当前位置: 首页 > ai >正文

Dify-CHATflow案例

Chatflow面向对话类情景,包括客户服务、语义搜索、以及其他需要在构建响应时进行多步逻辑
的对话式应用程序,该类应用特点在于支持对生成的结果进行多轮对话交互,调整生成的结果。
常见的交互路径:给出指令 → 生成内容 → 就内容进行多次讨论 → 重新生成结果 → 结束。

 数据查询智能助手

       数据查询智能助手:创建chatflow实现自然语言对话方式实现从数据库中查询数据并返回相应结果。
       在该案例中,将数据库中已知表的结构信息作为知识库传递给大模型,当用户通过自然语言方式 查询数据时,首先从知识库中获取相应片段信息,传递给大模型,然后由大模型给出查询SQL,进而通过python代码从数据库中将数据查询数据,并给出相应解释。

1) 在MySQL中准备数据库及表

在mysql中的mydb数据库下,创建表及插入数据:

-- 使用mydb数据库
use mydb;
-- 客户表
CREATE TABLE mydb.customers (customer_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '客户ID',name VARCHAR(100) NOT NULL COMMENT '客户姓名',email VARCHAR(100) COMMENT '客户邮箱',phone VARCHAR(20) COMMENT '客户电话',address VARCHAR(255) COMMENT '客户地址'
) COMMENT='客户表';
INSERT INTO mydb.customers (name, email, phone, address) VALUES
('张三', 'zhangsan@example.com', '13800138000', '北京市朝阳区'),
('李四', 'lisi@example.com', '13800138001', '上海市浦东新区'),
('王五', 'wangwu@example.com', '13800138002', '广州市天河区'),
('赵六', 'zhaoliu@example.com', '13800138003', '深圳市南山区'),
('孙七', 'sunqi@example.com', '13800138004', '杭州市西湖区'),
('周八', 'zhouba@example.com', '13800138005', '成都市武侯区'),
('吴九', 'wujiu@example.com', '13800138006', '武汉市江汉区'),
('郑十', 'zhengshi@example.com', '13800138007', '南京市鼓楼区'),
('钱十一', 'qianshiyi@example.com', '13800138008', '长沙市岳麓区'),
('刘十二', 'liushier@example.com', '13800138009', '重庆市渝中区');
-- 产品表
CREATE TABLE mydb.products (product_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',name VARCHAR(100) NOT NULL COMMENT '产品名称',description TEXT COMMENT '产品描述',price DECIMAL(10, 2) NOT NULL COMMENT '产品价格',stock_quantity INT NOT NULL COMMENT '库存数量'
) COMMENT='产品表';
INSERT INTO mydb.products (name, description, price, stock_quantity) VALUES
('产品A', '这是产品A的描述。', 100.00, 50),
('产品B', '这是产品B的描述。', 200.00, 30),
('产品C', '这是产品C的描述。', 150.00, 20),
('产品D', '这是产品D的描述。', 300.00, 10),
('产品E', '这是产品E的描述。', 250.00, 15),
('产品F', '这是产品F的描述。', 120.00, 40),
('产品G', '这是产品G的描述。', 80.00, 60),
('产品H', '这是产品H的描述。', 90.00, 70),
('产品I', '这是产品I的描述。', 110.00, 55),
('产品J', '这是产品J的描述。', 130.00, 35);
-- 订单表
CREATE TABLE mydb.orders (order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',customer_id INT NOT NULL COMMENT '客户ID',order_date DATE NOT NULL COMMENT '订单日期',total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额',FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
) COMMENT='订单表';
INSERT INTO mydb.orders (customer_id, order_date, total_amount) VALUES
(1, '2025-03-01', 300.00),
(2, '2025-03-02', 450.00),
(3, '2025-03-03', 200.00),
(4, '2025-03-04', 150.00),
(5, '2025-03-05', 500.00),
(6, '2025-03-06', 350.00),
(7, '2025-03-07', 400.00),
(8, '2025-03-08', 250.00),
(9, '2025-03-09', 600.00),
(10, '2025-03-10', 700.00);
-- 订单明细表
CREATE TABLE mydb.order_details (order_detail_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单明细ID',order_id INT NOT NULL COMMENT '订单ID',product_id INT NOT NULL COMMENT '产品ID',quantity INT NOT NULL COMMENT '数量',unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',FOREIGN KEY (order_id) REFERENCES orders(order_id),FOREIGN KEY (product_id) REFERENCES products(product_id)
) COMMENT='订单明细表';
INSERT INTO mydb.order_details (order_id, product_id, quantity, unit_price) VALUES
(1, 1, 2, 100.00),
(1, 2, 1, 200.00),
(2, 3, 3, 150.00),
(2, 4, 1, 300.00),
(3, 5, 2, 250.00),
(3, 6, 1, 120.00),
(4, 7, 5, 80.00),
(4, 8, 2, 90.00),
(5, 9, 4, 110.00),
(5, 10, 3, 130.00);
-- 供应商表
CREATE TABLE mydb.suppliers (supplier_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '供应商ID',name VARCHAR(100) NOT NULL COMMENT '供应商名称',contact_name VARCHAR(100) COMMENT '联系人姓名',phone VARCHAR(50) COMMENT '联系电话',address VARCHAR(255) COMMENT '联系地址'
) COMMENT='供应商表';
INSERT INTO mydb.suppliers (name, contact_name, phone, address) VALUES
('京东供应链', '赵经理', '13800138001', '北京市大兴区产业园1号楼'),
('阿里巴巴供货', '孙先生', '13800138002', '杭州市西湖区科技园B座'),
('苏宁供货商', '李主管', '13800138003', '南京市玄武区软件谷'),
('唯品会供货中心', '陈小姐', '13800138004', '广州市天河区商务中心'),
('拼多多合作商', '王助理', '13800138005', '上海市浦东新区电商产业园');
-- 产品供应商关系表
CREATE TABLE mydb.product_suppliers (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',product_id INT NOT NULL COMMENT '产品ID',supplier_id INT NOT NULL COMMENT '供应商ID',FOREIGN KEY (product_id) REFERENCES products(product_id),FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id)
) COMMENT='产品供应商关系表';
INSERT INTO mydb.product_suppliers (product_id, supplier_id) VALUES
(1, 1), (2, 1), (3, 2), (4, 2), (5, 3),
(6, 3), (7, 4), (8, 4), (9, 5), (10, 5);
-- 客户反馈表
CREATE TABLE mydb.customer_feedback (feedback_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '反馈ID',customer_id INT NOT NULL COMMENT '客户ID',product_id INT NOT NULL COMMENT '产品ID',rating INT NOT NULL COMMENT '评分(1-5)',comment TEXT COMMENT '反馈内容',feedback_date DATE COMMENT '反馈日期',FOREIGN KEY (customer_id) REFERENCES customers(customer_id),FOREIGN KEY (product_id) REFERENCES products(product_id)
) COMMENT='客户反馈表';
INSERT INTO mydb.customer_feedback (customer_id, product_id, rating, comment, feedback_date) VALUES
(1, 1, 5, '产品很好', '2025-03-05'),
(2, 2, 4, '性价比高', '2025-03-06'),
(3, 3, 3, '一般般', '2025-03-07'),
(4, 4, 5, '非常满意', '2025-03-08'),
(5, 5, 2, '不太好用', '2025-03-09'),
(6, 6, 4, '还不错', '2025-03-10'),
(7, 7, 5, '值得购买', '2025-03-11'),
(8, 8, 3, '中规中矩', '2025-03-12'),
(9, 9, 4, '挺好', '2025-03-13'),
(10, 10, 5, '超级棒', '2025-03-14');

