一、前言
随着 GPT-3、PaLM 和 Anthropic 的 Claude 等大型语言模型 (LLM) 的出现引发了自然语言在人工智能领域的一场革命。这些模型可以理解复杂的语言、推理概念并生成连贯的文本。这使得各种应用程序都能够使用对话界面。然而,绝大多数企业数据都存储在结构化 SQL 数据库中,例如 PostgreSQL、MySQL 和 TiDB。通过自然对话无缝访问和分析这些数据仍然具有挑战性。
最近新的研究提出了增强LLM与 SQL 数据库集成的技术,重点是跨领域和跨组合泛化。例如,Arora等人设计了一种算法[1]
,用于抽样涵盖所有 SQL 子句和运算符的多样化少量示例以有效提示LLM。他们的领域适应方法通过语义相似性将这些少量示例适应于目标数据库。此外,最少到最多提示技术将少量示例分解为具有中间表示的子问题,以提高组合泛化能力。
本文主要探讨了将大型语言模型与 SQL 数据库集成的前景和挑战。
二、将 LLM 与 SQL 数据库融合的初衷
其实原因很简单,前面我们在介绍 LangChain 框架的时候,有单独介绍过如何基于 LangChain 技术结合 LLM 实现自然语言操作数据库《LangChain:使用自然语言查询数据库》,包括业界这半年时间也陆续发布了一些关于DB和LLM结合的产品,都是希望能够将 LLM 模型的强大能力可以应用在数据库和大数据分析领域,试想一下以后业务分析师和业务用户只需要输入一段普通文本就可以直接与数据进行对话,快速或者到想要的结果,而不需要编写 SQL 查询。这样可以实现数据访问大众化、加速分析并释放数据驱动自动化的新可能性。
但是,想要有效地实现 LLM 与 SQL 之间类似人类语义交互的功能,需要克服有关查询正确性、安全性和性能等关键挑战。结合 LLM 的语义理解能力和 SQL 的丰富分析能力,可能会彻底改变我们与数据互动的方式。未来,我们与数据进行对话可能会像日常聊天一样自然流畅!
接下来我们将来讨论如仔细提示、验证循环和基于角色的访问控制等技术,这些技术可以为生产 LLM-SQL 集成铺平道路。
总的来说,融合 LLM 与 SQL 的原因有很多:
-
++自然语言界面++ ------ 用户无需编写复杂的 SQL 查询语句,只需用平易近人的英语与数据库进行交谈。比如,他们只需要问 "上个月最热销的产品是什么?" 而无需编写 JOIN 和 GROUPBY 查询语句。这样一来,获取数据就变得更加直观,处理分析型数据的门槛也大大降低。
-
++数据民主化++ ------ 启用自然语言界面后,即使是没有技术性 SQL 技能的用户也能访问到数据。商业用户、分析师甚至高管都可以通过自然对话直接获取有价值的洞见,从而实现整个组织的数据驱动决策。
-
++增强型分析++ ------ LLM 已经展示出了其在理解信息和产生洞见方面的强大能力,它们能生成摘要、可视化和叙述。将它们与 SQL 集成后,可以自动用生成的文本、图表和图形来增强查询结果,突出显示关键趋势和发现。这样就能加快分析工作流程。
-
++工作流自动化++ ------ 有了会话界面后,LLM 可以通过语音命令或聊天机器人集成到自动化工作流中。常见的分析工作流程可以通过对机器人说话来激活。例如,只需说 "运行我的周销售分析" 就可以生成周销售报告。具有 LLM SQL 访问权限的机器人可以成为数据分析师的智能助手。
-
++增强协作++ ------ 通过结合 NLP 技术和 SQL 访问权限,LLM 可以实现数据分析的跨职能协作。各方利益相关者可以通过自然语言对话来讨论数据集,并交流他们的发现。在这个过程中,LLM 充当了 SQL 的接口,将对话转化为查询,并分享洞察。
-
++多模态分析++ ------ LLM 接口允许我们无缝地将 SQL 数据与知识图、向量数据库以及其他数据源进行整合。这使我们能够进行多模态分析,从而获得更全面的洞察。
最终目标是让我们与数据的交互变得像人类之间的对话一样简单直观。通过 LLM 的自然语言处理能力和 SQL 数据库的丰富分析功能,我们可以进一步提升数据的民主化、自动化和协作。
三、使用外部数据增强 SQL
到目前为止,我们主要关注的是 LLM 和 SQL 数据库之间的接口。但实际上,存储在企业 SQL 系统中的数据只是整个数据难题的一部分。关键性的知识还存在于知识图谱、向量数据库、外部 API 等。
LLM 提供了一个独特的机会,能够无缝地整合和增强来自不同来源的数据。
LLM 可以查询 SQL 数据库,并通过调用知识图谱获取相关实体来增强查询结果。它还可以在企业向量数据库中进行相似性搜索,找到相关文档。此外,外部 API 可以提供补充数据以增强 SQL 的结果。
例如,在查询销售数据库时,LLM 可以通过使用地理空间 API 在地图上叠加结果来增强地理分析。在分析客户流失时,它可以引入向量化账户配置文件以揭示常见模式。当与其他来源的数据混合时,从 SQL 查询中得到的洞察力会变得更强大。
为了实现这一点,LLM 查询接口应该允许编排对各种内部和外部数据源的调用。然后,LLM 可以利用其强大的语言理解能力来分析汇总后的数据,并通过自动生成摘要、可视化和叙述来综合洞察力。
使用多模态数据增强 SQL 不仅可以提升单个查询的效果,还开启了构建虚拟知识图谱的可能性,将结构化数据库与非结构化知识连接起来。这使得组织能够从他们的企业数据中提取出更多价值。
四、SQL 结合向量数据库查询
4.1、方法 1 --- SQLAutoVectorQueryEngine:
-
这种方法将单独的 SQL 和向量查询引擎融合成一个名为 SQLAutoVectorQueryEngine 的工具,该引擎可以同时从两种数据存储中提取信息。
-
这种方法已经在城市数据上进行了演示,其中使用了 SQLite 数据库和 Pinecone 向量索引。
-
它可以将查询路由到适当的引擎,并将结果进行整合。
具体示例可以参考[2]
4.2、方法 2 --- SQLAlchemy 中的 PGVector:
-
这种方法通过将嵌入作为向量列存储在 PostgreSQL 中,实现了语义搜索。
-
它允许用户进行富有表现力的文本到 SQL 查询,包括过滤器和相似性搜索。
-
此外,它还提供了专门针对 PGVector 语法的自定义文本到 SQL 提示符。
具体示例可以参考[3]
4.3、方法 3 --- OpenAI 函数 API:
-
这种方法使用 OpenAI 的函数 API 和代理进行跨 SQL 和向量的检索,而不是使用自定义检索器。
-
它定义了一个用于从向量自动检索信息的函数,并使用 SQL 和向量工具初始化代理。
-
尽管这种方法展示了联合查询的潜力,但仍需要进行更全面的稳健性分析。
具体示例可以参考[4]
4.4、关键挑战
目前面临着一些关键挑战,包括++查询路由逻辑、跨数据库检索的限制、语义搜索能力的性能和质量以及随着复杂性增加而增加的稳健性扩展++。
4.5、未来的研究
目前正在研究一些未来可能会探索的方向,包括++简单且富有表现力的混合接口、增强提示的技术(如释义)、合并数据库元数据和统计信息,以及扩展到其他数据源(如知识图谱)++。
五、LLM-SQL 集成的挑战
然而,想要有效地将 LLM 和 SQL 集成起来,目前可能还需要面对一些独特的挑战:
-
++幻觉现象++ ------ 由于 LLM 是以概率方式生成文本,因此它们可能会产生一些不存在于实际数据库中的表或列等数据库元素的查询请求,我们称之为"幻觉"查询。这可能导致生成无效的 SQL 查询语句,从而得到错误的结果。
-
++上下文长度限制++ ------ 大型语言模型在操作时有一定的上下文窗口长度限制。但是,包括模式定义和列详细信息在内的数据库元数据可能远超过这些令牌限制。这使得 LLM 很难在完整的数据库上下文中找到自己的定位。
-
++查询错误++ ------ LLM 可能成功地理解了用户意图,但仍然可能生成逻辑错误的 SQL 查询语句,从而导致错误结果。次优的数据采样和提示可能导致此类错误发生。由于缺乏正式推理能力,LLM 很难生成无误差的 SQL 查询语句。
-
++成本和性能问题++ ------ 随着查询复杂度增加,通过 LLM 生成和验证 SQL 查询语句所需的计算成本也会相应增加。大量使用 LLM 可能会导致高昂且不可预测的成本。同时,由于推理延迟问题,系统性能也可能受到影响。
-
++安全性和治理问题++ ------ 在对话界面中,用户并没有明确指定查询语句,而只是表达了他们的意图。因此,保护数据访问和进行适当的治理变得非常具有挑战性。
-
++可解释性问题++ ------ 解释为什么 LLM 会根据对话式自然语言意图生成特定的 SQL 查询语句可能会非常困难。缺乏可解释性使得调试失败更加困难。
-
++监控和测试问题++ ------ 对于动态生成的 SQL 查询语句,进行持续的监控、测试和验证是非常困难的。要达到生产就绪状态,需要进行大量的测试。
六、潜在的解决方案
以下是一些可能解决这些挑战的策略:
6.1、信息提示
通过详细描述数据库模式、样本数据行、有效的 SQL 查询和业务逻辑,我们可以仔细地为 LLM 做好准备。这样可以使 LLM 在现实中找到自己的定位,避免出现"幻觉"错误。像通用提示这样的技术可以帮助我们创建覆盖 SQL 结构的代表性提示。
python
decompose_prompt(adapted_prompt):
decomposed_prompt = []
for query_pair in adapted_prompt:
nl_questions = decompose_nl(query_pair.nl)
sql_reps = generate_intermediate_sql(nl_questions)
decomposed = [QueryRep(nl, sql) for nl, sql in zip(nl_questions, sql_reps)]
decomposed_prompt.append(decomposed)
return decomposed_prompt
6.2、渐进式提示
将复杂的对话意图分解成逻辑子查询,有助于 LLM 逐步学习。中间步骤可以解释每个子查询的意图和数据需求。这样可以提高组合泛化能力,有助于处理查询错误。
6.3、语法验证
在执行前,我们可以验证生成的 SQL 查询语句在语法上是否正确。如果出现错误,我们可以通过解释错误来重新提示 LLM 进行更正。这样可以捕获任何不正确的 SQL 查询语句。
例如,LLM 从输入 "显示每个产品上个月的总销售额" 中生成了一个 SQL 查询语句。在执行前,我们使用 SQL 解析器验证查询语句,发现查询错误地引用了不存在的 "销售" 表。然后我们重新提示 LLM 来纠正查询。
6.4、用户反馈循环
通过收集用户对查询质量的持续反馈,并使用它来进一步微调提示,我们可以通过持续学习来提高 LLM 的性能。
例如,用户对像 "上个季度销售最好的产品是哪些?" 这样的查询检索到的结果进行相关性评级。这个反馈被用来进一步微调提示工程并训练 LLM 更好地定位其查询。
6.5、混合接口
允许在对话和更准确的查询接口之间无缝切换提供了一个备选方案,并在 LLM 接口成熟时弥补了差距。
例如,对话接口允许用简单的中文问 "我的顶级客户是谁?"。然而,对于更复杂的分析需求,用户可以无缝切换到 GUI 查询构建器接口来制作准确的 SQL 查询。
6.6、使用监控
通过跟踪计算使用统计信息,我们可以防止过度使用导致的过高成本,如果需要,我们可以通过限制请求来实现。此外,缓存也有所帮助。 例如,根据查询的数量和复杂性,我们跟踪 LLM 的计算使用情况。如果由于使用量激增预计会产生过高的成本,我们可以通过限流来限制非关键查询以控制费用。
6.7、访问控制
我们可以与现有访问控制框架集成以管理安全性,而不是直接暴露 LLM。我们可以根据用户凭证验证查询。
例如,用户通过中间件层与 LLM 进行交互,而不是直接交互。这样我们就可以验证用户在允许将 "显示客户地理位置的平均订单值" 的查询传递给 LLM 之前是否具有适当的数据访问权限。
6.8、领域适应
将通用提示适应目标数据库模式有助于使 LLM 适应新数据库。
python
adapt_to_target(generic_prompt, target_schema):
adapted_prompt = []
for query_pair in generic_prompt:
sql = query_pair.sql
adapted_sql = generate_similar_sql(sql, target_schema)
nl = generate_nl(adapted_sql)
adapted_prompt.append(QueryPair(nl, adapted_sql))
return adapted_prompt
6.9、最少到最多提示
渐进地分解查询有助于提高组合泛化能力。
python
decompose_prompt(adapted_prompt):
decomposed_prompt = []
for query_pair in adapted_prompt:
nl_questions = decompose_nl(query_pair.nl)
sql_reps = generate_intermediate_sql(nl_questions)
decomposed = [QueryRep(nl, sql) for nl, sql in zip(nl_questions, sql_reps)]
decomposed_prompt.append(decomposed)
return decomposed_prompt
我们最终目标应该是无缝、安全、高效能的 LLM 查询接口,与人类分析师相匹敌。如果要实现企业生产应用,需要进行仔细训练、验证和采用混合接口。
七、总结
如果能实现通过最直接的自然语言对话来分析企业数据,确实能带来不小的影响,然而,想要有效地将大型语言模型与生产 SQL 数据库集成,我们需要面对一些关于正确性、安全性、成本和治理等方面的关键挑战。
通过精心设计的提示策略、验证循环和混合接口,LLM 可以在不影响准确性、性能或控制的情况下,使数据访问更直观。领域适应、从最少到最多提示和渐进式分解等技术也显示出改善自然语言 SQL 接口的稳健性的前景。
随着 LLM 的能力以快速的速度不断趋于成熟,它们与数据访问堆栈的集成将变得更加可行。在未来,负责监督数据工作流的对话式分析机器人可能会成为企业现实。通过语言接口对数据进行民主化可以引领一个新层次的跨职能协作时代。
然而,负责任和受控的集成对于企业采用仍然至关重要。这项技术必须通过严格的测试和验证来赢得信任。通过审慎的方法,对话式 AI 和 SQL 分析之间的协同效应提供了巨大的机会来改变人类与数据互动的方式。前进的道路充满挑战,但可能性使它成为一个有益的旅程,可能会重塑企业分析和数据驱动决策的未来。
八、References
[1]. Adapt and Decompose: Efficient Generalization of Text-to-SQL via Domain Adapted Least-To-Most Prompting**(** https://arxiv.org/abs/2308.02582)
[2]. SQLAutoVectorQueryEngine examples:(https://docs.llamaindex.ai/en/stable/examples/query_engine/SQLAutoVectorQueryEngine.html#sql-auto-vector-query-engine)
[3]. SQLAlchemy 中的 PGVector examples:
https://docs.llamaindex.ai/en/latest/examples/query_engine/pgvector_sql_query_engine.html
[4]. OpenAI 函数 API examples:
https://docs.llamaindex.ai/en/stable/examples/agent/openai_agent_query_cookbook.html