OpenAi FunctionCalling 案例详解

news2024/11/19 1:51:10

源码详细讲解 pdf 及教学视频下载链接:点击这里下载

FunctionCalling的单一函数调用

天气预报查询(今天长沙的天气如何?)
import json
import requests
from openai import OpenAI

client = OpenAI()

location = "长沙"

def get_current_weather(city):
    url = "https://restapi.amap.com/v3/weather/weatherInfo?key=0f219ddb5f23d95ea1731fe653f906a3&city={city}".format(city=city)
    response = requests.get(url)
    result = eval(response.text)["lives"][0]
    weather_info = {
        "location": city,
        "weather": result["weather"],
        "temperature": result["temperature"],
        "time": result["reporttime"]
    }
    return json.dumps(weather_info, ensure_ascii=False)

messages = []
messages.append({"role":"system", "content":"你是一个查询天气的机器人,你需要根据用户提供的地址来回答当地的天气情况"})
messages.append({"role":"user", "content": f"""今天{location}的天气如何?"""})
tools = [{
    "type":"function",
    "function": {
        "name":"get_current_weather",
        "description": "获取给定位置的当前天气",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "城市或区,例如长沙"
                }
            },
            "required":["location"]
        }
    }
}]

response = client.chat.completions.create(
    model = "gpt-3.5-turbo",
    messages = messages,
    tools = tools
)

messages.append(response.choices[0].message)
print(messages)
function_name = response.choices[0].message.tool_calls[0].function.name
print(function_name)
function_id = response.choices[0].message.tool_calls[0].id
print(function_id)
messages.append({
    "tool_call_id": function_id,
    "role": "tool",
    "name": function_name,
    "content": get_current_weather(location)
})
print(messages)

response = client.chat.completions.create(model="gpt-3.5-turbo", messages=messages)
print(response.choices[0].message.content)

运行结果

Function call的多函数调用

查询学校课程对应的老师(帮我查询北京大学的中国历史课程是哪位老师(teacher)。)
import json
from openai import OpenAI
client = OpenAI()
tools = [{
	"type": "function",
	"function": {
		"name": "get_class_number",
		"description": "根据学校、课程查询上课编号",
		"parameters": {
			"type": "object",
			"properties": {
				"school": {
					"description": "学校",
					"type": "string"
				},
				"course": {
					"description": "课程",
					"type": "string"
				}
			},
			"required": ["school", "course"]
		}
	}
}, {
	"type": "function",
	"function": {
		"name": "get_course_teacher",
		"description": "查询某课程的老师",
		"parameters": {
			"type": "object",
			"properties": {
				"class_number": {
					"description": "上课编号",
					"type": "string"
				}
			},
			"required": ["class_number"]
		},
	}
}]

def get_class_number(school: str, course: str):
	class_number = {
		"清华大学": {
			"高等数学": "MATH101",
			"线性代数": "MATH102",
		},
		"北京大学": {
			"大学英语": "ENG201",
			"中国历史": "HIST202",
		}
	}
	return {"class_number": class_number[school][course]}

def get_course_teacher(class_number: str):
	course_teacher_mapping = {
		"MATH101": "张老师",
		"MATH102": "李老师",
		"ENG201": "王老师",
		"HIST202": "赵老师",
	}
	teacher = course_teacher_mapping.get(class_number)
	return {"teacher": teacher}

messages = []
messages = [
	{
		"role": "system",
		"content": "你是一位高效的教育助手,现在需要查询某高校的老师名称。"
	},
	{
		"role": "user",
		"content": "帮我查询北京大学的中国历史课程是哪位老师(teacher)。"
	}
]

# 第一次调用
first_response = client.chat.completions.create(
	model="gpt-3.5-turbo",
	messages=messages,
	tools=tools,
	tool_choice="auto",
)
print(first_response.choices[0].message)

messages.append(first_response.choices[0].message)

first_function = {}
if first_response.choices[0].message.tool_calls:
	tool_call = first_response.choices[0].message.tool_calls[0]
	args = tool_call.function.arguments
	if tool_call.function.name == "get_class_number":
		first_function = get_class_number(**json.loads(args))
	if tool_call.function.name == "get_course_teacher":
		first_function = get_course_teacher(**json.loads(args))

print(first_function)

tool_call = first_response.choices[0].message.tool_calls[0]
messages.append({
	"role": "tool",
	"tool_call_id": tool_call.id,
	"content": str(json.dumps(first_function)),
	"name": tool_call.function.name
})
print("***" * 40)
print(messages)
print("***" * 40)

second_response = client.chat.completions.create(
	model="gpt-3.5-turbo",
	messages=messages,
	tools=tools,
	tool_choice="auto"
)
print(second_response.choices[0].message)

