返回博客列表

Token、上下文窗口与 RAG 的工程取舍

HUTAO667
AI 应用开发 RAG Token

从 Token、上下文预算、资料切块到检索质量,讨论 AI 应用中准确性、速度与成本的取舍。

做 RAG 或 AI 助手时,很容易有一种直觉:模型的上下文越长,就把越多资料直接塞进去;资料越多,回答应该越准确。

实际做下来会发现,这个直觉并不可靠。

模型并不是按“多少页文档”或“多少个汉字”处理输入,而是按 Token 处理。上下文变长会带来成本、延迟和注意力分散的问题;检索到的内容太少,模型缺少依据;检索到的内容太多,又可能把真正关键的信息淹没。

所以 RAG 的重点不是单纯给模型更多资料,而是在用户问题、可用上下文和资料质量之间做取舍。

Token 是模型实际处理的单位

用户看到的是文字,模型实际处理的是 Token。

一段文字进入模型前,会先被 Tokenizer 切分成 Token,再映射成 Token ID 和向量。Token 不一定等于一个完整的汉字、英文单词或字符;它可能是子词、标点、空格、字节片段或特殊标记。

这意味着“这篇文档有多少字”不能直接推导出它会占用多少上下文。同一段内容在不同模型、不同 Tokenizer 下,Token 数也可能不同。

系统指令、用户问题、历史对话、工具调用结果、RAG 检索片段和模型输出,都会一起占用上下文窗口。真正可用的空间,通常比只看用户输入时想象得更少。

因此,做 AI 应用时不应该把某个“一个 Token 等于几个字”的经验值当成固定公式。需要精确估算时,应该使用目标模型或接口对应的 Tokenizer;只需要粗略规划时,也要给输出和工具结果预留空间。

长上下文不等于模型一定更会回答

更长的上下文窗口让模型能够看到更多信息,但它不能保证模型会稳定地抓住最重要的内容。

如果把整份产品文档、历史记录和无关说明全部塞进提示词,模型可能会:

  • 忽略真正和问题有关的段落;
  • 受到旧版本或互相矛盾内容的干扰;
  • 生成成本更高、响应更慢;
  • 在有限输出空间里给出更泛的回答。

这不是说长上下文没有价值。对需要比较多个文档、理解较长链路或分析一段代码时,它很有用。问题在于,长上下文只是容量,不是自动的知识组织能力。

在实际产品中,更重要的是先判断:用户这次的问题到底需要哪些资料?哪些内容是当前版本?哪些内容只是背景,不应该参与回答?

RAG 解决的是“按问题找资料”,不是永久记忆

RAG 的基本流程并不复杂:把资料清洗、切块并建立索引;用户提问后,先找出相关片段,再把这些片段连同问题交给模型回答。

它的价值在于,模型不必依赖训练阶段从未见过的私有资料,而可以在回答前读取与问题相关的依据。

但 RAG 也不是给模型外挂一个永远准确的记忆。

检索系统只负责找到“可能相关”的片段。它不会天然知道哪份文档已经过时,不会自动解决同一概念在不同版本里写法不一致的问题,也不能保证切分后每个片段仍保留完整语义。

所以,RAG 的效果很大程度上取决于知识本身是否可用:文档是否清楚、版本是否可辨认、切块是否保留了必要上下文、检索结果是否真的和用户问题相关。

切块不是越细越好,也不是越长越好

资料切块时,常见的两个极端都容易出问题。

切得太小,单个片段可能只剩一句结论,没有前提、对象或操作步骤。模型拿到它以后,容易把结论用到错误的场景。

切得太大,一个片段里会混入多个主题。它虽然看起来信息完整,但检索时很难精确命中,也会占用更多上下文。

更实用的思路是围绕资料的自然结构切分:一个功能说明、一个故障排查步骤、一条配置规则、一个问答单元,通常比按固定字数生硬截断更容易保留语义。

必要时还应把标题、版本、产品模块或来源位置作为元信息保留。这样在检索到片段后,模型和用户都更容易判断它适用于什么场景。

检索质量比“塞得多”更重要

如果用户问的是某个功能怎样配置,最有价值的可能是一段当前版本的操作说明,而不是十段泛泛相关的介绍。

如果用户问的是某个报错,最有价值的可能是包含复现条件、错误信息和解决步骤的记录,而不是整个项目的概览。

因此,检索结果进入模型前最好再经过一层判断:

  • 结果是否真的回答了当前问题?
  • 来源是否属于当前有效版本?
  • 多个片段之间是否互相矛盾?
  • 是否需要把来源或不确定性告诉用户?

这层判断可以由规则、人工维护、模型重排或它们的组合完成。具体方式取决于产品规模,但目标始终一样:让模型看到少而可靠的依据,而不是大量模糊相关的内容。

上下文预算是一项产品决策

上下文窗口不是一个单纯的模型参数,它会直接影响用户体验。

给每次请求加入更多资料,可能提高部分问题的覆盖度,也可能增加费用和等待时间。保留完整历史对话,可能让回答更连贯,也可能把已经失效的偏好和内容一直带下去。

所以,一个 AI 应用通常需要先决定:

  • 哪些信息每次都必须带上;
  • 哪些信息应该按问题检索;
  • 哪些历史需要摘要、压缩或丢弃;
  • 哪些资料必须标注版本或失效状态;
  • 用户在什么情况下需要看到回答依据。

这些选择不会有一套适合所有产品的固定答案。客服知识库、个人笔记助手、代码问答和内部业务助手,面对的资料形态、错误成本和用户期待都不一样。

结语

模型上下文再长,也不会自动替产品整理知识。RAG 再完整,也不能替人判断资料是否正确、是否最新、是否适用于当前问题。

我现在更愿意把它们看成一套信息取舍机制:Token 决定模型实际能处理什么;上下文窗口决定一次请求能带多少信息;RAG 决定哪些信息值得带进去;产品设计决定怎样在准确性、速度和成本之间取舍。

当这些边界被考虑清楚后,AI 助手才更可能从“偶尔答对”变成一个能在真实资料上稳定工作的工具。