开源大模型应用开发:Dify开发基本过程
一、开发前准备
1.1 环境要求
- 操作系统:Linux/Windows/macOS
- 内存:8GB RAM(推荐16GB+)
- 存储:50GB可用空间
- Docker & Docker Compose(容器化部署)
- Python 3.8+(本地开发)
- 能访问 GitHub(下载源码)
- 可连接模型API(本地或远程)
1.2 部署方式选择
| 方式 |
适合场景 |
优点 |
缺点 |
| Docker Compose |
快速体验/生产 |
一键部署,依赖隔离 |
需要Docker基础 |
| 源码部署 |
深度定制开发 |
完全控制,方便调试 |
依赖管理复杂 |
| 云端托管 |
团队协作开发 |
免运维,开箱即用 |
需要付费,数据在云端 |
二、完整开发流程
2.1 第一步:部署Dify服务
Docker Compose部署(推荐):
git clone https://github.com/langgenius/dify
cd dify/docker
cp .env.example .env
nano .env
APP_WEB_URL=http://localhost:3000
SECRET_KEY=your-secret-key-here
DB_PASSWORD=your-db-password
REDIS_PASSWORD=your-redis-password
docker-compose up -d
docker-compose logs -f web
2.2 第二步:配置大模型
方案A:使用本地开源模型(Ollama)
curl -fsSL https://ollama.com/install.sh | sh
ollama serve &
ollama pull qwen2.5:7b
ollama pull llama3.2:3b
在Dify界面配置:
- 进入「设置」→「模型供应商」
- 点击「添加模型供应商」
- 选择「Ollama」
- 填写配置:
方案B:使用云端API
提供商:OpenAI
API密钥:sk-xxxx
模型:gpt-3.5-turbo
温度:0.7
提供商:自定义模型
端点URL:https://dashscope.aliyuncs.com/compatible-mode/v1
模型:qwen-max
API密钥:sk-xxxx
2.3 第三步:创建第一个应用
3.1 创建翻译助手
-
点击「创建应用」 → 选择「文本生成应用」
-
基本信息:
- 应用名称:智能翻译助手
- 应用描述:支持多语言翻译的AI助手
- 图标:上传或选择图标
-
提示词编排:
# 系统指令
你是一名专业的翻译官,精通多种语言。
# 任务描述
请将用户输入的文本翻译成目标语言。
# 变量定义
{{source_text}} - 需要翻译的文本
{{target_language}} - 目标语言(如:英语、日语、法语等)
# 输出格式
翻译结果:
[翻译后的文本]
注:保持原文风格和语气。
- 对话开场白:
欢迎使用智能翻译助手!我可以帮您翻译各种语言。
请告诉我:
1. 要翻译的文本
2. 目标语言
- 用户输入表单配置:
[
{
"label": "需要翻译的文本",
"variable": "source_text",
"required": true,
"type": "textarea"
},
{
"label": "目标语言",
"variable": "target_language",
"required": true,
"default": "英语",
"type": "select",
"options": ["英语", "日语", "韩语", "法语", "德语", "西班牙语"]
}
]
3.2 配置模型参数
温度:0.3
最大Token:1000
停止序列:无
启用上下文:是
上下文轮数:5
最大上下文长度:2000
2.4 第四步:工作流开发(进阶)
创建「智能客服工作流」:
工作流设计:
┌─────────┐ ┌──────────────┐ ┌─────────────┐
│ 用户输入 │────▶│ 意图识别 │────▶│ 条件判断 │
└─────────┘ └──────────────┘ └─────────────┘
│
┌──────────────┐ ▼ ┌──────────────┐
│ 技术问题 │◀────┤ ├────▶│ 售后问题 │
└──────────────┘ │ └──────────────┘
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│知识库检索 │ │通用回答 │ │创建工单 │
│+LLM回答 │ │ │ │+模板回复 │
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└──────────┬───────────┴──────────────────────┘
▼
┌──────────────┐
│ 最终回复 │
└──────────────┘
具体配置:
- 意图识别节点(LLM节点):
你是一个客服意图分类器。请分析用户问题属于以下哪一类:
1. 技术问题 - 产品使用、故障排除等
2. 售后问题 - 退货、换货、维修等
3. 产品咨询 - 功能、价格、规格等
4. 其他问题 - 无法归类的其他问题
用户问题:{{input}}
请以JSON格式回复:
{
"intent": "技术问题|售后问题|产品咨询|其他问题",
"confidence": 0.95,
"key_entities": ["关键词1", "关键词2"]
}
- 条件判断节点:
[
{
"condition": "{{intent}} == '技术问题'",
"output": "tech_support"
},
{
"condition": "{{intent}} == '售后问题'",
"output": "after_sales"
},
{
"condition": "{{intent}} == '产品咨询'",
"output": "product_info"
},
{
"condition": "true",
"output": "general"
}
]
- 知识库节点配置:
知识库:产品技术文档
检索模式:混合搜索
返回条数:3
相似度阈值:0.7
提示词模板:根据以下知识回答问题:{{context}}
用户问题:{{question}}
2.5 第五步:知识库集成
创建产品知识库:
docs/
├── 用户手册.pdf
├── FAQ常见问题.docx
├── 技术规格.txt
└── 更新日志.md
- 名称:产品知识库
- 描述:包含所有产品文档
- 分段方式:智能分段
配置索引参数:
索引配置:
- 分块大小:500字符
- 重叠长度:50字符
- 嵌入模型:text-embedding-3-small
- 索引方法:HNSW
处理选项:
- 自动提取PDF图片文字:是
- 处理表格数据:是
- 处理公式:否
- 语言检测:自动
测试知识库:
问题:"产品如何充电?"
预期结果:返回用户手册中充电章节内容
问题:"保修期多久?"
预期结果:返回FAQ中的保修政策
2.6 第六步:API集成与工具调用
6.1 添加天气查询工具:
{
"name": "get_weather",
"description": "查询城市天气",
"method": "GET",
"url": "https://api.openweathermap.org/data/2.5/weather",
"parameters": {
"q": "{{city}}",
"appid": "${env.WEATHER_API_KEY}",
"units": "metric"
},
"headers": {
"Content-Type": "application/json"
},
"response_mapping": {
"temperature": "$.main.temp",
"description": "$.weather[0].description",
"humidity": "$.main.humidity"
}
}
6.2 工具调用提示词:
# 系统指令
你可以使用以下工具:
1. get_weather - 查询天气
2. calculator - 计算数学表达式
3. search_web - 搜索最新信息
# 使用规则
- 当用户询问天气时,使用get_weather工具
- 当需要计算时,使用calculator
- 当问题涉及实时信息时,使用search_web
用户问题:{{query}}
2.7 第七步:测试与优化
7.1 测试方法:
测试用例:
- 输入:"翻译'你好'成英语"
期望包含:"Hello"
- 输入:"北京天气如何?"
期望使用:天气工具
- 输入:"产品怎么重启?"
期望来源:知识库文档
上传CSV文件:
问题,期望关键词
"如何充电","电池,充电"
"保修政策","保修,期限"
版本A:温度=0.3
版本B:温度=0.7
比较指标:准确性、用户评分
7.2 优化技巧:
原始:回答用户问题
优化:"""
你是一个{角色},请遵循以下规则:
1. 首先理解问题的核心:{{分析}}
2. 检查是否有相关知识:{{知识库检索}}
3. 组织回答结构:{{结构}}
4. 验证准确性:{{验证}}
5. 最终输出:{{输出}}
用户问题:{{query}}
"""
最佳实践:
- 翻译任务:温度=0.1-0.3
- 创作任务:温度=0.7-0.9
- 问答任务:温度=0.3-0.5
2.8 第八步:部署与发布
8.1 应用发布配置:
发布设置:
访问权限:
- 公开访问:是/否
- 密码保护:可选
- API密钥访问:是
频率限制:
- 每分钟:60次
- 每小时:1000次
- 每月:10000次
数据记录:
- 保存对话历史:是
- 匿名化处理:是
- 保留时长:30天
8.2 获取访问方式:
URL: http://your-domain/app/app-xxx
curl -X POST "http://your-domain/v1/chat-messages" \
-H "Authorization: Bearer app-xxx" \
-H "Content-Type: application/json" \
-d '{
"inputs": {},
"query": "你好",
"response_mode": "blocking"
}'
<script>
window.difyChatbotConfig = {
token: 'app-xxx',
baseUrl: 'http://your-domain'
}
</script>
<script src="http://your-domain/embed.min.js"></script>
8.3 监控与维护:
监控指标:
1. 性能指标:
- 响应时间:< 3秒
- 错误率:< 1%
- Token使用量
2. 业务指标:
- 用户满意度评分
- 问题解决率
- 知识库命中率
3. 成本指标:
- API调用成本
- 存储成本
- 计算资源成本
三、故障排除
常见问题解决:
docker-compose logs web
docker-compose down
docker-compose up -d
ollama list
curl http://localhost:11434/api/generate -d '{"model":"qwen2.5:7b","prompt":"test"}'
file 用户手册.pdf
pdftotext 用户手册.pdf
性能优化:
优化建议:
1. 模型层面:
- 使用量化模型:Q4_K_M
- 启用批处理
- 设置合适的max_tokens
2. 知识库层面:
- 优化分块大小
- 使用更快的嵌入模型
- 定期清理无效文档
3. 系统层面:
- 增加缓存
- 使用CDN加速静态资源
- 数据库索引优化
四、最佳实践总结
- 从小开始:先完成最小可用产品,再逐步添加功能
- 持续测试:每个功能点都要有对应的测试用例
- 文档完善:及时更新应用文档和操作手册
- 安全第一:注意API密钥管理,敏感信息不硬编码
- 监控告警:设置关键指标的监控和告警
- 用户反馈:建立反馈机制,持续改进应用
- 版本控制:对提示词和工作流进行版本管理
- 成本控制:监控Token使用,优化成本结构
通过以上步骤,您可以系统地使用Dify开发出功能完善的AI应用。记得在实际开发中根据具体需求调整配置,并持续迭代优化。