messages.append(second_response.choices[0].message)
second_function = {}
if second_response.choices[0].message.tool_calls:
	tool_call = second_response.choices[0].message.tool_calls[0]
	args = tool_call.function.arguments
	if tool_call.function.name == "get_class_number":
		second_function = get_class_number(**json.loads(args))
	if tool_call.function.name == "get_course_teacher":
		second_function = get_course_teacher(**json.loads(args))

print(second_function)
tool2_call = second_response.choices[0].message.tool_calls[0]
# 将函数的结果添加到messages中,继续送入模型问答
messages.append(
	{
		"role": "tool",
		"tool_call_id": tool2_call.id,
		"content": str(json.dumps(second_function)),
		"name":tool2_call.function.name
	}
)

last_response = client.chat.completions.create(
	model="gpt-3.5-turbo",
	messages=messages,
	tools=tools,
	tool_choice="auto",
)
print(last_response.choices[0].message.content)

运行结果

FunctionCalling调用SQL

查询一下最高工资的员工姓名及对应的工资
import json
import pymysql
from openai import OpenAI

client = OpenAI()

def connect_database(query):
    conn = pymysql.connect(
        host="localhost",
        port=3306,
        user="root",
        password="123456",
        database="school",
        charset="utf8mb4",
    )
    cursor = conn.cursor()
    cursor.execute(query)
    result = cursor.fetchall()
    cursor.close()
    conn.close()
    return result

messages = []
messages.append({"role": "system", "content": "通过针对业务数据库生成 SQL 查询来回答用户的问题"})
messages.append({"role": "user", "content": "查询一下最高工资的员工姓名及对应的工资"})

response = client.chat.completions.create(
    messages=messages,
    model="gpt-3.5-turbo",
    tools=[
        {
            "type": "function",
            "function": {
                "name": "connect_database",
                "description": "使用此函数回答业务问题,要求输出是一个SQL查询语句",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "sql": {
                            "type": "string",
                            "description": f"SQL查询提取信息以回答用户的问题。"
                            f"查询应该以纯文本返回,而不是JSON。"
                            f"数据库的表为 emp 表。字段有 id,name,salary"
                            f"查询应该只包含MySQL支持的语法。",
                        }
                    },
                    "required": ["sql"],
                },
            }
        }
    ]
)
print("tool calls", response.choices[0].message.tool_calls[0])

messages.append(response.choices[0].message)
function_name = response.choices[0].message.tool_calls[0].function.name
function_id = response.choices[0].message.tool_calls[0].id
function_response = connect_database(
    json.loads(
        response.choices[0].message.tool_calls[0].function.arguments
    ).get("sql")
)
print("dbResult", function_response)

messages.append({
    "role": "tool",
    "tool_call_id": function_id,
    "name": function_name,
    "content": str(function_response),
})
last_response = client.chat.completions.create(
    messages=messages,
    model="gpt-3.5-turbo",
)
print(last_response.choices[0].message.content)

运行结果 

 源码详细讲解 pdf 及教学视频下载链接:点击这里下载 

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

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

相关文章

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别,尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令: 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

Cortex微控制器软件接口标准(CMSIS)

Cortex微控制器软件接口标准 目前,软件开发已经是嵌入式系统行业公认的主要开发成本,通过将所有Cortex-M芯片供应商产品的软件接口标准化,能有效降低这一成本,尤其是进行新产品开发或者将现有项目或软件移植到基于不同厂商MCU的产…

Golang | Leetcode Golang题解之第450题删除二叉搜索树的节点

