八周带你手搓AI应用-Day4-赋予你的AI“记忆力”

恭喜你!当你发现 AI "记不住前文"时,你已经触碰到了大模型应用开发中最核心的逻辑------状态管理

今天(第4天)的任务是:赋予你的 AI "记忆力"。我们将从原理出发,通过改造代码,让你的机器人能接住你抛出的"烂梗"或连续的业务逻辑。


第一站:解密大模型------为什么它是"鱼的记忆"?

1. 大模型(LLM)到底是什么?

从工程角度看,大模型本质上是一个巨大的数学函数

f(输入文本)=输出文本f(输入文本) = 输出文本f(输入文本)=输出文本

它不是一个一直运行、有自我意识的实体,而是一个"即用即走"的推理机。

2. 为什么大模型"无记忆"?
  • 技术原因(无状态性): 为了保证服务器能同时处理全球数百万人的请求,模型被设计为"无状态(Stateless)"的。这意味着服务器不会为每个用户开辟专门的存储空间来记聊天记录。对它来说,每一次请求都是全新的、独立的
  • 类比: 就像一个极其聪明但只有"秒瞬记忆"的教授。你推门进去问他问题,他答完你就被推出来了;你第二次推门进去,他根本不记得你刚才来过。

第二站:如何赋予它"记忆"?(核心操作)

1. 为什么这么设计?

既然模型记不住,我们就在每次请求时,把之前的聊天记录全部打包发给它

就像你第二次推门进教授办公室时,手里拿着一张纸,上面写着:"我刚才问了A,你回答了B,现在我想问C。" 教授读完这张纸,就能接上话了。

2. 具体操作:维护 messages 列表

在 OpenAI 的标准接口中,messages 字段是一个列表,它可以按顺序存放多条消息:

  • {"role": "user", "content": "..."}:用户说的话。
  • {"role": "assistant", "content": "..."}:AI 说的话(必须存进去,否则 AI 记不住自己刚才承诺过什么)。
  • {"role": "system", "content": "..."}:系统指令(设定 AI 的身份,如"你是一个材料学专家")。

🚀 今日最终里程碑:编写"有记忆"的聊天机器人

在 Cursor 中新建文件 day4_memory_bot.py。我们将引入一个全局列表 history 来存储对话。

python 复制代码
import requests

def start_memory_bot():
    url = "https://api.siliconflow.cn/v1/chat/completions"
    api_key = "你的API_KEY"
    headers = {
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json"
    }
    
    # --- 关键:创建一个列表来存放对话上下文 ---
    # 我们先放一个 system 消息,设定它的专家身份
    history = [
        {"role": "system", "content": "你是一位资深的高分子材料研发工程师,擅长PI、CPI等材料的合成与性能分析。"}
    ]

    print("=== 记忆助手已启动 (输入 'clear' 重置记忆,'quit' 退出) ===")

    while True:
        user_input = input("\n👤 你: ")

        if user_input.lower() in ["quit", "退出"]:
            break
        
        # 增加一个重置记忆的功能
        if user_input.lower() == "clear":
            history = [{"role": "system", "content": "你是一位资深工程师。"}]
            print("✨ 记忆已清空!")
            continue

        # 1. 把用户的新问题 append 到 history 列表中
        history.append({"role": "user", "content": user_input})

        payload = {
            "model": "Qwen/Qwen2.5-7B-Instruct",
            "messages": history, # 2. 发送的是整个列表,而不仅仅是最后一句话
            "temperature": 0.7
        }

        try:
            response = requests.post(url, headers=headers, json=payload)
            if response.status_code == 200:
                res_json = response.json()
                ai_reply = res_json["choices"][0]["message"]["content"]
                
                print(f"🤖 AI: {ai_reply}")

                # 3. 重要!把 AI 的回答也 append 到 history 中
                # 这样下次提问时,模型才知道它刚才说了什么
                history.append({"role": "assistant", "content": ai_reply})
            else:
                print(f"请求失败: {response.status_code}")
        except Exception as e:
            print(f"错误: {e}")

if __name__ == "__main__":
    start_memory_bot()

验证环节:如何证明它有记忆了?

运行代码后,请按顺序输入以下问题进行测试:

  1. 输入: "你好,我叫王小明,我正在研究聚酰亚胺的透光率。"
    • AI 回答: 应该会以专家身份欢迎你。
  2. 输入: "我刚才说我叫什么名字?我在研究什么?"
    • 验证: 如果 AI 能准确答出"你叫王小明"和"研究聚酰亚胺透光率",说明 上下文记忆功能成功跑通!
  3. 输入: "clear"
  4. 再问: "我是谁?"
    • 验证: AI 应该表示不认识你。

💡 学习技巧:注意"长度爆炸"

这种把所有记录都发过去的方法有一个缺陷:对话越长,消耗的 Token 越多,且模型会有长度限制(Context Window)。

在实际项目中(比如第 6 周),我们会学习如何"裁剪"这个列表,只保留最近的几轮对话。但今天,请先尽情享受这种"能接话"的快感!

相关推荐
ACP广源盛139246256732 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享
运维·服务器·网络·数据库·人工智能·嵌入式硬件·电脑
向量引擎2 小时前
向量引擎接入 GPT Image 2 和 deepseek v4:一个 api key 把热门模型串起来,开发者终于不用深夜修接口了
人工智能·gpt·计算机视觉·aigc·api·ai编程·key
努力努力再努力FFF2 小时前
医生对AI辅助诊断感兴趣,作为临床人员该怎么了解和学习?
人工智能·学习
AI医影跨模态组学2 小时前
如何将纵向MRI深度学习特征与局部晚期直肠癌新辅助放化疗后的免疫微环境建立关联,并解释其对pCR及预后的机制
人工智能·深度学习·论文·医学·医学影像·影像组学
Empty-Filled2 小时前
AI生成测试用例功能怎么测:一个完整实战案例
网络·人工智能·测试用例
eastyuxiao2 小时前
设计一个基于 OpenClaw 的 AI 智能体来辅助交易
人工智能
波动几何3 小时前
因果动力学架构技能cda
人工智能
Lucas_coding3 小时前
【Claude Code Router】 Claude Code 兼容 OpenAI 格式 API, Claude code 接入本地部署模型
人工智能·python
jinanwuhuaguo3 小时前
(第二十七篇)OpenClaw四月的演化风暴:OpenClaw 2026年4月全版本更新的文明级解读
大数据·人工智能·架构·kotlin·openclaw