使用 LLM 作为评判者评估 SQL 生成

原文:towardsdatascience.com/evaluating-sql-generation-with-llm-as-a-judge-1ff69a70e7cf?source=collection_archive---------4-----------------------#2024-07-31

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9476fd2135a3132b8b6ef277b53fe2a6.png

图片由作者使用 Dall-E 创作

结果指向了一种有前景的方法

https://aparnadhinak.medium.com/?source=post_page---byline--1ff69a70e7cf--------------------------------https://towardsdatascience.com/?source=post_page---byline--1ff69a70e7cf-------------------------------- Aparna Dhinakaran

·发布于 Towards Data Science ·4 分钟阅读·2024 年 7 月 31 日

特别感谢 Manas Singh 和 Evan Jolley 与我们共同合作进行这项研究!

一种引起关注和投资的 LLM 潜在应用是其生成 SQL 查询的能力。使用自然语言查询大型数据库解锁了几个有吸引力的用例,从提高数据透明度到改善非技术用户的可访问性。

然而,和所有 AI 生成内容一样,评估问题非常重要。我们如何判断 LLM 生成的 SQL 查询是否正确并产生预期结果?我们最近的研究深入探讨了这个问题,并探索了使用LLM 作为评判者来评估 SQL 生成的有效性。

研究发现总结

在这项实验中,LLM 作为评判者在评估 SQL 生成方面表现出初步的前景,使用 OpenAI 的 GPT-4 Turbo,F1 得分在 0.70 到 0.76 之间。在评估提示中加入相关的模式信息可以显著减少假阳性。尽管仍然存在挑战——包括由于错误的模式解释或对数据的假设导致的假阴性——LLM 作为评判者为 AI SQL 生成性能提供了一个可靠的代理,尤其是在快速检查结果时。

方法论与结果

本研究建立在 Defog.ai 团队之前的工作基础上,该团队开发了一种方法来使用黄金数据集和查询评估 SQL 查询。该过程涉及使用黄金数据集问题生成 AI SQL,使用 AI 生成的 SQL 生成测试结果“x”,然后使用预先存在的黄金查询在相同数据集上生成结果“y”,最后比较结果“x”和“y”以判断准确性。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0321f9684b937ee0c804967416443634.png

图表由作者提供

在这个比较中,我们首先探讨了传统的 SQL 评估方法,例如精确的数据匹配。该方法涉及直接比较两个查询的输出数据。例如,在评估关于作者引用的查询时,如果作者人数或引用次数有任何差异,就会导致不匹配并失败。虽然这种方法简单直接,但它无法处理边界情况,如如何处理零计数的桶或数值输出的轻微变化。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/128cb4d97ec04ebbac643c34ee6044ee.png

图表由作者提供

我们随后尝试了一种更细致的方法:使用 LLM 作为评判者。我们使用 OpenAI 的 GPT-4 Turbo 进行的初步测试,在不包含数据库模式信息的评估提示中,取得了令人鼓舞的结果,F1 分数介于 0.70 和 0.76 之间。在这种设置下,LLM 通过仅检查问题和生成的查询来判断生成的 SQL。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/40b5b95a1c7b9ce81ea8e9c3bdf0be65.png

结果:图片由作者提供

在本次测试中,我们注意到有相当多的假阳性和假阴性,其中许多与对数据库模式的误解或假设有关。在这个假阴性案例中,LLM 假设响应的单位与预期不同(学期与天数)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9e03dd586b3b2a1be3425f269d1f9caf.png

图片由作者提供

这些差异促使我们在评估提示中添加了数据库模式。与我们的预期相反,这导致了性能下降。然而,当我们精细化方法,只包含查询中引用的表的模式时,我们在假阳性和假阴性率方面看到了显著的改善。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/73f63923309c1d1977eb4a238041a0de.png

结果:图片由作者提供

挑战与未来方向

