如何让LLM通过反思来提升生成sql的正确率 - 以Gemini生成sql为例

什么是Agent Reflection

通常指 “智能体反思”,即让 AI 系统通过自我反思机制优化决策或任务处理过程,类似人类通过复盘改进策略。

创建一个 SQL Agent

  • 导入相关的库
import openai
import pandas as pd
import sqlite3
from util.get_schema import get_schema
from util.make_openai_message import make_openai_message#Genimi_API_Key = "加上你的Gemini APIKey"client = openai.OpenAI(api_key=Genimi_API_Key,base_url="https://generativelanguage.googleapis.com/v1beta/openai/"
)
  • 定义get_schema 来指定对应的sql表的数据类型等,以方便LLM生成更准确的sql
def get_schema():return """\
0|Team|TEXT eg. "Toronto Raptors"
1|NAME|TEXT eg. "Otto Porter Jr."
2|Jersey|TEXT eg. "0" and when null has a value "NA"
3|POS|TEXT eg. "PF"
4|AGE|INT eg. "22" in years
5|HT|TEXT eg. `6' 7"` or `6' 10"`
6|WT|TEXT eg. "232 lbs" 
7|COLLEGE|TEXT eg. "Michigan" and when null has a value "--"
8|SALARY|TEXT eg. "$9,945,830" and when null has a value "--"
"""
  • 定一个prompt模版方便调用
def make_openai_message(user, system=""):system_prompt = ""if system != "":system_prompt = {"role": "system","content": system,}message = [system_prompt, {"role": "user", "content": user}]return message
  • 准备好LLM的prompt message
question = "What is the median weight in the NBA?"
system = f"""You are an NBA analyst with 15 years of experience writing complex SQL queries. 
Consider the nba_roster table with the following schema:
{get_schema()}
Write a sqlite query to answer the following question. 
Follow instructions exactly"""message = make_openai_message(question, system)
  • 发起LL M提问, 提取出sqlite的SQL,以方便后面执行验证
def get_llm_response(prompt):client_response = client.chat.completions.create(model="gemini-2.0-flash",messages=message,max_tokens=100,)generated_query = client_response.choices[0].message.contentif "sqlite" in generated_query:sql = generated_query.replace("```sqlite\n", "").replace("\n```", "")return sqlelse:return generated_querysql = get_llm_response(message)
print(sql)
  • 连接sqlite,验证sql执行情况
engine = sqlite3.connect("./nba_roster.db")
try:df = pd.read_sql(sql, con=engine)print(df)
except Exception as e:print(e)

结果验证,验证是否有幻觉

  • 提问: What is the median weight in the NBA?
  • LLM 生成的sql:
    执行时候虽然没有报错,但是结果不对
SELECT WT FROM nba_roster WHERE WT != '' ORDER BY REPLACE(WT, ' lbs', '') LIMIT 1 OFFSET (SELECT COUNT(*) FROM nba_roster WHERE WT != '') / 2
  • 正确的sql:
select 
CAST(SUBSTR(WT, 1, INSTR(WT,' ')) as INTEGER) as percentile
from nba_roster 
order by percentile limit 1 offset (select count(*) from nba_roster)/2;

增加反思步骤,让LLM再生成

  • 把错误的sql和执行结果给到大模型做反思,再生成
reflection = f"""Question: {question}.
Query: {sql} This query is invalid, {df} it cannot answer the question. Write a corrected sqlite query.""""
refection_message = make_openai_message(reflection, system)refection_message = make_openai_message(reflection, system)
sql_updated = get_llm_response(refection_message)
print(f'update query: {sql_updated}')
try:df = pd.read_sql(sql_updated, con=engine)print(df)
except Exception as e:print(e)
  • 在加了反思功能之后,生成的sql执行出了正确的结果
    在这里插入图片描述

参考

  • https://learn.deeplearning.ai/courses/improving-accuracy-of-llm-applications/lesson/xf44y/create-an-evaluation 教程中用的meta-llama/Meta-Llama-3-8B-Instruct和Lamimi,我用的Gemini和openai
  • nba_roster.db 文件已上传

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85017.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字IC学习笔记(二)

数字IC学习笔记(二) 宏定义,异步FIFO, 时钟来源,复位信号 文章目录 数字IC学习笔记(二)1. define宏定义的使用2,异步FIFO原理3,时钟来源4,复位参考资料 1. define宏定义的…

日志输出功能

当程序运行出现问题时,日志记录是一种非常有用的工具,它可以帮助我们追踪和定位问题。在 MicroPython 中,可以使用 log 模块来记录程序运行中的信息。本文将介绍 log 模块的使用方法和常见功能。 日志级别 log.DEBUG 常量,用来…

【JVM】- 类加载与字节码结构1

