通过 ChatGPT 的 Function Call 查询数据库

 用 Function Calling 的方式实现手机流量包智能客服的例子。

def get_sql_completion(messages, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,temperature=0,tools=[{  # 摘自 OpenAI 官方示例 https://github.com/openai/openai-cookbook/blob/main/examples/How_to_call_functions_with_chat_models.ipynb"type": "function","function": {"name": "ask_database","description": "Use this function to answer user questions about packages. \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"],}}}],)return response.choices[0].message
#  描述数据库表结构
database_schema_string = """
CREATE TABLE packages (id INT PRIMARY KEY NOT NULL, -- 主键,不允许为空package_name STR NOT NULL, -- 套餐名称,不允许为空monthly_fee INT NOT NULL, -- 月费,单位元,不允许为空flow_size INT NOT NULL, -- 流量大小,单位G,不允许为空condition STR -- 购买的限制条件,允许为空
);
"""
import sqlite3# 创建数据库连接
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()# 创建orders表
cursor.execute(database_schema_string)# 插入4条明确的模拟记录
mock_data = [(1, '经济套餐', 50, 10, None),(2, '畅游套餐', 180, 100, None),(3, '无限套餐', 300, 1000, None),(4, '校园套餐', 150, 200, '仅限在校生'),
]for record in mock_data:cursor.execute('''INSERT INTO packages (id, package_name, monthly_fee, flow_size, condition)VALUES (?, ?, ?, ?, ?)''', record)# 提交事务
conn.commit()
def ask_database(query):cursor.execute(query)records = cursor.fetchall()return recordsprompt = "请问流量最大的套餐是哪个?"
# prompt = "统计每月每件商品的销售额"
# prompt = "哪个用户消费最高?消费多少?"messages = [{"role": "system", "content": "基于 packages 表回答用户问题"},{"role": "user", "content": prompt}
]
print("====messages====")
print_json(messages)response = get_sql_completion(messages)
# print("====first Function Calling====")
# print_json(response)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)print("====最终回复====")print(response.content)

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

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

相关文章

未定义基类问题解决

基类A, 子类B 原因 出现了超前部署,循环依赖,即A.h中包含了B.h ,B.h中包含了A.h从而出现错误。 解决 将基类中的包含头文件#include"B.h"删除即可

想打游戏 可是windows一直出问题 应该如何解决呢 我来告诉你

如何你想让系统一直不出问题 你需要按照我的方法: 1 用 users 用户组用户 不登陆管理员账户 特别不登陆windows默认创建的那个用户 安装软件时 输密码安装 2 不安装国产软件 和 杀毒软件 3 使用firefox这个浏览器 或 google浏览器(但gogole不保证安全&…

扩展学习|统计学习理论(SLT)与极限学习机(ELM)应用于大社会数据分析

文献来源:[1] Oneto L , Bisio F , Cambria E ,et al.Statistical Learning Theory and ELM for Big Social Data Analysis[J].IEEE Computational Intelligence Magazine, 2016, 11(3):45-55.DOI:10.1109/MCI.2016.2572540. 提取链接:链接:h…

移远(Quectel)物联网通信解决方案

一、方案简介 无线通信模块是具备无线通信的电路模块,它能通过无线连接传输数据,能识别分析主控制器发来的命令,控制节点设备的工作,或者向主控制器发送当前节点设备的工作状态。 市面上常用的无线通信模组包括蓝牙模组、WLAN模…

灵伴科技(Rokid)借助 Knative 实现 AI 应用云原生 Serverless 化

作者:朱炜栋、元毅、子白 公司介绍 Rokid 创立于 2014 年,是一家专注于人机交互技术的产品平台公司,2018 年即被评为国家高新技术企业。Rokid 作为行业的探索者、领跑者,目前致力于 AR 眼镜等软硬件产品的研发及以 YodaOS 操作系…

数据结构—基础知识:哈夫曼编码

文章目录 数据结构—基础知识:哈夫曼编码哈夫曼编码的主要思想有关编码的概念哈夫曼编码满足两个性质: 数据结构—基础知识:哈夫曼编码 哈夫曼编码的主要思想 在进行数据压缩时,为了使压缩后的数据文件尽可能短,可采…

使用Python的turtle模块实现简单的烟花效果

import turtle import random import math# 设置窗口大小 width, height 800, 600 screen turtle.Screen() screen.title("Fireworks Explosion") screen.bgcolor("black") screen.setup(width, height)# 定义烟花粒子类 class Particle(turtle.Turtle):…

当程序员买了一台新 Mac

作为一名程序员,最趁手的“兵器”那还得是 MBP,有了一台新的 MBP 之后,肯定是要安装一大堆软件或工具的,把电脑装扮成自己喜欢的样子。 正好最近入手了一台新电脑,把安装软件的过程记录下来,下次再需要装环…

STM32控制DHT11温湿度传感器模块获取温湿度数据

时间记录:2024/1/29 一、DHT11引脚介绍 (1)VCC:电源引脚,3.3-5.5V (2)DATA:数据输入输出引脚 (3)NC:保留引脚,悬空即可 (…

颐和园龙纹珍宝展亮相,文物预防保护科技护航

在皇家园林颐和园的深处,一场独特的文化盛宴正静静上演。2月1日,“祥龙贺岁—颐和园藏龙纹题材文物特展”在德和园华丽揭幕。此次特展汇聚了66件珍贵文物,包括玉器、瓷器、书画、珐琅、家具等,每一件都是颐和园园藏的瑰宝。这些文…

Flink SQL Client 安装各类 Connector、组件的方法汇总(持续更新中....)

一般来说,在 Flink SQL Client 中使用各种 Connector 只需要该 Connector 及其依赖 Jar 包部署到 ${FLINK_HOME}/lib 下即可。但是对于某些特定的平台,如果 AWS EMR、Cloudera CDP 等产品会有所不同,主要是它们中的某些 Jar 包可能被改写过&a…

【Wireshark教程】流量分析,使用Wireshark寻找主机信息

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

力扣labuladong一刷day72天动态规划

力扣labuladong一刷day72天动态规划 文章目录 力扣labuladong一刷day72天动态规划一、343. 整数拆分二、96.不同的二叉搜索树 一、343. 整数拆分 题目链接:https://leetcode.cn/problems/integer-break/description/ 思路:本题为整数拆分,可…

clickhouse如何清除多个分区数据 alter table drop partition操作

官网drop partition操作 官网链接:https://clickhouse.com/docs/zh/sql-reference/statements/alter/partition#drop-partitionpart 官网上之有清除单个分区的例子,并没有对清除多个分区的场景进行描述,之前清除分区时也是按照官网例子进行…

MySQL系统配置

MySQL系统配置 内存相关 sort_buffer_size 定义了每个线程排序缓存区的大小,当索引无法满足需要的顺序信息时会用到,执行计划中出现using filesort,MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部…

在 PyTorch 中动态构建和更新模型

1. PyTorch 中动态构建和更新模型 在 PyTorch 中,动态构建和更新模型是其核心特性之一。这意味着开发者无需预先定义完整的计算图,而是在运行时根据需要构建神经网络结构,并可以随时修改模型参数、添加或删除网络层等。这种动态图机制为研…

【AudioPolicy To AudioHAL笔记(二)】AudioPolicyAudioFliger To AudioHAL

/*****************************************************************************************************************/ 声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢! 创作不易,如果文章…

【Python】【完整代码】解析Excel文件内容,按每列首行元素名打印出某个字符串的统计占比(超详细)

目录 1.示例: 1.1 实现代码1:列数为常量 运行结果: 1.2 实现代码2:列数为变量 运行结果: 1.示例: 开发需求:读取Excel文件,统计第3列到第5列中每列的"False"字段占…

【新书推荐】5.1节 16位汇编语言学习环境

第五章 16位汇编学习环境 16位汇编语言的学习环境是建立在8086计算机的基础上的,我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。 5.1节 16位汇编语言学习环境 本节内容:16位汇编学习环境的搭建。 ■汇编语言程序设计编程调试过程&#xff1…

【React】react组件传参

【React】react组件传参 一、props:父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递(组件插槽) 二、自定义事件:子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…