第 1 周 Day 4:Python Agent 实战:命令行多轮对话 ChatBot
第 1 周 Day 4:Python Agent 实战:命令行多轮对话 ChatBot
学习主题:实现一个可多轮对话的命令行 ChatBot
建议时长:2-3 小时
学习目标:用messages保存对话历史,让模型能基于上下文连续回答问题
一、为什么学这个
本文适合已经完成LLMClient封装的学习者。你需要会运行 Python 脚本,并且已经配置好大模型 API Key。
前一篇文章里,我们已经能完成一次模型调用:
用户问一句 -> 模型答一句 -> 程序结束但真实聊天不是这样的。用户经常会追问:
什么是 Python Agent? 那它和普通 ChatBot 有什么区别? 能不能给一个代码例子?第二句里的“它”指的是上一轮提到的 Python Agent。如果程序不保存历史,模型就可能不知道“它”是什么。
所以本篇要完成第一阶段的核心产出:一个可以连续对话的命令行 ChatBot。
二、核心概念
1. 什么是多轮对话
多轮对话就是模型回答时能看到前面的上下文。
单轮对话:
用户:它和普通 ChatBot 有什么区别? 模型:不知道“它”指什么。多轮对话:
用户:什么是 Python Agent? 模型:Python Agent 是…… 用户:它和普通 ChatBot 有什么区别? 模型:这里的“它”指 Python Agent,区别是……2.messages列表的作用
入门阶段可以用一个列表保存历史:
messages=[{"role":"user","content":"什么是 Python Agent?"},{"role":"assistant","content":"Python Agent 是用 Python 构建的智能体程序。"},{"role":"user","content":"它和普通 ChatBot 有什么区别?"},]每条消息有两个关键字段:
| 字段 | 含义 |
|---|---|
role | 谁说的话,例如user或assistant |
content | 消息内容 |
当我们把整个messages传给模型时,模型就能看到前面的对话。
3. 为什么不无限保存历史
对话历史会消耗上下文长度和 token。第一阶段可以先全部保存,方便理解;但要知道这不是最终方案。
后面学习记忆系统时,会用这些方法优化:
- 只保留最近 N 轮对话
- 把旧对话压缩成摘要
- 把重要内容存入向量数据库
本篇先专注完成最小可用版本。
三、基础示例
1. 改造LLMClient支持 messages
在src/llm_client.py中增加chat_with_messages方法:
fromopenaiimportOpenAIfromconfigimportSettings DEFAULT_SYSTEM_PROMPT="你是一个耐心的 Python 编程助教,回答要通俗、准确、简洁。"classLLMClient:def__init__(self,settings:Settings):self.model=settings.model client_kwargs={"api_key":settings.api_key}ifsettings.base_url:client_kwargs["base_url"]=settings.base_url self.client=OpenAI(**client_kwargs)defchat(self,user_input:str,system_prompt:str=DEFAULT_SYSTEM_PROMPT)->