利用大型语言模型,构建端到端Text2SQL流程

by June 2024-03-08

作者: 宋文欣,智领云科技联合创始人兼CTO

武汉大学计算机系本科及硕士,美国纽约州立大学石溪分校计算机专业博士。曾先后就职于Ask.com 和 EA (电子艺界)。在 Ask.com 期间,担任大数据部门技术负责人及工程经理,使用Hadoop 集群处理实时搜索数据,形成全球规模领先的 Search Ads Arbitrage 用户;在EA期间,担任数字平台部门高级研发经理,从无到有组建EA数据平台团队,建设公司大数据平台,为EA全球工作室提供数据能力支持。2016年回国联合创立智领云科技有限公司,组建智领云技术团队,开发了 BDOS 大数据平台操作系统。

1.简介

本文将探讨如何在 Docker 容器中利用 LLMs 实现 Text2SQL 的完整过程,利用大语言模型 (LLMs) 在 Docker 容器中构建端到端的 Text2SQL 流程,实现从自然语言问题到关系型数据库上的 SQL 查询的转化。

我们将介绍 LangChain 和 Ollama 这两个框架,它们为我们提供了在这一领域中构建应用所需的基础。本文也将演示如何在本地环境和阿里云实例上运行示例程序,并且将在备注中提供在 AWS EC2 实例上运行示例程序的指南。同时,我们还将简要概述代码结构,以便读者能更好地理解整个流程。

此外,本文还将深入介绍 LangChain 的 SQL 查询链以及使用 SQL 代理在关系型数据库上执行自然语言查询的方法。针对本地 LLM 部署,通过介绍 Ollama 框架,帮助读者更轻松地部署模型。本文提供了详细的操作指南,涵盖在本地和阿里云实例上运行示例程序的逐步操作,同时在备注中提供 AWS 实例上运行示例程序的指南。

最后,我们将讨论 LLMs 与 Text2SQL 任务的交互方式,以及如何利用 LangChain 实现 Text2SQL,并探讨 LLMs 在 Text2SQL 任务中的准确性。

通过本文,读者将深入了解利用 LLMs 构建 Text2SQL 流程的关键步骤和技术要点,为他们在实际场景中应用该技术提供了重要参考和指导。

2.技术背景

LangChain 框架

LangChain LangChain 框架作为一个用于创建大型语言模型 (LLM) 驱动的应用程序的工具,其核心功能包括 SQL 查询链和 SQL 代理。通过 SQL 查询链,我们能够实现将自然语言查询转化为 SQL 语句的过程,并且可以根据需求定制和扩展该过程,以满足不同应用场景的需求。SQL 代理具有高度的灵活性和定制性,能够根据具体的任务和数据结构进行优化和调整,从而实现更加准确和高效的自然语言查询转换。这两个组件都能处理自然语言查询,并将其转化为 SQL 语句,非常适合 Text2SQL 应用程序。

本文介绍了如何利用 LangChain 的 SQL 查询链和 SQL 代理,为关系型数据库创建易用便捷的自然语言查询界面。

Ollama框架

Ollama 提供了与 OpenAI 兼容的接口,可以帮助轻松地在本地环境中部署和运行 LLMs,而无需依赖于云服务。借助 Ollama 提供的 OpenAI 兼容接口,应用程序可以在 OpenAI 后端和本地运行的 LLMs 之间进行无缝切换。这种灵活性使得开发人员可以根据需求选择最合适的部署方式,无论是在云端还是在本地环境中运行模型,都能够轻松实现。

本文详细介绍了如何利用 Ollama 的本地 LLM 部署功能,将其集成到 Text2SQL 应用程序中。通过示例,读者可以清晰地了解如何利用 Ollama 框架实现自然语言查询与 SQL 查询的转换过程,并将其应用于实际的应用场景中。

3.演示

宋博士的原文是在 AWS EC2 CPU/GPU 进行配置以运行,本篇博客会以国内用户更加熟悉的本机环境和国内(阿里云)为主要演示环境进行呈现。 

我们也会在文稿的后半部分保留宋博士原文中关于在 AWS EC2 CPU/GPU 上进行配置的演示内容。这样感兴趣的读者可以根据自己的需求选择合适的部署环境,并参考相应的操作步骤。

本机电脑(Mac,非GPU配置)

以下是在 本机电脑(Mac,非GPU配置) 上启动演示的逐步指南:

1)选择合适路径,右键Open in Terminal,输入如下命令克隆仓库:

git clone https://github.com/LinkTime-Corp/llm-in-containers.git
cd llm-in-containers/text2sql

