Files

3.8 KiB
Raw Permalink Blame History

id, title, type, domain, stack, tags, level, prerequisites, est_hours, related, week
id title type domain stack tags level prerequisites est_hours related week
ai.lowcode.scenario.poc-to-production 从 Dify 原型到生产:哪些留在平台、哪些改成代码 scenario ai
lowcode
fastapi
rag
PoC
低代码
私有化部署
自定义工具
迁移
评测
intermediate
ai.lowcode.dify-coze
2
ai.lowcode.interview
ai.agent-ops.scenario.agent-quality-gate
13

从 Dify 原型到生产:哪些留在平台、哪些改成代码

业务背景与问题

业务部门用私有化部署的 Dify 搭了一个“合同条款问答”原型,两周内在部门内部很受欢迎,准备推广到全公司。评估时发现:

  1. 知识库是所有合同混在一起,没有按部门和密级做权限;
  2. 回答效果没有量化,改提示词全凭感觉;
  3. 某些问题需要查合同管理系统的实时状态,平台的 HTTP 节点直接写了系统的内部账号;
  4. 用户量扩大 20 倍后,平台的响应变慢。

约束

  • 业务部门希望继续能自己调整提示词和流程。
  • 合同属于敏感数据,权限必须严格。

方案设计

  1. 能力拆分:
    • 留在平台:对话流程编排、提示词、界面、通用知识(公开的制度);
    • 改成代码服务:带权限的合同检索(按用户部门和密级过滤,见 RAG 权限场景)、合同系统查询(用户身份透传),以自定义工具接入平台。
  2. 评测:从原型的对话日志中整理 100 条问题和标准答案,形成评测集;每次修改提示词后通过 API 批量调用平台应用跑评测。
  3. 配置版本化:定期导出应用配置(DSL)存入 Git,修改前后对比。
  4. 性能:自定义工具服务独立扩容;平台按官方文档做多实例部署;高频问题加缓存(注意权限维度)。
  5. 退出路径:如果平台无法满足(例如需要复杂的多 Agent 和人工审批),核心服务已经是独立代码,迁移到 LangGraph 的成本可控。

关键代码

通过 API 批量调用平台应用做评测(Dify 应用 API 的路径和参数以官方文档为准,示意):

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。

取舍

选择 优点 缺点
平台编排 + 代码服务(本方案) 业务可自助调整,关键逻辑可控 两套系统,要定义清楚边界
全部留在平台 最快 权限、评测、性能受平台能力限制
全部重写为代码 完全可控 失去业务自助能力,开发周期长

易错点

  • 在平台的 HTTP 节点中写死系统账号和密钥。
  • 原型的知识库直接用于全公司,没有权限。
  • 评测时用的平台应用版本和线上不一致。
  • 推广前没有压测。

面试怎么讲

“Dify 原型验证了需求之后,我做的是拆分:流程、提示词和界面留在平台,让业务自己调;带权限的合同检索和合同系统查询写成代码服务,用用户身份调用,再作为自定义工具接入。用原型日志整理了评测集,通过平台的 API 批量跑;平台配置定期导出进 Git。这样既保留了低代码的效率,权限和质量又在我们控制之下。”