无需训练让 LLM 支持超长输入的四种主流方案
随着大语言模型(LLM)的快速发展,上下文窗口(Context Window)的长度成为了限制其处理长文档、复杂任务的关键瓶颈。虽然部分厂商推出了原生支持超长上下文的模型,但大多数场景下,我们仍需要在现有模型基础上扩展输入长度。本文总结了四种无需重新训练即可实现超长输入的主流技术方案,涵盖显式搜索、隐式搜索、并行输入及并行解码。
1. 显式搜索:知识库外挂(RAG 模式)
这是目前最成熟且应用最广泛的方法,核心思想是将长文本切分后存入向量数据库,通过检索相关片段来补充上下文。
核心流程
- 文本解析与切分:将长文本拆分为语义完整的 Chunk。关键在于保留段落完整性,高质量解析表格和结构化数据。常用的策略包括重叠切分(Overlap),例如每段重叠 250 字,以保留上下文连贯性。
- 文本向量化:使用 Embedding 模型将文本转换为向量。中文场景可选用 BGE、M3E 等模型。若领域垂直度高,可基于 SimCSE 或 Consert 进行微调。需注意截断带来的信息损失,可通过拼接摘要或标题辅助召回。
- 向量入库:选择高效的向量检索数据库,如 Milvus、Pinecone 等。需考虑索引构建速度与查询延迟的平衡。
- 用户问题改写:在多轮对话中,利用历史对话对当前 Query 进行改写,提高检索准确性;或直接使用原始 Query 召回,在生成阶段引入历史上下文。
- 召回与生成:基于向量相似度检索 Top-K 或阈值召回的相关文档。最后将召回内容拼接至 Prompt 中进行答案生成。此步骤常结合模型摘要能力压缩长文本。
优缺点
- 优点:实现简单,生态成熟(LangChain 等框架支持良好),适合大规模知识问答。
- 缺点:仅支持 NLU 任务,破坏了输入文本的原始顺序和全局上下文连续性,存在检索噪声风险。
2. 隐式搜索:Unlimiformer
Unlimiformer 提出了一种针对 Encoder-Decoder 架构的无限长度输入方法,本质是在解码阶段对 Token 粒度的输出层 Embedding 进行检索。
技术原理
- 重叠切分编码:采用 50% 重叠率将超长输入切块,独立通过 Encoder 编码,绕过 Attention 的平方复杂度。输出每段文本后半部分每个 Token 的最上层 Embedding,写入 Faiss 向量索引。
- Token 级检索:在解码每一步,Query 检索注意力最高的 Top-K 个输入 Token,作为编码器信息用于解码器计算。
- 存储优化:为降低 O(LNseq_len) 的存储开销,作者改变了 QK 计算顺序,利用映射矩阵对 Q 进行变换,仅需存储一份 seq_len 的编码向量,以时间换空间。
代码实现要点
# 超长文本编码示例
for context_start_ind, context_end_ind in window_indices:
chunk = input_ids[:, context_start_ind:context_end_ind]
hidden_states = self.model(chunk, attention_mask=chunk_attention_mask)
last_hidden = hidden_states.encoder_last_hidden_state
# 提取后半部分 Embedding 存入索引
适用场景
适用于单文档 QA、长文本摘要等 Encoder-Decoder 场景。相比 RAG,它保留了更多 Token 级细节,但存储成本更高,不适合批量文档存储。
3. 并行输入:PCW (Parallel Context Windows)
PCW 专为 Decoder 模型设计,通过对超长文本切块并独立编码,在解码时对全部上文进行 Attention 计算。


