第四章:Messaging and Memory
Chapter 4: Messaging and Memory
从配置管理到消息记忆:如何让AI记住对话内容?
在上一章的配置管理中,我们已经能让系统记住所有参数设置。但你是否想过:如果用户连续提问“今天天气如何?”和“明天呢?”,AI如何知道“明天”是接续之前的查询?这就像给指挥官配备一个记忆力超强的副官,专门记录对话历史!本章将介绍如何通过消息与记忆系统让AI记住之前的对话内容,保持上下文连贯。
核心问题:如何让AI记住“之前的对话”?
想象你和朋友聊天时,突然对方忘记你们之前讨论过的内容,这会让人很困扰!对于AI来说:
- 用户先问:“今天的天气?”
- 接着问:“明天呢?”
如果AI不知道“明天”是接续“今天”的查询,就无法正确回答。消息记忆系统就像一个智能笔记本,自动记录:
✅ 每个对话参与者的发言
✅ 工具调用的执行结果
✅ 保持对话上下文不超过限制
通过本章学习,我们将实现:
✅ 自动维护对话历史记录
✅ 设置消息数量上限防止内存溢出
✅ 整合工具调用的结果到对话中
核心概念分解
1. 消息结构:对话记录的“标准化格式”
每条消息都有统一格式,包含:
- 角色:用户、助手、工具(如天气API)
- 内容:文本或图片(base64编码)
- 工具调用记录:记录调用了哪个工具
# app/schema.py中的Message类片段
class Message(BaseModel):role: Role # 发言者身份(用户/助手/工具)content: Optional[str] # 文本内容tool_calls: Optional[List[ToolCall]] # 工具调用记录
2. 记忆管理:对话历史的“智能管家”
记忆对象负责:
- 存储消息列表
- 限制最多存储100条消息(默认值可配置)
- 提供添加/清理/获取最近消息的功能
# app/schema.py中的Memory类片段
class Memory(BaseModel):messages: List[Message] = [] # 消息列表max_messages: int = 100 # 最大消息数量def add_message(self, message: Message):self.messages.append(message)if len(self.messages) > self.max_messages:self.messages = self.messages[-self.max_messages:] # 只保留最新消息
3. 工具调用整合:让工具结果“参与对话”
当调用天气API时,工具调用记录会自动加入对话历史,方便后续分析:
# 示例:添加工具调用消息
tool_call = ToolCall(id="123", function=Function(name="get_weather", arguments="北京"))
memory.add_message(Message.tool_message(content="查询到北京今天25°C",name="天气API",tool_call_id="123"
))
如何用消息记忆解决问题?
场景:用户连续查询天气并获得连贯回答
步骤1:初始化记忆系统
from app.schema import Memory# 创建记忆对象,设置最大消息数为5
memory = Memory(max_messages=5)
步骤2:记录用户提问
# 用户问“今天北京天气?”
memory.add_message(Message.user_message("今天北京天气?"))
步骤3:记录工具调用结果
# 调用天气API获取数据
tool_response = "北京今天25°C,晴"
memory.add_message(Message.tool_message(content=tool_response,name="天气API",tool_call_id="tool_001"
))
步骤4:生成回答并记录
# 助手回复结果
assistant_response = f"今天北京{tool_response}"
memory.add_message(Message.assistant_message(assistant_response))
步骤5:用户继续提问
# 用户接着问“明天呢?”
memory.add_message(Message.user_message("明天呢?"))
此时,记忆中的消息列表会显示完整的对话历史,确保助手能理解“明天”是接续“今天”的查询。
内部实现揭秘:记忆系统的“工作原理”
流程分解(用简单序列图演示)
关键代码解析
1. 消息格式化示例
# 将消息转化为字典格式方便传输
message = Message.user_message("你好!")
print(message.to_dict())
# 输出:
# {'role': 'user', 'content': '你好!'}
2. 消息数量限制机制
memory = Memory(max_messages=2)
for i in range(5):memory.add_message(Message.user_message(f"消息{i}"))print(len(memory.messages)) # 输出:2(只保留最后两条消息)
深入理解消息与记忆系统
通过本章,你已掌握:
✅ 消息的标准化存储格式
✅ 记忆对象对对话历史的管理机制
✅ 工具调用记录如何参与对话上下文
小结与展望
通过消息与记忆系统,我们实现了:
✅ 对话历史的完整记录
✅ 动态调整消息存储数量
✅ 工具执行结果与对话的无缝衔接
下一章我们将探讨执行流框架,学习如何让所有组件按照预设流程协同工作——就像给指挥官制定一份详细的作战计划!现在你可以尝试修改代码,让AI在回答时主动引用之前的对话内容了。