尽管使用 LLM 来评估 SQL 生成的潜力显而易见,但仍然存在挑战。通常,LLM 会对数据结构和关系做出错误的假设,或者错误地假设度量单位或数据格式。找到适当的模式信息类型和数量来包含在评估提示中,对于优化性能至关重要。

任何探索 SQL 生成用例的人可能会探讨其他几个领域,比如优化模式信息的包含、提高大型语言模型(LLM)对数据库概念的理解,以及开发结合 LLM 判断与传统技术的混合评估方法。

结论

由于能够捕捉到细微的错误,LLM 作为评判者展现出作为快速有效工具的潜力,能够评估 AI 生成的 SQL 查询。

仔细选择提供给 LLM 评判者的信息,有助于最大化这一方法的效益;通过包含相关的架构细节并持续优化LLM 评估过程,我们可以提高 SQL 生成评估的准确性和可靠性。

随着自然语言接口在数据库中的普及,对有效评估方法的需求也将不断增长。尽管 LLM 作为评判者的方法并不完美,但它比简单的数据匹配提供了更为细致的评估,能够理解上下文和意图,这一点是传统方法无法做到的。

有问题吗?欢迎随时在这里或通过LinkedInSlack与我联系。

### 利用大型语言模型 (LLM) 自动生成 SQL 查询 通过结合 Retrieval-Augmented Generation (RAG) 技术以及先进的 LLM 模型(如 Gemini-Pro、PaLM 2 或其他高性能模型),可以显著提升从自然语言文本生成 SQL 查询的能力。以下是具体的方法和示例: #### 方法概述 1. **嵌入与检索** 使用向量数据库存储预处理的数据表元数据及其描述,当接收到用户的自然语言查询时,可以通过计算输入文本的嵌入并与已有数据匹配,快速定位相关联的数据源[^1]。 2. **提示工程设计** 构建高效的提示模板对于引导 LLM 正确解析意图至关重要。例如,提供清晰的上下文信息(包括目标数据库模式)、样例对话历史记录以及期望输出格式可以帮助减少歧义并提高精度[^3]。 3. **Tool Calling 功能应用** 基于某些高级版 LLM 提供的功能——tool calling,可以直接调用外部工具完成特定任务。在这种场景下,“工具”即指代能够接收参数化指令并返回结果的服务端 API 接口;而这些服务通常封装了针对不同类型的 DBMS 执行动态构建出来的 DQL/DML 请求逻辑[^2]。 4. **反馈循环机制建立** 实施持续改进策略非常重要。这可能涉及收集错误案例用于微调基础模型权重或者调整推理过程中使用的启发式规则集等措施来逐步增强系统的鲁棒性和泛化能力。 #### 示例代码展示 下面给出一段 Python 脚本作为演示用途,它展示了如何集成上述提到的技术要点去实现自动化生产有效 SQL 语句的过程: ```python from langchain import PromptTemplate, LLMChain import openai # Replace with appropriate library based on chosen model provider. def generate_sql(natural_language_query): template = """You are an AI assistant that helps people find information. Given the following natural language question and database schema, generate a corresponding SQL query to answer the user's question. Database Schema: {db_schema} Question: {question} SQL Query:""" prompt = PromptTemplate(template=template, input_variables=["db_schema", "question"]) llm_chain = LLMChain(prompt=prompt, llm=openai.ChatCompletion.create(model="gpt-4")) db_schema = """ CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), department_id INT, salary DECIMAL(10,2) ); CREATE TABLE departments( dept_id INT PRIMARY KEY, dept_name VARCHAR(50) ) """ response = llm_chain.run({"db_schema": db_schema, "question": natural_language_query}) return response if __name__ == "__main__": sample_input = "What is the average salary of all employees working under 'Sales'?" sql_output = generate_sql(sample_input) print(sql_output) ``` 此脚本定义了一个函数 `generate_sql` 来接受用户提出的关于某个已知关系型数据库的问题字符串形式,并基于该问题连同给定的数据库架构一起传递至指定的大规模预训练语言模型实例处请求生成相应的结构化查询语言表达式。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值