2) 创建知识库,将表结构作为知识库构建

表结构信息如下:
-- 客户表
CREATE TABLE customers (customer_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '客户ID',name VARCHAR(100) NOT NULL COMMENT '客户姓名',email VARCHAR(100) COMMENT '客户邮箱',phone VARCHAR(20) COMMENT '客户电话',address VARCHAR(255) COMMENT '客户地址'
) COMMENT='客户表';
-- 产品表
CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',name VARCHAR(100) NOT NULL COMMENT '产品名称',description TEXT COMMENT '产品描述',price DECIMAL(10, 2) NOT NULL COMMENT '产品价格',stock_quantity INT NOT NULL COMMENT '库存数量'
) COMMENT='产品表';
-- 订单表
CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',customer_id INT NOT NULL COMMENT '客户ID',order_date DATE NOT NULL COMMENT '订单日期',total_amount DECIMAL(10, 2) NOT NULL COMMENT '总金额',FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
) COMMENT='订单表';
-- 订单明细表
CREATE TABLE order_details (order_detail_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '订单明细ID',order_id INT NOT NULL COMMENT '订单ID',product_id INT NOT NULL COMMENT '产品ID',quantity INT NOT NULL COMMENT '数量',unit_price DECIMAL(10, 2) NOT NULL COMMENT '单价',FOREIGN KEY (order_id) REFERENCES orders(order_id),FOREIGN KEY (product_id) REFERENCES products(product_id)
) COMMENT='订单明细表';
-- 供应商表
CREATE TABLE suppliers (supplier_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '供应商ID',name VARCHAR(100) NOT NULL COMMENT '供应商名称',contact_name VARCHAR(100) COMMENT '联系人姓名',phone VARCHAR(50) COMMENT '联系电话',address VARCHAR(255) COMMENT '联系地址'
) COMMENT='供应商表';
-- 产品供应商关系表
CREATE TABLE product_suppliers (id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',product_id INT NOT NULL COMMENT '产品ID',supplier_id INT NOT NULL COMMENT '供应商ID',FOREIGN KEY (product_id) REFERENCES products(product_id),FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id)
) COMMENT='产品供应商关系表';
-- 客户反馈表
CREATE TABLE customer_feedback (feedback_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '反馈ID',customer_id INT NOT NULL COMMENT '客户ID',product_id INT NOT NULL COMMENT '产品ID',rating INT NOT NULL COMMENT '评分(1-5)',comment TEXT COMMENT '反馈内容',feedback_date DATE COMMENT '反馈日期',FOREIGN KEY (customer_id) REFERENCES customers(customer_id),FOREIGN KEY (product_id) REFERENCES products(product_id)
) COMMENT='客户反馈表';

