码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 15天学会AI应用开发(三)把历史对话作为提示词会怎样


    合集 - AI应用开发(20)
    1.15天学会AI应用开发(一)搭建AI大模型应用开发环境05-242.15天学会AI应用开发(二)为什么编写提示词这么重要05-30
    3.15天学会AI应用开发(三)把历史对话作为提示词会怎样05-31
    4.15天学会AI应用开发(四)根据Token长度截断历史对话06-065.15天学会AI应用开发(五)使用AI摘要来压缩上下文消息06-076.15天学会AI应用开发(六)使用离线大模型对文本生成摘要06-147.15天学会AI应用开发(七)有了大模型为什么还要引入RAG06-208.15天学会AI应用开发(八)使用向量数据库实现RAG功能06-219.15天学会AI应用开发(九)利用Chroma持久化向量数据06-2710.15天学会AI应用开发(十)把文本嵌入模型换成国产模型06-2811.15天学会AI应用开发(十一)从TXT文件构建RAG知识库07-0512.15天学会AI应用开发(十二)从PDF、WORD、网页构建RAG07-1113.15天学会AI应用开发(十三)上下文与RAG的阶段性总结07-1214.15天学会AI应用开发(十四)搭建LangChain的开发环境07-1815.15天学会AI应用开发(十五)使用LangChain封装AI执行链07-1916.15天学会AI应用开发(十六)LangChain实现对话记忆功能07-2517.15天学会AI应用开发(十七)使用LangGraph实现会话记忆功能07-2618.15天学会AI应用开发(十八)使用LangGraph实现精确记忆功能08-0119.15天学会AI应用开发(十九)使用LangGraph实现持久记忆功能08-0820.15天学会AI应用开发(二十)使用LangChain实现RAG检索功能08-09
    收起
    ​AI大模型服务的用户很多,它对每个用户的印象仅存在于当前会话中,一旦用户离开当前会话重新开启新的会话,AI会把该用户当作是新用户,而非之前已经对话过的某个用户。

    也就是说,AI没有持久记忆的功能,它记不住你上次问了什么,也记不住它上次回答了什么。这意味着AI没法从过往的对话中吸取经验,原本纠正了的错误还会继续犯错,原本积累了的知识重开转头就忘。

    一、历史对话能作为提示词吗?

    大模型的用户那么多,推理过程已经消耗许多算力了,不可能再给每个用户分配单独的存储空间以实现记忆功能。既然大模型放弃了记忆功能,开发者就得在AI应用这边增加对话记忆,以弥补大模型缺失的记忆。
    具体而言,在用户每次退出会话之时,AI应用就要保存本次会话的各轮问答内容。然后下次开启新会话时,AI应用先把上次的多轮问答合并后作为初始提示词发给大模型,再接收处理用户的新问题。好让大模型知晓用户之前已经问过了哪些问题,并且上次的大模型都做了哪些回答,于是心中有数、方能投用户之所好。

    二、提示词形式的历史对话例子

    包含上回多轮问答内容的初始提示词举例如下:

    “用户之前已经问过你多个问题了,后续推理请参考之前的问答内容。
    上次用户的问题和AI的回答按照时间升序排列如下:
    【用户】推荐一本关于历史的书,要内容详细、适合入门
    【AI】推荐《明朝那些事儿》,通俗好读
    【用户】有没有国外历史的?比如欧洲史
    【AI】推荐《欧洲通史上下两千年》
    【用户】太长了有没有更短的?我只想快速了解核心脉络
    【AI】那看《极简欧洲史》精简版,100页搞定”

    上面的初始提示词首先说明这不是普通的问题,而是上次用户与AI的问答交互内容;接着把用户与AI的对话内容一一罗列,其中用户的提问以【用户】开头,AI的回答以【AI】开头。这样大模型一开始就了解用户比较关注入门的历史读物,尤其是欧洲的历史梗概。

    三、根据消息数量精简上下文

    当然,历史会话中的问答内容可能很多,把所有历史对话统统发给下次的大模型,既不经济也不可取。只能摘取历史对话的局部内容,提炼之后形成下次会话的初始提示词,才是可行的做法。
    历史对话的提炼方式有很多,最简单的就是拾取最新最近最靠后的几条问答内容。因为较老较远较靠前的问答过去比较久了,很可能用户已经不再关注。按照思维惯性,用户大概率更关注上次最后的几次问达,那么提取最新的会话问答就足够了。

    接下来将以Python代码演示如何按照消息数量来截断早期的上下文(即问答内容)。在运行Python代码之前,请确保电脑已经按照本教程的第一篇文章安装了 Python 3.10.11 和 PyCharm 2022.2 。
    下面是只保留两轮对话内容的Python代码例子:

    # 上下文仓库:存放所有历史对话
    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)

    四、历史对话上下文的精简结果

    运行上面的Python代码,观察到下面的输出日志:

    ===== 第1轮对话 =====
    当前拼接的完整上下文:
    用户:请推荐一本小说
    
    AI回复: 我结合上下文回答:收到你的问题【请推荐一本小说】
    
    ===== 第2轮对话 =====
    当前拼接的完整上下文:
    用户:请推荐一本小说
    AI:我结合上下文回答:收到你的问题【请推荐一本小说】
    用户:再来一本科幻的
    
    AI回复: 我结合上下文回答:收到你的问题【再来一本科幻的】
    
    ===== 第3轮对话 =====
    当前拼接的完整上下文:
    AI:我结合上下文回答:收到你的问题【请推荐一本小说】
    用户:再来一本科幻的
    AI:我结合上下文回答:收到你的问题【再来一本科幻的】
    用户:不要太长的
    
    AI回复: 我结合上下文回答:收到你的问题【不要太长的】
    
    ===== 第4轮对话 =====
    当前拼接的完整上下文:
    AI:我结合上下文回答:收到你的问题【再来一本科幻的】
    用户:不要太长的
    AI:我结合上下文回答:收到你的问题【不要太长的】
    用户:有没有悬疑类?
    
    AI回复: 我结合上下文回答:收到你的问题【有没有悬疑类?】

    可见,在第3轮对话时,AI应用还保存着前两轮(第1轮和第2轮)的对话记录;但到了第4轮对话,AI应用只保存最近两轮(第2轮和第3轮)的对话记录,更早的第1轮对话被删掉了。

    以上的Python代码纯粹演示用,不涉及任何AI库。从下一篇文章开始,本教程将逐步引入AI库以深入介绍AI应用开发。

    本系列的AI应用开发文章目录为《15天学会AI应用开发全目录(零基础小白,零Token消耗)》。

  • 相关阅读:
    Stable Diffusion WebUI如何做到真人和动漫互相转换,就在这里!
    leaflet 示例教程100+ 目录
    知乎问题:如何说服技术老大用 Redis ?
    Redis(单/多)线程
    2024第十五届蓝桥杯 C/C++ B组 参赛经历分享(以及部分题解)
    速码!!!BGP最全学习笔记:BGP选路原则实验配置
    FG6223EUUD系列模块选型参考
    国产FPGA高云GW1NSR-4C,集成ARM Cortex-M3硬核
    springboot引入外部jar,package打包报错找不到程序包XXX
    自媒体账号如何运营赚钱?
  • 原文地址:https://www.cnblogs.com/aqi00/p/20229835
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号