agentic_huge_data_base / wiki
页面 Open WebUI · 7.6 检索与重排·DeepWiki 中文全文译文

7.6 · 检索与重排(Retrieval and Reranking)

多模型对话工作台与知识应用入口 · 本章是 Open WebUI DeepWiki 中文译文的独立章节页,保留原始链接、源码锚点、模块标签和章节层级。

项目Open WebUI 章节7.6 状态全文译文 模块检索、召回与知识系统、工具、记忆与模型调用、接口与服务契约、系统架构
源码线索
  • backend/open_webui/models/memories.py
  • backend/open_webui/retrieval/loaders/datalab_marker.py
  • backend/open_webui/retrieval/loaders/main.py
  • backend/open_webui/retrieval/loaders/mineru.py
  • backend/open_webui/retrieval/loaders/paddleocr_vl.py
  • backend/open_webui/retrieval/utils.py
  • backend/open_webui/routers/memories.py
  • backend/open_webui/routers/retrieval.py
  • src/lib/apis/retrieval/index.ts
  • src/lib/components/admin/Settings/Documents.svelte
模块标签
  • 检索、召回与知识系统
  • 工具、记忆与模型调用
  • 接口与服务契约
  • 系统架构
  • 界面与交互

中文译文

检索与重排(中文译文)

原始 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.py
  • backend/open_webui/retrieval/loaders/datalab_marker.py
  • backend/open_webui/retrieval/loaders/main.py
  • backend/open_webui/retrieval/loaders/mineru.py
  • backend/open_webui/retrieval/loaders/paddleocr_vl.py
  • backend/open_webui/retrieval/utils.py
  • backend/open_webui/routers/memories.py
  • backend/open_webui/routers/retrieval.py
  • src/lib/apis/retrieval/index.ts
  • src/lib/components/admin/Settings/Documents.svelte
  • src/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-456backend/open_webui/routers/retrieval.py:84-95

---

嵌入与重排序函数

系统在应用启动时初始化特定的函数来处理向量化和评分。

嵌入函数(EMBEDDING_FUNCTION

通过 get_ef() 初始化,支持多种引擎,包括 Ollama、OpenAI、Azure 和本地 SentenceTransformers backend/open_webui/routers/retrieval.py:139-160

引擎实现类 / API来源
默认(""SentenceTransformerbackend/open_webui/routers/retrieval.py:146-155
ollamaOllama APIbackend/open_webui/routers/retrieval.py:56-57
openaiOpenAI APIbackend/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-236backend/open_webui/env.py:121-124

---

混合搜索实现

混合搜索通过加权集成的方式,将语义向量搜索与基于关键词的 BM25 搜索相结合。

BM25 富化

在关键词索引之前,文档块会通过元数据进行富化,以改善对特定标识符(如文件名或标题)的匹配效果 backend/open_webui/retrieval/utils.py:182-217

  • 富化逻辑: get_enriched_texts()FilenameTitleSection 等元数据字段前置到原始块文本中 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

  1. 通过 VECTOR_DB_CLIENT.get() 获取集合中的所有文档 backend/open_webui/retrieval/utils.py:241
  2. 从富化文本创建 BM25Retriever backend/open_webui/retrieval/utils.py:252
  3. 创建 VectorSearchRetriever 用于语义查找 backend/open_webui/retrieval/utils.py:256
  4. 使用 LangChain 的 EnsembleRetriever 将它们组合起来 backend/open_webui/retrieval/utils.py:261-273

来源: backend/open_webui/retrieval/utils.py:182-318backend/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_Kbackend/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

  1. 去重: 使用文档内容的 SHA-256 哈希值来识别重复块 backend/open_webui/retrieval/utils.py:348-350
  2. 排序: 根据相似性距离(向量搜索中越小越好)或重排序器分数(越大越好)对合并后的列表进行排序 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_rerankerr(相关性阈值)以及 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-142src/lib/components/admin/Settings/WebSearch.svelte:16-42backend/open_webui/routers/retrieval.py:276-324