ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AutoRAG RankGPT 重排序模块:用 LLM 实现基于排列的 Passage 重排序

AutoRAG RankGPT 重排序模块:用 LLM 实现基于排列的 Passage 重排序 AutoRAG RankGPT 重排序模块用 LLM 实现基于排列的 Passage 重排序【免费下载链接】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导读RankGPT 是 AutoRAGpassage_reranker节点下基于 LLM 的深度重排序模块。它不依赖交叉编码器打分而是直接让 GPT 等大语言模型以排列生成permutation generation的方式一次性地对检索到的候选 passage 重新排序。本篇文章围绕 legacy/docs/source/nodes/passage_reranker/rankgpt.md 展开讲解其模块参数、配置 YAML 写法、底层实现原理与测试验证并结合 源码 说明它在 AutoRAG 优化流程中的完整调用链。RankGPT 模块是什么在 RAG 流水线中passage_reranker是紧跟在检索之后的重排序环节第一次检索如 BM25、向量检索会召回一批候选 passage重排序模块再依据它们与 query 的相关性重新排列顺序把最相关的内容优先送给后续的 prompt maker 与 generator。AutoRAG 的 passage_reranker 节点文档 中收录了 tart、monot5、upr、cohere、colbert 等十余种重排序模块而 RankGPT 属于其中少数依赖通用 LLM的模块。RankGPT 的核心思路来自同名开源项目 RankGPT它不输出逐条的相关性分数而是构造一段包含所有候选 passage 的指令让 LLM 直接输出一个新的排列顺序。AutoRAG 将其封装为passagereranker节点下的一个模块集成方式是通过 LlamaIndex 的RankGPTRerankpostprocessor见 rankgpt.py因此它可以复用 AutoRAG 的整个 LLM 配置体系。模块参数详解原文档定义的全部参数如下表参数在 YAML 中位于modules列表内、module_type: rankgpt之下参数含义默认值llm用于 RankGPT 重排序的 LLM。可以是 LlamaIndex LLM 类名如openai其余参数作为 LLM 的初始化 kwargs 直接透传也可以是已实例化的 LLM 对象gpt-4o-miniOpenAIverbose是否打印重排序中间过程如 LLM 输出的新排列Falsebatch批次大小即一次并发处理多少个 query 的重排序任务16rankgpt_rerank_prompt自定义重排序 prompt 模板RankGPT 默认 prompt注意原文档默认 LLM 记为gpt-3.5-turbo-16k而当前仓库源码中默认值已是OpenAI(modelgpt-4o-mini)见 rankgpt.py本文以源码为准。llm参数的设置方式llm的配置方式与llama_index_llmgenerator 模块完全一致把llm设为 LlamaIndex LLM 类的注册名其余键model、temperature、api_base、api_key、max_tokens等会作为 kwargs 传入 LLM 类构造函数。在 rankgpt.py 中AutoRAG 通过generator_models注册表解析类名并用pop_params过滤出构造函数可接受的参数if not isinstance(llm, LLM): llm_class generator_models[llm] llm_param pop_params(llm_class.__init__, kwargs) self.llm llm_class(**llm_param) else: self.llm llm因此你既可以在 YAML 里用字符串类名配置推荐也可以在 Python 代码中直接传入一个 LlamaIndex LLM 实例。AutoRAG 支持的 LLM 类型openai、azure_openai、openailike、ollama、bedrock等参见 local_model.md这也是 RankGPT 能接本地 Ollama、HuggingFace 模型的原因。batch的取舍RankGPT 的每个 query 都要调用一次 LLMbatch控制同时进行多少个异步调用。源码 rankgpt.py 中每个 query 的重排序任务被构造成async_postprocess_nodes协程再交给process_batch(tasks, batch_sizebatch)分批执行。由于每个任务都可能携带很长的 prompt候选 passage 全部拼进一条指令batch过大容易触发 LLM 的 token 上限或并发 OOM文档明确建议choose wisely。测试用例中同时覆盖了默认 batch 与batch1的串行模式见 test_rankgpt.py供低资源环境参考。verbose与自定义 promptverboseTrue时模块会在重排序完成后打印 LLM 输出的新排列方便调试见 rankgpt.py。rankgpt_rerank_prompt则透传给 LlamaIndex 的RankGPTRerank用于替换默认的请对以下 passage 按相关性排序并输出排列式 prompt。配置示例与完整 YAML原文档给出的核心示例modules: - module_type: rankgpt llm: openai model: gpt-4 temperature: 0.5 verbose: False batch: 8把这一模块放进passage_reranker节点的完整配置参考 sample_config/rag/english/gpu/full.yaml 的节点结构node_lines: - node_line_name: retrieve_node_line nodes: - node_type: passage_reranker strategy: metrics: [retrieval_f1, retrieval_recall, retrieval_precision] speed_threshold: 10 top_k: 5 modules: - module_type: pass_reranker - module_type: rankgpt llm: openai model: gpt-4 temperature: 0.5 verbose: False batch: 8关键点说明top_k是节点级参数决定重排序后保留的 passage 数量也就是最终进入生成器的候选数量strategy.metrics支持retrieval_f1、retrieval_recall、retrieval_precision用于在多个模块间做自动择优speed_threshold为可选的耗时上限秒超过阈值的模块会被过滤把pass_reranker与rankgpt放在一起可以自动对比不用重排序与用 RankGPT的效果差异。仓库中sample_config/rag/english/gpu/、sample_config/rag/english/gpu_api/下的 compact/half/full 多份示例以及 sample_config/rag/full.yaml 均收录了module_type: rankgpt可作为现成的参考配置。底层实现原理从检索结果到排列重排RankGPT.pure首先通过BasePassageReranker.cast_to_run见 base.py从上一节点结果中取出query、retrieved_contents、retrieve_scores、retrieved_ids四列然后进入_pure执行重排。核心流程如下将每条 query 包装为QueryBundle把(content, score)对包装成NodeWithScore保留检索阶段的原始分数见 rankgpt.py实例化AsyncRankGPTRerankAutoRAG 对 LlamaIndexRankGPTRerank的异步封装对每个 query 构造排列指令调用 LLM 获取新排列再按排列重排节点并截取top_k见 rankgpt.py汇总重排后的 contents、ids并生成伪分数。伪分数的生成由于 RankGPT 只给出排列、不给出逐条分数AutoRAG 用np.linspace(1.0, 0.0, len(res[0]))生成从 1 递减到 0 的等距序列作为retrieve_scores见 rankgpt.py即排名第一的 passage 得 1.0最后一名趋近 0。这意味着下游节点不应把 RankGPT 的分数当作真实置信度而应只看相对顺序。异常兜底如果 LLM 返回内容为空async_postprocess_nodes会直接返回原始节点顺序的前top_k个结果保证流水线不会因 LLM 异常而中断见 rankgpt.py。节点运行与择优在节点层run.py 会读取项目data/qa.parquet中的retrieval_gt构造MetricInput对每个模块执行measure_speed计时再用evaluate_retrieval_node计算检索类指标最后按strategy过滤并选出is_best模块结果写入passage_reranker/summary.csv与best_*.parquet。RankGPT 的__del__还会显式释放 LLM 并调用empty_cuda_cache()见 rankgpt.py及时清空显存。测试验证仓库对 RankGPT 模块有完整测试见 test_rankgpt.py覆盖排列解析用 mock 的OpenAI.achat返回[2] [1] [3]验证 LLM 输出被正确解析为排列并重排节点异步重排序AsyncRankGPTRerank.async_postprocess_nodes在top_n3时返回 3 个NodeWithScore模块级_pure分别以默认 batch 与batch1运行验证重排结果结构正确节点级run_evaluator验证通过llm: openai字符串配置、传入 LLM 实例两种方式都能正确跑通且top_k生效。测试中llm同时支持openai字符串和OpenAI(modelgpt-4o)实例两种形态与源码中的双分支初始化逻辑一一对应。适用场景与注意事项适用场景候选 passage 数量适中、追求排序质量的场景。由于 LLM 会把所有候选拼进一条指令候选数量过多会显著放大 token 消耗与延迟因此通常用在检索后候选已被初步控制的情况下。成本与延迟每个 query 至少一次 LLM 调用batch过大会同时推高 token 用量与并发压力建议结合speed_threshold评估是否值得。分数语义输出分数为伪分数线性插值只反映相对顺序不要用于阈值截断类下游逻辑。模型兼容llm可换成任意 AutoRAG 支持的 LlamaIndex LLM含 Ollama 等本地模型参考 local_model.md但本地模型需自行评估其排列指令遵循能力。总结RankGPT 为 AutoRAG 的passage_reranker节点提供了一个LLM 直接重排的选项通过llm、verbose、batch、rankgpt_rerank_prompt四个参数即可接入配合节点级top_k与strategy自动择优机制可以快速验证用 LLM 重排序相对其他重排序器tart、monot5、upr 等在retrieval_f1/recall/precision上的收益。其源码实现清晰展示了如何复用 LlamaIndex 生态的RankGPTRerank并处理了异步批处理、伪分数生成与异常兜底等工程细节。【免费下载链接】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),仅供参考
返回列表