八周带你手搓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 周),我们会学习如何"裁剪"这个列表,只保留最近的几轮对话。但今天,请先尽情享受这种"能接话"的快感!

相关推荐
Try_again_1几秒前
WorkBuddy 卸载重装+数据迁移全记录:用 Junction 解决工作空间路径锁定问题
人工智能·ai·腾讯云
Vodka~几秒前
WSL2 + RViz GPU渲染机械臂
人工智能·python
Mister Leon2 分钟前
模型端侧部署之 Nvidia Orin 异构硬件调度
人工智能
Python私教4 分钟前
DocsGPT 开源二开第一步:如意知识库工厂怎么换脸?
人工智能
林中青木7 分钟前
OpenCV 5.0 使用方法及注意事项
人工智能·opencv·计算机视觉
硅谷秋水8 分钟前
FATE:面向物理落地机器人课程学习具备主动修复功能且考虑可行性-觉察的闭环任务生成方法
人工智能·深度学习·语言模型·机器人
8Qi89 分钟前
hello-agents学习笔记--Memory让Agent拥有记忆
人工智能·python·llm·agent·ai编程·vibecoding
IT·陈寒10 分钟前
Gemini 3 Flash Preview 深度评测:速度、智能与成本的综合博弈
人工智能
梦想的初衷~11 分钟前
《双 Agent 工作台 + 全栈 GIS 项目搭建:前端地图/空间数据库/后端/云部署指南》
人工智能·echarts·leaflet·webgis·ai 辅助编程
恣逍信点11 分钟前
论“无中生有”之元逻辑——《凌微经——对称性共生关系论》随读
人工智能·程序人生·知识图谱·学习方法·业界资讯·交友·哲学