检索与重排(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/7.6-retrieval-and-reranking
翻译时间:2026-06-09T16:09:26.101Z
翻译模型:deepseek-chat
原文字符数:9904
项目:Open WebUI (open-webui)
---
检索与重排序
相关源文件
以下文件为本 wiki 页面的生成提供了上下文:
backend/open_webui/models/memories.pybackend/open_webui/retrieval/loaders/datalab_marker.pybackend/open_webui/retrieval/loaders/main.pybackend/open_webui/retrieval/loaders/mineru.pybackend/open_webui/retrieval/loaders/paddleocr_vl.pybackend/open_webui/retrieval/utils.pybackend/open_webui/routers/memories.pybackend/open_webui/routers/retrieval.pysrc/lib/apis/retrieval/index.tssrc/lib/components/admin/Settings/Documents.sveltesrc/lib/components/admin/Settings/WebSearch.svelte
目的与范围
本文档描述了用于为 RAG(检索增强生成)查询查找相关文档块的检索与重排序系统。该系统支持向量相似性搜索、BM25 关键词匹配以及交叉编码器重排序,以提升结果质量。它集成了多种向量数据库后端和嵌入提供者,构建了一个灵活的混合搜索流水线。
---
架构概览
检索系统通过多阶段流水线处理查询。根据配置不同,它可以执行简单的向量查找,也可以执行结合多种搜索策略的复杂集成检索。
检索流水线流程
该流水线主要在 backend/open_webui/retrieval/utils.py 中进行编排。当收到查询时,系统会根据 ENABLE_RAG_HYBRID_SEARCH 配置决定使用标准向量搜索还是混合搜索 backend/open_webui/retrieval/utils.py:459-465。
graph TB
subgraph "自然语言空间"
Query["用户查询字符串"]
Config["app.state.config<br/>RAG_TOP_K, RAG_RELEVANCE_THRESHOLD<br/>RAG_HYBRID_BM25_WEIGHT"]
end
subgraph "代码实体空间"
EmbedFunc["EMBEDDING_FUNCTION<br/>(backend/open_webui/main.py)"]
subgraph "搜索执行"
VectorSearch["query_doc()<br/>VECTOR_DB_CLIENT.search()"]
HybridDecision{"ENABLE_RAG_HYBRID_SEARCH?"}
BM25["BM25Retriever<br/>(langchain_community)"]
VectorRetriever["VectorSearchRetriever<br/>(backend/open_webui/retrieval/utils.py)"]
Ensemble["EnsembleRetriever<br/>(langchain_classic)"]
end
subgraph "后处理"
RerankDecision{"reranking_function<br/>exists?"}
Reranker["RerankCompressor<br/>(backend/open_webui/retrieval/utils.py)"]
Filter["merge_and_sort_query_results()"]
end
end
Query --> Config
Query --> EmbedFunc
EmbedFunc --> HybridDecision
HybridDecision -->|"false"| VectorSearch
HybridDecision -->|"true"| BM25
HybridDecision -->|"true"| VectorRetriever
BM25 --> Ensemble
VectorRetriever --> Ensemble
VectorSearch --> Filter
Ensemble --> RerankDecision
RerankDecision -->|"yes"| Reranker
RerankDecision -->|"no"| Filter
Reranker --> Filter
Filter --> Results["最终文档上下文"]
来源: backend/open_webui/retrieval/utils.py:138-456,backend/open_webui/routers/retrieval.py:84-95
---
嵌入与重排序函数
系统在应用启动时初始化特定的函数来处理向量化和评分。
嵌入函数(EMBEDDING_FUNCTION)
通过 get_ef() 初始化,支持多种引擎,包括 Ollama、OpenAI、Azure 和本地 SentenceTransformers backend/open_webui/routers/retrieval.py:139-160。
| 引擎 | 实现类 / API | 来源 |
|---|---|---|
默认("") | SentenceTransformer | backend/open_webui/routers/retrieval.py:146-155 |
ollama | Ollama API | backend/open_webui/routers/retrieval.py:56-57 |
openai | OpenAI API | backend/open_webui/routers/retrieval.py:112-114 |
重排序函数(RERANKING_FUNCTION)
通过 get_rf() 初始化,提供交叉编码器评分机制,用于重新评估检索到的块的相关性 backend/open_webui/routers/retrieval.py:162-236。它支持本地 CrossEncoders、ColBERT 模型以及基于外部 API 的重排序器。
graph LR
subgraph "初始化逻辑"
GetRF["get_rf()<br/>(backend/open_webui/routers/retrieval.py)"]
end
subgraph "模型实现"
ColBERT["ColBERT 类<br/>(backend/open_webui/retrieval/models/colbert.py)"]
External["ExternalReranker 类<br/>(backend/open_webui/retrieval/models/external.py)"]
CrossEnc["CrossEncoder<br/>(sentence_transformers)"]
end
subgraph "系统状态"
StateRF["app.state.RERANKING_FUNCTION"]
end
GetRF --> ColBERT
GetRF --> External
GetRF --> CrossEnc
ColBERT --> StateRF
External --> StateRF
CrossEnc --> StateRF
来源: backend/open_webui/routers/retrieval.py:162-236,backend/open_webui/env.py:121-124
---
混合搜索实现
混合搜索通过加权集成的方式,将语义向量搜索与基于关键词的 BM25 搜索相结合。
BM25 富化
在关键词索引之前,文档块会通过元数据进行富化,以改善对特定标识符(如文件名或标题)的匹配效果 backend/open_webui/retrieval/utils.py:182-217。
- 富化逻辑:
get_enriched_texts()将Filename、Title和Section等元数据字段前置到原始块文本中backend/open_webui/retrieval/utils.py:182-217。 - 权重:
RAG_HYBRID_BM25_WEIGHT决定了两个检索器之间的平衡backend/open_webui/retrieval/utils.py:270-271。
集成过程
query_doc_with_hybrid_search 函数负责编排集成过程 backend/open_webui/retrieval/utils.py:220-318:
- 通过
VECTOR_DB_CLIENT.get()获取集合中的所有文档backend/open_webui/retrieval/utils.py:241。 - 从富化文本创建
BM25Retrieverbackend/open_webui/retrieval/utils.py:252。 - 创建
VectorSearchRetriever用于语义查找backend/open_webui/retrieval/utils.py:256。 - 使用 LangChain 的
EnsembleRetriever将它们组合起来backend/open_webui/retrieval/utils.py:261-273。
来源: backend/open_webui/retrieval/utils.py:182-318,backend/open_webui/config.py:50-54
---
重排序与压缩
初始检索后,结果会通过 RerankCompressor 进行优化排序,并过滤掉不相关的内容。
RerankCompressor 类
该类实现了 LangChain 的 BaseDocumentCompressor 接口 backend/open_webui/retrieval/utils.py:522-525。
- 评分: 它使用
app.state.RERANKING_FUNCTION为每个查询-文档对预测相关性分数backend/open_webui/retrieval/utils.py:545-564。 - 过滤: 分数低于
RELEVANCE_THRESHOLD的块会被丢弃backend/open_webui/retrieval/utils.py:586-590。 - 限制: 最终结果集会被截断至
TOP_K值backend/open_webui/retrieval/utils.py:612。
来源: backend/open_webui/retrieval/utils.py:522-615
---
多集合检索
系统可以使用 query_collection 同时查询多个知识库或文档集合 backend/open_webui/retrieval/utils.py:405-456。
并行执行
为减少延迟,对多个集合的查询使用 ThreadPoolExecutor 并行执行 backend/open_webui/retrieval/utils.py:437-445。
结果合并
merge_and_sort_query_results 函数负责聚合来自多个来源的结果 backend/open_webui/retrieval/utils.py:341-386:
- 去重: 使用文档内容的 SHA-256 哈希值来识别重复块
backend/open_webui/retrieval/utils.py:348-350。 - 排序: 根据相似性距离(向量搜索中越小越好)或重排序器分数(越大越好)对合并后的列表进行排序
backend/open_webui/retrieval/utils.py:378-384。
来源: backend/open_webui/retrieval/utils.py:341-456
---
配置与管理
检索设置通过 PersistentConfig 系统进行管理,并可通过管理面板进行更新。
管理设置界面
Documents.svelte 组件提供了调整这些参数的 UI src/lib/components/admin/Settings/Documents.svelte:41-65。
- 查询设置: 包括
k(top-k)、k_reranker、r(相关性阈值)以及hybrid搜索开关src/lib/components/admin/Settings/Documents.svelte:59-65。 - 模型管理: 允许切换嵌入引擎(Ollama、OpenAI、Azure)和重排序模型,这会触发后端重新初始化
src/lib/components/admin/Settings/Documents.svelte:69-142。
网络搜索集成
WebSearch.svelte 组件管理用于实时检索的外部搜索引擎 src/lib/components/admin/Settings/WebSearch.svelte:16-42。支持的引擎包括 Brave、Google PSE、SearXNG、Tavily 等 backend/open_webui/routers/retrieval.py:55-82。
来源: src/lib/components/admin/Settings/Documents.svelte:41-142,src/lib/components/admin/Settings/WebSearch.svelte:16-42,backend/open_webui/routers/retrieval.py:276-324