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

相关推荐
Eloudy3 分钟前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
COOLMO研究AI23 分钟前
Python 如何在 AI 接口中实现请求幂等性:防止重复提交与重复扣费
人工智能·python·php
微三云-张梅27 分钟前
东莞企业做GEO:AI信任体系的三个建设层级
大数据·人工智能·微三云geo·东莞系统开发·东莞geo
CTA量化套保35 分钟前
新手学量化,先做能复查的小流程
人工智能·python
狂奔蜗牛(bradley)39 分钟前
RKNN Toolkit2开发环境搭建实操
人工智能
weixin_446260851 小时前
AutoDesign:面向长时序智能体设计的元调度优化框架
人工智能
Rocktech_ruixun1 小时前
机器人端侧大模型部署对主板有哪些要求?瑞迅主控板分级方案对比
人工智能·嵌入式硬件·机器人
ZGi.ai1 小时前
多模型回答不稳定:路由规则与评测方法
网络·人工智能·大模型评测·多模型·模型路由·zgi·模型网关
dogstarhuang1 小时前
大模型 API 停服怎么办:用 API 网关实现多模型统一接入与可切换架构
人工智能·后端·架构·大模型·api·数字化转型·ai应用
紫禁玄科1 小时前
MCP协议安全深度剖析:AI Agent时代的隐形攻击面
人工智能