返回列表

上下文窗口不是越大越好:企业该怎么理解模型的记忆?

企业的知识问题通常更适合用检索解决,在多数场景下超长上下文并非最优选择。上下文窗口指的是模型单次能处理的 token 上限,输入与输出共用这个额度;窗口拉长,成本和延迟同步上升,位于中间位置的内容利用率还会下降。把少量高相关片段挑出来送进模型,在多数场景下比把全部文档塞进去更为准确,成本也更低。

 

 

上下文窗口

 

 

统计语言模型阶段,主流做法是 n-gram:用前 n-1 个词预测下一个词。视野是固定的小格子,超出这个格子就看不见,n 稍微放大一点,数据稀疏问题立刻压过来。

 

循环神经网络改变了这一点。RNN 把读过的历史压进一个定长隐状态,理论上能处理任意长序列,实际上越靠前的信息越被稀释,梯度在长距离回传时也容易消失。LSTM 用输入门、遗忘门、输出门改善了记忆衰减,隐状态依然是那条卡住的瓶颈。

 

注意力机制缓解了这个瓶颈。序列里任意两个位置可以直接建立关联,距离不再构成障碍。代价明码标价:每处理一个新 token,都要与前面所有 token 计算一遍关联度,计算量随长度呈平方增长,注意力权重的存储也同步膨胀。

 

窗口就是给这条平方曲线设的上限,由硬件预算和延迟预算共同决定。它是工程妥协的产物,把它当成能力指标去横向比大小,容易误判。

 

 

中间那段内容,为什么最容易丢

 

根据 Liu 等人在 2023 年发表的论文《Lost in the Middle: How Language Models Use Long Contexts》,将一段长材料中能回答问题的那句话分别放在开头、中部、结尾,再让模型作答。结果呈现 U 型曲线,开头和结尾位置的答案被找到的比例明显更高,放在中部的答案明显更低,这个现象被概括为 Lost in the Middle。

 

这里的机制层面有两个原因。注意力权重在长序列上被大量位置摊薄,归一化之后分给单个位置的权重变小,中间段落拿到的份额最尴尬。训练语料的分布也在起作用,答案紧跟在问题附近的样本占多数,长距离依赖的样本相对稀少,模型对这类依赖学得弱。

 

放到企业场景里,这件事的风险有明确指向。合规条款、技术参数、责任划分、例外情形,这些内容在文档里通常不长在开头或结尾,偏偏又是最不能被漏掉的部分。全量塞入时,它们的命中率可能下降,错漏较易出现在企业最在意的段落上。

 

 

成本账要按输入算

 

 

输入和输出分开计价,输出单价通常更高,输入量级大得多。多数企业问答场景里,账单的大头在输入这一侧。

 

请求进来后,模型要把整个输入重新计算一遍,这一步叫 prefill;计算过程中产生的 Key/Value 张量会被缓存下来供生成阶段复用,这就是 KV Cache。KV Cache 随上下文长度线性增长,占用的是 GPU 显存,而显存大小直接决定一台机器能同时服务多少并发。prefill 的时间同样随输入长度增长,用户感知到的首字返回随之变慢。

 

多轮对话是另一个放大器。历史轮次会原样累加进下一次请求,第 10 轮的输入携带了前 9 轮的全部内容,账单和延迟在无声变大。

 

平方项也还在。在特定条件下,一次 128K 的调用,成本可能高于 8K 的十六次调用,响应速度也可能更慢。

 

 

从倒排索引走到向量

 

关键词检索走的是倒排索引这条路,先记录每个词出现在哪些文档里,再用 TF-IDF 之类的权重算法给文档打分,后来演进到概率模型 BM25,回答的问题是"包含这些词的文档有哪些"。

 

稠密向量检索是另一条路。嵌入模型把文本映射成高维向量,语义相近的文本在向量空间里距离更近,配合近似最近邻索引(HNSW、IVF_FLAT 等)查找,回答的问题是"意思相近的段落有哪些"。

两路的短板正好错开。关键词检索对产品型号、条款编号、人名、错误码这类精确串较为准确,遇到同义改写就失效。向量检索对表述变化容错,遇到 "KT-8800" 或 "第 3.2.1 条" 这类精确串容易失手。

 

融合时有个常踩的坑:余弦相似度的取值有界,BM25 的取值无界,两者直接加权相加,量纲大的一方会主导排序。RRF(倒数排名融合)改用名次投票,绕开了量纲问题;对精度要求更高的场景,再叠加 cross-encoder 做一次精排。

 

账可以算得很具体。以 1024 维向量为例,向量数据占用存储空间,但检索返回的文本量远小于全量文档,两者输入 token 量级差异显著。离线评测上,recall@10 值得长期盯,它测的是"正确片段有没有进前 10 名",比在线反复改提示词有效得多。

 

 

分块决定检索的上限

 

检索再准,也只能从切好的块里挑,块的质量很大程度上影响检索效果的上限。

 

最早的做法是按固定字符数切,实现简单,代价是句子被腰斩、表格被拆散、论证链条断裂,切出来的片段单独看常常没有意义。之后按文档结构切,标题、段落、Markdown 层级成为天然边界,语义完整性好了不少。再往后是按语义切:计算相邻句子的向量相似度,在相似度明显下降的位置下刀。

 

块大小的取舍很现实。块太小,片段缺少上下文,模型拿到也答不全;块太大,噪声混进来,token 又上去了。相邻块之间留一定重叠能缓解边界切断,重叠本身也带来存储膨胀和重复召回的开销。

 

 

小艾智能体的做法

 

小艾智能体的文档处理流程可参考这一思路设计。文件上传后可自动识别格式并提取文本,用语义分块切分为带独立意义的片段,经 BGE-M3(北京智源研究院发布,1024 维)转换为向量存入 Milvus(Zilliz 开源向量数据库),同时由 Elasticsearch(Elastic 公司全文检索引擎)维护关键词索引。提问时可采用混合检索,向量检索用于语义相近匹配,关键词检索用于锁定型号与条款号,融合后的少量片段再送进大模型。整条流程可由 LangGraph(LangChain 团队开发的工作流编排框架)编排,检索、重排、生成、回写各节点可支持单独调整。对于希望控制成本又在意答案可靠性的企业,这种结构有助于在控制成本的同时提升答案可靠性。