在构建智能对话系统(Chatbot)、RAG(检索增强生成)或 Agent(智能体) 时,上下文记忆(Context Memory)
是核心能力之一。模型本身是无状态的,它不知道您上一句说了什么,除非您显式地将历史对话记录传递给它们。
OpenAI 兼容接口(如阿里云 DashScope)的
参数设计得非常巧妙,它是一个列表(List),天然支持传入多条历史消息。本文将演示如何通过维护这个列表,实现具备”记忆力”的多轮对话。
大语言模型(LLM)本质上是基于概率预测下一个 token 的。如果没有历史信息,每一次请求对模型来说都是”初次见面”。
通过传入历史消息,我们可以实现:
- 指代消解:用户说”它多少钱?”,模型知道”它”指的是上一轮提到的商品。
- 逻辑推理:用户先说”A有2个苹果”,后说”B有3个苹果”,最后问”一共几个?”,模型能结合前文计算。
- 风格一致性:保持对话的人设和语气贯穿始终。
参数是一个字典列表,每个字典代表一条消息,包含 (角色)和 (内容)。
三种关键角色
📌 关键点 :要实现多轮对话,只需将之前的 提问和 回答按时间顺序依次加入 列表即可。
以下代码演示了一个经典的”累加推理”场景。我们将多轮对话历史硬编码在列表中,观察模型如何结合上下文回答问题。
🔍 代码运行逻辑解析
- System Prompt:首先告诉模型”回答要简洁”,这会影响后续所有输出的风格。
- History Injection :
- 用户说”小明有2条狗” -> 模型回”好的”。
- 用户说”小红有3条猫” -> Agent 智能体 模型回”好的”。
- 关键点 :我们将这两组问答都放入了 列表。
- Final Query :最后用户问”共有多少条宠物狗 ?”。
- 模型会扫描整个列表。
- 它发现第一条信息提到”2条狗”。
- 它发现第二条信息提到”3条猫“(与问题无关,忽略)。
- 结论:模型会回答”2条”。
🎯 测试建议:您可以尝试修改最后一句提问为”共有多少只宠物?”,模型应该会回答”5只”(2狗+3猫),证明它真正理解了上下文。
上面的例子是静态的(写死的列表)。在实际的聊天机器人应用中,我们需要动态地往列表里添加消息。
简易聊天循环示例
动态维护的关键点
- Append User : 每次用户说话后,立即 。
- Call Model : 发送整个 列表。
- Append Assistant : 收到模型回复后,必须 。如果不做这一步,模型就会”失忆”,不知道刚才自己说了什么。
1. Token 长度限制
列表不能无限增长。每个模型都有最大上下文窗口(Context Window),例如 8k, 32k, 128k tokens。
- 风险:如果列表太长,超过限制,API 会报错。
- 对策 :当对话过长时,需要实施滑动窗口策略 (只保留最近 N 轮对话)或摘要策略(用模型总结之前的对话)。
2. System Prompt 的位置
虽然大多数模型对位置不敏感,但最佳实践是将 角色始终放在列表的第一个位置,以确保指令的全局有效性。
3. 数据清洗
在将用户输入加入 之前,最好进行简单的清洗(如去除多余空白、过滤敏感词),以保证上下文质量。
通过灵活运用 列表,我们可以赋予无状态的大模型以”记忆”。
- 基础用法 :按顺序填入 , , 消息。
- 核心价值:实现指代理解、逻辑推理和人设保持。
- 工程落地 :在代码中使用列表 操作动态维护对话历史。
掌握这一技术,是开发 RAG 系统和自主 Agent 的基石。下一步,您可以尝试结合向量数据库,将外部知识库作为”长期记忆”注入到 中!
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/284333.html原文链接:https://javaforall.net
