查看原文
其他

Llama 3.1发布后的几点体验 | 附本地运行Llama 3.1模型的Streamlit应用完整代码

思辨view kate人不错
2024-08-23

最好最快体验Llama 3.1渠道就是Groq | Llama 3.1 模型发布重点
llama 3.1 405B的信息还是比较陈旧的

以OpenAI新的python库为例,llama 3.1 405B不了解,写错了,GPT4o也错了,Claude 3.5 Sonnet回答正确。

测试llama 3.1 8B的指令遵循情况

对比Gemma2-9b-It,llama 3.1 8B更好。

测试用的我前两天做的单词关联应用,都是接入的Groq,用Gemma2-9b-It(图2)运行结果里会显示例子和记忆技巧里一会是中文,一会是英文,不遵循我的提示,但是今天改用llama 3.1 8B(图1)和70B,情况好了很多,让它中文解释,它都遵循了。

下面的视频是前2天的

让我想到之前有个产品的开发者说有时不用优化提示词什么的,或者做很多代码优化,等着上新模型就好了。

AI模型考试表现分析

根据Ethan Mollick分享的表格整理

在个人电脑上离线使用 Llama 3.1 8B

我在作者Pietro Schirano分享的代码基础上加了些功能。

虽然使用Ollama的UI端很多,但是我很喜欢Streamlit的清爽界面,而且可以随时根据自己的需求修改代码。

这个脚本实现了以下功能:

聊天界面:提供了一个与AI助手(Llama 3.1)对话的界面。用户可以输入消息,并获得AI的实时响应。

对话管理:支持创建新的对话。可以在不同的对话之间切换。

对话历史:保存所有的对话历史。在侧边栏显示历史对话列表,每个对话显示其开始的部分内容作为预览。用户可以从历史记录中选择并加载之前的对话。

删除功能:允许用户删除不需要的历史对话。

实时响应:AI的回答是流式传输的,用户可以看到回答的实时生成过程。

持久化存储:所有对话都被保存到本地文件系统,即使关闭应用后重新打开,历史对话仍然可用。

对话排序:历史对话按最后修改时间排序,最新的对话显示在前面。

界面使用中文,适合中文用户使用。

记得运行py代码前,先下载最新版Ollama,再“ollama run llama3.1”下载模型。

import streamlit as st
import ollama
import uuid
import json
import os
from datetime import datetime

def get_ai_response(messages):
    try:
        response = ollama.chat(
            model='llama3.1',
            messages=messages,
            stream=True
        )
        return response
    except Exception as e:
        st.error(f"错误: {str(e)}")
        return None

def save_conversation(conversation_id, messages):
    if not os.path.exists('conversations'):
        os.makedirs('conversations')
    with open(f'conversations/{conversation_id}.json''w') as f:
        json.dump(messages, f)

def load_conversation(conversation_id):
    try:
        with open(f'conversations/{conversation_id}.json''r') as f:
            return json.load(f)
    except FileNotFoundError:
        return []

def get_conversation_list():
    if not os.path.exists('conversations'):
        return []
    conversations = []
    for f in os.listdir('conversations'):
        if f.endswith('.json'):
            file_path = os.path.join('conversations', f)
            modified_time = os.path.getmtime(file_path)
            with open(file_path, 'r') as file:
                data = json.load(file)
                if data:
                    first_message = data[0]['content'][:30]
                    conversations.append((f.split('.')[0], first_message, modified_time))
    # 按修改时间排序,最新的在前
    return sorted(conversations, key=lambda x: x[2], reverse=True)

def delete_conversation(conversation_id):
    file_path = f'conversations/{conversation_id}.json'
    if os.path.exists(file_path):
        os.remove(file_path)
        return True
    return False

def main():
    st.title("与 Llama 3.1 聊天")

    # 初始化会话状态
    if "conversation_id" not in st.session_state:
        st.session_state.conversation_id = str(uuid.uuid4())
    if "messages" not in st.session_state:
        st.session_state.messages = []

    # 侧边栏
    st.sidebar.title("对话控制")
    
    # 新对话按钮
    if st.sidebar.button("新对话", key="new_conversation"):
        st.session_state.conversation_id = str(uuid.uuid4())
        st.session_state.messages = []
        st.rerun()

    # 对话历史
    st.sidebar.title("对话历史")
    conversation_list = get_conversation_list()
    
    # 显示当前对话
    if st.sidebar.button("当前对话", key="current_conversation"):
        st.rerun()

    # 显示历史对话列表
    for conv_id, preview, _ in conversation_list:
        col1, col2 = st.sidebar.columns([3, 1])
        with col1:
            if st.button(f"{preview}", key=f"select_{conv_id}"):
                st.session_state.conversation_id = conv_id
                st.session_state.messages = load_conversation(conv_id)
                st.rerun()
        with col2:
            if st.button("删除", key=f"delete_{conv_id}"):
                if delete_conversation(conv_id):
                    st.success("对话已删除")
                    if st.session_state.conversation_id == conv_id:
                        st.session_state.conversation_id = str(uuid.uuid4())
                        st.session_state.messages = []
                    st.rerun()
                else:
                    st.error("删除失败")

    # 显示历史聊天消息
    for message in st.session_state.messages:
        with st.chat_message(message["role"]):
            st.markdown(message["content"])

    # 响应用户输入
    if prompt := st.chat_input("请输入您的消息"):
        # 将用户消息添加到聊天历史
        st.session_state.messages.append({"role""user""content": prompt})
        # 在聊天消息容器中显示用户消息
        with st.chat_message("user"):
            st.markdown(prompt)

        # 获取AI响应
        response_stream = get_ai_response(st.session_state.messages)
        
        # 在聊天消息容器中显示助手响应
        with st.chat_message("assistant"):
            message_placeholder = st.empty()
            full_response = ""
            for chunk in response_stream:
                full_response += chunk['message']['content']
                message_placeholder.markdown(full_response + "▌")
            message_placeholder.markdown(full_response)
        
        # 将助手响应添加到聊天历史
        st.session_state.messages.append({"role""assistant""content": full_response})

        # 保存更新后的对话
        save_conversation(st.session_state.conversation_id, st.session_state.messages)

        # 强制重新运行以更新聊天显示
        st.rerun()

if __name__ == "__main__":
    main()

广告时间

过去我已写了150+篇AI主题原创长文,我对继续写作充满信心,因为这是我的爱好,我非常热爱这件事。

最近我开通了知识星球,你加入后可以访问公众号收费文章,向我提问,第一时间获取AI资讯。

结语

希望这些工具和技巧能帮助你实现更多创意想法。

别忘了分享你的作品,让我们一起在AI应用开发的道路上共同进步!

欢迎点赞、转发、收藏。

精选历史文章,请看这里:

探索新Ollama Python库:在应用程序中集成本地LLM

实测在Mac上使用Ollama与AI对话的过程 - 模型选择、安装、集成使用记,从Mixtral8x7b到Yi-34B-Chat

效率提升N倍!分享我正在使用的AI编程新工具

打造更可靠的 AI :解析 7 种减少幻觉的高效策略

解锁 Claude 3.5 Sonnet 创意潜能:10+ 个 Web 应用实战

Poe x Claude:零代码创建交互式 Web 应用,完整操作带你轻松上手

AI 驱动的网页开发:用 Claude 3.5 Sonnet 打造趣味互动应用并轻松部署


继续滑动看下一个
kate人不错
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存