题目: 题解: func deleteNode(root *TreeNode, key int) *TreeNode {var cur, curParent *TreeNode root, nilfor cur ! nil && cur.Val ! key {curParent curif cur.Val > key {cur cur.Left} else {cur cur.Right}}if cur nil {retur…

回首往事,感受change

今早,我收到了CSDN发来的消息,当我看了内容才发现,我不知不觉已经在CSDN里面创作了730天(2年)也是个非常值得纪念的日子。 今天,我来回顾一下我的以往,感受一下我的成长与变化。 梦的开始 大家…

【Python报错已解决】 Failed building wheel for opencv-python-headless

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

2024多模态大模型发展调研

随着生成式大语言模型应用的日益广泛,其输入输出模态受限的问题日益凸显,成为制约技术进一步发展的瓶颈。为突破这一局限,本文聚焦于研究多模态信息的协同交互策略,旨在探索一种能够统一理解与生成的多模态模型构建方法。在此基础…

C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验

一、预览效果 国庆节第一天,祝祖国繁荣昌盛! 1.1 效果图 (WinForm无边框窗体,F11可全屏) 拖动窗体时半透明效果(拖动时参考窗体后面释放位置) 说明:本功能的实现基于网友的原型完善而来,更多代码可以参考他的文章 h

智能平衡移动机器人-平台硬件电路

目录 硬件电路主要模块包括: 主控制器 TMS320F28069数字信号处理器 电池 电机驱动电路 直流电机的驱动 编码器 传感器与外设模块 APP 为了使智能平衡移动机器人达到更好的平衡控制效果,机器人的本体设计更为轻便、集中。机器人的硬件电路也进行集…

课设实验-数据结构-单链表-文教文化用品品牌

题目&#xff1a; 代码&#xff1a; 正解&#xff1a; #include<stdio.h> #include<stdlib.h> #include<string.h> #define MaxSize 10 //定义顺序表最大长度static int result; //字符串比较结果 static int i; //循环初始值 static bool flag; //记录结…

Typora使用与Markdown语法详细教程

Typora 基本介绍 Typora 是一款由 Abner Lee 开发的轻量级 Markdown 编辑器。Markdown 是一种 轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者 HTML&#xff09;文档。 安装 下载地址&#xff…

C语言 getchar 函数完全解析:掌握字符输入的关键

前言 在C语言中&#xff0c;getchar 是一个非常实用的函数&#xff0c;用于从标准输入流&#xff08;通常是键盘&#xff09;读取单个字符。这对于处理文本输入非常有用&#xff0c;尤其是在需要逐个字符处理的情况下。本文将深入探讨 getchar 函数的用法和特点&#xff0c;并…

开放式耳机是什么意思?哪个品牌好?开放式蓝牙耳机测评分享

开放式耳机是目前比较流行的一种蓝牙耳机类型&#xff0c;它凭借佩戴舒适、安全性高、透气性好以及健康卫生等等特点成为了很多人的耳机选择。但其实并没有太多人了解开放式耳机&#xff0c;不知道什么是开放式耳机、开放式耳机是否比封闭式耳机强、什么样的人适合开放式耳机以…

Optiver股票大赛Top2开源!

Optiver股票大赛Top2开源&#xff01; ↑↑↑关注后"星标"kaggle竞赛宝典 作者&#xff1a;杰少 Optiver第二名方案解读 简介 Optiver竞赛已经于今天结束了&#xff0c;竞赛也出现了极端情况&#xff0c;中间断崖式的情况&#xff0c;在Kaggle过往的竞赛中&#…

【电路基础 · 1】电路模型和电路定律(自用)

总览 1.电路和电路模型 2.电流和电压参考方向 3.电功率和能量 4.电路元件 5.电阻元件 6.电压源和电流源 7.受控电源 8.基尔霍夫定律 重点&#xff1a; 1.电压、电流的参考方向 2.电阻元件、电源元件的特性 3.基尔霍夫定律&#xff08;基尔霍夫电流定律KCL、基尔霍夫电压定律K…

【办公类-48-03】20240930每月电子屏台账汇总成docx-3(三园区合并EXCLE,批量生成3份word)

背景需求&#xff1a; 前期电子屏汇总是“总园”用“”问卷星”、“一分园”用“腾讯文档”&#xff0c;二分园“用“手写word”” 【办公类-48-02】20240407每月电子屏台账汇总成docx-2&#xff08;腾讯文档xlsx导入docx&#xff0c;每页20条&#xff09;【办公类-48-02】20…

C语言 | Leetcode C语言题解之题451题根据字符出现频率排序

题目&#xff1a; 题解&#xff1a; #define HASH_FIND_CHAR(head, findint, out) HASH_FIND(hh, head, findint, sizeof(char), out) #define HASH_ADD_CHAR(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(char), add)struct HashTable {char key;int val;UT_ha…

基于小程序+Vue + Spring Boot的进销存库存出库入库统计分析管理系统

目录 一、项目背景及需求分析 1. 项目背景 2. 需求分析 二、系统架构设计 1. 技术选型 2. 模块划分 三、数据库设计数据库表结构 四、前端实现 五、后端实现 1. RESTful API设计 2. 数据库操作 六、安全性和性能优化 1. 安全性 2. 性能优化 七、测试与部署 1. …

Unity之寻找子物体的8种方式

废话不多说&#xff0c;举个例子&#xff1a; 当前的transform是Cube1物体&#xff0c;所以。。。。 寻找子物体的方式有以下几个&#xff1a; 1.transform.Find("go2/go3") 好处&#xff1a;可以快速通过路径定位对应的子物体&#xff0c;甚至是子子子物体。 2.t…

UG NX二次开发(C++)-建模-采用NXOpen获取拉伸特征的信息

文章目录 1、前言2、创建一个特征3 采用NXOpen来实现拉伸特征信息的获取1、前言 UG NX二次开发过程中,大部分初学者喜欢用UFun函数来实现UG NX二次开发的功能,因为相较于NXOpen,UFun函数简单易懂;但是有时UFun函数如果初始值设置不好,出现的错误也比较难排查。比如对于拉…

L4 KNN 算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 KNN 算法用于约会数据集分类 在这周中&#xff0c;学习如何使用 K 近邻&#xff08;K-Nearest Neighbors, KNN&#xff09;算法对一个约会数据集进行分类。KN…