基于MySQL的数据库查询agent
首先我们要有MySQL,可以查询一下别的地方怎么装
我这里装好拥有了,用了DBeaver去连接,现在新增一个数据库
CREATE DATABASE dify_test;
USE dify_test;
CREATE TABLE student_grades (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id VARCHAR(20) NOT NULL,
student_name VARCHAR(50) NOT NULL,
class_name VARCHAR(50) NOT NULL,
subject VARCHAR(50) NOT NULL,
score DECIMAL(5,2) NOT NULL,
exam_date DATE NOT NULL,
semester VARCHAR(50) NOT NULL,
grade VARCHAR(50) NOT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL
);

INSERT INTO student_grades (student_id, student_name, class_name, subject, score, exam_date, semester, grade, created_at, updated_at) VALUES
('2023001', '李一', '高一(1)班', '数学', 85.00, '2023-09-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023002', '王二', '高一(1)班', '英语', 92.50, '2023-09-20', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023003', '张三', '高一(2)班', '物理', 78.00, '2023-10-05', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023004', '赵四', '高一(2)班', '化学', 88.00, '2023-10-10', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023005', '孙五', '高一(3)班', '生物', 95.00, '2023-11-01', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023006', '周六', '高一(3)班', '历史', 82.00, '2023-11-05', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023007', '吴七', '高一(4)班', '地理', 90.00, '2023-12-01', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023008', '郑八', '高一(4)班', '政治', 87.00, '2023-12-05', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023009', '冯九', '高二(1)班', '数学', 76.00, '2024-01-10', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023010', '陈十', '高二(1)班', '英语', 94.00, '2024-01-15', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023011', '褚十一', '高二(2)班', '物理', 89.00, '2024-02-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023012', '卫十二', '高二(2)班', '化学', 81.00, '2024-02-05', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023013', '蒋十三', '高二(3)班', '生物', 93.00, '2024-03-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023014', '沈十四', '高二(3)班', '历史', 86.00, '2024-03-05', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023015', '韩十五', '高二(4)班', '地理', 91.00, '2024-04-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023016', '杨十六', '高二(4)班', '政治', 84.00, '2024-04-05', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023017', '朱十七', '高三(1)班', '数学', 79.00, '2024-05-10', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023018', '秦十八', '高三(1)班', '英语', 96.00, '2024-05-15', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023019', '尤十九', '高三(2)班', '物理', 88.00, '2024-06-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023020', '许二十', '高三(2)班', '化学', 83.00, '2024-06-05', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023021', '何二十一', '高三(3)班', '生物', 92.00, '2024-07-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023022', '吕二十二', '高三(3)班', '历史', 85.00, '2024-07-05', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023023', '施二十三', '高三(4)班', '地理', 90.00, '2024-08-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023024', '张二十四', '高三(4)班', '政治', 87.00, '2024-08-05', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023025', '孔二十五', '高一(1)班', '数学', 77.00, '2023-09-25', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023026', '曹二十六', '高一(1)班', '英语', 95.00, '2023-09-30', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023027', '严二十七', '高一(2)班', '物理', 89.00, '2023-10-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023028', '华二十八', '高一(2)班', '化学', 82.00, '2023-10-20', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023029', '金二十九', '高一(3)班', '生物', 94.00, '2023-11-10', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023030', '魏三十', '高一(3)班', '历史', 86.00, '2023-11-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023031', '陶三十一', '高一(4)班', '地理', 91.00, '2023-12-10', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023032', '姜三十二', '高一(4)班', '政治', 84.00, '2023-12-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023033', '戚三十三', '高二(1)班', '数学', 78.00, '2024-01-20', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023034', '谢三十四', '高二(1)班', '英语', 96.00, '2024-01-25', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023035', '邹三十五', '高二(2)班', '物理', 88.00, '2024-02-10', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023036', '喻三十六', '高二(2)班', '化学', 83.00, '2024-02-15', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023037', '吴三十七', '高二(3)班', '生物', 93.00, '2024-03-10', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023038', '柏三十八', '高二(3)班', '历史', 85.00, '2024-03-15', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023039', '水三十九', '高二(4)班', '地理', 90.00, '2024-04-10', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023040', '窦四十', '高二(4)班', '政治', 87.00, '2024-04-15', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023041', '章四十一', '高三(1)班', '数学', 79.00, '2024-05-20', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023042', '云四十二', '高三(1)班', '英语', 96.00, '2024-05-25', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023043', '苏四十三', '高三(2)班', '物理', 88.00, '2024-06-10', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023044', '潘四十四', '高三(2)班', '化学', 83.00, '2024-06-15', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023045', '葛四十五', '高三(3)班', '生物', 92.00, '2024-07-10', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023046', '奚四十六', '高三(3)班', '历史', 84.00, '2024-07-15', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023047', '范四十七', '高三(4)班', '地理', 90.00, '2024-08-10', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023048', '彭四十八', '高三(4)班', '政治', 87.00, '2024-08-15', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023049', '郎四十九', '高一(1)班', '数学', 77.00, '2023-10-01', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023050', '鲁五十', '高一(1)班', '英语', 95.00, '2023-10-05', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023051', '韦五十一', '高一(2)班', '物理', 88.00, '2023-10-25', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023052', '昌五十二', '高一(2)班', '化学', 82.00, '2023-10-30', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023053', '马五十三', '高一(3)班', '生物', 94.00, '2023-11-20', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023054', '苗五十四', '高一(3)班', '历史', 86.00, '2023-11-25', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023055', '凤五十五', '高一(4)班', '地理', 91.00, '2023-12-20', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023056', '花五十六', '高一(4)班', '政治', 83.00, '2023-12-25', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023057', '方五十七', '高二(1)班', '数学', 78.00, '2024-01-30', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023058', '俞五十八', '高二(1)班', '英语', 96.00, '2024-02-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023059', '任五十九', '高二(2)班', '物理', 88.00, '2024-02-20', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023060', '袁六十', '高二(2)班', '化学', 83.00, '2024-02-25', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023061', '柳六十一', '高二(3)班', '生物', 92.00, '2024-03-20', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023062', '酆六十二', '高二(3)班', '历史', 85.00, '2024-03-25', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023063', '鲍六十三', '高二(4)班', '地理', 90.00, '2024-04-20', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023064', '史六十四', '高二(4)班', '政治', 87.00, '2024-04-25', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023065', '唐六十五', '高三(1)班', '数学', 79.00, '2024-05-30', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023066', '费六十六', '高三(1)班', '英语', 95.00, '2024-06-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023067', '廉六十七', '高三(2)班', '物理', 88.00, '2024-06-20', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023068', '岑六十八', '高三(2)班', '化学', 82.00, '2024-06-25', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023069', '薛六十九', '高三(3)班', '生物', 94.00, '2024-07-20', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023070', '雷七十', '高三(3)班', '历史', 86.00, '2024-07-25', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023071', '贺七十一', '高三(4)班', '地理', 91.00, '2024-08-20', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023072', '倪七十二', '高三(4)班', '政治', 84.00, '2024-08-25', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023073', '汤七十三', '高一(1)班', '数学', 78.00, '2023-10-10', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023074', '滕七十四', '高一(1)班', '英语', 96.00, '2023-10-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023075', '殷七十五', '高一(2)班', '物理', 88.00, '2023-11-01', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023076', '罗七十六', '高一(2)班', '化学', 83.00, '2023-11-05', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023077', '毕七十七', '高一(3)班', '生物', 93.00, '2023-11-30', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023078', '郝七十八', '高一(3)班', '历史', 85.00, '2023-12-01', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023079', '邬七十九', '高一(4)班', '地理', 90.00, '2023-12-30', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023080', '安八十', '高一(4)班', '政治', 87.00, '2024-01-01', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023081', '常八十一', '高二(1)班', '数学', 79.00, '2024-02-05', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023082', '乐八十二', '高二(1)班', '英语', 96.00, '2024-02-10', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023083', '于八十三', '高二(2)班', '物理', 88.00, '2024-03-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023084', '时八十四', '高二(2)班', '化学', 83.00, '2024-03-05', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023085', '傅八十五', '高二(3)班', '生物', 92.00, '2024-03-30', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023086', '皮八十六', '高二(3)班', '历史', 84.00, '2024-04-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023087', '卞八十七', '高二(4)班', '地理', 90.00, '2024-04-30', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023088', '齐八十八', '高二(4)班', '政治', 87.00, '2024-05-01', '2023-2024学年第二学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023089', '康八十九', '高三(1)班', '数学', 77.00, '2024-06-05', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023090', '伍九十', '高三(1)班', '英语', 95.00, '2024-06-10', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023091', '余九十一', '高三(2)班', '物理', 88.00, '2024-07-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023092', '元九十二', '高三(2)班', '化学', 82.00, '2024-07-05', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023093', '卜九十三', '高三(3)班', '生物', 94.00, '2024-07-30', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023094', '顾九十四', '高三(3)班', '历史', 86.00, '2024-08-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023095', '孟九十五', '高三(4)班', '地理', 91.00, '2024-08-30', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023096', '平九十六', '高三(4)班', '政治', 83.00, '2024-09-01', '2024-2025学年第一学期', '高三', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023097', '黄九十七', '高一(1)班', '数学', 78.00, '2023-10-20', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023098', '和九十八', '高一(1)班', '英语', 96.00, '2023-10-25', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023099', '穆九十九', '高一(2)班', '物理', 88.00, '2023-11-10', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023100', '萧一百', '高一(2)班', '化学', 83.00, '2023-11-15', '2023-2024学年第一学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023101', '李一', '高一(1)班', '数学', 90.00, '2024-03-15', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023102', '王二', '高一(1)班', '英语', 88.00, '2024-03-20', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023103', '张三', '高一(2)班', '物理', 85.00, '2024-04-05', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023104', '赵四', '高一(2)班', '化学', 92.00, '2024-04-10', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023105', '孙五', '高一(3)班', '生物', 55.00, '2024-05-01', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023106', '周六', '高一(3)班', '历史', 70.00, '2024-05-05', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023107', '吴七', '高一(4)班', '地理', 65.00, '2024-06-01', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023108', '郑八', '高一(4)班', '政治', 95.00, '2024-06-05', '2023-2024学年第二学期', '高一', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023109', '冯九', '高二(1)班', '数学', 60.00, '2024-07-10', '2024-2025学年第一学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00'),
('2023110', '陈十', '高二(1)班', '英语', 75.00, '2024-07-15', '2024-2025学年第一学期', '高二', '2026-02-03 08:00:00', '2026-02-03 08:00:00');


数据库表创建好了,数据也好了.回到dify去安装两个插件,一个是database,一个是echarts



mysql+pymysql://root:123456@host.docker.internal:3306/dify_test
回到dify创建一个chatflow


这是默认的
把llm改为qwen3max
然后prompt写
## 角色
你是一个专业的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 ...;" }
]
请严格按照上述格式和要求生成响应。
然后再系统prompt下点击添加,添加用户提示词和助手提示词相当于给大模型一个例子


