案例:多轮对话聊天机器人
·
案例:多轮对话聊天机器人
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
MAX_SESSION_NUM=10#可以保存的最大会话数
#保存的最大会话数,如果会话数超过这个数字,将会删除最旧的会话
def keep_session(messages, max_num):
#将系统提示这个会话剥离出来,他将要一直存在
system_messages=[]
#只有用户和助手的会话
all_session_messages=[]
for message in messages:
#如果是系统的消息,保存在system_messages中
if message["role"]=="system":
system_messages.append(message)
else:
#如果是用户或助手的消息,保存在all_session_messages中
all_session_messages.append(message)
# 保存会话一轮包括用户和助手的回复
session_messages = all_session_messages[-(max_num*2):]
#将系统消息和会话消息合并,返回
return system_messages + session_messages
#1.加载模型
#1.1 将env文件读到系统环境变量中
load_dotenv(override=True)
#1.2 从系统环境变量中读取key和url
DEEPSEEK_API_KEY=os.getenv("DEEPSEEK_API_KEY")
DEEPSEEK_API_BASE=os.getenv("DEEPSEEK_API_BASE")
#1.3 初始化模型
model=init_chat_model(
model="deepseek:deepseek-v4-flash",
api_key=DEEPSEEK_API_KEY,
api_base=DEEPSEEK_API_BASE
)
#2. 维护一个消息列表,用于存储多轮对话历史
#2.1先存放一个系统消息,告诉助手它的角色
messages=[
{"role":"system","content":"你是一个AI大模型助手,你叫小p,你会耐心回答用户的问题,仔细讲解"}
]
#2.2 开始进行多轮会话
i=1#用来记录对话的轮数
#一个标记符,当用户输入这个标识符,代表会话结束
SESSION_END="quit"
print("请输入您的问题,输入",SESSION_END,"代表会话结束")
#一个无线循环,只要循环不结束,将会一直进行对话
while True:
#一个提示信息,来说明这是第几轮对话
print("\n","="*10,f"第{i}轮对话开始","="*10,"\n")
#接受用户的输入消息
user_input=input("请输入:")
#判断用户是否想要结束会话
if user_input == SESSION_END:
print("会话结束")
break
#将用户的输入消息加入会话列表中
messages.append({"role":"user","content":user_input})
# 如果每轮消息都保存,会导致内存溢出,所以我们只保留几轮对话的记忆
session_memory = keep_session(messages, max_num=MAX_SESSION_NUM)
AI_reponse=""#AI回复的消息
print("小p说:",end="",flush=True)
#模型的回复
for chunk in model.stream(session_memory):#model.stream使用流式输出
if chunk.content:
#end=""不自动换行,flush=True:立即输出
print(chunk.content,end="",flush=True)
AI_reponse+=chunk.content
print("\n","="*10,f"第{i}轮对话结束","="*10,"\n")
#对话轮数加一
i=i+1
#将助手回复的消息也加入会话列表
messages.append({"role":"assistant","content":AI_reponse})
运行的结果:

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)