第一次在 GitHub 上刷到 Dify 的时候,我其实没太当回事。项目描述写得挺宏大——“面向 LLM 应用开发的可视化编排平台”,第一反应是这年头套壳工具太多了。直到我把一个真实的业务问答系统用 Dify 在半天内搭完,还顺手接进了飞书机器人,才意识到这东西跟我以前手写 FastAPI 调模型、自己管向量库、自己维护会话记忆的做法完全是两个维度。
这篇东西我不打算写成官方文档的复读机,就聊聊这半年多实际用下来对 Dify 的理解:它到底解决了什么问题,核心机制是怎么回事,从部署安装到二次开发有哪些坑,以及我踩过之后总结的排查思路。文章会比较长,干货为主,适合两类人看:一类是刚接触 LLM 应用开发、想找一条快速落地路径的开发者;另一类是已经在用 Dify、但卡在部署、编排、报错排查这些环节上的人。
1. 为什么我觉得 Dify 是 LLM 应用的“积木盒”
1.1 它到底解决了我什么痛点
先说说在没有 Dify 之前,我做一个带知识库的问答机器人要干哪些事:接入模型厂商的 API、设计 Prompt 模板、写会话历史管理、搭建向量数据库、做文档切分和 Embedding、写检索逻辑、还要处理多轮对话里的上下文引用、再到权限管理和对外暴露接口。最要命的是这些东西每个项目都要重新来一遍,换一个模型厂商就要改一堆代码,换一个向量库又要改一套调用方式。
Dify 把这些高频组件全部模块化了。模型接入、Prompt 编排、知识库处理、检索增强、Agent 工具调用、工作流编排,全部变成界面上的积木。你要做的不再是实现某个技术细节,而是思考业务逻辑怎么串起来。这个思维转变挺重要的——从“如何写代码”变成“如何编排能力”。
我这里说的“积木”不只是比喻。Dify 底层的每个节点,比如 LLM 节点、知识检索节点、代码执行节点、HTTP 请求节点,本质上就是一个封装好的模块。你把节点拖到画布上,连上线,配置参数,一个应用就出来了。整个过程跟搭积木没有本质区别,只是积木换成了能力组件。
1.2 与传统开发模式和同类工具有什么不一样
很多人会拿 Dify 和 LangChain 对比。说实话,这俩定位完全不同。LangChain 是一套开发框架,给你提供各种封装好的组件和链式调用能力,但还是得写代码,得自己处理部署、运维、前端界面这些事。Dify 是平台型产品,可视化编排加上完整的前后端、数据库、API 网关,开箱即用。你可以理解成 LangChain 是一堆零件,Dify 是把零件拼好的工作台。
还有一类对标产品是 Coze。Coze 的优势在于自带大量插件和模型资源,对新手友好;但它是商业闭源产品,数据在别人服务器上,插件生态受平台控制,企业用起来约束多。Dify 开源,能自托管,数据完全在自己手里,这一点对很多公司来说是刚需。再加上它有完整的 API 接口和二次开发入口,可以嵌进自己的系统里面。
从技术栈角度看,Dify 的架构对开发者也很友好。前端是 Next.js,后端是 Python Flask,数据库用 PostgreSQL,向量存储支持多种引擎(默认 Weaviate,也可以切 Qdrant、Milvus 等),消息队列和缓存用了 Redis。整套东西跑在 Docker 里,迁移和部署都相对简单。
注意:Dify 毕竟是开源社区版,跟商业版有功能差距。比如多租户隔离、部分企业级权限管理在社区版里是缺失的。后面我会专门讲这个边界问题。
2. 我理解的 Dify 核心机制:编排、知识库与 Agent
2.1 应用编排的本质:节点、变量与会话
Dify 的应用类型我现在习惯分三种:普通对话(Chat)、工作流(Workflow)、智能体(Agent)。其中 Chat 和 Agent 都支持多轮对话,Workflow 偏向单次任务处理。最新版本把界面统一成了 Chatflow 和 Workflow 两种画布,Chatflow 可以理解为带对话能力的流程编排。
刚上手的时候不要被画布上密密麻麻的节点吓到。核心节点就那几个:开始节点(接收用户输入和参数)、LLM 节点(调用模型生成回复)、知识检索节点(从知识库找出相关内容)、代码节点(执行 Python/Node.js 脚本)、条件分支节点(按条件走不同路径)、HTTP 请求节点(调用外部接口)、参数提取节点(从用户输入里抽结构化信息)。
变量体系是我觉得 Dify 设计得比较巧妙的地方。系统内置了sys.query(用户当前问题)、sys.conversation_id(会话 ID)、sys.user_id(用户 ID)这些系统变量,你自己还可以定义会话变量来存中间状态。比如你要做一个多轮信息收集的表单机器人,就需要定义一个会话变量保存用户已填写的字段,下一轮对话接着说。
这里顺便说一个我在实践中提炼的理解,跟网上那个关于 token 的热门说法很像:每个 token 其实承载了“身份、意图、价值”三层信息——key 告诉模型“我是谁”,query 告诉模型“我在找什么”,value 告诉模型“我能提供什么”。放在 Dify 的编排里,系统变量就是 key,用户的输入就是 query,知识库和工具就是 value。你把这三层理清楚了,Prompt 模板和上下文策略基本就顺了。
2.2 RAG 知识库流水线是怎么串起来的
Dify 的知识库功能是它最受关注的部分,没有之一。整个流程是一条标准流水线:文档导入 → 文本清洗 → 分段切块 → 向量化 → 存入向量库 → 索引建立 → 召回。
先说分段。Dify 支持自定义分段规则,核心参数是最大分段长度和分段重叠长度。这两个参数直接影响检索质量。分段太短,语义容易割裂;分段太长,Embedding 后向量表达不够精准,还容易超 token 限制。重叠部分的作用是让上下文衔接得更自然,避免在句子中间硬切导致语义断裂。我给中文字档的经验值是:最大分段 1000 个 token,重叠 100 到 200 个 token,具体还要看文档类型。政策制度类文本适合长分段,技术 FAQ 类文本适合短分段。
然后是 Embedding 模型的选择。Dify 默认支持多种模型提供商的 Embedding 接口。如果你部署在国内服务器,建议用国内模型的 Embedding 接口;如果服务器在海外,OpenAI 的text-embedding-3-small性价比较高。这里有个容易被忽略的点:同一套知识库最好固定用一个 Embedding 模型,不要混用。因为不同模型的向量空间不一致,混用的结果就是检索相似度完全不可靠。
检索策略上,Dify 提供了向量检索、全文检索、混合检索、Rerank 重排序这几个选项。我实际测下来,中小规模知识库场景里混合检索 + Rerank是效果最稳的。纯向量检索对关键词匹配不敏感,比如用户问“报销流程”,文档里可能写的是“费用报销管理办法”,纯向量能召回到,但关键词精确度不如全文检索。混合检索把两者结果合并,再用 Rerank 模型排序,能同时兼顾语义和关键词。代价是检索延迟会增加几十到几百毫秒,可接受。
2.3 Agent 与工具调用的底层逻辑
Agent 类型的应用跟普通对话最大的区别在于:它不只是“生成文本”,而是能“采取行动”。Dify 的 Agent 实现依赖大模型的工具调用能力,也就是 Function Calling,或者最新的 Tool Calling 机制。模型在生成回复时,会先判断是否需要调用某个工具,输出一个结构化的工具调用请求,Dify 拿到这个请求后执行对应工具,把结果返回给模型,模型再基于工具结果生成最终回复。
这个循环就是 Agent 的核心循环。Dify 支持的工具有几类:一是平台内建的插件,比如网页搜索、维基百科、计算器等;二是你自定义的工具,核心做法是通过 OpenAPI Schema 描述接口,或者直接写一段 Python 代码做一个代码工具;三是最新版支持的 MCP 接入,社区生态正在往这个方向推。
我踩过的一个典型的坑是:模型不支持 Function Calling,却配置了工具。比如有些文本类模型没有工具调用能力,你硬在 Agent 里加了工具,模型要么假装调用、输出一段非结构化文本,要么直接报provider rejected the request schema or tool payload。这个报错后面我会细说,这里先提醒一句:给 Agent 选模型,优先选官方标注支持工具调用的型号。
3. 从零部署一套能用的 Dify:含踩坑记录
3.1 部署方式选型:Docker Compose 还是源码运行
官方推荐的方式是 Docker Compose 部署,这也是我实际验证过最省心的一条路。Dify 的仓库里直接带了docker/docker-compose.yaml,你只要把仓库 clone 下来,在docker目录下执行docker compose up -d,等几个容器起来就算部署完了。整个过程大概需要拉十几个镜像,视网络情况可能需要十几分钟到半小时。
先别急着敲命令,先确认你的服务器配置。Dify 本身不算吃资源,但一套完整的 Docker 部署下来,包含 API 服务、Worker、Web 前端、PostgreSQL、Redis、Weaviate(或你选的向量库)、SSRF 代理等容器,最低建议 2 核 4G,正式使用推荐 4 核 8G。我最早试过在 1 核 2G 的机器上跑,内存经常飙满,应用动不动就卡死。省什么都不能省内存,这是第一课。
源码运行的方式我也试过,适合要深度二次开发的场景。前端在web目录,跑的是 Next.js;后端在api目录,需要把.env.example复制成.env,配好数据库和 Redis 连接信息,再启动 Flask。源码运行的好处是调试方便,改一行代码立刻能看到效果;坏处是环境配置繁琐,而且你绕过了官方的容器编排,很多组件要自己装。我建议:先 Docker 部署用起来,确认理解架构后再决定要不要走源码。
3.2 CentOS 7 和 Windows 本机的实操要点
很多公司服务器还是 CentOS 7,这里有几个特别需要注意的点。首先 CentOS 7 默认的 Docker 版本可能很老,如果你执行docker compose提示找不到命令,大概率是版本太旧或者没装 compose 插件。Dify 官方要求 Docker 20.10+,所以第一步把 Docker 升级到新版。
其次,CentOS 7 默认防火墙是 firewalld,如果你发现服务起起来了但浏览器访问不了,检查一下 80 端口(或你配置的映射端口)有没有放行。执行firewall-cmd --zone=public --add-port=80/tcp --permanent然后firewall-cmd --reload即可。还有 SELinux,很多 CentOS 7 默认开着,会导致容器读写权限异常,碰到诡异问题可以临时setenforce 0排查。
Windows 本机部署就简单多了,前提是装好 Docker Desktop 并启用 WSL2。我遇到过的坑主要是文件路径权限问题:把 Dify 仓库 clone 到 WSL 文件系统里(比如~/dify)而不是 Windows 的 C 盘 NTFS 路径下,否则文件挂载到容器里经常出现权限不对、启动失败的情况。另一个常见的 Windows 坑是 Docker Desktop 资源分配不足,默认只分 2G 内存给 WSL,Dify 整套起来后明显不够用,在 Docker Desktop 设置里把内存调到至少 4G。
3.3 SSL 报错与初始化失败的排查思路
Dify 相关的报错里,ssl error这个词出现的频率相当高。我总结一下我遇到过的几类情况,供你对照排查。
第一类是浏览器访问报了 SSL 连接错误。这种情况通常是你给 Dify 配了 HTTPS 反向代理,但证书没配置对,或者用了自签名证书,浏览器不信任。如果你只是内网测试,直接用http://IP:端口访问即可,别先折腾 HTTPS。生产环境要配 HTTPS,我建议用 Nginx 或 Caddy 做反向代理,证书用正规 CA 签发的,别在 Dify 容器本身去折腾 TLS。
第二类是配置模型供应商时报An error occurred during credentials validation。这个报错看着像 SSL,其实是模型接口的凭证校验失败。常见原因有三个:API Key 填错了、网络不通、模型服务不可用。排查步骤我一般按这个顺序来:先用 Postman 或 curl 直接调模型厂商的 API,确认 Key 有效且网络能通;再检查 Dify 设置的模型供应商填写的 Base URL 是否正确;最后在 Dify 的日志里看具体的报错信息。我在国内服务器上最常见的根因是模型厂商的接口域名解析超时,换个通得过的 Base URL 或者在网络层面解决。
第三类是 Docker 镜像拉取时报 TLS/SSL 错误。这类问题往往出在镜像源上,跟火山、阿里云的镜像加速器有关,不是 Dify 本身的问题。你执行docker pull的时候看具体的报错信息,如果提示tls: handshake failure,先检查 Docker 的 registry-mirrors 配置,或者把相关镜像源换掉。
还有一类容易误导人的情况:Dify 设置里有个“允许系统安全配置”之类的选项,涉及 SSRF 保护,通过一个代理容器转发所有外部请求。如果你自定义了工具要请求内网服务,这个代理会拦下来。这种报错不是 SSL,但表现可能是 HTTPS 证书校验失败。解决办法是把目标地址加入白名单,或者关闭对应的代理选项。
4. 用 Dify 搭一个真正能用的知识库问答应用
4.1 先设计再动手:场景、模型与知识库规划
纸上谈兵讲了这么多机制,我们直接落地一个案例。假设要给公司做一个内部制度问答机器人,要求是:员工问“报销流程是什么”,机器人能从制度文档里找到准确答案,回答要带引用来源;如果文档里没有相关内容,机器人应该明确说“不知道”,而不是瞎编。
这个需求非常典型,几乎涵盖了 Dify 知识库应用的所有核心环节。第一步不是建应用,而是规划知识库。把公司制度文档按主题拆成几个文档,比如报销制度、考勤制度、差旅制度。不要一股脑把几百页制度文本全塞进一个知识库,因为不同主题的文档内容主题差异大,如果知识库过杂,检索取 topK 时混入不相关内容的概率会显著上升。
模型方面,问答场景我在 Dify 里喜欢用支持长上下文的模型做生成层(比如gpt-4o-mini、deepseek-chat、qwen-plus这类),Embedding 模型单独选一个国产接口或开源模型接口。注意 Dify 里生成模型和 Embedding 模型是分开配置的两个供应商条目,别搞混了。
4.2 编排 Chatflow:把 RAG 和条件分支串起来
进入 Dify 工作台,创建一个 Chatflow 类型的应用。画布上默认已经有“开始”和“结束”节点。我们往中间加“知识检索”节点。
知识检索节点的配置有几个关键项:选择知识库、召回模式、TopK 值、Score 阈值。TopK 指的是从向量库里召回多少条候选片段,一般设 3 到 5。Score 阈值是一个过滤条件,相似度低于这个值的片段会被丢弃。我不建议把这个值设得太高,否则检索结果经常为空;也不建议太低,否则模型会拿到一堆不相关的内容。可以先设为 0.5 左右,后面根据实际测试调。
知识检索节点后面接 LLM 节点。LLM 节点的 Prompt 模板里,要把检索结果作为参考上下文注入。Dify 的系统提示词里可以用变量占位符,比如{context}会被自动替换成检索到的内容。Prompt 的写法直接影响回答质量,我常用的模板结构是:
你是公司内部的制度助手,请基于“参考资料”中的内容回答用户问题。 参考资料: {context} 回答要求: 1. 如果资料中有明确答案,直接回答,并标注引用来源。 2. 如果资料中没有相关内容,回复“抱歉,制度文档中没有找到相关信息”,不要编造。 3. 回答尽量简洁,控制 200 字以内。 用户问题: {query}注意{context}和{query}是 Dify 提供的上下文变量,直接在 Prompt 编辑器里引用即可,不需要自己写代码。这两个占位符是 Dify 系统内置的核心变量,几乎每个知识库应用都会用到。
为了让流程更健壮,我一般在知识检索节点后面加一个条件分支节点。判断逻辑是:如果检索结果为空或 Score 过低,走到一个“兜底回复”的 LLM 节点,让它礼貌地说明没找到信息;如果检索结果正常,走正式的 LLM 节点回答。这个设计极大地提升了用户体验,避免模型强行用不相关内容编答案。
4.3 发布与调用:WebApp、API 与第三方集成
编排完成后点右上角的“发布”。Dify 会为每个应用生成一个 WebApp 链接,你可以直接把这个链接分享给团队试用,也能在 WebApp 里调试对话。这个功能对非技术同事特别友好,他们不需要知道什么叫 RAG、什么叫向量库,给个链接就能体验。
WebApp 适合人工试用,正式系统集成还是走 API。Dify 为每个应用生成了专属 API Key,调用方式和普通 LLM API 几乎一致。我用 curl 做个例子:
curl -X POST https://your-dify-domain/v1/chat-messages \ -H "Authorization: Bearer app-your-api-key" \ -H "Content-Type: application/json" \ -d '{ "inputs": {}, "query": "报销流程是什么", "response_mode": "blocking", "conversation_id": "" }'返回结果里会带上conversation_id,下一次请求传入这个 ID 就能保持多轮对话的上下文。Dify 也提供了流式响应模式,适合做打字机效果,体验比阻塞模式好很多。这里提醒一下:API Key 相当于应用的访问凭证,一定要保护好,不要暴露在前端代码里。如果只是 H5 页面嵌入式集成,Dify 有专门的嵌入脚本,用 iframe 方式加载,不需要暴露 Key。
我在实际项目中接飞书机器人,就是写了一个 Python 脚本监听飞书的消息事件,收到消息后调用上面这个 API,再把返回内容发回飞书。这个流程你换成钉钉、企业微信、微信客服都成立,Dify 本身不关心你接什么渠道,它只提供 HTTP API,渠道层完全是你自己掌控的。
5. 进阶玩法:迁移、升级与二次开发
5.1 数据备份与跨服务器迁移
Dify 用起来之后,你很快会面临两个现实问题:一是数据要备份,二是可能要换服务器。这两个问题本质上是同一个问题,核心就三样东西:.env配置文件、volumes数据目录、docker-compose.yaml编排文件。
Dify 的所有持久化数据都在docker/volumes目录下,包括 PostgreSQL 的数据库文件、Weaviate/Qdrant 的向量数据、Redis 的缓存数据等。备份时最稳妥的方式是:先停掉容器(docker compose down),把整个volumes目录和.env、docker-compose.yaml一起打包压缩,然后再把容器启起来。停容器是为了保证数据一致性,避免备份过程中有写入导致文件损坏。
迁移到新服务器时,先把 Dify 的 Docker 部署跑起来一遍,让它生成默认的数据目录,然后覆盖新生成的volumes目录和.env文件,再docker compose up -d重启。这里有个小技巧:如果新老版本不一致,强烈建议先在原服务器上把 Dify 升级到跟目标服务器相同的版本,再做数据迁移,否则数据库结构不兼容会导致启动失败。
我踩过的一个真实的坑是:只备份了volumes,忘记备份.env,结果新环境里数据库连接配置不对,应用起不来。.env里记录了密钥、数据库密码、向量库配置这些关键信息,缺了它等于丢了钥匙。迁移这件事,请务必把三件套都带上。
5.2 社区版的多租户与权限边界
Dify 社区版 1.10 出来的时候,很多人对“多租户”功能寄予厚望。但这里要泼一盆冷水:完整的多租户隔离、子账号管理、企业级权限控制是 Dify 商业版的能力,社区版不支持。社区版的账号体系很简单:管理员在控制台邀请成员,成员能看到同一个工作区里的所有应用和知识库,没有做成员级的资源隔离。
这一点对个人开发者和已经有运维团队的小团队问题不大,因为大家一起维护一个工作区就行。但如果你是给客户做 SaaS 产品,每个客户要独立的模型配置、独立的知识库、独立的 API Key,社区版就需要自己设计隔离方案。常见的做法是:给每个客户部署一套独立的 Dify 实例,用不同的域名和数据库。这样隔离彻底,但运维成本也跟着上去了。
Dify 自己也意识到了这个需求,路线图里在推进更细粒度的权限控制。如果你不想自己造轮子,可以关注后续版本的更新;这个场景下直接把商业版也纳入评估,比较省心。
5.3 二次开发:前端、后端与插件扩展
Dify 二次开发这件事,很多人一听就劝退,其实难度没有想象中高。前端部分在web目录,Next.js 技术栈,你想改界面风格、加自定义组件都在这层做。后端在api目录,Python Flask,核心的编排逻辑、知识库处理、API 网关都在这里。
二次开发最轻的入口其实是扩展 API。Dify 提供了api扩展机制,你可以在不修改核心代码的情况下,在应用编排放一个“扩展节点”,让流程在特定环节回调你自己的服务接口。这个方式很推荐,等于把自定义逻辑放在系统外部,升级 Dify 时不会被覆盖。
如果需要更深度的定制,比如新增一个 Embedding 模型供应商、实现一种新的检索算法、改造 Agent 的工具调用逻辑,那就要动后端的api/core目录了。做这种修改前,强烈建议先把项目结构读一遍,至少搞清楚model_providers、rag、agent这几个目录的职责边界。修改后要自己跑后端单元测试,Dify 的测试体系还算完整,但社区版的 CI 不一定覆盖你改的每个分支。
二次开发时有一个不得不提醒的点:升级 Dify 会跟你改的代码产生冲突。Dify 迭代速度很快,我基本每个季度都升级一次,用了自定义代码之后,升级前一定要先看 release notes,重点检查你改动的模块文件有没有变化。如果不想维护一套 fork,就尽量把自己的改动收敛到独立的插件目录或扩展 API,避免散落到核心文件里。
6. 高频问题速查与实践心得
6.1 常见报错与解决办法
下面这张表格整理了我以及身边朋友实际遇到过的高频问题,每一项都有真实场景支撑,不是从文档里抄的。
| 报错信息 / 现象 | 可能原因 | 排查与解决办法 |
|---|---|---|
An error occurred during credentials validation | 模型供应商 API Key 无效,或网络无法访问模型接口 | 先用 curl 直连模型厂商 API 验证 Key 与网络;检查 Dify 供应商配置的 Base URL;查看日志定位具体报错 |
Unstructured API URL is not configured for doc file processing | 文档解析服务未配置,Dify 自带解析器处理不了某些文件(如复杂 PDF、图片型文档) | 在设置中配置 Unstructured API 服务,或改用 Dify 内置的简易解析器处理文本类文档 |
Provider rejected the request schema or tool payload | Agent 的模型不支持工具调用,或工具参数 Schema 与模型预期不符 | 换用支持 Function/Tool Calling 的模型;检查自定义工具的 OpenAPI Schema 是否合法;尝试精简工具参数 |
| 知识库文档处理一直转圈/失败 | 文档格式复杂、Embedding 模型未配置、向量库写入异常 | 检查 Embedding 供应商是否配置并可用;换用 PDF/Text 格式重试;查看 Worker 容器日志 |
| 对话时检索不到知识库内容 | 知识库未关联到应用、召回 TopK 或 Score 阈值设置不当、Embedding 模型不一致 | 确认应用关联了正确的知识库;调低 Score 阈值;检查索引数据是否存在 (知识库显示文档 chunk 数量) |
| 多轮对话上下文混乱 | 会话变量设置错误、系统提示词未明确角色边界 | 把每轮的关键信息显式写入会话变量;在 Prompt 里强调“只能基于对话历史和知识库回答” |
| 内存不足导致容器挂起 | 服务器内存小于 4G,Docker 资源分配不够 | 为 Docker 增加内存;关闭不需要的容器;考虑去掉独占的向量库改用轻量方案 |
排查这些问题的通用方法论其实只有一条:先看日志,再猜原因。Dify 的后端日志通常在docker compose logs api或docker compose logs worker里,SSRF 代理的报错看在ssrf_proxy的日志。日志里往往直接写了底层错误,比你在界面上瞎猜快得多。
另外,所有跟模型供应商相关的报错,我建议直接先做网络连通性测试。很多诡异的报错最后的根子都在“你那台服务器访问不了模型接口”这件事上。你在本地电脑上测通了,不代表服务器上也能通,这是国内部署 Dify 最容易踩的隐性坑。
6.2 我在实际项目中养成的几个习惯
用 Dify 这一年多,我自己慢慢沉淀了几个工作习惯,分享出来供你参考。
第一个习惯是应用版本化。Dify 的应用编排支持导出 DSL 文件,就是一个 JSON 格式的描述文件。我每次在界面上做了重要调整,都会把 DSL 导出保存到公司 Git 仓库里,跟代码一样管理。这样既可以回滚任意版本,也能让我在 Review 的时候看到编排逻辑到底改了什么。不要只依赖 Dify 界面里的自动保存,一定要自己导出归档,这是我在升级和迁移时能快速恢复的最大保障。
第二个习惯是小步快跑,先做最小闭环。拿到一个需求,不要一上来就设计十个节点的复杂工作流。先用一个“开始 → 知识检索 → LLM → 结束”的四节点链路跑通,确认知识库召回效果和 Prompt 产出质量,再逐步加条件分支、加工具调用、加渠道集成。复杂编排的问题定位起来非常痛苦,小而美的链路才是折磨最少的状态。
第三个习惯是给模型选型留余地。Dify 的好处之一是模型供应商解耦,你随时可以在应用设置里切换不同的生成模型,不影响应用结构和知识库。我会在 Prompt 和节点编排里刻意避免写死某个模型特有的行为,这样当主力模型涨价或者效果不达标时,换一个模型只需要几分钟。对于 LLM 应用来说,模型是会抽卡升级的关键变量,别把一切都押在一个模型上。
第四个习惯,也算是对刚入坑朋友的一句心理按摩:不要迷信完美编排。Dify 的边界和模型的能力边界,很多都是试出来的。你精心设计的复杂流程,上线后用户的问题分布可能完全超出你的预期。与其在编排上反复打磨,不如先把基础功能跑起来,用真实流量和数据去迭代。这跟我前几年写传统软件的思路完全不同,但在 LLM 应用这个领域,先跑通、再调优才是真正有效的路径。
我现在几乎每个新项目的原型阶段都在 Dify 上完成。它不是一个金光闪闪的“AI 神器”,但它是让我把想法变成可运行产品的最近路径。如果你正在犹豫要不要用它,我的建议是先拿一个真实但低风险的场景跑一遍,跑完你自己就会有答案。