类文件结构 ClassFile {u4 magic;u2 minor_version;u2 major_version;u2 constant_pool_count;cp_info constant_pool[constant_pool_count-1];u2 access_flags;u2 this_class;u2 …

Android及Harmonyos实现图片进度显示效果

鸿蒙Harmonyos实现,使用ImageKnife自定义transform来实现图片进度效果 import { Context } from ohos.abilityAccessCtrl; import { image } from kit.ImageKit; import { drawing } from kit.ArkGraphics2D; import { GrayScaleTransformation, PixelMapTransform…

linux 中的自动化之systemd

linux | 自动化之systemd linux 中的自动化之systemd 学习总是循序渐进的。 linux 中程序的自动化,包括早期手动启动,查看启动后的日志、分析启动情况,再到后面封装脚本(大致要求启动后检查是否挂了,挂了拉起,没挂跳过…

【编译工具】CodeRider 2.0:驭码 CodeRider 2.0 全流程智能研发协作平台深度技术测评报告

目录 前言:CodeRider 2.0 简介 (1)核心功能 (2)适用场景 (3)优势 一、产品概述与技术架构 (1)产品定位与核心价值 (2)技术架构解析 &…

抓包 TCP 四次挥手报文

文章目录 抓包 TCP 三次握手报文一、第一次挥手二、第二次挥手三、第三次挥手四、第四次挥手 抓包 TCP 三次握手报文 抓包 TCP 三次握手报文 一、第一次挥手 二、第二次挥手 三、第三次挥手 四、第四次挥手

KMP(Kotlin Multiplatform)发布Web版本乱码

一、背景 最近用KMP尝试运行在Android、iOS、desktop都成功了,网络数据访问也正常。 可是当运行wasmJs的时候遇到了2个较大的问题。 中文字体出现乱码。 出现了跨域问题。 首先贴一下每个平台的运行截图: Android iOS Desktop 二、问题 当web跑起…

一个应用程序或移动网站项目提供最佳UI解决方案

一个应用程序或移动网站项目提供最佳UI解决方案 此套件是用大量的爱和辛勤工作制作的,为您的下一个应用程序或移动网站项目提供最佳解决方案。120个完全可编辑的界面,分为10个类别和2种文件格式,Photoshop和AI。简单易用的结构将允许您以所…

Android studio打包生成jar包文件

Android studio打包生成jar包文件 一 项目配置1.修改 app/build.gradle2.修改 AndroidManifest.xml 二 打 Jar 包1.修改 app/build.gradle2.编译生成 Jar 包 一 项目配置 1.修改 app/build.gradle 将com.android.application改成com.android.library注释掉applicationId 2.…

JAVA类加载机制(jdk8)

三句话总结JDK8的类加载机制: 类缓存:每个类加载器对他加载过的类都有一个缓存。双亲委派:向上委托查找,向下委托加载。沙箱保护机制:不允许应用程序加载JDK内部的系统类。 JDK8的类加载体系 类加载器的核心方法 //…

更进一步深入的研究ObRegisterCallBack

引入 我们如果想hook对象的回调,在上篇文章里我们已经知道了对象回调函数存在一个列表里面,我们通过dt可以看见,这里他是一个LIST_ENTRY结构,但是实际调用的时候,这样是行不通的,说明它结构不对 0: kd> dt _OBJEC…

Nginx-3 Nginx 的负载均衡策略

Nginx-3 Nginx 的负载均衡策略 Nginx 的负载均衡其实就是指将请求按照一定的策略转发给服务集群中的一台,提高了服务集群的可用性,解决数据流量过大、网络负荷过重的问题。 AKF 扩展立方体 分为 3 个方向负载: x 轴:增加实例数…

Wiiu平台RetroArch全能模拟器美化整合包v1.18

这款WiiU平台RetroArch全能模拟器美化整合包v1.18的亮点包括: 1. 18款平台完美兼容:无论你是喜欢NES时代的经典游戏,还是钟爱SNES、GBA等平台的大作,这款整合包都能满足你的需求,让你尽情畅玩游戏。 2. 三款自制主题&a…

MyBatis原理

Mybatis执行过程为:接口代理->sqlSession会话->executor执行器->JDBC操作 一、接口代理 Mybatis根据Mapper接口,动态生成相应实现类 二、SqlSession介绍 MyBatis核心对象SqlSession介绍 - MyBatis中文官网 三、Executor执行器介绍 精通My…

升级内核4.19-脚本

#bash cd /root yum remove -y kernel-tools-3.10.0-1160.el7.x86_64 yum remove -y kernel-tools-libs-3.10.0-1160.el7.x86_64tar -xvf rhel-7-amd64-rpms.tar.gz cd /root/rhel-7-amd64-rpms #安装依赖、包括socat&conntrack yum localinstall -y *.rpm --skip-broken#升…

全面理解 JVM 垃圾回收(GC)机制:原理、流程与实践

JVM 的 GC(Garbage Collection)机制是 Java 程序性能的关键支柱。本文将从堆内存布局、回收原理、GC 算法、流程细节、并发收集器机制等维度,系统讲清楚 GC 的底层运作原理和优化思路。 一、JVM 堆内存结构 Java 堆是 GC 管理的主要区域&am…

runas命令让其他用户以管理员权限运行程序

RUNAS 用法: RUNAS使用示例: runas /noprofile /user:mymachine\administrator cmd #本机Administrator管理员身份执行CMD,/noprofile为不加载该用户的配置信息。runas /profile /env /user:mydomain\admin “mmc %windir%\system32\dsa.msc” #本机上…

实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)

MinerU web api部署 MinerU 能够将包含图片、公式、表格等元素的多模态 PDF、PPT、DOCX 等文档转化为易于分析的 Markdown 格式。 克隆 MinerU 的仓库 git clone https://github.com/opendatalab/MinerU.gitcd 到 projects/web-api cd projects/web-api在可以科学上网的情况下…