构建知识库:

3) 创建chatflow,命名“数据查询智能助手

4) 创建开始、知识检索节点

5) 创建LLM和参数提取节点

LLM模型改名为“生成查询SQL”,负责根据知识库内容和用户提问转换成SQL查询语句。参数
提取节点改名为“提取SQL”,负责讲LLM生成SQL单独提取出来(默认生成的SQL是MD格式,
需要单独提取可执行的SQL)。
SYSTEM内容如下:
你是一位SQL专家,擅长根据用户的自然语言结合知识库{{上下文}}
中的内容查询生成SQL语句。
1.请根据用户的自然语言描述生成对应的SQL查询语句,直接返回可执行的SQL即可,返回的内容应当可以直接在数据库中执行查询,不需要额外的信息、解释或说明。
2.SQL只能是select相关sql,所有查询的表及字段只能来自于知识库,严谨随意添加不存在于知识库中的表或者字段
3.如果根据用户的自然语言无法生成select相关sql,请直接返回 select "无法生成SQL" from dual
4.用户的描述只能转换为基于知识库中表的查询不能查询mysql相关系统表

6) 创建代码执行节点、LLM和直接回复节点

代码执行节点改名为“查询数据库”,负责直接执行python代码从数据库中查询数据。
LLM节点改名为“对结果优化”,负责对数据库中查询的数据进行优化。
直接回复节点直接返回LLM输出的结果。
import pymysql
import re
import json
from decimal import Decimal
from datetime import date, datetime
class CustomEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, Decimal):return str(obj)elif isinstance(obj, (date, datetime)):return obj.isoformat()return super(CustomEncoder, self).default(obj)
def main(sql: str = ''):"""参数:sql: 要执行的SELECT语句(必需)返回:- 总是返回 {"result": "完整字符串"} 格式"""# 固定写死的参数host = '192.168.1.105'port = 3306user = 'root'password = '123456'database = 'mydb'# 校验必填参数if not sql.strip():return {"result": "SQL语句不能为空"}# 严格校验SQL类型cleaned_sql = re.sub(r'[\s\t\n]+', ' ', sql.strip().lower())if not cleaned_sql.startswith("select"):return {"result": "仅允许执行SELECT查询语句"}# 阻止危险操作forbidden_keywords = ['insert', 'update', 'delete', 'drop', 'alter', 'create', 'truncate']if any(keyword in cleaned_sql for keyword in forbidden_keywords):return {"result": "检测到非查询操作语句"}try:# 建立数据库连接connection = pymysql.connect(host=host,port=port,user=user,password=password,database=database,cursorclass=pymysql.cursors.DictCursor)with connection:with connection.cursor() as cursor:# 执行SQLcursor.execute(sql)result = cursor.fetchall()# 将结果转换为完整字符串if not result:result_str = "查询成功,但结果为空"else:# 将结果转换为格式化的JSON字符串result_str = json.dumps(result, indent=2, ensure_ascii=False, cls=CustomEncoder)return {"result": result_str}except pymysql.Error as err:return {"result": f"数据库错误: {str(err)}"}except Exception as e:return {"result": f"未知错误: {str(e)}"}

