【GPT入門】第12課 FunctionCall 生成數據庫sql代碼

【GPT入門】第12課 FunctionCall 生成數據庫sql代碼

  • 1.概述
  • 2. 代碼
  • 3.執行結果

1.概述

如下代碼的任務:自然語言問ai,自動生成sql并回答用戶
實現思路:
步驟1. ai會把用戶的問題,轉為sql
步驟2. 程序執行sql
步驟3.把執行的sql結果,重新給回ai,
步驟4. ai給的回復再次放到prompt中 ,并給ai

2. 代碼

from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json_ = load_dotenv(find_dotenv())client = OpenAI()
def print_json(data):"""打印參數。如果參數是有結構的(如字典或列表),則以格式化的 JSON 形式打印;否則,直接打印該值。"""if hasattr(data, 'model_dump_json'):data = json.loads(data.model_dump_json())if (isinstance(data, (list))):for item in data:print_json(item)elif (isinstance(data, (dict))):print(json.dumps(data,indent=4,ensure_ascii=False))else:print(data)#  描述數據庫表結構
database_schema_string = """
CREATE TABLE orders (id INT PRIMARY KEY NOT NULL, -- 主鍵,不允許為空customer_id INT NOT NULL, -- 客戶ID,不允許為空product_id STR NOT NULL, -- 產品ID,不允許為空price DECIMAL(10,2) NOT NULL, -- 價格,不允許為空status INT NOT NULL, -- 訂單狀態,整數類型,不允許為空。0代表待支付,1代表已支付,2代表已退款create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 創建時間,默認為當前時間pay_time TIMESTAMP -- 支付時間,可以為空
);
"""def get_sql_completion(messages, model="gpt-4o-mini"):response = client.chat.completions.create(model=model,messages=messages,temperature=0,tools=[{ "type": "function","function": {"name": "ask_database","description": "Use this function to answer user questions about business. \Output should be a fully formed SQL query.","parameters": {"type": "object","properties": {"query": {"type": "string","description": f"""SQL query extracting info to answer the user's question.SQL should be written using this database schema:{database_schema_string}The query should be returned in plain text, not in JSON.The query should only contain grammars supported by SQLite.""",}},"required": ["query"],}}}],)print("get_sql_completion 返回:")print(response)return response.choices[0].messageimport sqlite3# 創建數據庫連接
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()# 創建orders表
cursor.execute(database_schema_string)# 插入5條明確的模擬記錄
mock_data = [(1, 1001, 'TSHIRT_1', 50.00, 0, '2023-09-12 10:00:00', None),(2, 1001, 'TSHIRT_2', 75.50, 1, '2023-09-16 11:00:00', '2023-08-16 12:00:00'),(3, 1002, 'SHOES_X2', 25.25, 2, '2023-10-17 12:30:00', '2023-08-17 13:00:00'),(4, 1003, 'SHOES_X2', 25.25, 1, '2023-10-17 12:30:00', '2023-08-17 13:00:00'),(5, 1003, 'HAT_Z112', 60.75, 1, '2023-10-20 14:00:00', '2023-08-20 15:00:00'),(6, 1002, 'WATCH_X001', 90.00, 0, '2023-10-28 16:00:00', None)
]for record in mock_data:cursor.execute('''INSERT INTO orders (id, customer_id, product_id, price, status, create_time, pay_time)VALUES (?, ?, ?, ?, ?, ?, ?)''', record)# 提交事務
conn.commit()def ask_database(query):cursor.execute(query)records = cursor.fetchall()return records# prompt = "10月的銷售額"
# prompt = "統計每月每件商品的銷售額"
prompt = "哪個用戶消費最高?消費多少?"messages = [{"role": "system", "content": "你是一個數據分析師,基于數據庫的數據回答問題"},{"role": "user", "content": prompt}
]
response = get_sql_completion(messages)
if response.content is None:response.content = ""
messages.append(response)
print("====Function Calling====")
print_json(response)if response.tool_calls is not None:tool_call = response.tool_calls[0]if tool_call.function.name == "ask_database":arguments = tool_call.function.argumentsargs = json.loads(arguments)print("====SQL====")print(args["query"])result = ask_database(args["query"])print("====DB Records====")print(result)messages.append({"tool_call_id": tool_call.id,"role": "tool","name": "ask_database","content": str(result)})response = get_sql_completion(messages)messages.append(response)print("====最終回復====")print(response.content)print("=====對話歷史=====")
print_json(messages)