2)若需要使用 OpenAI 的模型进行推理,将您的OpenAI API密钥设置到conf/config.json的“OPENAI_API_KEY”中:

如果用户的OpenAI 未进行订阅,这里则需要修改model为:”OPENAI_API_MODEL”: “gpt-3.5-turbo”,

3)打开 Docker Desktop

4)启动演示

bash run.sh

修改 run.sh :

text2sql_ollama_1 -> text2sql-ollama-1

修改 load_data.sh :

text2sql_mysql_1 -> text2sql-mysql-1

(备注:将_修改为-)

5)将样本数据加载到 MySQL 中

bash load_data.sh

6)访问 http://localhost:8501/ 上的用户界面

7)关闭演示

bash shutdown.sh

国内阿里云服务器

1)ssh 登录服务器

2)克隆仓库

git clone https://github.com/LinkTime-Corp/llm-in-containers.git

进入 demo 路径

cd llm-in-containers/text2sql

3)若需要使用 OpenAI 的模型进行推理,将您的OpenAI API密钥设置到conf/config.json的“OPENAI_API_KEY”中

如果用户的OpenAI 未进行订阅,这里则需要修改model为:”OPENAI_API_MODEL”: “gpt-3.5-turbo”,

4)启动演示

sudo bash run.sh

修改 run.sh 中:

text2sql_ollama_1 -> text2sql-ollama-1

修改 load_data.sh 中:

text2sql_mysql_1 -> text2sql-mysql-1

(备注:将_修改为-)

5)将样本数据加载到MySQL中

sudo bash load_data.sh

6)配置防火墙规则

例如,对于阿里云,可参考https://help.aliyun.com/zh/simple-application-server/user-guide/manage-the-firewall-of-a-server

7)访问 http://{阿里云CPU实例的IP地址}:8501 上的用户界面

可以在阿里云的工作台处查看服务器的IP地址,或者在连接服务器后使用如下命令查看IP地址:

curl ip.sb

随后在浏览器中访问 http://{阿里云CPU实例的IP地址}:8501 访问web ui

8)关闭演示

sudo bash shutdown.sh

常见问题

  1. 如在将样本数据加载到MySQL中遇到MySQL自动退出的情况

1)需要配置防火墙规则(port:3306)

0dff4998ba9f mysql:8.3.0 "docker-entrypoint.s…" 9 minutes ago Exited (137) About a minute ago text2sql-mysql-1

重新启动 MySQL

sudo docker start 0dff4998ba9f

2)如MySQL还是自动退出,检查服务器资源是否足够

将原来的容器删除后,重新运行

sudo bash run.sh




  1. MySQL 成功运行,但是无法 ssh 登录服务器,访问 Web UI 无反应

检查磁盘读写情况

在 Web UI 上测试

现在让我们通过查询样本数据来操作用户界面:

通过”DATABASE Information”功能,用户可以浏览每个表的示例数据,从而更好地了解数据库结构和内容。同时用户可以在”ChatGPT”和”Local_LLM”之间进行选择,以便根据自己的需求提出问题并进行查询处理。例如,“旧金山的办公室在哪里?”。用户只需在指定的输入框中输入问题,点击 Enter/Return 按钮即可提交查询请求。

用户界面的侧边栏提供了“LLM 推理跟踪”的选项,该功能允许用户查看 LLM 对问题的逐步处理过程。通过这个功能,用户可以更深入地了解答案是如何由 LLM 推导出来的,提供了有关查询处理过程的详细见解。

备注1:在 AWS CPU 实例上运行

以下是在 AWS EC2 CPU 实例上启动演示的逐步指南:

1)克隆仓库到EC2 CPU实例:

git clone https://github.com/LinkTime-Corp/llm-in-containers.git
cd llm-in-containers/text2sql

2)若需要使用 OpenAI 的模型进行推理,将您的OpenAI API密钥设置到conf/config.json的“OPENAI_API_KEY”中。如果用户的OpenAI 未进行订阅,这里则需要修改model为:”OPENAI_API_MODEL”: “gpt-3.5-turbo”,

3)启动演示:

bash run.sh

4)将样本数据加载到MySQL中:

bash load_data.sh

5)访问UI在 http://{IP 的EC2 CPU实例}:8501。

6)关闭演示

bash shutdown.sh

现在让我们通过查询样本数据来操作用户界面:

备注2:在 AWS GPU 实例上运行

在 AWS GPU 实例上启动演示与 CPU 实例设置类似,但在‘run.sh’和‘shutdown.sh’脚本中增加了“-gpu”标志:

1)克隆仓库到 EC2 GPU 实例:

git clone https://github.com/LinkTime-Corp/llm-in-containers.git
cd llm-in-containers/text2sql

2)若需要使用 OpenAI 的模型进行推理,将您的OpenAI API密钥设置到conf/config.json的“OPENAI_API_KEY”中:如果用户的OpenAI 未进行订阅,这里则需要修改model为:”OPENAI_API_MODEL”: “gpt-3.5-turbo”,

3)启动演示:

bash run.sh -gpu

4)将样本数据加载到MySQL:

bash load_data.sh

5)访问UI在 http://{IP 的EC2 GPU实例}:8501。

6)关闭演示

bash shutdown.sh -gpu

4.代码结构

代码 的结构设计简单直观,不同的组件被组织在独立的文件中,以便清晰、方便的维护:1)main.py: 该文件包含用户界面(UI)的代码。2)query_engine.py: 负责处理选择 LLMs 和与 LLMs 交互的逻辑。3)db_engine.py: 负责访问和查询 MySQL 数据库。4)constants.py: 所有使用的常数都在这里定义。

5.要点笔记

与LLMs交互

LangChain 使用 ChatOpenAI 类为 OpenAI 和开源模型建立连接。在集成开源模型时,我们需要向 ChatOpenAI 构造器添加一个额外的参数,即‘openai_api_base’,用于定义本地 LLM 服务的 URI。

在我们的演示中,我们直接将这个 URI 指向了 Ollama 的 API 服务。Ollama 以其支持多种开源大语言模型而闻名,因此这个配置允许我们在不改变代码的情况下轻松更换 LLMs。

以下代码片段,演示了此配置:

openai_llm = ChatOpenAI(model_name=OPENAI_API_MODEL)
local_llm = ChatOpenAI(model_name=LOCAL_MODEL_NAME, openai_api_base=API_BASE)

使用LangChain实现Text2SQL

LangChain 提供了两个核心组件用于实现 Text2SQL:SQL Chain和 SQL Agent。SQL Agent 作为 LangChain 的一个重要组件,与两种代理类型集成:“openai-tools” 和 “openai-functions”。这两种代理类型分别对应于 GPT 的工具和函数调用 API,因此在 GPT 模型中表现良好。

然而,需要注意的是,大多数开源 LLMs 缺乏工具和函数调用的训练,导致这些工具与函数的效果往往不理想。同样,“zero-shot-react-description” 代理类型在开源 LLMs 中的表现也不尽如人意。

因此,考虑到这些限制,我们更倾向于在开源 LLMs 中使用 SQL Chain,而不是 SQL Agent。这种方法已经被证明非常有效,特别是在一些模型如 Defog 的 SQLCoder 模型中。

以下代码片段,演示了如何实现 SQL Chain 和 SQL Agent 配置:

from langchain_community.agent_toolkits import create_sql_agent
def init_openai_agent(self, db):
    openai_llm = ChatOpenAI(model_name=OPENAI_API_MODEL)
    return create_sql_agent(openai_llm, db=db,
        agent_type="openai-tools", verbose=True)


from langchain.chains import create_sql_query_chain
def init_local_chain(self, db):
    local_llm = ChatOpenAI(model_name=LOCAL_MODEL_NAME, openai_api_base=API_BASE)
    write_query = create_sql_query_chain(local_llm, db)
    return write_query

LLMs 在 Text2SQL 任务上的准确性

在 Text2SQL 任务中,准确性是评估 LLMs 性能的关键指标之一,直接反映了模型将自然语言查询准确转换为 SQL 语句的能力。虽然本文的重点不在于详细介绍准确性指标,但我们强烈鼓励对了解最先进的 LLMs 在 Text2SQL 任务上的表现感兴趣的读者参考公开可用的详细性能测试。

此类测试 Defog 在这篇文章 中提供了参考,该测试比较了来自 Defog 公司的 SQLCoder2 与各种其他 LLMs 的准确性指标,可以为读者提供一个更清晰的了解,帮助选择最适合其应用需求的 LLM 模型。

6.Github链接

Github链接

https://github.com/LinkTime-Corp/llm-in-containers/tree/main/text2sql

博客原文链接

https://blog.gopenai.com/text2sql-pipeline-with-llms-in-docker-containers-34ae1097df46

留言

评论

${{item['author_name']}} 回复 ${{idToContentMap[item.parent] !== undefined ? idToContentMap[item.parent]['author_name'] : ''}} · ${{item.date.slice(0, 10)}} 回复

暂时还没有一条评论.