Dify 完全指南:从安装到实战的开源 LLM 应用开发平台
1. Dify 简介
1.1 什么是 Dify?
Dify 是一个开源的 LLM(大语言模型)应用开发平台,旨在降低 AI 应用开发的门槛。它提供了:
- 可视化工作流编排:拖拽式界面,无需编码即可构建复杂 AI 应用
- 知识库管理:支持多种数据源,自动文本分段与向量化
介绍开源 LLM 应用开发平台 Dify 的完整使用流程,涵盖本地部署、API 配置、工作流编排及知识库管理。包含跨境电商客服和 Text2SQL 两个实战案例,提供意图识别代码实现与数据库查询方案。适合企业知识库问答、智能客服系统及内部工具自动化场景,支持自定义工具开发与网页集成。
Dify 是一个开源的 LLM(大语言模型)应用开发平台,旨在降低 AI 应用开发的门槛。它提供了:
| 概念 | 说明 |
|---|---|
| Workflow(工作流) | 面向任务的自动化流程,适合批量处理 |
| Chatflow(对话流) | 面向对话的交互流程,适合客服场景 |
| 知识库 | 私有数据向量化存储,支持 RAG 检索增强 |
| 工具 | 外部 API 或函数,可扩展 AI 能力边界 |
工作流 vs 智能体:
git clone https://github.com/langgenius/dify.git
cd dify
cp .env.example .env
提示:可根据需要修改
.env文件中的配置,如数据库密码、服务端口等。
docker compose up -d
docker compose ps
所有服务应显示为 running 状态。
http://localhost┌─────────────────────────────────────────────────────┐
│ Dify │
├─────────────┬─────────────┬─────────────┬───────────┤
│ Web UI │ API Server │ Worker │ Database │
│ (Next.js) │ (Flask) │ (Celery) │ (PostgreSQL)│
├─────────────┼─────────────┼─────────────┼───────────┤
│ Redis │ Weaviate │ Sandbox │ Nginx │
│ (Cache) │ (Vector DB) │ (Code Exec) │ (Proxy) │
└─────────────┴─────────────┴─────────────┴───────────┘
Q: 启动失败怎么办?
# 查看日志
docker compose logs -f
# 重启服务
docker compose down && docker compose up -d
Q: 如何重置管理员密码?
docker compose exec api flask reset-password [email protected]
from dify import DifyClient
client = DifyClient(api_key="your-api-key")
# 发送对话请求
response = client.chat_messages(inputs={"query": "你好"}, user="user-123")
print(response.json())
curl -X POST https://your-dify-instance.com/v1/chat-messages \
-H "Authorization: Bearer your-api-key" \
-H "Content-Type: application/json" \
-d '{ "inputs": { "query": "你好" }, "user": "user-123" }'
| 计划 | QPS | 月配额 |
|---|---|---|
| 免费版 | 2 | 10,000 |
| 专业版 | 10 | 100,000 |
| 企业版 | 自定义 | 自定义 |
Dify 内置工具可能无法满足所有需求。当需要:
这时就需要开发自定义工具。
由于 Dify 云端服务无法直接访问本地 API,需要使用穿透工具。
npm install -g localtunnel
lt --port 8081
输出示例:
your url is: https://random-name-123.local.lt
# 添加基本认证
lt --port 8081 --basic_auth username:password
创建 API 端点
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/custom-tool', methods=['POST'])
def custom_tool():
data = request.json
# 处理逻辑
return jsonify({"result": "success"})
if __name__ == '__main__':
app.run(port=8081)
Dify 支持多种鉴权方式:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| None | 无需鉴权 | 公开 API |
| API Key | Header 中携带密钥 | 大多数服务 |
| Bearer Token | JWT/OAuth 令牌 | 用户认证 |
| Basic Auth | 用户名密码 | 内部服务 |
特点:
典型流程:
输入 → 预处理 → LLM 处理 → 后处理 → 输出
适用场景:
特点:
典型流程:
用户输入 → 意图识别 → 知识库检索 → LLM 生成 → 回复用户 ↓ 多轮记忆
适用场景:
| 维度 | Workflow | Chatflow |
|---|---|---|
| 交互模式 | 单次任务 | 多轮对话 |
| 状态管理 | 无状态 | 有状态 |
| 上下文 | 不保留 | 保留历史 |
| 适用场景 | 批量处理 | 实时交互 |
| 延迟要求 | 较低 | 较高 |
知识库是 Dify 的 RAG(检索增强生成)核心,通过向量化存储私有数据,让 AI 能够:
支持的数据源类型:
| 类型 | 格式 | 说明 |
|---|---|---|
| 文本文件 | .txt, .md | 纯文本内容 |
| 文档 | .pdf, .docx | Office 文档 |
| 网页 | URL | 自动抓取网页内容 |
| CSV/Excel | .csv, .xlsx | 结构化数据 |
| Notion | Notion 页面 | 需授权访问 |
分段策略:
| 策略 | 说明 | 适用场景 |
|---|---|---|
| 自动分段 | AI 智能识别段落边界 | 通用场景 |
| 固定长度 | 按字符数分段 | 技术文档 |
| 按分隔符 | 按指定符号分段 | 结构化文本 |
清洗选项:
Dify 使用嵌入模型将文本转换为向量:
文本 → [嵌入模型] → 向量 → [向量数据库] → 可检索
支持的嵌入模型:
等待向量化完成后,知识库即可用于检索。
| 参数 | 说明 | 推荐值 |
|---|---|---|
| Top K | 返回的文档片段数量 | 3-5 |
| 相似度阈值 | 最低相似度要求 | 0.5-0.7 |
| 重排序 | 是否启用重排序模型 | 开启 |
构建一个跨境电商智能客服系统,能够:
用户输入
↓
[意图识别节点]
├─→ 打招呼 → 固定回复
├─→ 感谢语 → 礼貌回复
├─→ 告别语 → 告别回复
├─→ 人工服务 → 转接链接
└─→ 其他问题 → RAG 检索 → LLM 生成
import random
import re
def main(query: str) -> dict:
"""
基于固定短语匹配的跨境电商问答处理器
Args: query: 用户输入的问题
Returns: Dict: 包含回复类型、回复内容等信息的字典
"""
# 去除首尾空格
query = query.strip()
# 打招呼相关的固定短语
greeting_phrases = {
# 基本问候
"你好", "您好", "hi", "hello", "嗨", "哈喽", "哈罗", "早上好", "下午好", "晚上好", "上午好", "中午好", "晚安", "早", "午安", "good morning", "good afternoon", "good evening",
# 询问身份
"你是谁", "你是什么", "你叫什么", "你的名字", "介绍一下自己", "自我介绍", "你是什么东西", "你是哪个", "你是啥",
# 询问状态
"你好吗", "怎么样", "还好吗", "你还好吗", "最近怎么样", "你在吗", "在不在", "还在吗", "在线吗", "你在线吗",
# 询问能力
"你能干什么", "你会做什么", "你能做什么", "你的功能", "你有什么用", "你的作用", "你的职责", "你的用途", "你能帮我什么", "你可以做什么", "你会什么", "你懂什么", "能力介绍", "功能介绍", "你的能力", "你有什么功能",
# 开始对话
"开始", "开始咨询", "开始对话", "开始聊天", "我想咨询", "我有问题", "我想问问题", "我想了解", "咨询一下",
# 测试类
"测试", "试试", "试一试", "test", "testing", "试试看", "测试一下", "看看", "检查一下"
}
# 固定回复
greeting_response = "你好,很高兴为您服务!我是您的跨境电商学习小助手,专业为您答疑解惑。"
# 礼貌用语
thank_phrases = {"谢谢", "感谢", "多谢", "谢了", "thanks", "thank you", "thx", "3q", "3x", "谢谢你", "感谢你", "多谢了", "非常感谢", "十分感谢", "万分感谢", "太感谢了"}
goodbye_phrases = {"再见", "拜拜", "bye", "byebye", "goodbye", "88", "走了", "告辞", "先走了", "下次见", "回头见", "有空再聊", "改天聊", "see you", "拜", "溜了", "闪了", "slip away"}
polite_responses = {
"thank": ["不用客气,随时为您服务!", "很高兴能帮助到您!", "这是我应该做的,有问题随时找我哦!", "客气了,有什么问题尽管问!", "不客气,祝您跨境电商生意兴隆!"],
"goodbye": ["再见!期待下次为您服务!", "祝您生活愉快,有问题随时来找我!", "再见!祝您跨境电商生意兴隆!", "拜拜!有问题随时回来咨询!", "再见!祝您学习愉快!"]
}
# 人工服务相关短语
human_service_phrases = {
# 直接要求人工服务
"人工服务", "人工客服", "人工坐席", "人工咨询", "人工帮助", "人工支持", "人工答疑", "人工解答", "人工回复", "人工对话",
# 转接相关
"转人工", "找人工", "要人工", "转接人工", "转接客服", "切换人工", "接入人工", "联系人工", "答疑入口",
# 真人服务
"真人服务", "真人客服", "真人咨询", "真人对话", "真人帮助", "活人", "真人", "人类", "人工", "真的人",
# 客服相关
"客服", "在线客服", "联系客服", "找客服", "客服电话", "客服微信", "客服 qq", "官方客服",
# 老师/导师
"联系老师", "找老师", "咨询老师", "请教老师", "老师帮忙", "专业老师", "课程老师", "指导老师",
# 专业服务
"专人服务", "专人客服", "专业咨询", "专业服务", "专家咨询", "顾问咨询", "一对一服务", "专属服务",
# 投诉和问题
"投诉", "举报", "反馈问题", "意见反馈", "服务投诉", "质量问题", "服务问题", "系统问题",
# 售后相关
"退款", "退货", "售后", "售后服务", "退换货", "申请退款", "退费", "取消订单", "订单问题",
# 不满意
"不满意", "有问题", "出问题", "不行", "太差了", "服务差", "回答不对", "答非所问", "听不懂", "不准确"
}
human_service_response = "同学,点击 https://www.123.com 可进入人工答疑"
def normalize_text(text: str) -> str:
"""标准化文本:去除标点符号,转换为小写"""
cleaned = re.sub(r'[^\w\u4e00-\u9fff]', '', text.lower().strip())
return cleaned
def exact_match_check(query_text: str, phrase_set) -> bool:
"""精确匹配检查"""
normalized_query = normalize_text(query_text)
for phrase in phrase_set:
normalized_phrase = normalize_text(phrase)
if normalized_phrase == normalized_query:
return True
return False
def contains_match_check(query_text: str, phrase_set) -> bool:
"""包含匹配检查(用于短查询中包含关键短语的情况)"""
normalized_query = normalize_text(query_text)
# 只有当查询很短时才使用包含匹配(避免误匹配)
if len(normalized_query) <= 10:
for phrase in phrase_set:
normalized_phrase = normalize_text(phrase)
if normalized_phrase in normalized_query or normalized_query in normalized_phrase:
return True
return False
# 处理输入
query = query.strip()
if not query:
return {"type": "error", "response": "请输入您的问题。", "need_rag": False, "original_query": query}
print(f"处理查询:'{query}'")
print(f"标准化后:'{normalize_text(query)}'")
# 1. 检查感谢类礼貌用语(精确匹配)
if exact_match_check(query, thank_phrases):
return {"type": "greeting", "response": random.choice(polite_responses["thank"]), "need_rag": False, "original_query": query}
# 2. 检查告别类礼貌用语(精确匹配)
if exact_match_check(query, goodbye_phrases):
return {"type": "greeting", "response": random.choice(polite_responses["goodbye"]), "need_rag": False, "original_query": query}
# 3. 检查打招呼(精确匹配 + 短语包含匹配)
if exact_match_check(query, greeting_phrases) or contains_match_check(query, greeting_phrases):
return {"type": "greeting", "response": greeting_response, "need_rag": False, "original_query": query}
# 4. 检查人工服务请求(精确匹配 + 短语包含匹配)
if exact_match_check(query, human_service_phrases) or contains_match_check(query, human_service_phrases):
return {"type": "human_service", "response": human_service_response, "need_rag": False, "original_query": query}
# 5. 其他情况需要 RAG 检索
return {"type": "rag_needed", "response": "", "need_rag": True, "original_query": query}
type == "greeting" → 直接回复type == "human_service" → 返回人工链接type == "rag_needed" → 知识库检索 → LLM 生成构建一个自然语言查询学生成绩的系统,用户可以用中文提问,系统自动生成 SQL 并执行。
CREATE TABLE student_grades (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id VARCHAR(20) NOT NULL,
student_name VARCHAR(50) NOT NULL,
class_name VARCHAR(20),
subject VARCHAR(30),
score DECIMAL(5,2),
exam_date DATE,
semester VARCHAR(20),
grade INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
## 角色
你是一个专业的 SQL 查询生成器,负责根据用户查询创建标准的 MySQL 数据库 SQL 语句。
## 任务
根据以下问题,生成一个格式清晰、结构明确的 JSON 数组,其中每个元素是一条合法且性能优化的 MySQL 查询语句。
### 表信息
表名:student_grades(学生成绩信息表)
### 字段说明
- id: 主键
- student_id: 学号
- student_name: 学生姓名
- class_name: 班级
- subject: 科目
- score: 分数
- exam_date: 考试日期
- semester: 学期
- grade: 年级
- created_at: 记录创建时间
- updated_at: 记录更新时间
### 输出要求
1. 根据用户的问题,生成最多 10 条直接关联问题的 SQL 查询语句。
2. 每条 SQL 应从不同分析角度(如按科目、班级、学期、年级等维度)切入,确保覆盖多维统计需求。
3. 所有 SQL 必须语法正确、可执行,并注重性能优化(如避免 SELECT *,合理使用索引字段等)。
4. 若问题涉及多维统计(例如"各班各科平均分"),请为每个统计维度单独生成子查询。
5. 对于全量数据查询,必须按 semester(学期)进行聚合或排序。
6. 最终输出必须是纯 JSON 数组格式,以 ```json 开头,以 ``` 结尾,不包含任何额外解释或文本,其中每个元素必须是对象,且仅包含一个字段:`"sql"`(字符串类型),格式示例:
```json
[
{ "sql": "SELECT ...;" },
{ "sql": "SELECT ...;" }
]
请严格按照上述格式和要求生成响应。
#### 8.4 示例查询
**用户输入**:「查询三年级一班的数学平均分」
**生成的 SQL**:
```json
[
{"sql": "SELECT AVG(score) as avg_score FROM student_grades WHERE grade = 3 AND class_name = '一班' AND subject = '数学';"},
{"sql": "SELECT class_name, subject, AVG(score) as avg_score FROM student_grades WHERE grade = 3 AND subject = '数学' GROUP BY class_name, subject;"},
{"sql": "SELECT semester, AVG(score) as avg_score FROM student_grades WHERE grade = 3 AND class_name = '一班' AND subject = '数学' GROUP BY semester ORDER BY semester;"}
]
Dify 提供嵌入式脚本,可直接集成到网页中:
<!-- 在 </body> 前添加 -->
<script>
window.difyChatbotConfig = {
token: 'your-app-token',
baseUrl: 'https://your-dify-instance.com'
}
</script>
<script src="https://your-dify-instance.com/embed.min.js" id="your-app-token" defer></script>
.dify-chatbot-container {
position: fixed;
bottom: 20px;
right: 20px;
z-index: 9999;
}
.dify-chatbot-bubble {
max-width: 400px;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
document.addEventListener('dify-chatbot-ready', function() {
console.log('聊天机器人已就绪');
});
document.addEventListener('dify-chatbot-message', function(e) {
console.log('收到消息:', e.detail);
});
// React 示例
import { useEffect } from 'react';
function DifyChatbot() {
useEffect(() => {
const script = document.createElement('script');
script.src = 'https://your-dify-instance.com/embed.min.js';
script.id = 'your-app-token';
script.defer = true;
document.body.appendChild(script);
return () => {
document.body.removeChild(script);
};
}, []);
return <div />;
}
| 优势 | 说明 |
|---|---|
| 快速部署 | Docker Compose 一键启动 |
| 可视化编排 | 无需编码即可构建工作流 |
| RAG 支持 | 私有知识库增强 AI 准确性 |
| 灵活集成 | 支持自定义工具和 API |
| 开源免费 | 社区版完全免费 |
强烈推荐:
可以考虑:
需要评估:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online