7) 测试并发布chatflow

预览测试:
提问示例:
查找打了差评的客户信息
输出每个产品的供应商信息
统计每个用户订单信息,包含用户名称、订单数、订单金额
统计员工每季度总工资
发布使用:

技术手册生成助手

技术手册生成助手:创建chatflow实现根据用户的输入技术内容,进行谷歌搜索,然后爬取每个
搜索到的网站内容,综合生成对应技术的手册。
在该案例中,需要使用到“谷歌搜索”工具来搜索用户输入的内容,然后将搜索到的网站通过迭
代节点一个个爬取,最终将爬取到的内容输入LLM生成完整技术手册。

1) 创建chatflow

2) 创建开始节点、谷歌搜索工具、代码执行节点

谷歌搜索负责根据用户输入内容搜索网页,代码执行节点负责将谷歌搜索到的网址提取,交由后
续迭代节点进行迭代爬取数据。
第六步骤中python代码如下:
def main(array_of_objects) -> dict:# 解析 JSON 字符串# 使用列表推导式提取所有链接links = [result['link'] for obj in array_of_objects for result in obj.get('organic_results', [])]return {"websites": links,}

3) 创建迭代节点,迭代搜索到的每个网站

在迭代节点中创建“网页爬虫”工具和LLM节点,使用爬虫工具爬取每个网址中的内容,然后通过LLM提取爬取内容主要的信息。

以上SYSTEM内容如下:
你是一个文档内容提取助手,擅长从凌乱的内容中提取核心关键的内容信息

4) 创建LLM和直接回复节点

LLM节点改名为“搜索内容整合”,将迭代爬取的多个网页内容做整合。
SYSTEM内容如下:
你是一个专业的文档整理大师,专门擅长对各类技术使用手册内容进行整理。根据用户的提问:{{上下文}}结合{{outp

5) 测试并发布chatflow

预览测试:

发布使用:
http://www.xdnf.cn/news/20144.html

相关文章:

  • JS中的String的常用方法
  • Process Explorer 学习笔记(第三章3.2.3):工具栏与参考功能
  • 知微集:Python中的线程(三)
  • JavaScript 中的并发编程实践与误区:一次深入的探讨
  • 软考高级 — 系统规划与管理师考试知识点精要
  • 电脑活动追踪全解析:六款软件助企业实现数字化精细管理
  • whl编译命令作用解释
  • 【完整源码+数据集+部署教程】加工操作安全手套与手部检测系统源码和数据集:改进yolo11-cls
  • mysq集群高可用架构之组复制MGR(单主复制-多主复制)
  • 2025 年 8 个最佳网站内容管理系统(CMS)
  • 小迪安全v2023学习笔记(七十八讲)—— 数据库安全RedisCouchDBH2database未授权CVE
  • LeetCode 刷题【65. 有效数字】
  • 机器学习算法介绍二
  • postgresql 通过dblink实现 跨库查询
  • PostgreSQL收集pg_stat_activity记录的shell工具pg_collect_pgsa
  • zoho crm notes add customer fields
  • 数字人打断对话的逻辑
  • 本地 Ai 离线视频去水印字幕!支持字幕、动静态水印去除!
  • python-虚拟试衣
  • LVS、Nginx与HAProxy负载均衡技术对比介绍
  • 任意齿形的齿轮和齿条相互包络工具
  • Linux常见命令总结 合集二:基本命令、目录操作命令、文件操作命令、压缩文件操作、查找命令、权限命令、其他命令
  • Process Explorer 学习笔记(第三章3.2.5):状态栏信息详解
  • PyTorch 训练显存越跑越涨:隐式保留计算图导致 OOM
  • 机器学习周报十二
  • 基于Echarts+HTML5可视化数据大屏展示-旅游智慧中心
  • CC-Link IE FB 转 DeviceNet 实现欧姆龙 PLC 与松下机器人在 SMT 生产线锡膏印刷环节的精准定位控制
  • docker 安装kafaka常用版本
  • 错误波形曲线
  • Qt信号与槽机制全面解析