使用 LLM 和 RAG 进行数据库查询(文本到 SQL)的四大挑战及解决方案
大型语言模型(LLM)的出现展示了机器理解自然语言的能力。这些能力帮助工程师完成了许多令人惊叹的工作,比如编写代码文档、代码审查以及最常见的用例之一:代码生成。GitHub Copilot 等工具展示了 AI 理解工程师代码生成意图的能力,例如在 Python、JavaScript 和 SQL 领域。
使用 LLM 解决文本到 SQL 的问题
基于 LLM 的代码生成能力,许多人开始考虑使用 LLM 解决使用自然语言从数据库检索数据的长期难题,有时被称为'文本到 SQL'。'文本到 SQL'的概念并不新鲜;在'检索增强生成(RAG)'和最新的 LLM 模型突破之后,文本到 SQL 有了新的机会,利用 LLM 的理解力和 RAG 技术来理解内部数据和知识。
通过 RAG 架构进行文本到 SQL,旨在让非技术人员也能通过自然语言与数据库交互,但实现过程充满挑战。
文本到 SQL 使用 RAG 的挑战
在文本到 SQL 的场景中,用户必须有精确度、安全性和稳定性才能信任 LLM 生成的结果。然而,追求一个可执行、准确、受控于安全性的文本到 SQL 解决方案并不那么简单。在这里,我们总结了使用 LLM 和 RAG 通过自然语言查询数据库的四个关键技术挑战:上下文收集、检索、SQL 生成和协作。
挑战 1:上下文收集挑战
- 跨不同来源的互操作性:为了无缝地概括和规范化跨不同来源、元数据服务和 API 搜索和集成的信息。企业数据往往分散在多个系统中,需要统一视图。
- 数据和元数据的复杂链接:这涉及将数据与其元数据关联在文档存储中。它涉及存储元数据、模式和上下文,如关系、计算和聚合逻辑。Schema Linking(模式链接)是其中的核心难点,需要准确识别哪些表列与用户问题相关。
挑战 2:检索挑战
- 向量存储的优化:开发和实施向量存储的优化技术,如索引和分块,对于提高搜索效率和精度至关重要。传统的关键词搜索难以处理语义差异。
- 语义搜索的精确度:挑战在于理解查询的上下文细微差别,这可以显著影响结果的准确性。这通常涉及查询重写、重新排名等技术,确保检索到的 Schema 片段最符合当前意图。
挑战 3:SQL 生成挑战
- SQL 查询的准确性和可执行性:生成既准确又可执行的 SQL 查询是一个重大挑战。这要求 LLM 深入理解 SQL 语法、数据库模式以及不同数据库系统特定方言(如 MySQL vs PostgreSQL)。
- 适应查询引擎方言:数据库通常在 SQL 实现中有独特的方言和细微差别。设计能够适应这些差异并生成跨各种系统兼容查询的 LLM,为挑战增加了另一层复杂性。此外,还需防止注入攻击和性能低下的查询。
挑战 4:协作挑战
- 集体知识积累:挑战在于创建一个机制,可以有效地收集、整合和利用来自多样化用户群的集体洞察力和反馈,以提高 LLM 检索的数据的准确性和相关性。这需要建立反馈闭环。
- 访问控制:在我们最终检索数据的同时,下一个最重要的挑战是确保现有的组织数据访问策略和隐私法规也适用于新的 LLM 和 RAG 架构。行级安全(RLS)和用户权限管理必须集成到生成过程中。
我们如何解决它?LLM 的语义层
为了解决上述挑战,我们需要在 LLM 和数据源之间建立一个层,允许 LLM 学习数据源中的业务语义和元数据的上下文;这一层还需要将语义与物理数据结构映射,通常称为'语义层'。语义层必须解决语义和数据结构之间的连接,并协调访问控制和身份管理,确保只有合适的人访问合适的数据。
数据解释和呈现
- 业务术语和概念:语义层包括业务术语和概念的定义。例如,'收入'一词在语义层中定义,因此当业务用户在他们的 BI 工具中查询'收入'时,系统确切知道要检索什么数据以及如何根据底层数据源计算它。
- 数据关系:它定义了不同数据实体之间的关系。例如,客户数据如何与销售数据相关,或者产品数据如何与库存数据链接。这些关系对于执行复杂分析和生成洞察至关重要。
- 计算和聚合:语义层通常包括预定义的计算和聚合规则。这意味着用户不需要知道如何编写复杂的公式来计算,例如,年初至今的销售;语义层根据其包含的定义和规则处理这些操作。


