1. 文本分块 (Chunking) :
- 原理 :将长文本分割成多个小于模型最大 Token 限制的块(Chunk)。
- 方法 :
- 简单分割 :按固定长度(如句子数、段落数或字符数估算的 Token 数)分割。
- 重叠分块 (Overlapping Chunks) :每个块包含上一个块的一部分结尾内容,以帮助模型维持上下文连贯性。
- 语义分块 (Semantic Chunking) :根据文本的语义结构(如章节、段落、主题变化)来分割,效果通常更好,但实现更复杂。
- 处理 :
- 独立处理 :分别将每个块发送给模型处理。适用于信息提取、摘要生成等任务,最后可能需要合并结果。
- 顺序处理与状态传递 :处理第一个块,将其输出(或关键信息摘要)作为下一个块输入的一部分,依次传递上下文。适用于需要连贯性的任务,如长文问答或持续对话。
- Map-Reduce 方式 :并行处理所有块(Map 阶段),然后将各块的结果汇总处理(Reduce 阶段)。常用于文档摘要。2. 文本摘要 (Summarization) :
- 原理 :在将文本输入最终任务模型之前,先使用另一个(可能是专门的摘要模型或同一个模型的不同调用)对文本进行摘要,减少 Token 数量。
- 方法 :可以对整个长文本进行摘要,或者对每个分块进行摘要,然后合并摘要结果。
- 优点 :能显著减少 Token 数。
- 缺点 :可能会丢失部分细节信息,摘要本身的质量会影响最终结果。
3. 信息筛选与提取 (Filtering & Extraction) :
- 原理 :根据任务需求,预先从长文本中提取最相关的部分,只将这部分信息输入模型。
- 方法 :可以使用关键词匹配、正则表达式、命名实体识别(NER)或更复杂的嵌入向量相似度搜索来找到相关片段。
- 优点 :输入更聚焦,减少无关信息的干扰。
- 缺点 :需要明确的筛选标准,可能漏掉一些间接相关但重要的信息。
4. 检索增强生成 (Retrieval-Augmented Generation, RAG) : - 原理 :将长文本或文档集合预处理并存储在外部知识库(通常是向量数据库)中。当用户提问或需要处理任务时,先从知识库中检索最相关的文本片段,然后将这些片段连同原始问题/指令一起输入给大模型。- 优点 :非常适合处理海量文档的问答或内容生成,模型只需处理相关的上下文片段,扩展性好。
- 缺点 :需要构建和维护检索系统,检索质量直接影响生成效果。
5. 选择具有更大上下文窗口的模型 :- 原理 :不同的模型具有不同的最大 Token 限制。一些较新的模型(如 GPT-4 Turbo、Claude 3 等)提供了非常大的上下文窗口(例如 128k、200k甚至更大)。
- 优点 :最直接的方法,减少了处理长文本的工程复杂性。
- 缺点 :使用大窗口模型通常成本更高,且即使是最大的窗口也仍然有上限。处理超长上下文时,模型可能会出现“迷失在中间”(Lost in the Middle)的问题,即对输入中间部分的信息关注度下降。6. 优化 Prompt :
- 原理 : 精简你的指令(Prompt),去除冗余的词语、示例或说明,为实际输入内容留出更多空间。
- 方法 : 使用更简洁的表达,减少 few-shot 示例的数量等。
选择哪种方法?
- 对于 单篇长文档问答/摘要 :分块(带重叠或语义分块)+ 顺序处理/Map-Reduce,或者 RAG 是常用方案。
- 对于 海量文档知识库问答 :RAG 是事实上的标准。
- 对于 需要保留大部分细节的长文生成/改写 :分块 + 顺序处理,或者选择大窗口模型。
- 对于 只需要关键信息的任务 :摘要或信息筛选可能足够。
通常,解决这个问题可能需要结合使用上述多种策略。例如,先对文档进行分块,然后使用 RAG 检索最相关的块,再输入给模型。你需要根据具体的应用场景、文本特性、任务需求以及可用资源(模型、算力、成本预算)来选择最合适的方法。网友回复