--- id: ai.lowcode.scenario.poc-to-production title: 从 Dify 原型到生产:哪些留在平台、哪些改成代码 type: scenario domain: ai stack: [lowcode, fastapi, rag] tags: [PoC, 低代码, 私有化部署, 自定义工具, 迁移, 评测] level: intermediate prerequisites: [ai.lowcode.dify-coze] est_hours: 2 related: [ai.lowcode.interview, ai.agent-ops.scenario.agent-quality-gate] week: [13] --- # 从 Dify 原型到生产:哪些留在平台、哪些改成代码 ## 业务背景与问题 业务部门用私有化部署的 Dify 搭了一个“合同条款问答”原型,两周内在部门内部很受欢迎,准备推广到全公司。评估时发现: 1. 知识库是所有合同混在一起,没有按部门和密级做权限; 2. 回答效果没有量化,改提示词全凭感觉; 3. 某些问题需要查合同管理系统的实时状态,平台的 HTTP 节点直接写了系统的内部账号; 4. 用户量扩大 20 倍后,平台的响应变慢。 ## 约束 - 业务部门希望继续能自己调整提示词和流程。 - 合同属于敏感数据,权限必须严格。 ## 方案设计 1. **能力拆分**: - 留在平台:对话流程编排、提示词、界面、通用知识(公开的制度); - 改成代码服务:**带权限的合同检索**(按用户部门和密级过滤,见 [RAG 权限场景](../../rag/scenarios/permission-aware-kb.md))、合同系统查询(用户身份透传),以自定义工具接入平台。 2. **评测**:从原型的对话日志中整理 100 条问题和标准答案,形成评测集;每次修改提示词后通过 API 批量调用平台应用跑评测。 3. **配置版本化**:定期导出应用配置(DSL)存入 Git,修改前后对比。 4. **性能**:自定义工具服务独立扩容;平台按官方文档做多实例部署;高频问题加缓存(注意权限维度)。 5. **退出路径**:如果平台无法满足(例如需要复杂的多 Agent 和人工审批),核心服务已经是独立代码,迁移到 LangGraph 的成本可控。 ## 关键代码 通过 API 批量调用平台应用做评测(Dify 应用 API 的路径和参数以官方文档为准,示意): ```python async def ask(client: httpx.AsyncClient, question: str, user: str) -> str: r = await client.post( f"{DIFY_BASE}/v1/chat-messages", headers={"Authorization": f"Bearer {APP_API_KEY}"}, json={"inputs": {}, "query": question, "user": user, "response_mode": "blocking"}, timeout=60, ) r.raise_for_status() return r.json()["answer"] results = await asyncio.gather(*(ask(client, c["q"], "eval-bot") for c in CASES)) report = score(CASES, results) # 复用 Agent 评测专题中的打分和门禁逻辑 ``` 自定义工具接口示例:[examples/dify-tool-api](../examples/dify-tool-api/)。 ## 取舍 | 选择 | 优点 | 缺点 | | --- | --- | --- | | **平台编排 + 代码服务(本方案)** | 业务可自助调整,关键逻辑可控 | 两套系统,要定义清楚边界 | | 全部留在平台 | 最快 | 权限、评测、性能受平台能力限制 | | 全部重写为代码 | 完全可控 | 失去业务自助能力,开发周期长 | ## 易错点 - 在平台的 HTTP 节点中写死系统账号和密钥。 - 原型的知识库直接用于全公司,没有权限。 - 评测时用的平台应用版本和线上不一致。 - 推广前没有压测。 ## 面试怎么讲 > “Dify 原型验证了需求之后,我做的是拆分:流程、提示词和界面留在平台,让业务自己调;带权限的合同检索和合同系统查询写成代码服务,用用户身份调用,再作为自定义工具接入。用原型日志整理了评测集,通过平台的 API 批量跑;平台配置定期导出进 Git。这样既保留了低代码的效率,权限和质量又在我们控制之下。”