ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Dify实操指南:从本地部署到生产级RAG知识库工作流

Dify实操指南:从本地部署到生产级RAG知识库工作流 大概是去年底的时候我在帮一家单位做政策文件问答的RAG知识库项目待处理的上百份PDF全是政策原文业务方提的要求很朴素答案必须带出处没把握就直说不知道。当时市面上的平台和框架我基本都过了一遍最后真正让我在两周内交付掉这个项目的是Dify。原因不复杂它把Prompt工程、知识库检索、工作流编排这些原本要拼好几个系统的环节全放进了同一个画布从原型到上线路径短得超乎预期。这篇文章就是我基于那个项目写下的完整实操记录覆盖部署、提示词、RAG、工作流和生产维护适合正在评估Dify的开发者也适合已经在用但想把应用从“能跑”打磨到“能上生产”的团队。1. 从“会对话”到“能干活”Dify在应用层到底解决了什么1.1 大模型应用落地最常见的三个断层很多人第一次接触大模型应用都是从网页聊天开始的。你问一句它答一句看起来很聪明但一旦想真拿它做业务系统问题立刻冒出来。我拆过很多项目总结下来有三个断层最典型。第一个断层是模型不认你的业务数据。你问它公司内部制度、客户合同、行业政策它只能靠训练时的记忆编答案因为它没见过你的文档。要解决这个问题就得做RAG也就是检索增强生成先把你自己的文档切成片段存起来用户提问时先检索相关片段再让模型看着这些片段回答。这个链路里涉及文档清洗、分段、向量化、召回排序、上下文注入每一环都有讲究绝不是一个Prompt能糊弄过去的。第二个断层是对话没有业务逻辑。真实业务往往不是“一问一答”就结束的。用户问题模棱两可时需要先澄清知识库查不到时要转人工不同意图要分流到不同处理流程最后还要决定输出是给人看还是给系统用。这些逻辑用单个模型调用很难表达清楚必须靠工作流来编排。第三个断层是上线之后两眼一抹黑。应用发布后用户问得多不多、模型答得准不准、哪类问题老是触发兜底这些都需要被记录、被观察、被迭代。如果还用传统“写完代码就忘掉”的方式做AI应用后面维护成本会高到怀疑人生。这三个断层加在一起就是LLMOps平台要解决的问题。1.2 Dify的定位一个带可视化界面的LLMOps平台Dify把自己定义为LLMOps平台这个定位很准确。类比一下DevOps把开发和运维打通LLMOps就是把模型接入、提示词管理、知识库维护、应用发布、数据反馈这一整条链路打通。它不是让开发者少写代码那么简单而是把AI应用里“工程化”的部分用平台承接起来让开发者把精力放在业务设计上。Dify的核心模块大致有这六个模型供应商接入统一管理OpenAI、Anthropic、通义千问、智谱、Ollama等几十种模型对外暴露一致的API切换模型时不需要改应用代码。应用编排与Prompt管理用可视化方式编排聊天助手、Agent、工作流提示词可以带变量和模板还能做版本对比。知识库上传文档、分段、索引、检索一条龙内置向量检索、全文检索、混合检索多种策略RAG的主战场。工作流画布式拖拽编排节点包括LLM、知识检索、代码执行、HTTP请求、条件分支、迭代等适合实现复杂业务逻辑。可观测性详细记录每次对话的输入输出、token消耗、模型响应时间支持日志标注和反馈收集。API发布编排好的应用一键发布为标准REST API方便外部业务系统集成。但也要清楚Dify的边界。它不负责模型训练不做微调也不会提高模型本身的推理能力。它的价值是把“模型能力”变成“业务功能”的这段路尽量缩短、铺平。理解了这个定位后面所有操作都有了解释。2. 本地部署第一课Windows机器上把Dify跑通2.1 为什么我建议先本地部署很多团队一上来就研究云服务器、K8s、域名备案其实在评估阶段完全没必要。我建议先在本地机器上把Dify完整跑一遍原因有三个一是经济。Dify本身是开源的本地跑社区版不产生平台费用模型也可以先用Ollama跑开源模型整个调试周期可以做到零API成本。二是数据可控。在做RAG测试时你往知识库里传的都是真实业务文档放在本地环境里心里踏实尤其涉及内部资料时本地部署能省掉很多合规上的顾虑。三是排错方便。本地环境你能直接进容器查日志、改配置、重启服务整个链路都是可见的。等你把本地跑通了再往服务器迁也就三四个步骤的事。2.2 部署全流程从拉取代码到出现安装页Dify社区版最主流的部署方式是Docker Compose。你在Windows上跑的话第一步是装好Docker Desktop然后把WSL2后端打开这一步网上教程很多不展开。接下来按下面的步骤操作获取源码。可以用Git克隆也可以直接去GitHub下载zip包解压。进入源码根目录下的docker文件夹。这个文件夹就是部署的核心里面放着docker-compose.yaml、.env.example这些关键文件。复制环境变量示例文件。在docker目录里打开命令行执行cp .env.example .env。这一步会生成你本地的环境配置文件端口、数据库密码、存储路径都在里面改。执行docker compose up -d启动全部服务。第一次启动会拉取不少镜像包括web前端、api后端、worker容器、PostgreSQL、Redis还有默认的向量数据库Weaviate或Qdrant。这个步骤的耗时完全取决于网速和磁盘性能耐心等。等所有容器都变成running状态浏览器访问http://localhost/install按页面提示填写管理员邮箱和密码完成初始化。这里说几个我实际踩过的坑你大概率也会遇到资源占用。Dify全家桶跑起来内存占用4G到6G很常见。开发机建议16G内存起步磁盘预留30G以上。我之前在8G内存的笔记本上跑容器隔三差五被杀掉后来换机器才消停。端口冲突。默认用80端口如果本机已经有Nginx、IIS或者什么开发服务占用启动就会失败。解决办法是在.env里改EXPOSE_NGINX_PORT改成8080重启服务后访问http://localhost:8080。镜像拉取很慢。这个取决于网络环境常规做法是给Docker配置国内镜像加速器或者根据你自己的网络条件处理。镜像没拉全时容器状态会是restarting这时先别急着查配置把镜像拉完再说。2.3 接入Ollama把大模型跑到自己机器上Dify默认不带模型想做对话测试必须先接一个模型源。生产上我推荐接通义千问、智谱或者OpenAI这类API但开发调试期我强烈推荐先用Ollama。Ollama是一个本地模型运行工具支持Llama、Qwen2.5、DeepSeek等主流开源模型。安装后打开命令行执行ollama pull qwen2.5:7b模型就下到本地了。然后切到Dify后台在“设置-模型供应商”里找到Ollama填写API地址http://host.docker.internal:11434模型名称qwen2.5:7b必须和Ollama里pull下来的名字完全一致模型类型LLM注意Windows下Docker容器访问宿主机不能用localhost要用host.docker.internal这个特殊域名第一次配Dify的人基本都会在这里卡一下。填完保存后点测试能拉到模型列表就算通了。用Ollama调试的好处是免费、快速、完全本地化坏处是普通家用机上7B模型推理速度远低于云端API只适合开发验证不建议直接扛生产流量。3. Prompt工程在Dify里让提示词从“摆设”变成“标准件”3.1 面向业务的提示词结构很多教程里讲的Prompt是在网页聊天框里临时写几句话这跟生产环境里的Prompt是两码事。生产环境里的Prompt应该是可维护的、可版本化的“标准件”。在Dify里编排应用时我习惯把系统提示词组织成四段结构身份、任务、范围约束、输出格式。举个例子一个政策问答助手的系统提示词是这样写的你是企业的政策咨询助手。你的任务是根据下方提供的【资料内容】回答用户问题不要使用训练数据中的记忆回答问题。如果【资料内容】中找不到答案请直接回答这个问题我没有找到相关资料不要编造。 【资料内容】 {{#context#}} 【用户问题】 {{#sys.query#}} 回答要求 1. 结论先行并引用资料中的条款或文件名称。 2. 保持客观不做推测。这里两个关键变量值得说明{{#context#}}是知识库检索结果的注入位置{{#sys.query#}}是用户当前提问内容。把检索结果和用户问题显式写进提示词模型才知道该依据什么作答。这是RAG应用提示词工程的核心逻辑也是Dify这类平台比裸调API方便的地方——变量帮你维护好了上下文拼接。3.2 变量、动态输入与流程可控性Dify的提示词支持自定义变量这意味着同一套模板可以应对不同场景。比如在对话开始前先通过表单收集用户所在城市、业务类型、会员等级然后在提示词里用{{#city#}}、{{#businessType#}}引用模型回答时就会自动带上这些限制。实际做项目时我自己总结了一个判断标准只要提示词里出现重复的业务实体就把它提出来做成变量别写死在文本里。这样维护起来省心也方便后续接入表单或API参数。还有一个细节提示词里写约束时尽量写“可判定的规则”不要写“请准确回答”这种模糊话。比如“当问题涉及金额时必须输出数字范围并注明币种”“当用户表达不明确时先列出你的理解并请用户确认”。模型也是基于概率的你给它的规则越可校验输出就越稳定。3.3 结构化输出让模型按约定交作业生产级AI工作流通常不是只给人看还要给下游系统用。让模型输出JSON是常见需求。在Dify里可以在提示词末尾加一句“以JSON格式输出字段包括answer、source_list、confidenceconfidence取值0到1”然后把LLM节点的输出格式切换成JSON模式系统会强制模型产出合法JSON解析的时候省心太多。这个环节我踩过一个坑如果提示词里要求输出JSON但节点开着流式输出部分模型会在结尾补一句“以上是回答”之类的废话导致整体JSON解析失败。解决办法很简单要么关掉流式输出要么在工作流后面加一个代码节点做解析容错先尝试严格解析失败再走正则修复。3.4 版本管理与日志驱动迭代Dify的编排页面有预览调试面板可以实时看到模型返回、token消耗和耗时。我的习惯是每次修改提示词都做同一件事把修改前后的版本分别存一份用固定的十到二十条测试问题来回跑记录每条问题的通过或不通过。不要凭感觉觉得新版本更好要用测试集说话尤其在你反复修改之后。应用上线后Dify的“日志与标注”功能会记录每次用户会话。我建议每周抽一批日志把回答质量差的问题捞出来反推是知识库没召回还是提示词约束不够再回到对应环节去修。AI应用不是上线就完事的它是一个持续用数据喂养、持续调整的过程。这条闭环走顺了Prompt才有资格叫“工程”。4. 知识库与RAG从“背教材”到“带着资料作答”4.1 文档清洗与分段检索质量的上游知识库是RAG项目的核心资产。我在政务项目里处理几份PDF之前第一件事不是上传而是清洗。很多政策文件是从扫描件转出来的文字有错乱、有页眉页脚、有图表序号直接拿去分段检索出来的片段会很脏。建议先做一轮预处理删掉页眉页脚和目录表格尽量转成文本必要时先用OCR工具重识别一遍。清洗完成后进入分段环节。Dify上传文档后会自动分段默认按token数切分。分段大小和重叠量对检索效果影响很大我常用的初始参数是参数数值理由分段长度400-500 token足够表达一个完整语义又不会让上下文过载分段重叠50 token减少关键句子被拦腰截断导致的语义丢失为什么要有重叠因为文本被切断时句子的后半截可能落在下一段没有重叠的话当用户问的核心内容正好跨段时检索就漏了。50 token的重叠可以保证关键句子在相邻两段各出现一次提高召回命中率。对于政策类文件我还会根据条款编号做自定义分段让一段尽量对应一条完整政策避免一条政策被切成两段各说各话。4.2 索引方式与检索策略怎么选Dify创建知识库时要选索引方式。高质量模式会调用Embedding模型把文本向量化检索时用向量相似度匹配语义经济模式用的是关键词索引适合文档量小、查询词高度精确的场景。生产上我基本只用高质量模式Embedding模型可以选BGE-M3或者市面上主流的向量模型。检索策略方面Dify支持三种模式向量检索语义理解强能匹配“怎么申请补贴”和“补贴申请流程”这种同义不同形的问题。全文检索适合精确关键词比如政策文号、专有名词、固定称呼。混合检索向量和关键词一起出结果再做Rerank重排效果最稳但会多一次模型调用。我在政务项目里最终用的是混合检索加Rerank召回Top 5相关度阈值设为0.4。这样既不会因为漏召回而答不出也不会因为灌进太多无关内容把模型“带偏”。4.3 政务RAG项目的参数复盘放一组我当时实际使用的完整参数给正准备做同类项目的人一个起点配置项参数说明文档处理页眉页脚删除、OCR识别、表格转文本PDF多为扫描版不洗没法用分段长度450 token尽量保持条款逻辑完整分段重叠50 token减少语义截断索引方式高质量模式使用BGE-M3向量模型检索策略混合检索 Rerank兼顾语义与关键词精确匹配召回数量Top 5再多会稀释上下文相关度阈值0.4低于阈值直接回答“未找到”这套参数在我当时的几十条测试集上表现稳定。核心思想只有一个严格控制进入上下文的资料质量宁可说得保守也不让模型在模糊资料上强行发挥。4.4 命中率不理想时的调优方向如果发现模型答得不对先别急着改Prompt。Dify的调试面板能直接看到召回的具体文档片段如果召回来的根本不是用户想问的内容那就证明确实是检索环节的问题改Prompt没意义。只有召回完全正确、但模型回答仍然不对才轮到提示词层面去优化。我自己的调优顺序是固定的先清理源文档再调分段参数再换Embedding模型然后调检索策略接着加Rerank最后才改提示词。按这个顺序走多数“答非所问”的问题都能定位到源头而不是在表面反复打补丁。5. 生产级工作流把业务逻辑画进画布5.1 什么时候从对话助手切到工作流Dify里有两种应用类型Chatflow对话流和Workflow工作流。用户问一句AI答一句还要带着多轮记忆的用Chatflow后台自动处理数据、批量处理文本、不需要多轮对话的用Workflow。我的判断标准很直接只要应用里出现了“如果…就…”这类条件逻辑就别只写一个LLM节点硬撑该上工作流就上。工作流里的分支、条件判断、错误处理、并行执行都是单个Prompt做不到的。你可以在一个Prompt里写“如果用户生气就道歉”但那种不可控的模糊逻辑远不如在工作流里用条件分支明确规定来得靠谱。5.2 工作流核心节点的连接逻辑Dify工作流画布上常用的节点包括开始、LLM、知识检索、条件分支、代码执行、HTTP请求、模板转换、变量聚合器、迭代、参数提取。刚上手的人容易被这些节点吓到其实核心链路就三种拿数据、加工数据、输出结果。举一个我当时实际做过的例子“政策自动问答加人工复核”工作流结构大致是开始节点接收用户问题。知识检索节点从知识库召回相关内容。LLM节点基于召回结果生成答案并输出JSON字段包含answer和confidence。条件分支判断confidence低于0.6走人工工单节点高于0.6直接返回用户。代码节点做JSON解析和字段清洗。结束节点返回最终结果。这个流程的精髓在于“有把握的自动答没把握的转人工”。用户感知上既快又可信这才叫生产级。纯粹的“有问必答、不会也硬答”是不可接受的。5.3 错误处理、重试与超时生产系统一定会出故障模型接口偶发超时、知识库检索失败、上游HTTP服务不可用这些在demo里无所谓上生产必须兜底。Dify的工作流节点支持配置错误处理可以为每个节点设置重试次数和失败后的异常分支。我的配置建议是关键LLM节点开启1到2次重试再多就既增费用又拖慢响应。主流程依赖的数据节点失败后走降级分支返回“当前服务繁忙请稍后再试”这类友好提示。从日志里记录节点耗时、失败原因和请求ID方便后续用链路追踪定位。这里强调一下异常分支一定要存在哪怕只是返回一句友好提示也比整个工作流卡死强。出错时的用户体验往往决定了用户对一个AI系统的信任度。5.4 发布与API化把AI能力嵌进业务系统工作流编排完成并测试通过后点击发布Dify会生成API访问地址外部系统通过标准REST API调用鉴权用App的API Key。这一步就是AI能力“接进业务系统”的入口。我当时就是把政务问答能力封装成API对接到了客户的内部办公平台。这里有个高频出错点API的输入输出字段必须和编排时“开始节点”里定义的变量一一对应字段名写错会直接报参数错误。上线前建议在“访问API”文档页复制示例请求跑一次冒烟测试确认字段、鉴权、返回结构都符合预期再给到对接方。6. 多租户、备份与升级社区版上生产绕不开的几件事6.1 1.10社区版的多租户能力很多团队评估社区版时第一件事就问多租户。早期的Dify社区版确实不支持一个实例只能有一个工作空间。但从社区版1.10开始系统管理后台支持创建多个租户每个租户有独立的工作空间、成员、应用和知识库数据彼此隔离。我实际测试下来对中小团队完全够用租户的管理员看不到其他租户的内容权限边界清晰不用自己二次开发隔离逻辑。不过要注意多租户的管理能力和商业版比还是有一些简化比如一些细粒度的配额控制、用量统计不如商业版精细。如果你的客户对租户隔离要求特别严格建议提前整理需求清单逐条核对。6.2 Docker部署下的数据备份与升级Dify的数据主要存在PostgreSQL和对象存储里社区版默认本地存储。备份最稳妥的方式是备份整个docker目录下的持久化数据或者进入容器执行pg_dump导出数据库。我的习惯是升级前至少做三件事备份.env文件这是整套环境配置的入口。备份PostgreSQL数据用docker exec进容器执行导出。记录当前版本号方便升级后核对。Dify的升级流程一般是把新版代码覆盖到原目录保留原来的.env和docker目录数据卷然后执行docker compose pull docker compose up -d。官方有迁移脚本处理数据库变更但我在Windows上升级时也遇到过数据库驱动版本不匹配的情况所以强烈建议先在测试环境完整升一遍确认业务跑通再去动生产实例。6.3 常见故障排查链路把我线上遇到最多的几类问题列个表方便你对号入座现象可能原因排查路径应用页面加载不出前端容器异常或端口变化docker compose ps看状态docker compose logs web查日志模型调用一直转圈API Key配置错误、额度用尽、模型名写错在模型供应商设置里点“测试”确认基础连通性知识库检索无结果Embedding模型未配置或索引失败检查索引状态必要时重建索引容器总是被杀死机器内存不足检查可用内存关闭多余容器或调大内存限制升级后数据库报错版本迁移不兼容查看迁移日志恢复备份后重新升级排查的核心思路是“逐层定位”先看容器活没活再看依赖服务通没通然后看模型调用成不成功最后才怀疑业务配置。大多数问题其实出在配置和资源而不是平台本身的代码。最后聊一点个人的感受。Dify这类平台给我的感觉是它把大模型应用开发的门槛压低到了一个很务实的位置——你不需要从零写RAG链路不需要为消息队列和向量数据库的运维操心但前提是你要真正理解业务编排和Prompt设计而不是把平台当成一个“拖拖拽拽就行”的黑盒。生产级AI工作流的核心从来不是工具本身多炫而是你对自己的业务问题有多少清晰的结构化拆解。把部署、提示词、知识库、工作流、维护这条线完整走通一遍之后你手上就有了一套可以持续迭代的AI应用底座。以上是我个人的实操体会希望对你有点用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进