LLM 本身没有长期记忆,它只是每次根据收到的 messages 推理

你的这段 messages 本质上就是 LLM 的上下文(Context),也是 上下文记忆(Memory)角色扮演(Role Playing) 的实现基础。

可以把它理解成:

LLM 本身没有长期记忆,它只是每次根据收到的 messages 推理。


1. messages 的本质

例如:

messages = [
    SystemMessage(content="你是一个AI助手,请回答用户的问题。"),
    "你好,我叫张三,你是谁?",
    AIMessage(content="我是GPT-4o,一个AI助手。"),
    {"role": "user", "content": "你知道我叫什么吗?"},
]

真正发送给模型的是:

System:
你是一个AI助手,请回答用户的问题。

User:
你好,我叫张三,你是谁?

Assistant:
我是GPT-4o,一个AI助手。

User:
你知道我叫什么吗?

模型看到的是完整聊天记录

然后开始预测下一句话。


2. 为什么知道用户叫张三?

例如:

User:
你好,我叫张三

模型读取 Context:

你好,
我叫张三

所以:

User:
你知道我叫什么吗?

模型推理:

前面出现过

我叫张三

因此回答:

你叫张三。

这里没有数据库。

没有变量。

没有 Memory。

只是因为:

名字就在 Context 里面。


3. 上下文记忆(Context Memory)

所谓 Memory:

实际上就是:

messages

越来越长。

例如:

System

User
AI

User
AI

User
AI

User
AI

模型每次都会重新阅读。

例如:

第一次:

User:
我喜欢篮球

第二次:

User:
我最喜欢哪个运动?

因为:

我喜欢篮球

还在 messages 里。

所以回答:

篮球。

这就是所谓:

上下文记忆。

并不是模型真的存住了。


4. 为什么删除 messages 就忘了?

例如:

第一次:

messages

User:
我叫张三

第二次:

你重新创建:

messages = [
    SystemMessage("你是AI")
]

然后:

User:
我叫什么?

模型收到:

System:
你是AI

User:
我叫什么?

里面没有:

我叫张三

所以模型只能回答:

不知道。

因此:

LLM 每次都是"开卷考试",书没带,就不会。


5. 角色扮演原理(Role Playing)

例如:

SystemMessage(
    content="你是一名Python专家,只回答Python问题。"
)

模型收到:

System
你是一名Python专家

于是后面生成时都会尽量符合这个身份。

例如:

User:
Java好吗?

模型可能回答:

我是Python专家,
从Python角度来看……

因为:

第一条 System Message 权重最高。


再例如

System:
你是海盗。

用户:

你好

模型:

啊哈!船长!

因为 Context 第一条就是:

你是海盗。

6. 为什么 System Message 最重要?

OpenAI Chat API:

System
↓

User

↓

Assistant

↓

User

↓

Assistant

推理时:

System
↓↓↓↓↓↓↓↓↓↓↓↓↓

整个聊天
↓↓↓↓↓↓↓↓↓↓↓↓↓

生成答案

System 是整个聊天的最高指导原则。

例如:

System:
以后所有回答都用英文。

用户:

用中文回答。

模型通常仍会回答英文(实际行为还会受到平台指令和安全策略影响)。

因为:

System 优先级最高。


7. 为什么 AIMessage 也要放进去?

例如:

User:
你好

AI:

你好,我叫GPT。

下一轮:

User:
你叫什么?

如果没有:

AI:
你好,我叫GPT。

模型不知道自己之前说过什么。

所以:

AIMessage 也是 Context。


例如:

User:
请以后都叫我老板。

Assistant:
好的老板。

下一轮:

User:
你好。

因为:

Assistant:
好的老板。

还在 Context。

模型继续:

老板您好。

所以:

AIMessage 也是记忆的一部分。


8. LangChain 为什么有各种 Message 类型?

LangChain 最终都会转换成统一格式:

[
    {
        "role": "system",
        "content": "..."
    },
    {
        "role": "user",
        "content": "..."
    },
    {
        "role": "assistant",
        "content": "..."
    }
]

因此下面这些写法本质等价:

SystemMessage(...)

等价于

{
    "role": "system",
    "content": "..."
}

AIMessage(...)

等价于

{
    "role": "assistant",
    "content": "..."
}

HumanMessage(...)

等价于

{
    "role": "user",
    "content": "..."
}

9. 真正的长期记忆(Long-term Memory)

如果希望 AI 在新的会话中仍然记住用户信息,就不能只依赖 messages,因为新的请求不会自动包含历史内容。

典型架构如下:

                 用户提问
                     │
                     ▼
             查询长期记忆(数据库)
                     │
                     ▼
        拼接成新的 messages(上下文)
                     │
                     ▼
                  LLM 推理
                     │
                     ▼
                返回回答并更新记忆

例如,数据库保存:

{
  "name": "张三",
  "favorite": "篮球"
}

当用户问:

我最喜欢什么运动?

程序会先读取数据库,再构造:

messages = [
    SystemMessage(content="你是AI助手"),
    SystemMessage(content="用户资料:名字张三,喜欢篮球"),
    HumanMessage(content="我最喜欢什么运动?")
]

这样模型就能回答:

你最喜欢篮球。

总结

概念实现原理是否模型真正记住
上下文记忆(Context Memory) 将完整 messages 一起发送给模型 ❌ 否,只是利用当前上下文推理
角色扮演(Role Playing) 使用 SystemMessage 设定身份、语气、规则 ❌ 否,只是在当前上下文中遵循设定
对话连续性 保留 UserAssistant 历史消息 ❌ 否,每次请求都会重新阅读历史
长期记忆(Long-term Memory) 将用户信息存入数据库/向量库等,下一次请求再检索并注入 messages ✅ 由应用层实现,而不是 LLM 自带能力

一句话概括:messages 就是 LLM 的工作记忆(Working Memory);角色扮演、本轮上下文记忆和多轮对话,本质都是通过不断构造和传递 messages 来实现的,而真正跨会话的长期记忆需要应用在模型外部存储并在每次请求前重新注入上下文。

posted @ 2026-07-09 10:57  jerry-mengjie  阅读(26)  评论(0)    收藏  举报