RAGFlow 响应社区需求推出了 Text2SQL 功能。传统的 Text2SQL 需要模型微调,这与 RAG 或 Agent 组件在企业环境中一起使用时会显著增加部署和维护成本。RAGFlow 基于 RAG 的 Text2SQL 利用现有的(已连接的)大型语言模型 (LLM),无需额外的微调模型即可与其他的 RAG/Agent 组件无缝集成。
以下流程图解释了如何实现基于 RAG 的 Text2SQL 功能
一般来说,您需要准备一个用于生成 Text2SQL 提示词的知识库,其中包含自然语言转换为 SQL 语句的各种示例。用户查询首先发送到该知识库以检索相似的示例。然后将检索到的示例连接到 LLM 的提示词中,以生成最终的 SQL 语句。生成的 SQL 直接用于查询数据库。如果返回结果不正确,或者更糟糕的是,什么也没检索到,则生成的 SQL 将被视为不正确,并且会再次调用 LLM 重新生成 SQL 语句,直到达到预设的上限。
因此,Text2SQL 依赖于多轮编排。RAGFlow 将此 Text2SQL 功能封装到一个方便的内置 Agent 组件中。在即将发布的版本中,我们计划调整此工作流。目标是使用户能够手动添加或更新知识库中的 text2SQL 示例,如上方虚线箭头所示。
Text2SQL 演示
在 RAGFlow 中使用 Text2SQL
以下是在 RAGFlow 中使用 Text2SQL 的指南
1. 从模板创建 Agent
2. 配置知识库
在提供的 **DB Assistant** 模板中,RAGFlow 使用三种类型的知识库来确保 Text2SQL 的性能
- **DDL** 知识库
- **Q->SQL** 知识库
- **数据库描述** 知识库
**DDL** 知识库:LLM 需要准确的 DDL(数据定义语言)数据来生成 SQL 语句,例如表结构和字段信息。DDL 知识库保存正确的 DDL 数据,以便进行有效的数据库查询。推荐的 DDL 知识库解析配置如下
示例: https://hugging-face.cn/datasets/InfiniFlow/text2sql/tree/main
**Q->SQL** 知识库:在 Text2SQL 过程中,向 LLM 提供自然语言及其对应 SQL 语句对的样本可以提高生成的 SQL 语句的质量。Q->SQL 知识库存储此类对。推荐的 Q->SQL 知识库解析配置如下
示例: https://hugging-face.cn/datasets/InfiniFlow/text2sql/tree/main
**数据库描述** 知识库:此知识库包含有关被查询数据库的准确信息,包括但不限于数据库表的含义以及这些表中不同字段的意义。通过详细的数据库描述,大型语言模型可以更准确地将用户问题转换为 SQL 语句。建议按如下方式配置数据库描述知识库解析设置
示例: https://hugging-face.cn/datasets/InfiniFlow/text2sql/tree/main
3. 配置数据库
- 在 **Execute SQL** 组件中配置数据库所需参数,包括
- 数据库类型(当前支持 MySQL、PostgresDB 和 MariaDB)
- 数据库名称
- 数据库用户名
- 数据库 IP 地址
- 数据库端口号
- 数据库密码
-
完成配置后,点击 **测试** 按钮检查连接是否成功。
-
配置 **循环次数 (Loop)** 参数
RAGFlow 中的 Text2SQL 具有自动纠错能力。如果生成的 SQL 被认为可以正确查询,则会直接返回结果。然而,如果查询失败,RAGFlow 的 Text2SQL 将根据数据库返回的错误信息自动纠正 SQL 语句并重试查询。这个过程——查询失败、纠正 SQL 语句和重试——将持续迭代,直到达到 Loop 参数设置的最大限制。如果达到此最大值,Text2SQL 过程将终止,提示用户在再次尝试之前优化他们的问题或知识库数据。
- 配置 **TopN** 参数
此参数限制查询返回的记录数量,因为查询通常涉及记录。
4. 试用 Text2SQL
点击 **运行** 执行操作。
故障排除
数据库连接失败
连接数据库失败。解决此问题的方法如下
- 点击 **Execute SQL** 组件,确保所有参数设置正确。
- 仔细检查部署 RAGFlow 的机器是否可以使用提供的连接信息连接到数据库。
- 点击 **测试** 检查数据库连接是否成功建立。
找不到 SQL 语句!
用户查询无法转换为 SQL 语句,主要原因是知识库不足或不完整。建议扩充上述三种知识库。
数据库中没有记录!
SQL 查询未能从表中检索到任何记录,原因可能是过滤条件过于严格或表本身没有数据。
超出最大循环次数。无法通过 SQL 语句查询到正确的数据。
生成的 SQL 语句无法准确查询数据库。请检查以下内容
- 确保数据库包含相关数据。
- 验证用户问题是否恰当。
- 确认 **Generate SQL Statement LLM** 和 **Fix SQL Statement LLM** 组件生成的 SQL 语句是正确的。