Llama 3.1发布后的几点体验 | 附本地运行Llama 3.1模型的Streamlit应用完整代码
最好最快体验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
解锁 Claude 3.5 Sonnet 创意潜能:10+ 个 Web 应用实战
Poe x Claude:零代码创建交互式 Web 应用,完整操作带你轻松上手
AI 驱动的网页开发:用 Claude 3.5 Sonnet 打造趣味互动应用并轻松部署