容器中的大模型 (二) | 利用大模型,使用自然语言查询 SQL 数据库


作者:宋文欣,智领云科技联合创始人兼 CTO
01 简介
随着人工智能技术的发展,尤其是自然语言处理(NLP)和机器学习的进步,使得将自然语言转换为结构化查询成为可能。这种技术的应用场景广泛,从简化数据库查询操作到提高数据分析的效率,都有着重要的实际价值。文章通过介绍 LangChain 和 Ollama 框架,提供了一种在本地或云服务器上部署和运行 LLMs 的方法,使得开发者和最终用户都能够轻松地实现自然语言到 SQL 查询的转换。
本文旨在向读者展示如何在 Docker 容器环境中利用大型语言模型(LLMs)构建一个端到端的 Text2SQL 流程。通过这一流程,用户可以以自然语言提出问题,系统则自动将这些问题转化为 SQL 查询语句,进而在关系型数据库上执行,从而获取所需的数据,实现从自然语言问题到关系型数据库上的 SQL 查询的转化。
02 技术背景
在本文中,我们将深入探讨两个关键技术框架:LangChain 和 Ollama,它们是构建端到端 Text2SQL 流程的基础。这些框架使得在 Docker 容器中部署和运行大型语言模型(LLMs)成为可能,从而实现了从自然语言到 SQL 查询语句的高效转换。
LangChain 框架
LangChain 提供了 SQL 查询链和 SQL 代理的核心功能。SQL 查询链负责将用户的自然语言查询转换为 SQL 语句,可以通过定制和扩展来适应不同的应用场景。SQL 代理则提供了高度的灵活性和定制性,允许开发者根据具体的任务和数据结构进行优化,以实现更准确和高效的自然语言查询转换。这两个组件共同为关系型数据库提供了一个易用且便捷的自然语言查询界面。
Ollama 框架
Ollama 框架则提供了与 OpenAI 兼容的接口,使得在本地环境中部署和运行 LLMs 变得简单。它允许应用程序在 OpenAI 后端和本地运行的 LLMs 之间进行无缝切换,这种灵活性使得开发者可以根据需求选择最合适的部署方式。无论是在云端还是本地环境中,Ollama 都能够帮助开发者轻松实现模型的部署和运行。
这两个框架的结合,为 Text2SQL 任务提供了坚实的技术基础。通过 LangChain 的 SQL 查询链和 SQL 代理,以及 Ollama 的本地 LLM 部署功能,开发者能够构建出能够理解和执行自然语言查询的应用程序。这些技术不仅提高了数据库查询的效率,也为非技术用户提供了更加友好的交互方式,使得他们能够更容易地从数据库中获取信息。
03 成果展示
Text2SQL 应用展示了自然语言处理技术在数据库查询领域的强大潜力。它不仅简化了查询过程,还通过提供详细的推理跟踪,让用户能够更加深入地参与到查询的每一个步骤中。这种创新的应用无疑将推动数据库查询技术的发展,为用户提供更加智能和个性化的服务。
通过应用,用户可以直观地了解数据库的结构和内容,并通过“DATABASE Information”功能浏览每个表的示例数据。为用户提供了一个清晰的视图,帮助他们更好地构建查询。此外,用户界面提供了两种模式选择:“ChatGPT”和“Local_LLM”,让用户能够根据自己的需求和偏好进行查询。为了增强用户体验,Text2SQL 还提供了 “LLM 推理跟踪”功能。
Text2SQL 推理的这个过程集成了自然语言处理和数据库管理系统,通过逐步将用户的自然语言输入转化为结构化的 SQL 查询,使得用户能够以自然且直观的方式与数据库交互。
Text2SQL 推理过程详细介绍如下:
(1)用户输入
用户以自然语言形式提出一个问题或请求,例如:“旧金山的办公室在哪里?”。


(2)文本解析
输入文本首先会被解析以确定关键词、短语、意图和实体,自然语言处理(NLP)技术,如分词、词性标注、命名实体识别(NER)等,被用于提取和理解查询中的重要信息。
(3)意图识别与实体链接
系统识别查询的意图,包括选择(SELECT)、计数(COUNT)、更新(UPDATE)等,确定与数据库中实体(如表格、列名)的映射关系。
(4)SQL 模板生成
使用预定义的模板和规则来生成 SQL 查询,这些模板可根据用户输入的意图和识别出的实体进行填充。
(5)深度学习模型
Text2SQL 使用序列到序列(Seq2Seq)模型、注意力机制或基于 Transformer 的架构,如 BERT 或 GPT,来生成 SQL 查询。在结合 ChatGPT 模型的情况下,LangChain 框架提供了与 ChatGPT 模型集成的关键点,LangChain 使用 ChatOpenAI 类来建立与 OpenAI 以及开源大语言模型(LLMs)的连接。
(6)SQL 生成
使用上述技术生成的 SQL 查询会根据用户的原始文本输入构建,包括 JOIN 操作(如果需要关联不同的表)、WHERE 子句(用于过滤结果)、GROUP BY 语句(用于聚合操作)等。

