使用带有 LLM 的语义搜索时,处理上下文窗口限制需要采取策略来优先处理相关信息,同时保持系统性能。LLM 每次只能处理固定量的文本(例如,4,000 或 8,000 个 token),因此处理大型数据集或长文档时,您需要选择性地包含最相关的内容。核心方法包括预处理数据以提取关键信息、使用检索技术过滤输入,以及设计能够根据任务动态调整上下文的系统。
首先,将大型数据集分解为适合模型上下文窗口的易于管理的块(chunk)。例如,将文档分割成段落或章节,并使用嵌入(embedding)对其进行索引。当查询到达时,使用语义相似度(例如,余弦相似度)检索与查询最相关的 top-k 个块。这减少了输入到 LLM 的文本量,同时保留了上下文。FAISS 或向量数据库等工具可以高效地搜索嵌入以查找匹配项。但是,应避免任意分块:使用逻辑边界(例如,章节标题)或带有重叠的滑动窗口,以防止分割连贯的想法。例如,一个 512 个 token 的块带有 64 个 token 的重叠,可以确保相邻部分之间的连续性。
其次,实施两阶段检索过程。使用快速、轻量级模型(如 BM25 或小型 transformer)进行初步的广泛过滤,然后使用 LLM 进行更精细的重排序。例如,如果用户搜索“机器学习优化技术”,首先使用关键词匹配检索 100 个候选段落,然后使用 LLM 对最符合查询意图的 top 5 段落进行评分和选择。这平衡了速度和准确性。此外,缓存常见查询或常用结果可以减少冗余处理。如果您的应用程序处理重复性问题(例如,FAQ 式查询),可以存储预先计算好的响应或嵌入,以绕过完整的检索步骤。
最后,优化上下文在窗口中的结构方式。将最关键的信息(例如,查询、热门结果)放在上下文的开头或结尾,因为某些模型对这些位置的处理效果更好。对于冗长的源,可以使用摘要:在将检索到的块喂给 LLM 之前,生成简洁的摘要。例如,将 1,000 个 token 的文章部分总结成 200 个 token 的摘要。如果 LLM 支持,可以利用“上下文压缩”等技术在处理过程中丢弃不太相关的 token。LangChain 的 map-reduce 管道等工具可以将任务分解为子任务(例如,总结单个块)并合并结果。务必测试不同的块大小和检索阈值,为您的特定用例找到完整性和性能之间的最佳平衡。