检索后重排序 #
本文档引用的文件
目录 #
简介 #
检索后重排序(Reranking)是现代RAG(检索增强生成)系统中的关键优化技术,它通过重新评估检索到的文档的相关性来显著提升最终答案的质量。本文档深入分析LangGraphGo框架中实现的检索后重排序机制,重点关注BuildAdvancedRAG方法如何构建包含rerank节点的图结构,以及RAGConfig中相关配置参数的作用。
项目结构概览 #
LangGraphGo项目采用模块化设计,将RAG功能分为多个核心模块:
graph TB
subgraph "示例应用"
A[rag_advanced/main.go]
B[rag_basic/main.go]
C[rag_conditional/main.go]
end
subgraph "核心库"
D[prebuilt/rag.go]
E[prebuilt/rag_components.go]
F[prebuilt/rag_test.go]
end
subgraph "支持组件"
G[graph/]
H[tool/]
I[checkpoint/]
end
A --> D
A --> E
B --> D
C --> D
D --> G
E --> G
图表来源
- [examples/rag_advanced/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/rag_advanced/main.go#L1-L223)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L1-L392)
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L1-L333)
章节来源
- [examples/rag_advanced/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/rag_advanced/main.go#L1-L223)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L1-L392)
核心组件分析 #
RAGConfig配置结构 #
RAGConfig结构体定义了RAG管道的所有配置参数,其中与重排序直接相关的有两个关键字段:
| 配置参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
UseReranking |
bool |
false |
是否启用重排序功能 |
IncludeCitations |
bool |
true |
是否包含源文档引用 |
这些配置参数控制着RAG管道的行为模式,特别是在高级RAG管道中发挥重要作用。
Reranker接口设计 #
Reranker接口定义了重排序的核心功能:
classDiagram
class Reranker {
<<interface>>
+Rerank(ctx Context, query string, documents []Document) ([]DocumentWithScore, error)
}
class SimpleReranker {
+Rerank(ctx Context, query string, documents []Document) ([]DocumentWithScore, error)
}
class DocumentWithScore {
+Document Document
+Score float64
}
Reranker <|.. SimpleReranker : 实现
SimpleReranker --> DocumentWithScore : 创建
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L52-L55)
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L206-L261)
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L69-L91)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L52-L55)
架构概览 #
Advanced RAG管道架构 #
Advanced RAG管道通过BuildAdvancedRAG方法构建,包含检索、重排序和生成三个主要阶段:
graph LR
A[查询] --> B[检索节点]
B --> C{启用重排序?}
C --> |是| D[重排序节点]
C --> |否| E[生成节点]
D --> E
E --> F{包含引用?}
F --> |是| G[格式化引用节点]
F --> |否| H[结束]
G --> H
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L148-L191)
条件RAG管道架构 #
条件RAG管道增加了基于相关性阈值的智能路由:
graph TD
A[查询] --> B[检索节点]
B --> C[重排序节点]
C --> D{相关性得分 ≥ 阈值?}
D --> |是| E[生成节点]
D --> |否| F{启用回退?}
F --> |是| G[回退搜索节点]
F --> |否| E
G --> E
E --> H{包含引用?}
H --> |是| I[格式化引用节点]
H --> |否| J[结束]
I --> J
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L193-L249)
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L148-L191)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L193-L249)
详细组件分析 #
BuildAdvancedRAG方法实现 #
BuildAdvancedRAG方法是构建包含重排序功能的RAG管道的核心逻辑:
flowchart TD
Start([开始构建]) --> CheckRetriever{检查检索器}
CheckRetriever --> |无效| Error1[返回错误]
CheckRetriever --> |有效| CheckLLM{检查LLM}
CheckLLM --> |无效| Error2[返回错误]
CheckLLM --> |有效| AddRetrieve[添加检索节点]
AddRetrieve --> CheckReranking{启用重排序?}
CheckReranking --> |是且有重排序器| AddRerank[添加重排序节点]
CheckReranking --> |否或无重排序器| SkipRerank[跳过重排序]
AddRerank --> AddGenerate[添加生成节点]
SkipRerank --> AddGenerate
AddGenerate --> CheckCitations{包含引用?}
CheckCitations --> |是| AddCitations[添加引用格式化节点]
CheckCitations --> |否| Finalize[完成构建]
AddCitations --> Finalize
Finalize --> Success([构建成功])
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L148-L191)
rerankNode节点实现 #
rerankNode是RAG管道中的关键节点,负责处理重排序逻辑:
sequenceDiagram
participant Pipeline as RAG管道
participant RerankNode as rerankNode
participant Reranker as 重排序器
participant State as RAG状态
Pipeline->>RerankNode : 传递查询和检索到的文档
RerankNode->>RerankNode : 检查重排序器是否存在
alt 重排序器存在
RerankNode->>Reranker : 调用Rerank方法
Reranker-->>RerankNode : 返回重排序后的文档列表
RerankNode->>State : 更新RankedDocuments
RerankNode->>State : 更新Documents为重排序后的顺序
else 重排序器不存在
RerankNode->>RerankNode : 使用简单递减分数分配
RerankNode->>State : 更新RankedDocuments
end
RerankNode-->>Pipeline : 返回更新的状态
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L277-L308)
NewSimpleReranker实现 #
NewSimpleReranker提供了基础的关键词匹配重排序算法:
flowchart TD
Start([开始重排序]) --> ParseQuery[解析查询词]
ParseQuery --> InitScores[初始化分数数组]
InitScores --> LoopDocs[遍历所有文档]
LoopDocs --> ExtractContent[提取文档内容]
ExtractContent --> CountTerms[统计查询词出现次数]
CountTerms --> NormalizeScore[归一化分数]
NormalizeScore --> StoreScore[存储分数]
StoreScore --> MoreDocs{还有更多文档?}
MoreDocs --> |是| LoopDocs
MoreDocs --> |否| SortScores[按分数降序排序]
SortScores --> CreateResults[创建DocumentWithScore列表]
CreateResults --> End([返回结果])
图表来源
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L216-L261)
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L148-L191)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L277-L308)
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L216-L261)
配置参数详解 #
UseReranking参数 #
UseReranking参数控制是否在RAG管道中启用重排序功能:
| 配置值 | 行为描述 | 影响范围 |
|---|---|---|
true |
启用重排序节点,使用配置的Reranker | 所有检索到的文档都会被重新评分 |
false |
跳过重排序节点,保持原始检索顺序 | 文档顺序完全由向量相似度决定 |
IncludeCitations参数 #
IncludeCitations参数控制是否在最终答案中包含源文档引用:
| 配置值 | 行为描述 | 输出影响 |
|---|---|---|
true |
在生成的答案末尾添加源文档引用列表 | 提供透明性和可追溯性 |
false |
不添加任何引用信息 | 答案更加简洁但缺乏来源信息 |
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L73-L74)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L78-L79)
重排序前后的文档顺序变化 #
在rag_advanced示例中,重排序的效果可以通过以下方式观察:
graph LR
subgraph "检索阶段"
A[文档1: 向量数据库介绍]
B[文档2: LangGraph概述]
C[文档3: RAG技术原理]
D[文档4: 重排序技术]
end
subgraph "重排序阶段"
E[文档4: 重排序技术<br/>高相关性分数]
F[文档1: 向量数据库介绍<br/>中等分数]
G[文档3: RAG技术原理<br/>中等分数]
H[文档2: LangGraph概述<br/>低分数]
end
A --> E
B --> F
C --> G
D --> H
图表来源
- [examples/rag_advanced/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/rag_advanced/main.go#L180-L210)
章节来源
- [examples/rag_advanced/main.go](https://github.com/smallnest/langgraphgo/blob/main/examples/rag_advanced/main.go#L180-L210)
依赖关系分析 #
组件间依赖关系 #
graph TD
subgraph "配置层"
Config[RAGConfig]
end
subgraph "管道层"
Pipeline[RAGPipeline]
Graph[MessageGraph]
end
subgraph "组件层"
Retriever[Retriever接口]
Reranker[Reranker接口]
LLM[LLM模型]
end
subgraph "实现层"
VectorRetriever[VectorStoreRetriever]
SimpleReranker[SimpleReranker]
InMemoryVectorStore[InMemoryVectorStore]
end
Config --> Pipeline
Pipeline --> Graph
Pipeline --> Retriever
Pipeline --> Reranker
Pipeline --> LLM
Retriever --> VectorRetriever
Reranker --> SimpleReranker
Retriever --> InMemoryVectorStore
图表来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L108-L123)
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L206-L261)
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L108-L123)
- [prebuilt/rag_components.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag_components.go#L206-L261)
性能考虑 #
重排序性能优化 #
- 批处理优化: 重排序器可以一次性处理多个文档,减少调用开销
- 内存管理:
DocumentWithScore结构体优化了内存使用,避免不必要的数据复制 - 算法复杂度: 当前的简单重排序算法时间复杂度为O(n*m),其中n是文档数量,m是查询词数量
内存使用优化 #
- 使用切片而非数组提高内存效率
- 及时释放不需要的中间状态
- 通过接口抽象减少具体类型依赖
故障排除指南 #
常见问题及解决方案 #
重排序未生效 #
症状: 检索到的文档顺序没有变化
原因: UseReranking设置为false或Reranker未正确配置
解决方案: 确保在配置中启用重排序功能
引用格式不正确 #
症状: 答案中缺少源文档引用
原因: IncludeCitations设置为false
解决方案: 启用引用生成功能
性能问题 #
症状: 重排序过程耗时较长
原因: 大量文档需要重排序或重排序算法复杂度高
解决方案: 调整TopK参数或实现更高效的重排序算法
章节来源
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L280-L291)
- [prebuilt/rag.go](https://github.com/smallnest/langgraphgo/blob/main/prebuilt/rag.go#L168-L171)
结论 #
LangGraphGo框架中的检索后重排序机制提供了一个灵活且强大的RAG系统基础。通过BuildAdvancedRAG方法,开发者可以轻松构建包含重排序功能的RAG管道,而RAGConfig中的UseReranking和IncludeCitations参数则提供了细粒度的控制能力。
NewSimpleReranker实现展示了重排序的基本原理,通过关键词匹配和归一化分数实现了有效的文档重排序。这种设计既保证了系统的可扩展性,又为后续集成更复杂的重排序算法(如交叉编码器)预留了空间。
通过合理配置这些参数和选择合适的重排序策略,开发者可以在保持系统性能的同时显著提升RAG系统的输出质量,为用户提供更加准确和可信的答案。