Dify应用实战番外 - 网友提问(1)

这两天有网友问,上次的课提到了数据库查询,对一般的人还是有点难度。所以希望大模型也能生成SQL,可以自己去查询数据库的数据。

麦金叔建议他使用文生SQL的模型,网友应该真的去尝试了,只不过还是有问题。那今天麦金叔就来演示一下,如何处理这一需求,并解决查询报错的问题。

**01.**动手做一做

今天的任务专题是解决让大模型生成SQL查询语句,并利用数据库工具查询得到结果。

依然用工作流作为测试。添加下图所示节点,依次为”开始”,”LLM”,”参数提取器”,”SQL EXECUTE”和”结束”。

图片

将”开始”节点,添加一个参数”user_promt”。这样在对话时,可以将查询要求填入。

“LLM”节点选择模型为”qwen2.5-72b-instruct”,上下文选择”开始”节点新增的参数”user_promt”,将系统提示词按如下填入:

请直接提供答案,无需解释思考过程。

根据用户输入 上下文

进行SQL的生成,最终结果仅包含SQL语句。

数据库的schema如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `doctor` (

`id` int(11) NOT NULL,

`name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,

`title` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,

`department` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,

`description` text COLLATE utf8mb4_bin,

`status` tinyint(2) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `dep` (`department`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

其中status为医生工作状态,1表示医生正常工作,0表示医生暂停诊治。

title为医生的职称,description为医生擅长领域。

接着在”参数提取器”节点配置模型为”qwen2.5-32b-Instruct”,输入选择上一个”LLM”节点的text。

新建一个提取参数”sql_query”,指令部分填入:

忽略大模型输出的思考过程,即不要提取部分

图片

“SQL EXECUTE”节点,保持和12节课数据库查询一致,并在”结束”节点输出查询结果。

保存后进行测试,结果如下图:

图片

**02.**解释说明

首先,需要添加一个”参数提取器”。因为大模型文生SQL的结果会是这样的结果:

1
2
3
4
5
{

"text": "\`\`\`sql\\nSELECT name, title, description \\nFROM doctor \\nWHERE department = '眼科' AND status = 1;\\n\`\`\`"

}

可以看到text的内容,是以sql开头的。那如果直接去运行,肯定不行呀。SQL查询语句还是需要严谨的,否则无法执行数据库查询。

当然,如果使用其他方法,比如”代码”或者”模版”也可以的,但都比”参数提取器”复杂。

其次,模型的选择上,”LLM”最后不要使用带有COT的模型,因为这一类模型强大是强大,还输出了思考过程,但只是给人看友好。而在工作流里面,还要进一步处理它,比较麻烦。还是直接用输出结果,而不给出思考过程的,更适合工作流。

最后,本着够用就行的原则,对问题理解并生成结果的模型需要参数大一些的模型,但是参数提取这种工作,就没必要也用参数大的,可以适当减小。毕竟实际工作中,在效果一致的前提下,能省一点是一点。

总结

今天的答疑来自网友的留言问题,实际上学习AI应用开发,一定不能照本宣科。要不断地尝试,碰到问题,并解决它,才能学以致用,为工作中能用上AI的能力打下坚实的基础。