测试成功


在代码执行后添加输出,然后测试一下可以

添加一个迭代处理查询,循环查询






这时候就能设置迭代的输出了

处理循环结果

def main(args) -> dict:
return {
"result": "".join(str(item) for item in args)
}
测试一下


import re
import json
def main(args: str) -> dict:
# 默认返回值
default_output = {
"results": "",
"ECHarts": "0",
"chartType": "",
"chartTitle": "",
"chartData": "",
"chartXAxis": ""
}
try:
# 使用正则表达式提取被 ```json 和 ``` 包裹的内容
match = re.search(r'```json\s*([\s\S]*?)\s*```', args)
if not match:
raise ValueError("输入字符串中未找到有效的 JSON 数据")
# 提取 JSON 字符串
json_str = match.group(1).strip()
# 将 JSON 字符串解析为 Python 字典
results_dict = json.loads(json_str)
except Exception as e:
# 如果解析失败,打印错误信息并返回默认输出
print(f"解析失败: {e}")
return default_output
# 检查是否包含 ECHarts 字段
if "ECHarts" not in results_dict:
results_dict["ECHarts"] = "0" # 默认设置为 "0"
# 根据 ECHarts 的值动态检查图表相关字段
if results_dict["ECHarts"] == "1":
required_chart_fields = ["chartType", "chartTitle", "chartData", "chartXAxis"]
for field in required_chart_fields:
if field not in results_dict:
results_dict[field] = "" # 自动补全缺失字段为空字符串
# 构造返回值
return {
"results": str(results_dict.get("results", "")),
"ECHarts": str(results_dict.get("ECHarts", "0")),
"chartType": str(results_dict.get("chartType", "")),
"chartTitle": str(results_dict.get("chartTitle", "")),
"chartData": str(results_dict.get("chartData", "")),
"chartXAxis": str(results_dict.get("chartXAxis", ""))
}

