第11章:RAGFlow 多模型供应商接入与本地模型实践
发布时间:2026/10/1 14:30:33来源:尧图网络
1 项目背景业务场景「云帆科技」的 CIO 在季度技术评审会上提出了一个敏感话题“我们的 HR 制度问答机器人用的是 OpenAI 的 GPT-4o员工每次提问薪酬制度、员工名单这些数据都要传到美国服务器。法务部评估后认为存在数据出境合规风险。你们能不能把模型换成国产的或者干脆在本地跑”与此同时项目组还收到三个部门的不同诉求技术部想用 DeepSeek便宜且代码能力强市场部想用 Gemini多模态能力好数据安全部要求核心数据只用本地模型。运营小李面临一个现实问题——RAGFlow 能不能在一个平台上同时接入多个模型供应商能否按数据集或助手粒度指定不同的模型本地模型怎么部署、怎么调优痛点模型选型不当或接入混乱导致的典型问题供应商锁定所有问答只依赖一个模型供应商一旦该供应商涨价、限流或服务中断全平台不可用。一刀切配置所有数据集用同一个 LLM但代码类文档需要强推理模型如 GPT-4o制度类文档用便宜模型如 DeepSeek-V3即可——用同一模型导致成本虚高或效果不足。本地模型部署门槛高Ollama/Xinference/vLLM 等多种本地推理框架每个都有不同的启动参数、模型格式、API 兼容性团队不知道选哪个。数据出境风险云端模型 API 调用意味着文档片段和用户问题经过第三方服务器涉及 GDPR、个人信息保护法等合规红线。模型选型不当的连锁反应 全部用 GPT-4o → 成本爆炸10万次问答/月 × $0.03/次 $3000/月 ↓ 一刀切换成 DeepSeek → 代码理解下降技术文档问答准确率从90%跌到70% ↓ 换成全部本地模型 → 需要购买 GPU 服务器硬件成本 20 万 ↓ 混合部署 → 不知道按什么规则分配请求到不同模型2 项目设计小胖拿着一份打印的账单“大师你看这个月 OpenAI 账单——$3,247HR 部门才 500 个人每人每天问不到 3 个问题钱就这么花出去了。老板说再这样下去要砍项目了。有没有便宜的替代方案”大师“有而且不止一种。RAGFlow 支持多种模型供应商从国际大厂到国产新锐从云端 API 到本地私有化部署。关键是——你要根据不同的任务类型选择合适档位的模型而不是所有问题都请’爱因斯坦’来回答。”小胖“那到底有哪些模型可以用你给我列个清单呗。”大师“RAGFlow 的模型按功能分为六类每类都有多个供应商可选”模型类型用途云端方案本地方案Chat对话生成根据检索结果生成答案OpenAI GPT-4o、DeepSeek-V3、Gemini、通义千问Ollama Qwen/LlamaEmbedding向量化把文本转成向量用于语义检索OpenAI text-embedding-3、阿里 DashScopeBGE-large-zh、M3E-baseRerank重排序对候选片段重新打分排序Cohere Rerank、阿里 GTE-RerankBGE-Reranker-v2-m3CV计算机视觉图片理解、OCR、版面分析GPT-4V、Gemini Vision本地 PaddleOCRASR语音识别语音转文字Whisper API、阿里 ASRWhisper 本地模型TTS语音合成文字转语音OpenAI TTS、阿里 TTSEdge-TTS、Bark技术映射模型供应商 不同品牌的家电——西门子的冰箱好但不代表它的洗衣机也好。不同任务要选不同专业模型。小胖“那本地模型怎么弄我们公司有块闲置的 RTX 4090能不能利用起来”大师“RTX 409024GB 显存简直是为本地 LLM 定制的推荐用 Ollama 作为本地推理框架——它把模型的下载、量化、API 暴露封装得跟docker run一样简单。”# Ollama 部署 Qwen2.5-14B中文能力强14B 量化后约 8GB 显存ollama pull qwen2.5:14b# 启动 API 服务默认监听 11434 端口ollama serve# 测试curlhttp://localhost:11434/api/chat-d{ model: qwen2.5:14b, messages: [{role: user, content: 用一句话介绍RAGFlow}] }小白端着茶杯认真记录“那本地模型和云端模型到底怎么选有没有决策树”大师“我画一张决策流程图”选择 Chat 模型的决策树 你的场景对数据隐私有严格要求吗 ├── 是法务合同/薪酬数据/客户信息 │ └── 选择本地模型Ollama Qwen/Llama │ 有 GPU 吗 │ ├── 有 → Qwen2.5-32B / Llama-3.1-70B │ └── 无 → Qwen2.5-7BCPU 可跑但慢 │ └── 否公开制度/技术文档/产品手册 └── 预算充足吗 ├── 是 → GPT-4o / Claude 3.5效果最好 └── 否 → DeepSeek-V3 / 通义千问性价比高技术映射本地 vs 云端 家里做饭 vs 点外卖——家里做饭食材安全但费时费力外卖方便但食材来源不可控。小胖“那 RAGFlow 怎么配置多个模型我看控制台里有个’模型供应商’的页面。”大师“对。RAGFlow 的模型管理架构是三层设计”模型管理三层架构 第一层模型供应商Factory - 定义 API 基础地址、API Key、默认参数 - 如OpenAI、DeepSeek、Ollama、通义千问 - 一个供应商可以有多个模型 第二层模型实例Model - 具体模型名称、类型Chat/Embedding/Rerank... - 如gpt-4o (Chat)、text-embedding-3-small (Embedding) - 每个模型绑定到一个供应商 第三层使用方Consumer - 数据集创建时选择 Embedding 模型 - Chat 助手创建时选择 Chat 模型 - 可以在助手级别覆盖数据集级别的模型选择小白“那源码层面是怎么实现多模型动态切换的”大师“核心在rag/llm/目录下的 LLMBundle 设计模式。简单来说就是策略模式——所有模型实现同一个接口运行时根据配置从数据库读取模型信息动态加载对应的模型类。”# 源码概念LLMBundle 多模型路由简化版# 文件: rag/llm/chat_model.pyclassLLMBundle:统一的模型调用入口def__init__(self,tenant_id,llm_type,llm_nameNone):# 从数据库读取该租户配置的模型信息self.model_configself._load_model_config(tenant_id,llm_type,llm_name)# 根据 factory 动态加载对应的模型实现类self.modelself._resolve_model(self.model_config)defchat(self,messages,**kwargs):所有 Chat 模型统一调用此方法returnself.model.chat(messages,**kwargs)def_resolve_model(self,config):根据供应商动态路由到具体实现factory_map{OpenAI:OpenAIChat,DeepSeek:DeepSeekChat,Ollama:OllamaChat,Tongyi-Qianwen:QwenChat,ZHIPU-AI:GLMChat,# ... 20 供应商}returnfactory_map[config.factory](config)技术映射LLMBundle 万能遥控器——不管你是索尼电视还是三星电视不同供应商遥控器上的开机按钮都能用统一接口只是背后的红外信号不同各自实现。小胖“那如果我一个助手想用 DeepSeek 做日常问答但遇到复杂代码问题时自动切到 GPT-4o能实现吗”大师“这叫模型路由Model RouterRAGFlow 原生不支持自动切换但你可以通过创建多个助手来实现——一个’高级助手’用 GPT-4o 处理复杂问题一个’标准助手’用 DeepSeek 处理日常问题。或者更高级的做法是自定义一个 Agent 组件在 Agent 工作流中加入条件判断——识别问题复杂度简单问题路由到便宜模型复杂问题路由到强模型。”小白“最后一个问题如果云端 API 突然崩了怎么做到不中断服务”大师“你需要模型降级策略Fallback。假设你的首选模型是 OpenAI GPT-4o”# 模型降级链fallback_chain[{model:gpt-4o,provider:OpenAI,timeout:10},# 首选{model:deepseek-chat,provider:DeepSeek,timeout:10},# 备选1{model:qwen2.5:14b,provider:Ollama,timeout:30},# 备选2(本地){model:None,provider:None},# 全部失败 → 返回降级消息]“这个降级链目前需要自己在 API 网关层或应用层实现——包装 RAGFlow 的 Chat API在每次调用失败时自动尝试下一个模型。”3 项目实战环境准备目标在 RAGFlow 中接入三个模型供应商OpenAI、DeepSeek、Ollama 本地对比成本与效果。前提RAGFlow 已部署准备以下密钥OpenAI API Key如sk-xxxxDeepSeek API Key如sk-xxxxOllama 已安装并运行ollama serve分步实现步骤1接入 OpenAI 模型供应商目标在控制台或通过 API 配置 OpenAI 的三个模型——Chat、Embedding、Rerank。# 1. 添加 OpenAI Chat 模型curl-XPOST http://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ llm_factory: OpenAI, api_key: sk-xxxxxxxxxxxxxxxxxxxx, base_url: https://api.openai.com/v1, model_type: chat, model_name: gpt-4o, max_tokens: 4096 }# 2. 添加 OpenAI Embedding 模型curl-XPOST http://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ llm_factory: OpenAI, api_key: sk-xxxxxxxxxxxxxxxxxxxx, base_url: https://api.openai.com/v1, model_type: embedding, model_name: text-embedding-3-small, dimensions: 1536 }# 3. 验证模型可用性curlhttp://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\|jq.data[] | select(.llm_factoryOpenAI) | {model_name, model_type, available}步骤2接入 DeepSeek 模型供应商目标接入 DeepSeek 作为高性价比的备选模型。# DeepSeek 兼容 OpenAI 接口格式curl-XPOST http://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ llm_factory: DeepSeek, api_key: sk-xxxxxxxxxxxxxxxxxxxx, base_url: https://api.deepseek.com/v1, model_type: chat, model_name: deepseek-chat, max_tokens: 4096 }坑点DeepSeek 的 API 完全兼容 OpenAI 接口格式RAGFlow 内部用 OpenAI 兼容适配器对接。如果自定义私有模型也兼容 OpenAI 格式可以直接复用 OpenAI 的 factory。步骤3接入 Ollama 本地模型目标部署本地 Qwen2.5 模型并接入 RAGFlow。# 1. 确保 Ollama 正在运行ollama serve# 2. 拉取模型根据显存选择大小# RTX 4090 (24GB): 可以用 14B 量化版ollama pull qwen2.5:14b# GTX 1660 (6GB): 只能用 7B 量化版# ollama pull qwen2.5:7b# 3. 拉取本地 Embedding 模型ollama pull bge-large-zh-v1.5# 4. 验证curlhttp://localhost:11434/api/tags|jq.models[].name# 5. 在 RAGFlow 中接入 Ollama# 注意Docker 容器内的 RAGFlow 访问宿主机的 Ollama 需要特殊地址curl-XPOST http://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ llm_factory: Ollama, api_key: ollama, base_url: http://host.docker.internal:11434, model_type: chat, model_name: qwen2.5:14b, max_tokens: 4096 }# 6. 接入 Ollama Embeddingcurl-XPOST http://localhost:8080/api/v1/llm\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{ llm_factory: Ollama, api_key: ollama, base_url: http://host.docker.internal:11434, model_type: embedding, model_name: bge-large-zh-v1.5, dimensions: 1024 }坑点Docker 容器访问宿主机 Ollama 时Linux 不能用host.docker.internal需要用172.17.0.1默认 docker0 网桥地址或--network host模式。步骤4创建多模型对比数据集目标创建三个数据集分别绑定不同 Chat 模型同一份文档对比问答效果。# multi_model_compare.py - 多模型对比fromragflowimportRAGFlowimporttime ragRAGFlow(api_keyxxx,base_urlhttp://localhost:8080/api/v1)# 使用同一个 Embedding 模型只对比 Chat 模型差异models[{name:GPT-4o,chat_model:gpt-4oOpenAI},{name:DeepSeek-V3,chat_model:deepseek-chatDeepSeek},{name:Qwen2.5-14B-Local,chat_model:qwen2.5:14bOllama},]# 创建数据集并上传同一份文档forminmodels:dsrag.create_dataset(namef模型对比-{m[name]},embedding_modeltext-embedding-3-smallOpenAI,# 统一 Embeddingchunk_methodtitle,)ds.upload_document(test_docs/员工手册2024.pdf)# 创建对应的 Chat 助手chatrag.create_chat(namef模型对比-{m[name]},dataset_ids[ds.id],llm_modelm[chat_model],prompt_system你是一个HR制度助手。简洁回答必须引用来源。,)m[ds_id]ds.idm[chat_id]chat.idprint(f[创建完成]{m[name]}: DS{ds.id}, Chat{chat.id})# 对比问答test_questions[年假有多少天,加班费怎么计算请列出具体公式。,员工离职需要提前多少天通知,What is the annual leave policy?,# 测试英文能力]forqintest_questions:print(f\n{*60})print(fQ:{q})forminmodels:starttime.time()resprag.chat(questionq,chat_idm[chat_id],streamFalse)elapsedtime.time()-startprint(f [{m[name]}]{elapsed:.1f}s:{resp.answer[:120]}...)预期输出示例Q: 加班费怎么计算请列出具体公式。 [GPT-4o] 2.1s: 根据《薪酬管理办法》第8条加班费计算公式如下 工作日加班基本工资÷21.75÷8×1.5×加班小时数... [DeepSeek-V3] 0.8s: 加班费计算方式工作日加班按1.5倍计算休息日按2倍计算... [Qwen2.5-14B-Local] 3.5s: 根据公司规定加班费为平时1.5倍周末2倍法定节假日3倍...步骤5实现模型降级包装器目标编写一个 API 代理层在主模型失败时自动切换备选模型。# model_fallback.py - 模型降级包装器importtimefromragflowimportRAGFlowclassModelFallbackClient:带降级策略的 RAGFlow 客户端def__init__(self,base_url):self.ragRAGFlow(api_keyxxx,base_urlbase_url)# 降级链主模型 → 备选模型 → 本地兜底self.fallback_chains{hr_dataset:[{chat_id:chat_gpt4o,timeout:10},# 首选 GPT-4o{chat_id:chat_deepseek,timeout:10},# 备选 DeepSeek{chat_id:chat_ollama,timeout:30},# 兜底 Ollama],tech_dataset:[{chat_id:chat_deepseek,timeout:10},# 代码任务首选 DeepSeek{chat_id:chat_gpt4o,timeout:15},# 备选 GPT-4o],}defchat_with_fallback(self,question,dataset_typehr_dataset):带降级的问答chainself.fallback_chains.get(dataset_type,[])errors[]forstepinchain:try:starttime.time()respself.rag.chat(questionquestion,chat_idstep[chat_id],streamFalse,timeoutstep[timeout])elapsedtime.time()-startprint(f[OK] 模型{step[chat_id]}响应:{elapsed:.1f}s)returnrespexceptExceptionase:errors.append(f{step[chat_id]}:{e})print(f[FALLBACK]{step[chat_id]}失败:{e}尝试下一个...)continue# 全部失败raiseException(f所有模型不可用:{; .join(errors)})# 使用示例clientModelFallbackClient(http://localhost:8080/api/v1)try:answerclient.chat_with_fallback(年假有几天,hr_dataset)print(f答案:{answer.answer})exceptExceptionase:print(f服务不可用:{e})测试验证# model_health_check.sh - 模型健康检查#!/bin/bashTOKENragflow-xxxxBASEhttp://localhost:8080/api/v1echo 模型健康检查 # 获取所有模型MODELS$(curl-s$BASE/llm-HAuthorization: Bearer$TOKEN)# 检查每个模型状态echo$MODELS|jq-r.data[] | \(.llm_factory) | \(.model_name) | \(.model_type)|whileIFS | readfactory model mtype;doif[$mtypechat];then# 用简单问题测试连通性result$(curl-s-o/dev/null-w%{http_code}-XPOST$BASE/chats\-HAuthorization: Bearer$TOKEN\-HContent-Type: application/json\-d{\question\:\测试\,\dataset_ids\:[\test-ds-id\],\stream\:false}\--max-time15)if[$result200];thenecho[OK]$factory/$model: 可用 (HTTP$result)elseecho[FAIL]$factory/$model: 不可用 (HTTP$result)fifidone完整代码清单Git 仓库https://github.com/infiniflow/ragflow路径说明rag/llm/chat_model.pyChat 模型抽象与供应商路由rag/llm/embedding_model.pyEmbedding 模型抽象rag/llm/rerank_model.pyRerank 模型抽象rag/llm/cv_model.py视觉模型抽象api/db/services/llm_service.py模型供应商数据库服务层api/apps/sdk/llm.py模型管理 API 接口4 项目总结优点 缺点维度RAGFlow 多模型管理LangChainDify自建模型网关供应商数量★★★ 20 内置★★★ 丰富集成★★★ 30 内置★☆☆ 需自行对接本地模型支持★★★ Ollama/Xinference 原生支持★★☆ 需额外配置★★★ Ollama/Xinference★★★ 完全自定义模型切换成本★★☆ 控制台切换需重建索引★★☆ 代码切换★★★ 界面切换★☆☆ 需开发多模型并存★★★ 助手级别独立模型★★★ 灵活组合★★★ 应用级别★★★ 完全灵活降级容错★☆☆ 不内置★☆☆ 不内置★☆☆ 不内置★★★ 可实现成本控制★★☆ 手动选择★★☆ 手动选择★★☆ 手动选择★★★ 可编程控制适用场景合规优先型法务、薪酬等敏感数据走本地模型其他公开制度走云端模型。成本敏感型日常高频问答用 DeepSeek/本地模型低频复杂问题用 GPT-4o。能力混合型代码类文档配代码强模型DeepSeek多模态文档配视觉模型GPT-4V。离线环境部署完全断网的内网环境全部使用 Ollama 本地模型 本地 Embedding。多供应商灾备主供应商故障时自动降级到备选供应商保障业务连续性。不适用场景所有任务都有相同要求如果所有文档类型和问题难度一致多模型管理是过度设计。团队无 GPU 资源且数据量极大纯 CPU 跑本地 LLM 速度无法接受只能用云端模型。注意事项Embedding 模型更换需重建索引切换 Embedding 模型后必须删除旧数据集重建这是最大的隐形成本。Ollama 默认只监听 127.0.0.1如果 RAGFlow 在 Docker 中需要设置OLLAMA_HOST0.0.0.0让容器可访问。API Key 安全管理多个供应商的 API Key 都存储在 RAGFlow 数据库中。建议定期轮换数据库访问权限最小化。本地模型并发限制Ollama 默认单模型只处理 1 个并发请求。大批量问答需要启用多个 Ollama 实例或使用队列。Langfuse/追踪使用多模型后调试困难——搞不清到底是哪个模型出了错。建议引入 LLM 调用追踪工具。常见踩坑经验故障现象根因解决方法Ollama 模型在 RAGFlow 中不可用Docker 容器无法访问localhost:11434改用host.docker.internal或172.17.0.1本地模型回答极慢30s/次CPU 推理模型太大14B换用 7B 量化版或在 GPU 上运行DeepSeek 返回格式异常DeepSeek 不完全兼容 OpenAI 的response_format参数在 Prompt 中显式指定 JSON 格式要求多模型 A/B 测试结果不一致不同模型对 Prompt 的敏感度不同为每个模型单独调优 Prompt不要共用切换 Embedding 后检索全空新旧模型维度不同索引未重建删除数据集 → 用新模型重建 → 重新导入文档思考题如果公司有 10 个部门每个部门的知识库对模型的保密等级要求不同绝密/机密/公开。请设计一个模型分级路由方案确保不同密级的问题自动路由到对应安全等级的模型且绝密数据永远不出本地。本地部署的 Qwen2.5-14B 模型在回答公司制度类问题时表现很好准确率 85%但在回答财务计算类问题时只有 60%。请设计一个智能分层方案——简单制度类问题用本地模型复杂计算类问题自动升级到云端强模型——如何判断问题的复杂度答案提示见第12章末尾或附录 D。延伸阅读与资源10倍开发者的 Dify 魔法书从零构建全栈 AI 应用后端工程师转型AI第一课-Ollama 与私有化大模型实战大型语言模型(LLM) vLLM 高性能推理落地实战Agent开发之LlamaIndex 实战修炼与源码进阶大语言模型Transformers 实战修炼与源码剖析
网站建设高端定制企业官网