3.執行結果

C:\ProgramData\anaconda3\envs\gptLearning\python.exe E:\workspace\gptLearning\gptLearning\les03\Lesson03_callDatabase.py 
get_sql_completion 返回:
ChatCompletion(id='chatcmpl-B930W6VUozMJnUahs6NitrNe7xfpu', choices=[Choice(finish_reason='tool_calls', index=0, logprobs=None, message=ChatCompletionMessage(content=None, refusal=None, role='assistant', audio=None, function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_5LYqXfDtIhKkQEcHckpbTw62', function=Function(arguments='{"query":"SELECT customer_id, SUM(price) AS total_spent FROM orders WHERE status = 1 GROUP BY customer_id ORDER BY total_spent DESC LIMIT 1;"}', name='ask_database'), type='function')]))], created=1741496212, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier='default', system_fingerprint='fp_06737a9306', usage=CompletionUsage(completion_tokens=46, prompt_tokens=255, total_tokens=301, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
====Function Calling====
{"content": "","refusal": null,"role": "assistant","audio": null,"function_call": null,"tool_calls": [{"id": "call_5LYqXfDtIhKkQEcHckpbTw62","function": {"arguments": "{\"query\":\"SELECT customer_id, SUM(price) AS total_spent FROM orders WHERE status = 1 GROUP BY customer_id ORDER BY total_spent DESC LIMIT 1;\"}","name": "ask_database"},"type": "function"}]
}
====SQL====
SELECT customer_id, SUM(price) AS total_spent FROM orders WHERE status = 1 GROUP BY customer_id ORDER BY total_spent DESC LIMIT 1;
====DB Records====
[(1003, 86.0)]
get_sql_completion 返回:
ChatCompletion(id='chatcmpl-B930YayyGGkd7TjoG9OQ7DdzT3nnE', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='消費最高的用戶是用戶ID為1003,消費總額為86.00。', refusal=None, role='assistant', audio=None, function_call=None, tool_calls=None))], created=1741496214, model='gpt-4o-mini-2024-07-18', object='chat.completion', service_tier=None, system_fingerprint='fp_b705f0c291', usage=CompletionUsage(completion_tokens=20, prompt_tokens=317, total_tokens=337, completion_tokens_details=CompletionTokensDetails(accepted_prediction_tokens=0, audio_tokens=0, reasoning_tokens=0, rejected_prediction_tokens=0), prompt_tokens_details=PromptTokensDetails(audio_tokens=0, cached_tokens=0)))
====最終回復====
消費最高的用戶是用戶ID為1003,消費總額為86.00=====對話歷史=====
{"role": "system","content": "你是一個數據分析師,基于數據庫的數據回答問題"
}
{"role": "user","content": "哪個用戶消費最高?消費多少?"
}
{"content": "","refusal": null,"role": "assistant","audio": null,"function_call": null,"tool_calls": [{"id": "call_5LYqXfDtIhKkQEcHckpbTw62","function": {"arguments": "{\"query\":\"SELECT customer_id, SUM(price) AS total_spent FROM orders WHERE status = 1 GROUP BY customer_id ORDER BY total_spent DESC LIMIT 1;\"}","name": "ask_database"},"type": "function"}]
}
{"tool_call_id": "call_5LYqXfDtIhKkQEcHckpbTw62","role": "tool","name": "ask_database","content": "[(1003, 86.0)]"
}
{"content": "消費最高的用戶是用戶ID為1003,消費總額為86.00。","refusal": null,"role": "assistant","audio": null,"function_call": null,"tool_calls": null
}Process finished with exit code 0

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71773.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《白帽子講 Web 安全》之身份認證

目錄 引言 一、概述 二、密碼安全性 三、認證方式 (一)HTTP 認證 (二)表單登錄 (三)客戶端證書 (四)一次性密碼(OTP) (五)多因…

服務器python項目部署

角色:root, 其他用戶應該也可以 1. 安裝python3環境 #如果是新機器,盡量執行,避免未知報錯 yum -y update python -v yum install python3 python3 -v2. 使用virtualenvwrapper 創建虛擬環境,并使用workon切換不同的虛擬環境 # 安裝virtua…

更新vscode ,將c++11更新到c++20

要在CentOS系統中安裝最新版本的GCC,你可以使用SCL(Software Collections)倉庫,它提供了開發工具的最新版本。以下是安裝步驟: 1、 添加SCL倉庫: 首先,添加CentOS的SCL倉庫,該倉庫…

Deeplabv3+改進5:在主干網絡中添加EMAattention|助力漲點!

??【DeepLabv3+改進專欄!探索語義分割新高度】 ?? 你是否在為圖像分割的精度與效率發愁? ?? 本專欄重磅推出: ? 獨家改進策略:融合注意力機制、輕量化設計與多尺度優化 ? 即插即用模塊:ASPP+升級、解碼器 PS:訂閱專欄提供完整代碼 目錄 論文簡介 步驟一 步驟二…

基于自監督三維語義表示學習的視覺語言導航

前言 目前的視覺語言導航存在的問題: (1)在VLN任務中,大多數當前方法主要利用RGB圖像,忽略了環境固有的豐富三維語義數據。許多語義無關的紋理細節不可避免地被引入到訓練過程中,導致模型出現過擬合問題&…

網絡原理之HTTPS(如果想知道網絡原理中有關HTTPS的知識,那么只看這一篇就足夠了!)

前言:隨著互聯網安全問題日益嚴重,HTTPS已成為保障數據傳輸安全的標準協議,通過加密技術和身份驗證,HTTPS有效防止數據竊取、篡改和中間人攻擊,確保通信雙方的安全和信任。 ???這里是秋刀魚不做夢的BLOG ???想要…

【江協科技STM32】ADC數模轉換器-學習筆記

ADC簡介 ADC(Analog-Digital Converter)模擬-數字轉換器ADC可以將引腳上連續變化的模擬電壓轉換為內存中存儲的數字變量,建立模擬電路到數字電路的橋梁,ADC是一種將連續的模擬信號轉換為離散的數字信號的設備或模塊12位逐次逼近型…

文件系統文件管理

文件緩沖區(內核級,OS內部的)存在的意義:系統調用將數據寫入緩沖區后函數即可返回,是從內存到內存的,提高了程序的效率。之后將緩沖區數據刷新到硬盤則是操作系統的事了。無論讀寫,OS都會把數據…

HTML 標簽語義化指南:讓網頁更易讀

HTML 語義化標簽是指在 HTML 中使用具有明確含義的標簽來標記網頁內容的結構和意義。這些標簽可以提供更多的語義信息,有助于搜索引擎理解網頁內容,并為使用輔助技術的用戶提供更好的訪問體驗。 以下是一些常見的HTML語義化標簽及其含義和用途&#xff…

機器學習:線性回歸,梯度下降,多元線性回歸

線性回歸模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的數學公式 多元線性回歸(Multiple Linear Regression)

共繪智慧升級,看永洪科技助力由由集團起航智慧征途

在數字化洪流洶涌澎湃的當下,企業如何乘風破浪,把握轉型升級的黃金機遇,已成為所有企業必須直面的時代命題。由由集團,作為房地產的領航者,始終以前瞻視野引領變革,堅決擁抱數字化浪潮,攜手數字…

laravel es 相關代碼 ElasticSearch

來源&#xff1a; github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…

阿里發布新開源視頻生成模型Wan-Video,支持文生圖和圖生圖,最低6G就能跑,ComFyUI可用!

Wan-Video 模型介紹&#xff1a;包括 Wan-Video-1.3B-T2V 和 Wan-Video-14B-T2V 兩個版本&#xff0c;分別支持文本到視頻&#xff08;T2V&#xff09;和圖像到視頻&#xff08;I2V&#xff09;生成。14B 版本需要更高的 VRAM 配置。 Wan2.1 是一套全面開放的視頻基礎模型&…

閉包函數是什么?

閉包函數是 JavaScript 中一個非常重要且強大的概念&#xff0c;下面將從定義、形成條件、作用、示例以及優缺點等方面詳細介紹閉包函數。 定義 閉包是指有權訪問另一個函數作用域中的變量的函數。簡單來說&#xff0c;即使該函數執行完畢&#xff0c;其作用域內的變量也不會…

nuxt2 打包優化使用“compression-webpack-plugin”插件

在使用 Nuxt.js 構建項目時&#xff0c;為了提高性能&#xff0c;通常會考慮對靜態資源進行壓縮。compression-webpack-plugin 是一個常用的 Webpack 插件&#xff0c;用于在生產環境中對文件進行 Gzip 壓縮。這對于減少網絡傳輸時間和提高頁面加載速度非常有幫助。下面是如何在…

大型語言模型訓練的三個階段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)

