跳到主要内容

使用 RAGFlow 实现 Text2SQL

·阅读时长5分钟
Yingfeng Zhang

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. 配置数据库

  1. 在 **Execute SQL** 组件中配置数据库所需参数,包括
    • 数据库类型(当前支持 MySQL、PostgresDB 和 MariaDB)
    • 数据库名称
    • 数据库用户名
    • 数据库 IP 地址
    • 数据库端口号
    • 数据库密码

  1. 完成配置后,点击 **测试** 按钮检查连接是否成功。

  2. 配置 **循环次数 (Loop)** 参数

RAGFlow 中的 Text2SQL 具有自动纠错能力。如果生成的 SQL 被认为可以正确查询,则会直接返回结果。然而,如果查询失败,RAGFlow 的 Text2SQL 将根据数据库返回的错误信息自动纠正 SQL 语句并重试查询。这个过程——查询失败、纠正 SQL 语句和重试——将持续迭代,直到达到 Loop 参数设置的最大限制。如果达到此最大值,Text2SQL 过程将终止,提示用户在再次尝试之前优化他们的问题或知识库数据。

  1. 配置 **TopN** 参数
    此参数限制查询返回的记录数量,因为查询通常涉及记录。

4. 试用 Text2SQL

点击 **运行** 执行操作。

故障排除

数据库连接失败

连接数据库失败。解决此问题的方法如下

  1. 点击 **Execute SQL** 组件,确保所有参数设置正确。
  2. 仔细检查部署 RAGFlow 的机器是否可以使用提供的连接信息连接到数据库。
  3. 点击 **测试** 检查数据库连接是否成功建立。

找不到 SQL 语句!

用户查询无法转换为 SQL 语句,主要原因是知识库不足或不完整。建议扩充上述三种知识库。

数据库中没有记录!

SQL 查询未能从表中检索到任何记录,原因可能是过滤条件过于严格或表本身没有数据。

超出最大循环次数。无法通过 SQL 语句查询到正确的数据。

生成的 SQL 语句无法准确查询数据库。请检查以下内容

  • 确保数据库包含相关数据。
  • 验证用户问题是否恰当。
  • 确认 **Generate SQL Statement LLM** 和 **Fix SQL Statement LLM** 组件生成的 SQL 语句是正确的。