ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

大模型应用开发教程04 | 多轮对话原理与实现(Chatbot)

大模型应用开发教程04 | 多轮对话原理与实现(Chatbot) 理论部分很多人第一次写多轮对话会误以为“模型记住了刚才聊过的内容”。但从 API 的角度看多轮对话的本质其实是每一轮请求都把历史消息一起发给模型。也就是说模型没有“长期记忆”默认情况下不会跨请求自动保存我们看到的“记住上下文”来自我们在每次调用时携带的messages所谓“对话状态”就是我们在本地维护的一份messages列表在常见的对话接口里输入是一个消息列表messages每条消息包含role消息角色常见为system/user/assistantcontent消息内容多轮对话要跑起来有一个关键点每轮把用户输入 append 进 messages拿到模型输出后也要把 assistant 输出 append 进 messages。否则模型下一轮就“忘了自己刚刚说了什么”。实践部分本案例做什么实现一个命令行聊天机器人支持我们在终端连续输入多轮消息初始化messages用system设定角色循环读取用户输入追加到messages调用模型生成回答并将回答追加到messages支持输入exit/quit/退出结束对话支持Ctrl C强制退出主要代码本篇直接使用项目脚本src/1.3_chatbot.pyimportosfromdotenvimportload_dotenvfromopenaiimportOpenAI# 加载配置load_dotenv()clientOpenAI(api_keyos.getenv(ZHIPUAI_API_KEY),base_urlos.getenv(ZHIPUAI_BASE_URL))defmain():# 1. 初始化对话历史# system: 设置模型的“人设”messages[{role:system,content:你是一个暴躁的四川厨师说话带口音。}]print( 智能聊天机器人 (输入 exit 或 quit 退出) )whileTrue:# 2. 获取用户输入try:user_inputinput(\n 你: )exceptKeyboardInterrupt:# 处理 CtrlC 强制退出print(\n 再见)breakifuser_input.lower()in[exit,quit,退出]:print( 聊得很开心下次见)breakifnotuser_input.strip():print(⚠️ 请输入内容...)continue# 3. 将用户输入加入历史messages.append({role:user,content:user_input})try:# 4. 调用 API# print(Thinking..., end, flushTrue) # 简单的等待提示responseclient.chat.completions.create(modelglm-4-flash,messagesmessages,temperature0.9,streamFalse)# 5. 获取回答并展示assistant_contentresponse.choices[0].message.contentprint(f\n AI:{assistant_content})# 6. 【关键】将 AI 的回答也加入历史# 如果不加这一步模型下一轮就会忘记它刚才说了什么messages.append({role:assistant,content:assistant_content})exceptExceptionase:print(f\n❌ 发生错误:{e})# 发生错误时建议把刚才导致错误的用户输入移除防止卡死messages.pop()if__name____main__:main()运行方式在项目根目录执行python3 src/1.3_chatbot.py运行结果示例运行后会看到类似交互回答内容每次会不同 智能聊天机器人 (输入 exit 或 quit 退出) 你: 我想学做番茄炒蛋 AI: ... 你: 那第一步应该做什么 AI: ... 你: exit 聊得很开心下次见如果出现报错提示缺少ZHIPUAI_API_KEY先确认第 2 篇的.env配置是否正确依赖缺失例如 openai/dotenv确认已安装依赖并激活虚拟环境网络相关错误确认网络/代理配置与ZHIPUAI_BASE_URL可访问总结这一篇我们完成了一个最小可用的多轮对话机器人并理解了多轮对话的核心对话状态由我们维护每轮请求都要携带历史消息。
返回列表