AI应用开发:历史对话提示词实战技巧
摘要
你是否注意到,AI大模型每天处理海量请求,但每个用户的对话记忆仅局限于当前会话窗口
你是否注意到,AI大模型每天处理海量请求,但每个用户的对话记忆仅局限于当前会话窗口。一旦关闭对话或开启新会话,模型便重置为空白状态——之前任何交互信息都会丢失。
简言之,AI不具备持久记忆能力。它既无法记住你上次的提问,也不能回忆起之前的回答。这意味着模型无法从历史交互中学习:你纠正过的错误,它会重复犯;积累的上下文,重新开始后瞬间归零。

一、能否把历史对话直接用作提示词?
大模型用户量庞大,每次推理都消耗大量算力,不可能为每个用户分配独立存储空间实现记忆。既然模型放弃记忆,开发者就必须在应用层弥补——通过对话记忆机制。
具体实现:用户在退出会话时,应用将本轮所有问答保存下来。下次用户开启新会话,应用把之前的多轮问答合并为初始提示词,发送给大模型,再处理用户的新问题。这样一来,模型就能“心中有数”——知道用户之前问了什么、自己答过什么,后续推理就会更贴合用户意图。
二、以提示词形式呈现的历史对话示例
包含历史多轮问答的初始提示词,格式如下:
“用户之前已经问过你多个问题了,后续推理请参考之前的问答内容。上次用户的问题和AI的回答按照时间升序排列如下:【用户】推荐一本关于历史的书,要内容详细、适合入门【AI】推荐《明朝那些事儿》,通俗好读【用户】有没有国外历史的?比如欧洲史【AI】推荐《欧洲通史上下两千年》【用户】太长了有没有更短的?我只想快速了解核心脉络【AI】那看《极简欧洲史》精简版,100页搞定”
这段提示词首先声明“这不是新问题,而是历史记录”;随后用【用户】和【AI】角色标签逐条列出过往对话。大模型一启动就知道:用户对历史入门读物感兴趣,尤其想要欧洲史概要——后续回答自然会延续这个方向。
三、根据消息数量精简上下文
历史会话中累积的问答可能很多。将所有内容塞给大模型既浪费资源也不合理。可行的做法是:只截取部分内容,提炼后作为下次会话的初始提示词。
最简单的提炼策略——只保留最新、最靠后的几条问答。因为较早的对话很可能已不是用户关注的重点,按照思维惯性,用户更关心最近几次交互。所以提取最新会话的几条即可。
下面用Python演示如何按消息数量截断早期上下文。运行前,请确保已安装 Python 3.10.11 和 PyCharm 2022.2(参考本系列第一篇文章)。
以下是仅保留两轮对话的代码示例:
# 历史对话缓存列表
context_history = []
# 最多保留 2 轮对话,超出自动移除最早记录
MAX_CONTEXT_ROUND = 2
# 角色标记常量
ROLE_USER = "用户"
ROLE_AI = "AI"
# 模拟一次对话 & 上下文管理
def chat(user_input: str) -> tuple[str, str]:
# ① 先将当前用户输入加入上下文
context_history.append({"role": ROLE_USER, "content": user_input})
# 关键:截断上下文,超出限制则移除最旧记录
while len(context_history) > MAX_CONTEXT_ROUND * 2:
context_history.pop(0) # 删除列表第一个元素(最早记录)
# ② 拼接完整上下文的提示词(最终发给大模型的内容)
full_prompt = ""
for msg in context_history:
full_prompt += f"{msg['role']}:{msg['content']}\n"
# ③ 模拟AI回复(实际项目需调用大模型接口)
ai_reply = f"我结合上下文回答:收到你的问题【{user_input}】"
# ④ 将AI回复也存入上下文,供后续轮次使用
context_history.append({"role": ROLE_AI, "content": ai_reply})
return ai_reply, full_prompt
# 测试运行
if __name__ == "__main__":
# 连续多轮提问,观察截断效果
questions = ["请推荐一本小说", "再来一本科幻的", "不要太长的", "有没有悬疑类?"]
for idx, q in enumerate(questions, 1):
print(f"\n===== 第{idx}轮对话 =====")
reply, prompt = chat(q)
print("当前拼接的完整上下文:")
print(prompt)
print("AI回复:", reply)
四、历史对话上下文的精简结果
运行上述代码,输出日志如下:
===== 第1轮对话 =====
当前拼接的完整上下文:
用户:请推荐一本小说
AI回复: 我结合上下文回答:收到你的问题【请推荐一本小说】
===== 第2轮对话 =====
当前拼接的完整上下文:
用户:请推荐一本小说
AI:我结合上下文回答:收到你的问题【请推荐一本小说】
用户:再来一本科幻的
AI回复: 我结合上下文回答:收到你的问题【再来一本科幻的】
===== 第3轮对话 =====
当前拼接的完整上下文:
AI:我结合上下文回答:收到你的问题【请推荐一本小说】
用户:再来一本科幻的
AI:我结合上下文回答:收到你的问题【再来一本科幻的】
用户:不要太长的
AI回复: 我结合上下文回答:收到你的问题【不要太长的】
===== 第4轮对话 =====
当前拼接的完整上下文:
AI:我结合上下文回答:收到你的问题【再来一本科幻的】
用户:不要太长的
AI:我结合上下文回答:收到你的问题【不要太长的】
用户:有没有悬疑类?
AI回复: 我结合上下文回答:收到你的问题【有没有悬疑类?】
可以看到,第3轮时,应用仍保存前两轮(第1轮和第2轮)的对话记录;到第4轮,只保留最近两轮(第2轮和第3轮),更早的第1轮已被自动删除。
以上代码仅为演示,未引入任何AI库。从下一篇文章开始,我们将逐步集成AI库,深入讲解AI应用开发。
本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。