AI应用开发:历史对话提示词实战技巧

2026-05-31阅读 0热度 0
AI应用开发

你是否注意到,AI大模型每天处理海量请求,但每个用户的对话记忆仅局限于当前会话窗口。一旦关闭对话或开启新会话,模型便重置为空白状态——之前任何交互信息都会丢失。

简言之,AI不具备持久记忆能力。它既无法记住你上次的提问,也不能回忆起之前的回答。这意味着模型无法从历史交互中学习:你纠正过的错误,它会重复犯;积累的上下文,重新开始后瞬间归零。

15天学会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消耗)》。

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

相关阅读

更多
欢迎回来 登录或注册后,可保存提示词和历史记录
登录后可同步收藏、历史记录和常用模板
注册即表示同意服务条款与隐私政策