如何讓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
英文地址,請注明出處:http://en.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在可以科學上網的情況下…