ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AutoRAG Prev Next Augmenter 详解:基于文档前后文关系的邻近段落扩充模块

2026/9/18 21:46:42 拓冰建站 浏览量
AutoRAG Prev Next Augmenter 详解:基于文档前后文关系的邻近段落扩充模块 AutoRAG Prev Next Augmenter 详解基于文档前后文关系的邻近段落扩充模块【免费下载链接】AutoRAGAutoRAG: Now your agent can find anything in your computer. It gets smarter if you are using it frequently.项目地址: https://gitcode.com/GitHub_Trending/au/AutoRAG导读本文围绕 AutoRAG 的passage_augmenter段落扩充节点中的prev_next_augmenter模块展开讲解如何利用语料库中段落间的前一篇/后一篇prev_id / next_id关联关系为检索结果补充上下文相邻的段落从而缓解切块chunking造成的信息割裂问题。读完本文你将掌握该模块的num_passages、mode两个核心参数的含义与配置方法理解其在 AutoRAG 流水线中的完整调用链从 YAML 配置到PrevNextPassageAugmenter源码实现并学会如何将它与pass_passage_augmenter组合使用以自动评估是否值得使用段落扩充。模块定位passage_augmenter 节点中的邻近段落扩充AutoRAG 将 RAG 流水线拆分为多个节点node每个节点内部可配置若干模块module进行自动评测与择优。passage_augmenter是一个与passage_filter段落过滤职责相反的节点过滤节点删减段落而扩充节点追加段落。prev_next_augmenter是 passage_augmenter 节点内置的两个模块之一其设计灵感来自 LlamaIndex 的Forward/Backward AugmentationPrev/Next Postprocessor示例。核心思想非常直观当一段文档被切分成多个相邻的段落passage/chunk后单独的某一段往往因缺少上下文而信息不完整例如一段只包含表格后半部分、或一句话被截断。此时把该段落前面或后面的相邻段落一并取回就能补全语义。在 passage_augmenter 总览文档 中官方明确将本模块的核心收益概括为passage augmenter allows users to fetch additional passages——即获取额外段落这正是prev_next_augmenter的用途。模块参数详解prev_next_augmenter提供两个可配置参数参数类型默认值说明num_passagesint1在检索到的段落前后追加的段落数量modestrnext扩充方向prev只加前文、next只加后文、both前后都加mode 的三种取值行为prev在每个检索段落的前面追加num_passages个段落next在每个检索段落的后面追加num_passages个段落both在检索段落前后各追加num_passages个段落共 2 ×num_passages个额外段落。参数校验在源码中明确定义mode必须是prev、next、both三者之一否则抛出ValueError。见 prev_next_augmenter.pyif mode not in [prev, next, both]: raise ValueError(fmode must be prev, next, or both, but got {mode})注意虽然模块级默认值是next但节点run_evaluator在调用时也会通过kwargs.pop(mode, both)兜底prev_next_augmenter.py因此在实际流水线中未显式配置时的最终行为取决于 YAML 与代码默认值的交互建议始终在配置中显式写明mode避免歧义。配置示例完整 config.yaml在 AutoRAG 的节点式 YAML 配置中prev_next_augmenter作为passage_augmenter节点的模块被声明。官方文档给出的最小示例prev_next_augmenter.mdmodules: - module_type: prev_next_augmenter num_passages: 1 mode: next将其放入完整节点上下文后参考 passage_augmenter.md 的节点级示例node_lines: - node_line_name: retrieve_node_line # Arbitrary node line name nodes: - node_type: passage_augmenter strategy: metrics: [ retrieval_f1, retrieval_recall, retrieval_precision ] speed_threshold: 5 embedding_model: openai top_k: 5 modules: - module_type: pass_passage_augmenter - module_type: prev_next_augmenter num_passages: 1 mode: next节点级参数top_k 与 embedding_model除模块参数外passage_augmenter 节点还有两个节点级参数需要理解top_k节点级定义最终要保留的段落数。官方文档特别强调top_k必须小于或等于前序 retrieval 节点的top_k否则扩充后无法从中截取足够的结果。这是因为扩充是在检索结果基础上追加段落追加后需要通过打分排序再截断回top_k。embedding_model用于计算查询 ↔ 扩充后段落余弦相似度的嵌入模型默认openai对应 text-embedding-ada-002 系列。该参数直接注入PrevNextPassageAugmenter.__init__并通过EmbeddingModel.load(embedding_model)()实例化见 prev_next_augmenter.py。为什么配置里要同时放 pass_passage_augmenterpass_passage_augmenter是不做任何扩充的直通模块它把上一节点传入的retrieved_contents、retrieved_ids、retrieve_scores原样返回pass_passage_augmenter.py。把它与prev_next_augmenter并列配置AutoRAG 会在同一节点内对两个模块分别跑评测指标并择优。这相当于自动回答当前数据下用不用前/后文扩充效果更好——因为不扩充有时反而是更优选择。AutoRAG 的策略机制strategy中的metrics、speed_threshold、strategy会自动过滤掉不达标的模块并选出最优结果。源码实现前置条件与核心算法前置条件语料必须带 prev_id / next_id 元数据PrevNextPassageAugmenter在初始化时会从项目data/corpus.parquet加载语料并只保留doc_id与metadata两列再从metadata中强制提取prev_id与next_id两个键slim_corpus_df self.corpus_df[[doc_id, metadata]] slim_corpus_df.loc[:, metadata] slim_corpus_df[metadata].apply( filter_dict_keys, keys[prev_id, next_id] )见 prev_next_augmenter.py。这里的filter_dict_keysutil.py要求这两个键必须存在于每条语料的metadata中否则直接抛KeyError。也就是说语料构建阶段必须为每个段落标注其文档内的前驱/后继段落 ID本模块才能工作。需要补充说明prev_id/next_id的赋值发生在数据预处理chunk 阶段或语料构建阶段属于语料元数据的一部分若语料中缺失这两个键prev_next_augmenter无法运行此时应改用pass_passage_augmenter或重新构建带邻接信息的语料。核心算法沿链表逐跳取回前后文pure()是模块入口_pure()是纯算法部分最底层的邻接遍历逻辑在prev_next_augmenter_pure函数中prev_next_augmenter.pydef fetch_id_sequence(start_id, key): sequence [] current_id start_id for _ in range(num_passages): current_id ( corpus_df.loc[corpus_df[doc_id] current_id][metadata] .values[0] .get(key) ) if current_id is None: break sequence.append(current_id) return sequence算法要点对每个检索到的段落 ID以它为起点沿prev_id或next_id逐跳向前/向后遍历最多取num_passages跳任一跳发现prev_id/next_id为None段落位于文档开头/结尾立即停止prev方向取回的序列需要反转后拼接到原 ID 前面保证输出顺序仍然是文档自然顺序前面的段落在前both模式则分别向两个方向取回后再拼接。扩充后的打分与截断扩充完成后模块需要把追加的段落与查询重新打分才能保证追加进来的段落不会污染排序用fetch_contents从语料中取回所有扩充段落的文本util.py用embedding_query_content批量计算查询与扩充段落的嵌入批次大小 128见 prev_next_augmenter.py逐对计算查询与每个段落之间的余弦相似度作为新分数最后按分数降序排序并截断到节点级top_ksort_by_scores与select_top_k见 base.py。这意味着prev_next_augmenter输出的段落顺序不再等同于检索器原本的排序而是扩充后按相关性重排的 Top-k 结果——这一点对下游 generator 的提示词组织有直接影响。调用链与节点运行机制把prev_next_augmenter放到 AutoRAG 完整流水线中其调用链如下配置解析AutoRAG 读取 YAML 中node_type: passage_augmenter下的modules列表实例化各模块节点执行run_passage_augmenter_noderun.py对每个模块执行run_evaluator并测量执行时间评测使用strategy.metrics如retrieval_f1、retrieval_recall、retrieval_precision对扩充结果计算检索类指标。若未配置metrics节点会直接抛出ValueErrorrun.py因此strategy.metrics是 passage_augmenter 节点的必填项择优根据speed_threshold过滤掉过慢的模块再按strategy默认mean选出最优模块落盘每个模块的结果保存为passage_augmenter/{i}.parquet汇总写入summary.csv最优结果写入best_*.parquet并作为该节点输出继续流向下一节点。值得一提的是节点的top_k截断发生在评测之前因此评测结果反映的是扩充重排后的最终 Top-k 质量与下游实际使用保持一致。运行示例与测试验证仓库测试 test_prev_next_augmenter.py 给出了三种模式下的期望行为可帮助理解算法细节设第 n 个文档的段落 ID 连续排列modenext, num_passages1检索到doc_id[1]时输出[doc_id[1], doc_id[2]]即追加了后一个段落modeprev, num_passages1检索到doc_id[3]时输出[doc_id[2], doc_id[3]]即在前方追加modeboth, num_passages1检索到doc_id[3]时输出[doc_id[2], doc_id[3], doc_id[4]]前后各追加一个modeprev, num_passages3多跳遍历最多向前走 3 跳若遇到文档开头prev_id为None则提前终止例如第三个检索段落输出[doc_id[0], doc_id[26], doc_id[27], doc_id[28], doc_id[29]]——注意doc_id[26]到doc_id[29]均位于同一文档内且doc_id[0]是该文档的首段prev_id缺失导致遍历停止。这些断言与源码中fetch_id_sequence的遇 None 即停逻辑完全一致可作为理解模块边界行为文档首尾段落的处理的参考。测试还通过run_evaluator验证了端到端输出retrieved_contents、retrieved_ids、retrieve_scores三列长度一致且每条查询的结果数等于top_k测试中top_k2。使用建议与注意事项语料必须带邻接元数据确保语料metadata中含prev_id、next_id否则模块初始化即失败KeyError。top_k约束节点top_k必须 ≤ 上游 retrieval 节点的top_k否则扩充后的重排截断没有意义。显式声明mode虽然默认值为next建议在 YAML 中显式写出避免依赖实现细节。与不扩充方案对比始终把pass_passage_augmenter与prev_next_augmenter并列配置让 AutoRAG 用评测指标替你判断扩充是否带来增益。扩充成本追加段落意味着额外的嵌入计算embedding_query_contentbatch128与排序开销且num_passages越大追加的段落越多。在speed_threshold敏感的场景下可通过该参数控制模块取舍。小结prev_next_augmenter是 AutoRAG 中利用文档段落邻接关系进行上下文补全的标准模块通过num_passages控制追加深度、mode控制追加方向配合pass_passage_augmenter的对照实验与strategy自动择优让是否需要前/后文扩充成为一个可量化验证的配置决策。其实现建立在语料prev_id/next_id元数据之上核心是沿邻接链逐跳取回并基于余弦相似度重排截断理解这两点即可在生产项目中正确配置与调优该模块。【免费下载链接】AutoRAGAutoRAG: Now your agent can find anything in your computer. It gets smarter if you are using it frequently.项目地址: https://gitcode.com/GitHub_Trending/au/AutoRAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考