大模型为什么会“忘记上下文”?从 Token 机制讲起
一、问题背景
在使用大模型(如基于 Spring AI 构建应用)时,我们常会遇到两个典型问题:
-
对话变长后,模型开始“忘记之前的内容”
-
Prompt 越长,调用成本越高
这些现象的背后,其实都与一个核心机制有关:Token体系
但仅仅理解 Token 本身是不够的,还必须结合:
-
Tokenization(分词机制)
-
Context Window(上下文窗口)
二、什么是 Token?
对于不同的场景Token其实有不同的解释,在我们平常使用大模型对话中:
Token 是模型处理文本的最小单位,而不是简单的“单词”。
例如一句话:
ChatGPT is powerful
可能被拆分为多个 Token:
-
"Chat"
-
"G"
-
"PT"
-
" is"
-
" powerful"
不同模型的切分方式不同,因此 Token 数量也不同。
而对于大模型应用开发工程师来说,Token是API的计费单位,通过合理控制token数量和优化分词策略,工程师能显著提升模型性能与经济效益。
三、Tokenization:Token 是如何产生的?
Tokenization 是将文本转换为 Token 的过程,其本质是:
文本 → Token → Token ID → 模型输入
常见的实现方式包括:
-
BPE(Byte Pair Encoding)
-
SentencePiece
需要注意的是:
同一句话,在不同模型中的 Token 数量可能完全不同。
这会直接影响:
-
API 调用成本
-
Prompt 设计策略
-
RAG 检索效果
四、大模型的本质:Token 预测器
大语言模型(LLM)的核心机制是通过概率预测下一个 token(词元),其本质是一个基于上下文生成概率分布的 token 预测器。这一设计理念决定了模型的生成逻辑、能力边界及局限性。
模型接收输入的 token 序列(如文本片段),通过神经网络计算下一个 token 的概率分布。每一步生成时,模型选择概率最高的 token 或通过随机采样(如温度参数调控)生成多样化输出。
P(tₙ₊₁ | t₁, t₂, ..., tₙ)
也就是说,模型只是基于已有的 Token 序列进行概率计算。
本文是对于token机制的简单概述,对于Token预测的关键技术就不多赘述了。
五、Context Window:模型的“记忆上限”
Context Window 指的是模型一次最多能处理的 Token 数量。
它满足如下约束:
Input Tokens + Output Tokens ≤ Context Window
例如:
-
一个 8K 上下文窗口的模型
-
如果输入占用了 7000 tokens
-
那么最多只能生成 1000 tokens
六、为什么模型会“忘记”?
原因并不是模型能力不足,而是:
1. 上下文窗口限制
当 Token 数超过上限时,早期内容会被截断。
2. 模型没有真实记忆
每一次请求,实际上都是:
-
拼接历史对话
-
加入当前问题
-
重新发送给模型
七、Spring AI 中的体现
在 Spring AI 中:
chatClient.prompt()
.messages(history)
.user("继续")
.call();
history 中的所有内容都会被拼接为 Token 并发送给模型。
如果超过上下文窗口:
-
要么被截断
-
要么请求失败
八、工程优化策略
在实际开发中,需要重点控制 Token 使用:
-
截断历史对话(Sliding Window)
-
压缩上下文(对历史进行总结)
-
控制输出长度(maxTokens)
-
限制 RAG 返回数量(topK)
更多推荐
所有评论(0)