阶段4(下):LangChain 1.x、提示词与注入防护、模型侧(路由/vLLM/LoRA)、AI 编程工具与验证、Dify/Coze 专题
This commit is contained in:
1 parent
caaec830b3
commit
7a32d2c9a6
38 files changed
+3059
-67
No files matched your search
@@ -0,0 +1,80 @@
|
||||
---
|
||||
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。这样既保留了低代码的效率,权限和质量又在我们控制之下。”
|
||||
Reference in new issue
Block a user