RAG 与知识系统(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/open-webui/open-webui/7-rag-and-knowledge-system
翻译时间:2026-06-09T16:09:09.858Z
翻译模型:deepseek-chat
原文字符数:10040
项目:Open WebUI (open-webui)
---
RAG 与知识系统
相关源文件
以下文件被用作生成此 wiki 页面的上下文:
.github/workflows/integration-test.disabledbackend/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/retrieval/web/firecrawl.pybackend/open_webui/retrieval/web/utils.pybackend/open_webui/routers/memories.pybackend/open_webui/routers/retrieval.pybackend/open_webui/storage/provider.pybackend/open_webui/test/apps/webui/storage/test_provider.pybackend/requirements-min.txtbackend/requirements.txtdocker-compose.playwright.yamlpyproject.tomlsrc/lib/apis/retrieval/index.tssrc/lib/components/admin/Settings/Documents.sveltesrc/lib/components/admin/Settings/WebSearch.svelteuv.lock
检索增强生成(RAG)与知识系统通过提取内容、生成嵌入向量、将向量存储在数据库中,以及检索相关上下文供 AI 响应使用,实现了对文档集合的语义搜索。该系统将非结构化数据(PDF、Office 文档、网页)与 LLM 的上下文窗口连接起来。
关于聊天界面的文件处理详情,请参见消息输入系统。关于实时网络搜索能力,请参见网络搜索集成。
系统架构概览
RAG 系统由 retrieval 路由器编排,并利用多种专门的加载器和向量数据库客户端。
graph TB
subgraph "前端空间"
DocumentsUI["Documents.svelte<br/>(管理设置)"]
WebSearchUI["WebSearch.svelte<br/>(搜索配置)"]
end
subgraph "代码实体空间:API 与编排"
RetrievalRouter["routers/retrieval.py<br/>APIRouter"]
KnowledgeRouter["routers/knowledge.py<br/>APIRouter"]
end
subgraph "代码实体空间:数据摄取"
Loader["loaders/main.py<br/>Loader 类"]
TikaLoader["TikaLoader"]
DoclingLoader["DoclingLoader"]
MarkerLoader["DatalabMarkerLoader"]
MinerULoader["MinerULoader"]
MistralLoader["MistralLoader"]
end
subgraph "代码实体空间:向量存储"
VDB_Factory["vector/factory.py<br/>VECTOR_DB_CLIENT"]
ChromaProxy["ChromaClient"]
MilvusProxy["MilvusClient"]
QdrantProxy["QdrantClient"]
PgvectorProxy["PgvectorClient"]
end
DocumentsUI -- "updateRAGConfig" --> RetrievalRouter
RetrievalRouter -- "process_file" --> Loader
Loader -- "引擎选择" --> TikaLoader
Loader -- "引擎选择" --> DoclingLoader
Loader -- "引擎选择" --> MarkerLoader
Loader -- "引擎选择" --> MinerULoader
Loader -- "引擎选择" --> MistralLoader
TikaLoader -- "提取" --> VDB_Factory
DoclingLoader -- "提取" --> VDB_Factory
MarkerLoader -- "提取" --> VDB_Factory
MinerULoader -- "提取" --> VDB_Factory
MistralLoader -- "提取" --> VDB_Factory
VDB_Factory --> ChromaProxy
VDB_Factory --> MilvusProxy
VDB_Factory --> QdrantProxy
VDB_Factory --> PgvectorProxy
来源: backend/open_webui/routers/retrieval.py:24-49,backend/open_webui/retrieval/loaders/main.py:231-235,src/lib/components/admin/Settings/Documents.svelte:17-21
文档摄取管道
摄取管道管理文档从原始字节到可搜索向量的完整生命周期。这包括识别文件类型、选择专门的加载器,以及可选地利用外部 OCR 或解析服务。Loader 类(位于 backend/open_webui/retrieval/loaders/main.py:231-235)充当调度器,根据配置的引擎和文件类型选择合适的加载器。存储通过 StorageProvider 实现进行抽象,包括 Local、S3、GCS 和 Azure backend/open_webui/storage/provider.py:40-56。
详情请参见文档摄取管道。
内容提取引擎
Open WebUI 支持多种提取技术。引擎通过 CONTENT_EXTRACTION_ENGINE 设置进行全局配置,可通过管理设置 UI 更新 src/lib/components/admin/Settings/Documents.svelte:144-196。
| 引擎 | 实现类 | 文件路径 |
|---|---|---|
| Tika | TikaLoader | backend/open_webui/retrieval/loaders/main.py:138-177 |
| Docling | DoclingLoader | backend/open_webui/retrieval/loaders/main.py:179-229 |
| Datalab Marker | DatalabMarkerLoader | backend/open_webui/retrieval/loaders/datalab_marker.py:13 |
| MinerU | MinerULoader | backend/open_webui/retrieval/loaders/mineru.py:14 |
| Mistral OCR | MistralLoader | backend/open_webui/retrieval/loaders/mistral.py:23 |
| PaddleOCR-VL | PaddleOCRVLLoader | backend/open_webui/retrieval/loaders/paddleocr_vl.py:14 |
详情请参见内容提取引擎。
来源: backend/open_webui/retrieval/loaders/main.py:231-260,src/lib/components/admin/Settings/Documents.svelte:144-203
文本分割与分块
提取的文本被分割成可管理的片段,以确保相关性并适配模型上下文窗口。系统针对不同的内容结构使用了 RecursiveCharacterTextSplitter、TokenTextSplitter 和 MarkdownHeaderTextSplitter backend/open_webui/routers/retrieval.py:32-36。系统支持针对代码、Markdown 和纯文本的特定分割策略。
详情请参见文本分割与分块。
来源: backend/open_webui/routers/retrieval.py:32-36,backend/requirements.txt:55
嵌入向量生成
系统使用可配置的嵌入引擎将文本块转换为数值向量。这可以通过 SentenceTransformer 在本地执行,也可以通过 OpenAI、Ollama 或 Azure 等 API 远程执行。get_ef 函数 backend/open_webui/routers/retrieval.py:139-160 负责根据配置的引擎和模型初始化嵌入函数。
graph LR
subgraph "嵌入逻辑"
GetEF["get_ef()<br/>retrieval.py:139"]
end
subgraph "提供者"
LocalST["SentenceTransformer<br/>(本地)"]
OllamaAPI["Ollama API"]
OpenAIAPI["OpenAI API"]
AzureOpenAIAPI["Azure OpenAI API"]
end
GetEF --> LocalST
GetEF --> OllamaAPI
GetEF --> OpenAIAPI
GetEF --> AzureOpenAIAPI
详情请参见嵌入向量生成。
来源: backend/open_webui/routers/retrieval.py:139-160,src/lib/components/admin/Settings/Documents.svelte:113-136
向量数据库集成
Open WebUI 提供了一个统一接口 VECTOR_DB_CLIENT,抽象了各种向量数据库的复杂性。这使得系统能够支持 ChromaDB(默认)、Milvus、Qdrant、Weaviate、pgvector、Pinecone、OpenSearch 和 Elasticsearch。客户端工厂定义在 backend/open_webui/retrieval/vector/factory.py backend/open_webui/retrieval/vector/factory.py:47-48 中,并支持同步和异步操作。
详情请参见向量数据库集成。
来源: backend/open_webui/routers/retrieval.py:47-48,backend/requirements.txt:58-61,backend/requirements.txt:128-132
检索与重排序
检索采用混合方法。它将向量相似度搜索与基于关键词的 BM25 匹配(使用 rank-bm25 backend/requirements.txt:94)相结合。为了进一步提高精度,可以使用 SentenceTransformer 交叉编码器或外部重排序器(如 ColBERT)对顶部结果应用交叉编码器重排序阶段 backend/open_webui/routers/retrieval.py:162-206。
混合搜索数据流
- 向量搜索:使用
VECTOR_DB_CLIENT基于语义距离获取候选结果。 - BM25 搜索:使用
BM25Retriever基于精确关键词匹配获取候选结果。 - 集成:使用
EnsembleRetriever合并结果backend/open_webui/retrieval/utils.py:15-18。 - 重排序:
get_rf函数初始化交叉编码器以对输出重新评分backend/open_webui/routers/retrieval.py:162-206。
详情请参见检索与重排序。
来源: backend/open_webui/routers/retrieval.py:162-206,backend/open_webui/retrieval/utils.py:15-20,backend/requirements.txt:94
网络搜索与 URL 加载
系统通过多个提供者(Brave、Google PSE、SearXNG 等)集成了网络搜索能力 src/lib/components/admin/Settings/WebSearch.svelte:16-42。内容使用专门的加载器获取,例如用于动态网站的 PlaywrightURLLoader 或用于结构化网页抓取的 Firecrawl backend/open_webui/retrieval/web/utils.py:27-43。
来源: src/lib/components/admin/Settings/WebSearch.svelte:16-43,backend/open_webui/retrieval/web/utils.py:27-49