解决问题:
- 上下文连续性:让模型知道上一轮说过什么。
- 会话个性化:让模型记住用户在当前会话里提供的信息,如名字、偏好、任务背景。
- 多步任务承接:让模型把前一步结果作为后一步输入,而不是每轮都重新从零开始。
记忆的实现原理
- 读历史
- 把历史拼进当前提示
- 调用模型
- 把本轮输入和输出写回历史
工程化表达
第一步:根据会话标识找到对应历史。
比如通过 session_id="user-001" 找到这位用户当前会话的消息列表。
第二步:把历史消息插入 Prompt。
这一步通常会和 第 13 章 里的 MessagesPlaceholder("history") 配合使用。
第三步:把“历史 + 当前问题”一起交给模型。
这样模型看到的就不再只是当前一句话,而是完整上下文。
第四步:把本轮消息写回历史存储。
也就是把:用户这一轮输入、模型这一轮回复,都追加进去,供下一轮再读取。
Session_id
如何知道哪份历史属于哪位用户、哪次会话?最常见的做法就是使用 session_id,它就是“当前会话的编号”
RunnableWithMessageHistory
作用: 给一条已有的 Runnable / Chain 包上一层历史管理能力。
它并不替代你的 Prompt、Model、Parser,而是站在它们外面,统一负责历史的读取、注入和写回
