Open WebUI 里给 DeepSeek 装上 RAG外部知识库 AI 写文一条龙【免费下载链接】open-webuiUser-friendly AI Interface (Supports Ollama, OpenAI API, ...)项目地址: https://gitcode.com/GitHub_Trending/op/open-webuiDeepSeek 系列模型的火爆让本地/API 大模型第一次有了真正的性价比推理强、中文好、价格低。但几乎每一个把 DeepSeek 接进自己工作流的人都会撞上同一个天花板——模型的知识有截止日期它读不到你的私有资料。写行业分析需要引用最新财报写技术方案需要对齐内部文档通用模型给出的答案要么过时、要么一本正经地胡说。Open WebUI 恰恰是那个把模型能力和自有资料缝合起来的开源界面它自带完整的 RAG检索增强生成管线支持上传文档建知识库、直连外部向量数据库、控制检索参数还能通过提示词模板把检索结果变成带引用的写作素材。本文直接从仓库源码出发讲清楚如何在 Open WebUI 里给 DeepSeek 搭一套外部知识库 AI 写文的完整工作流。一、RAG 能力入口知识库从建库到上传在 Open WebUI 中RAG 的入口是知识库Knowledge模块。管理员可以在管理面板中创建多个知识库每个知识库就是一组文件 一份向量索引的组合。这个设计在后端路由 routers/knowledge.py 中体现得很直接# Knowledge that sits unread serves no one. Let what is # stored here find the ones who need it. KNOWLEDGE_BASES_COLLECTION knowledge-bases文件上传后系统会切分文档、逐块生成 embedding并把向量写入向量库知识库本身的名称与描述也会生成一个 embedding 存入knowledge-bases集合用于后续知识库检索embed_knowledge_base_metadata。Open WebUI 的文档加载器非常全位于 retrieval/loaders/ 目录下本地文件local.py、PDFpdf.py、网页链接external_web.py、YouTube 视频youtube.py以及集成第三方解析服务的mineru.py、datalab_marker.py等。也就是说你喂给知识库的不只是 .txt/.md/.pdf还可以是网页 URL 甚至视频字幕。向量存储层则通过抽象接口解耦了具体数据库retrieval/vector/dbs/ 下可以看到一长串适配器Chroma、PGVector、Qdrant、Milvus、Elasticsearch、OpenSearch、Pinecone、Weaviate、Redis/Valkey、Oracle 23ai、S3 等 15 种。默认使用本地 Chroma也可通过VECTOR_DB环境变量切换到任意支持的后端。小规模写作场景用默认配置即可团队协作或多端共享则建议上 PostgreSQL pgvector。二、给 DeepSeek 配上外部知识库2.1 先让 DeepSeek 进来Open WebUI 对接 DeepSeek 有两条主流路线API 路线DeepSeek 官方 API 兼容 OpenAI 协议在管理员设置 → 外部连接 → OpenAI中填入https://api.deepseek.com/v1与 API Key 即可。仓库中 routers/openai.py 维护了openai.api_base_urls/openai.api_keys这一对配置数组支持多套 OpenAI 兼容服务并行接入DeepSeek 与 OpenAI、通义、Moonshot 等可以同时在线。本地路线通过 Ollama 拉取deepseek-r1/deepseek-v3等模型Open WebUI 会自动发现 Ollama 上的全部模型数据完全不出内网。对AI 写文这类任务API 路线的满血模型如 DeepSeek-V3/R1写作质量明显更高本地路线则胜在隐私与零成本适合处理敏感内容。2.2 直连外部知识库跳过重复上传除了把文档传进 Open WebUI 自己切分入库新版还支持外部知识库连接External Knowledge Connections直接对接团队已有的向量数据库让 DeepSeek 读到别的系统已经在用的资料而不必重复搬数据。核心实现在 retrieval/external.pydef _normalize_result(result: dict, mapping: dict, knowledge: KnowledgeModel, distance: Optional[float] None) - dict: content _get_path(result, mapping.get(content_field, content), ) title _get_path(result, mapping.get(title_field, title), None) source _get_path(result, mapping.get(source_field, source), None) url _get_path(result, mapping.get(url_field, url), None) ...以 Qdrant 为例_retrieve_qdrant外部连接只需配置endpoint、api_key和向量集合名source.name再通过字段映射声明 payload 中哪些字段对应content、metadata、document_id、score查询时系统会用同一个 embedding 函数生成查询向量直接query_points命中外部集合再把结果归一化成统一格式注入对话上下文。Milvus 走的是同样的模式_retrieve_milvus。这意味着你完全可以把公司内部 RAG 服务当成 DeepSeek 的资料口写文时引用的就是生产环境的真实数据。三、检索参数与提示词模板把写文变成引文写作3.1 一次检索请求背后发生了什么当你在聊天输入框打开知识库按钮并提问时后端会走 retrieval/utils.py 中的query_collection生成查询向量 → 并发查询所有目标集合 → 合并排序取 top-k。若开启了混合检索rag.enable_hybrid_search还会叠加 BM25 关键词检索与重排序if request and config.get(rag.enable_hybrid_search): reranking_function ( (lambda query, documents: request.app.state.RERANKING_FUNCTION(query, documents, useruser)) if request.app.state.RERANKING_FUNCTION else None ) return await query_collection_with_hybrid_search( collection_namescollection_names, queriesqueries, embedding_functionembedding_function, kk, reranking_functionreranking_function, k_rerankerconfig.get(rag.top_k_reranker), rconfig.get(rag.relevance_threshold), hybrid_bm25_weightconfig.get(rag.hybrid_bm25_weight), enable_enriched_textsconfig.get(rag.enable_hybrid_search_enriched_texts), )注意这里的容错设计混合检索一旦抛异常会静默回退到纯向量检索保证对话不中断——这在生产环境里是很贴心的兜底。3.2 模板决定怎么写检索到的片段并不会原样塞给模型而是先套一层 RAG 提示词模板。仓库默认模板定义在 config.py 的DEFAULT_RAG_TEMPLATE核心约束有三条只依据 context 回答不知道就明说回答语言跟随用户提问这对中英混排写作很重要仅当source标签带 id 时用[id]格式标注引用避免模型瞎编出处。### Task: Respond to the user query using the provided context, incorporating inline citations in the format [id] ... ### Guidelines: - If you dont know the answer, clearly state that. - Respond in the same language as the users query. - **Only include inline citations using [id] (e.g., [1], [2]) when the source tag includes an id attribute.** - Do not use XML tags in your response. ... context {{CONTEXT}} /context这意味着AI 写文在 Open WebUI 里天然是引文式写作DeepSeek 生成的每一句关键论断都能追溯到知识库里的原始段落既符合企业内容合规的要求也方便人工复核。如果你希望输出风格更贴合公众号、技术博客或政府公文完全可以用RAG_TEMPLATE环境变量覆盖默认模板加入面向 XX 读者段落间保持递进逻辑结尾给出行动建议等指令。四、效果验证与检索质量调优4.1 验证三步法问事实问一个只有知识库里有、模型知识截止日期之后才出现的事件如最新一期数据看它是否给出引用追来源检查回答中的[id]引用能否对应到知识库原始文件与页码——引用缺失说明模板约束失效或检索未命中换问法同一资料换三种问法概括、对比、延伸观察检索召回是否稳定。4.2 关键调优旋钮Open WebUI 把 RAG 参数全部开放成了环境变量见 config.py 的RAG_*系列以下是写作场景最常用的几个环境变量默认值作用写作调优建议RAG_TOP_K3注入上下文的检索片段数写长文可调到 5–8喂更多素材RAG_RELEVANCE_THRESHOLD0.0相关性阈值低于则丢弃调到 0.3–0.5 过滤噪声防止跑题RAG_TOP_K_RERANKER3重排序后保留条数开启混合检索后按需调整RAG_EMBEDDING_MODELsentence-transformers/all-MiniLM-L6-v2文本向量化模型中文资料换成bge-m3、m3e等中英双语模型检索质量立竿见影RAG_EMBEDDING_ENGINE空本地embedding 来源openai/ollama等可与 DeepSeek 同源配置保持向量口径一致几个实战组合供参考资料杂、噪声大调高RAG_RELEVANCE_THRESHOLD 开启rag.enable_hybrid_search用 BM25 兜住关键词用重排序精筛语义中文资料为主换bge-m3类 embedding 模型并配合RAG_EMBEDDING_QUERY_PREFIX/RAG_EMBEDDING_CONTENT_PREFIX给查询与文档加前缀区分这是很多检索质量问题的隐性开关单篇长文档控制切块大小RAG_CHUNK_SIZE与重叠RAG_CHUNK_OVERLAP段落级切块比固定 512 字符更适合引用式写作因为模型需要完整的因果段落而非孤立句子。调优完成后把知识库 模板 DeepSeek 组合成一个写作助手工作流上传资料 → 选知识库 → 给模型下发先列提纲、逐段成稿、每段必须带引用的指令Open WebUI 的多模型对照同时跑 DeepSeek-V3 与 R1 输出对比稿和保存的会话记录会让整个写作过程可追踪、可复盘。结语Open WebUI 的价值不在于它能聊天而在于它把 RAG 的全链路——文档解析、向量化、混合检索、重排序、模板约束、外部向量库对接——做成了可视化的、可配置的标准件。对 DeepSeek 用户来说这意味着不用写一行代码就能让模型读到你的私有知识库并产出带引用、可追溯、风格可控的成稿。从会聊天的模型到会引用的写手差的只是一个配置得当的 Open WebUI。【免费下载链接】open-webuiUser-friendly AI Interface (Supports Ollama, OpenAI API, ...)项目地址: https://gitcode.com/GitHub_Trending/op/open-webui创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考