(7)验证与优化
生成的 SQL 查询,可以通过执行部分查询或使用查询优化器来进行优化。
(8)执行 SQL 查询
生成的 SQL 查询在数据库上执行,执行结果是数据库返回的数据,通常是表格形式。

(9)结果展示
返回的结果以用户能理解的格式展示,涉及到将表格转换为自然语言的摘要,或以图形界面显示。

04 操作步骤
本机电脑(Mac,非 GPU 配置)
1.将以下是在本机电脑(Mac,非 GPU 配置) 上启动演示的逐步指南:
1)选择合适路径,右键 Open in Terminal,输入如下命令克隆仓库:
2)若需要使用 OpenAI 的模型进行推理,将您的 OpenAI API 密钥设置到 conf/config.json 的“OPENAI_API_KEY”中:

如果用户的 OpenAI 未进行订阅,这里则需要修改 model 为:"OPENAI_API_MODEL": "gpt-3.5-turbo",
3)打开 Docker Desktop
4)启动演示
修改 run.sh :
修改 load_data.sh :
(备注:将_修改为-)
5)将样本数据加载到 MySQL 中
bash load_data.sh
6)访问 http://localhost:8501/ 上的用户界面

7)关闭演示
bash shutdown.sh
阿里云/AWS 服务器过程类似,详情可参见完整博客内容,博客链接:https://www.linktimecloud.com/posts/7686
05 要点笔记
与 LLMs 交互的简化之道:LangChain 与 ChatOpenAI 的协同
在探索自然语言处理的前沿,LangChain 框架为我们提供了一种优雅的方式来与大型语言模型(LLMs)进行交互。通过使用 ChatOpenAI 类,我们不仅能够与 OpenAI 的模型建立连接,还能轻松地集成开源模型,这为开发者带来了极大的灵活性。
无缝集成:LangChain 通过 ChatOpenAI 类,为开发者提供了一个统一的接口来与不同的 LLMs 进行交互,无论是 OpenAI 的商业模型还是开源模型。
配置灵活性:在集成开源模型时,只需向 ChatOpenAI 构造器添加 openai_api_base 参数,即可定义本地 LLM 服务的 URI。
Ollama 的多功能性:在我们的演示中,我们选择将 openai_api_base 直接指向 Ollama 的 API 服务。Ollama 以其对多种开源 LLMs 的支持而受到推崇,这使得开发者可以在不同的模型之间自由切换,而无需修改代码。
以下代码片段,演示了此配置:
使用 LangChain 实现 Text2SQL
在自然语言处理中,LangChain 框架以其强大的 Text2SQL 能力脱颖而出。它通过两个核心组件:SQL Chain 和 SQL Agent 让自然语言到 SQL 查询的转换变得简单而高效。
SQL Agent 的集成:SQL Agent 集成了两种代理类型:“openai-tools”和“openai-functions”,专门为与 GPT 模型的工具和函数调用 API 配合设计,以优化 GPT 模型的使用。不过,由于大多数开源 LLMs 并未针对这类工具和函数进行特别训练,导致在实践中,这些工具和函数的效果可能不尽人意。
SQL Chain 的优势:虽然 SQL Agent 为 GPT 模型提供了高级特性,但在开源 LLMs 的环境中,SQL Chain 因其高效性成为了首选。它简化了 Text2SQL 任务的处理,使得开发者能够更快地实现自然语言查询到 SQL 查询的转换。
以下代码片段,演示了如何实现 SQL Chain 和 SQL Agent 配置:
LLMs 在 Text2SQL 任务上的准确性探索
准确性是衡量 LLMs 在 Text2SQL 任务上性能的关键指标,直接影响模型将自然语言查询转换成 SQL 语句的能力。虽然本文未深入探讨准确性指标,但我们鼓励读者参考公开的性能测试,以了解不同 LLMs 在这一任务上的表现。
Defog 公司在这篇文章(https://defog.ai/blog/open-sourcing-sqlcoder2-7b/)中提供了一项详细的性能测试,对比了 SQLCoder2 与其他多种 LLMs 的准确性,可以为我们选择最合适的模型提供参考。
评论