前言 如果你對這篇文章可感興趣&#xff0c;可以點擊「【訪客必讀 - 指引頁】一文囊括主頁內所有高質量博客」&#xff0c;查看完整博客分類與對應鏈接。 當前的大型語言模型訓練大致可以分為如下三個階段&#xff1a; Pre-train&#xff1a;根據大量可獲得的文本資料&#…

模型壓縮技術(二),模型量化讓模型“輕裝上陣”

一、技術應用背景 在人工智能蓬勃發展的浪潮下&#xff0c;大模型在自然語言處理、計算機視覺等諸多領域大放異彩&#xff0c;像知名的GPT以及各類開源大語言模型&#xff0c;其規模與復雜度持續攀升。然而&#xff0c;這一發展也帶來了挑戰&#xff0c;模型越大&#xff0c;對…

機器學習:愚者未完成的詩篇(零)

當算法在數據海洋中打撈支離破碎的韻律時&#xff0c;機器學習系統展現出的智慧如同斷臂的維納斯雕像——完美與殘缺構成令人戰栗的美學悖論。愚者&#xff0c;在詞語的混沌中編織邏輯經緯&#xff0c;卻總在即將觸及詩性本質的瞬間&#xff0c;暴露出認知維度的致命裂隙。 一…

【算法題】小魚的航程

問題&#xff1a; 分析 分析題目&#xff0c;可以看出&#xff0c;給你一個開始的星期&#xff0c;再給一個總共天數&#xff0c;在這些天內&#xff0c;只有周六周日休息&#xff0c;其他全要游泳250公里。 那分支處理好啦 當星期為6時&#xff0c;需要消耗2天&#xff0c;…

GStreamer —— 2.5、Windows下Qt加載GStreamer庫后運行 - “教程5:GUI 工具包集成(gtk)“(附:完整源碼)

運行效果 簡介 上一個教程演示了時間管理及seek操作。本教程介紹如何將 GStreamer 集成到圖形用戶中 接口 &#xff08;GUI&#xff09; 工具包&#xff0c;如 GTK。基本上 GStreamer 負責媒體播放&#xff0c;而 GUI 工具包處理 用戶交互。最有趣的部分是那些 庫必須進行交互&…