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-mini(OpenAI) |
verbose | 是否打印重排序中间过程(如 LLM 输出的新排列) | False |
batch | 批次大小,即一次并发处理多少个 query 的重排序任务 | 16 |
rankgpt_rerank_prompt | 自定义重排序 prompt 模板 | RankGPT 默认 prompt |
注意:原文档默认 LLM 记为gpt-3.5-turbo-16k,而当前仓库源码中默认值已是OpenAI(model="gpt-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 都要调用一次 LLM,batch控制同时进行多少个异步调用。源码 rankgpt.py 中,每个 query 的重排序任务被构造成async_postprocess_nodes协程,再交给process_batch(tasks, batch_size=batch)分批执行。由于每个任务都可能携带很长的 prompt(候选 passage 全部拼进一条指令),batch过大容易触发 LLM 的 token 上限或并发 OOM,文档明确建议"choose wisely"。测试用例中同时覆盖了默认 batch 与batch=1的串行模式(见 test_rankgpt.py),供低资源环境参考。
verbose与自定义 prompt
verbose=True时,模块会在重排序完成后打印 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); - 实例化
AsyncRankGPTRerank(AutoRAG 对 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_n=3时返回 3 个NodeWithScore; - 模块级
_pure:分别以默认 batch 与batch=1运行,验证重排结果结构正确; - 节点级
run_evaluator:验证通过llm: openai字符串配置、传入 LLM 实例两种方式都能正确跑通,且top_k生效。
测试中llm同时支持"openai"字符串和OpenAI(model="gpt-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),仅供参考