应社区需求,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 助手** 模板中,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 地址
- 数据库端口号
- 数据库密码
-
完成配置后,点击 **Test** 按钮检查连接是否成功。
-
配置 **Loop** 参数
RAGFlow 中的 Text2SQL 具有自动反思能力。如果生成的 SQL 被认为可以正确查询,则会直接返回结果。但是,如果查询失败,RAGFlow 的 Text2SQL 会根据数据库返回的错误信息自动修正 SQL 语句并重试查询。这个过程——查询失败、修正 SQL 语句、重试——将持续迭代,直到达到 Loop 参数设置的最大限制。如果达到此最大值,Text2SQL 过程将终止,并提示用户优化其问题或知识库数据后再试。
- 配置 **TopN**
此参数限制查询中返回的记录数,因为查询通常涉及多条记录。
4. 试用 Text2SQL
点击 **Run** 执行操作。
故障排除
数据库连接失败
无法连接到数据库。要解决此问题:
- 点击 **Execute SQL** 组件,确保所有参数都已正确设置。
- 仔细检查部署 RAGFlow 的机器是否可以使用所提供的信息连接到数据库。
- 点击 **Test** 检查数据库连接是否成功建立。
未找到 SQL 语句!
用户查询无法转换为 SQL 语句,主要原因是知识库不足或不完整。建议扩展上述三种知识库。
数据库中没有记录!
SQL 查询未能从表中检索到任何记录,原因可能是筛选条件过于严格,或者表本身不包含数据。
超出最大循环次数。无法通过 SQL 语句查询到正确的数据。
生成的 SQL 语句无法准确查询数据库。请检查以下内容:
- 确保数据库包含相关数据。
- 验证用户问题是否恰当。
- 确认 **Generate SQL Statement LLM** 和 **Fix SQL Statement LLM** 组件生成的 SQL 语句是否正确。