### 角色
你是一个数据分析师,需要基于前一个模型生成的SQL语句及其执行结果,优先针对用户问题进行回答,确保回答内容紧扣主题不发散,同时对相关维度的数据进行分析,并以JSON格式输出给用户。
### 参数
- **用户输入**:{{#sys.query#}}
- **SQL 模型生成**:{{#llm.text#}}
- **SQL 查询结果**:{{#context#}}
### 图表使用场景
- 线性图:适用于展示趋势变化的数据,例如时间序列数据(如每月或每年的变化趋势)。
- 柱状图:适用于比较不同类别之间的数量或占比,例如各城市的占比情况。
- 饼状图:适用于展示整体组成部分及其比例,通常用于单维度的比例分布。
### 要求:
1. 优先回答用户问题,确保回答内容紧扣主题不发散。
2. 根据用户问题选择合适的线性图、柱状图或饼状图。
3. 将输出内容封装到JSON中,格式如下:
```json
{
"results": "用Markdown格式先回复用户问题,其他维度数据简单概括,但必须完整展示数据",
"ECHarts": "1", // 如果需要生成图表,则为 "1";否则为 "0"
"chartType": "线性图/柱状图/饼状图", // 图表类型(仅当 ECHarts 为 "1" 时提供)
"chartTitle": "图表标题", // 图表标题(仅当 ECHarts 为 "1" 时提供)
"chartData": "图表的数据,多个用;隔开", // 图表数据(仅当 ECHarts 为 "1" 时提供)
"chartXAxis": "图表的X轴,多个用;隔开" // 图表的X轴数据(仅当 ECHarts 为 "1" 时提供)
}
```
#### 注意事项:
- 如果查询结果适合生成图表,则将 ECHarts 设置为 "1",并补充 chartType、chartTitle、chartData 和 chartXAxis 字段。
- 如果查询结果不适合生成图表,则将 ECHarts 设置为 "0",并省略 chartType、chartTitle、chartData 和 chartXAxis 字段。
- 对于占比查询,必须使用饼状图进行展示,且在饼状图的 chartData 中返回百分比值。


添加条件分支




大功告成
测试全校各班平均成绩

然后可以点击发布了.



<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>数据库分析助手</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
flex-direction: column;
}
.header {
background: rgba(255, 255, 255, 0.95);
padding: 20px 0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.header-content {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
align-items: center;
gap: 15px;
}
.logo {
width: 40px;
height: 40px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: bold;
font-size: 20px;
}
h1 {
color: #333;
font-size: 26px;
font-weight: 500;
}
.container {
flex: 1;
max-width: 1200px;
width: 100%;
margin: 30px auto;
padding: 0 20px;
display: flex;
flex-direction: column;
}
.chat-container {
background: white;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 500px;
}
.chat-messages {
flex: 1;
padding: 30px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 20px;
}
.message {
display: flex;
gap: 12px;
animation: fadeIn 0.3s ease-in;
}
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.message.user {
flex-direction: row-reverse;
}
.avatar {
width: 40px;
height: 40px;
border-radius: 50%;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
color: white;
}
.message.user .avatar {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.message.assistant .avatar {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.message-content {
max-width: 70%;
padding: 12px 18px;
border-radius: 18px;
line-height: 1.6;
word-wrap: break-word;
}
.message.user .message-content {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-bottom-right-radius: 4px;
}
.message.assistant .message-content {
background: #f5f5f5;
color: #333;
border-bottom-left-radius: 4px;
}
.input-area {
padding: 20px 30px;
background: #fafafa;
border-top: 1px solid #e0e0e0;
}
.input-container {
display: flex;
gap: 12px;
align-items: flex-end;
}
#messageInput {
flex: 1;
padding: 12px 18px;
border: 2px solid #e0e0e0;
border-radius: 24px;
font-size: 15px;
font-family: inherit;
resize: none;
max-height: 120px;
transition: border-color 0.3s;
}
#messageInput:focus {
outline: none;
border-color: #667eea;
}
#sendButton {
padding: 12px 30px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 24px;
cursor: pointer;
font-size: 15px;
font-weight: 500;
transition: transform 0.2s, box-shadow 0.2s;
}
#sendButton:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
}
#sendButton:active {
transform: translateY(0);
}
#sendButton:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
}
.welcome-message {
text-align: center;
padding: 60px 20px;
color: #666;
}
.welcome-message h2 {
font-size: 24px;
margin-bottom: 10px;
color: #333;
}
.welcome-message p {
font-size: 16px;
}
.suggestions {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 12px;
margin-top: 30px;
}
.suggestion-card {
background: white;
padding: 16px;
border-radius: 12px;
cursor: pointer;
transition: all 0.2s;
border: 2px solid transparent;
}
.suggestion-card:hover {
border-color: #667eea;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.2);
}
.suggestion-card h3 {
font-size: 15px;
color: #333;
margin-bottom: 6px;
}
.suggestion-card p {
font-size: 13px;
color: #666;
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #ccc;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #999;
}
</style>
</head>
<body>
<div class="header">
<div class="header-content">
<div class="logo">DB</div>
<h1>数据库分析助手</h1>
</div>
</div>
<div class="container">
<div class="chat-container">
<div class="chat-messages" id="chatMessages">
<div class="welcome-message">
<h2>👋 欢迎使用数据库分析助手</h2>
<p>我可以帮助您分析数据库性能、优化查询、设计数据结构等</p>
<div class="suggestions">
<div class="suggestion-card" onclick="sendSuggestion('如何优化慢查询?')">
<h3>🚀 查询优化</h3>
<p>如何优化慢查询?</p>
</div>
<div class="suggestion-card" onclick="sendSuggestion('数据库索引设计的最佳实践是什么?')">
<h3>📊 索引设计</h3>
<p>数据库索引设计的最佳实践是什么?</p>
</div>
<div class="suggestion-card" onclick="sendSuggestion('如何分析数据库性能瓶颈?')">
<h3>⚡ 性能分析</h3>
<p>如何分析数据库性能瓶颈?</p>
</div>
</div>
</div>
</div>
<div class="input-area">
<div class="input-container">
<textarea
id="messageInput"
placeholder="请输入您的问题..."
rows="1"
onkeydown="handleKeyDown(event)"
></textarea>
<button id="sendButton" onclick="sendMessage()">发送</button>
</div>
</div>
</div>
</div>
<script>
let isFirstMessage = true;
function handleKeyDown(event) {
if (event.key === 'Enter' && !event.shiftKey) {
event.preventDefault();
sendMessage();
}
}
function sendSuggestion(text) {
document.getElementById('messageInput').value = text;
sendMessage();
}
function sendMessage() {
const input = document.getElementById('messageInput');
const message = input.value.trim();
if (!message) return;
// 如果是第一条消息,清除欢迎界面
if (isFirstMessage) {
document.getElementById('chatMessages').innerHTML = '';
isFirstMessage = false;
}
// 添加用户消息
addMessage(message, 'user');
// 清空输入框
input.value = '';
input.style.height = 'auto';
// 模拟助手回复
setTimeout(() => {
const responses = [
'我理解您的问题。针对数据库优化,我建议:\n\n1. 首先分析查询执行计划,找出性能瓶颈\n2. 合理创建索引,但避免过度索引\n3. 优化查询语句,避免SELECT *\n4. 考虑使用缓存机制减少数据库压力\n\n您需要针对哪个方面进行深入了解吗?',
'关于这个问题,让我为您详细分析:\n\n数据库性能优化是一个系统工程,需要从多个维度考虑。建议您从监控当前系统指标开始,识别出真正的性能瓶颈所在。',
'很好的问题!根据最佳实践,我建议您:\n\n• 定期进行数据库维护和优化\n• 监控关键性能指标\n• 建立合理的备份策略\n• 考虑读写分离和分库分表方案\n\n需要我详细讲解某个方面吗?'
];
const randomResponse = responses[Math.floor(Math.random() * responses.length)];
addMessage(randomResponse, 'assistant');
}, 1000);
}
function addMessage(text, type) {
const messagesContainer = document.getElementById('chatMessages');
const messageDiv = document.createElement('div');
messageDiv.className = `message ${type}`;
const avatar = document.createElement('div');
avatar.className = 'avatar';
avatar.textContent = type === 'user' ? '我' : 'AI';
const content = document.createElement('div');
content.className = 'message-content';
content.textContent = text;
messageDiv.appendChild(avatar);
messageDiv.appendChild(content);
messagesContainer.appendChild(messageDiv);
// 滚动到底部
messagesContainer.scrollTop = messagesContainer.scrollHeight;
}
// 自动调整输入框高度
document.getElementById('messageInput').addEventListener('input', function() {
this.style.height = 'auto';
this.style.height = Math.min(this.scrollHeight, 120) + 'px';
});
</script>
<script>
window.difyChatbotConfig = {
token: 'jMrsD65xLeDqUxaD',
baseUrl: 'http://localhost',
inputs: {
// You can define the inputs from the Start node here
// key is the variable name
// e.g.
// name: "NAME"
},
systemVariables: {
// user_id: 'YOU CAN DEFINE USER ID HERE',
// conversation_id: 'YOU CAN DEFINE CONVERSATION ID HERE, IT MUST BE A VALID UUID',
},
userVariables: {
// avatar_url: 'YOU CAN DEFINE USER AVATAR URL HERE',
// name: 'YOU CAN DEFINE USER NAME HERE',
},
}
</script>
<script
src="http://localhost/embed.min.js"
id="jMrsD65xLeDqUxaD"
defer>
</script>
<style>
#dify-chatbot-bubble-button {
background-color: #1C64F2 !important;
}
#dify-chatbot-bubble-window {
width: 24rem !important;
height: 40rem !important;
}
</style>
<script>
window.difyChatbotConfig = {
token: 'JovcQ66zO1K6yyFZ',
baseUrl: 'http://localhost',
inputs: {
// You can define the inputs from the Start node here
// key is the variable name
// e.g.
// name: "NAME"
},
systemVariables: {
// user_id: 'YOU CAN DEFINE USER ID HERE',
// conversation_id: 'YOU CAN DEFINE CONVERSATION ID HERE, IT MUST BE A VALID UUID',
},
userVariables: {
// avatar_url: 'YOU CAN DEFINE USER AVATAR URL HERE',
// name: 'YOU CAN DEFINE USER NAME HERE',
},
}
</script>
<script
src="http://localhost/embed.min.js"
id="JovcQ66zO1K6yyFZ"
defer>
</script>
<style>
#dify-chatbot-bubble-button {
background-color: #1C64F2 !important;
}
#dify-chatbot-bubble-window {
width: 24rem !important;
height: 40rem !important;
}
</style>
</body>
</html>

下面是api方法


然后打开apifox测试一下接口


成功了