首页 > 其他分享 >OpenAi FunctionCalling 案例详解

OpenAi FunctionCalling 案例详解

时间:2024-10-02 09:03:53浏览次数:7  
标签:function name tool messages FunctionCalling 详解 OpenAi message response

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

FunctionCalling的单一函数调用

天气预报查询(今天长沙的天气如何?)

 1 import json
 2 import requests
 3 from openai import OpenAI
 4  
 5 client = OpenAI()
 6  
 7 location = "长沙"
 8  
 9 def get_current_weather(city):
10     url = "https://restapi.amap.com/v3/weather/weatherInfo?key=0f219ddb5f23d95ea1731fe653f906a3&city={city}".format(city=city)
11     response = requests.get(url)
12     result = eval(response.text)["lives"][0]
13     weather_info = {
14         "location": city,
15         "weather": result["weather"],
16         "temperature": result["temperature"],
17         "time": result["reporttime"]
18     }
19     return json.dumps(weather_info, ensure_ascii=False)
20  
21 messages = []
22 messages.append({"role":"system", "content":"你是一个查询天气的机器人,你需要根据用户提供的地址来回答当地的天气情况"})
23 messages.append({"role":"user", "content": f"""今天{location}的天气如何?"""})
24 tools = [{
25     "type":"function",
26     "function": {
27         "name":"get_current_weather",
28         "description": "获取给定位置的当前天气",
29         "parameters": {
30             "type": "object",
31             "properties": {
32                 "location": {
33                     "type": "string",
34                     "description": "城市或区,例如长沙"
35                 }
36             },
37             "required":["location"]
38         }
39     }
40 }]
41  
42 response = client.chat.completions.create(
43     model = "gpt-3.5-turbo",
44     messages = messages,
45     tools = tools
46 )
47  
48 messages.append(response.choices[0].message)
49 print(messages)
50 function_name = response.choices[0].message.tool_calls[0].function.name
51 print(function_name)
52 function_id = response.choices[0].message.tool_calls[0].id
53 print(function_id)
54 messages.append({
55     "tool_call_id": function_id,
56     "role": "tool",
57     "name": function_name,
58     "content": get_current_weather(location)
59 })
60 print(messages)
61  
62 response = client.chat.completions.create(model="gpt-3.5-turbo", messages=messages)
63 print(response.choices[0].message.content)
View Code

运行结果

 Function call的多函数调用

查询学校课程对应的老师(帮我查询北京大学的中国历史课程是哪位老师(teacher)。)

  1 import json
  2 from openai import OpenAI
  3 client = OpenAI()
  4 tools = [{
  5     "type": "function",
  6     "function": {
  7         "name": "get_class_number",
  8         "description": "根据学校、课程查询上课编号",
  9         "parameters": {
 10             "type": "object",
 11             "properties": {
 12                 "school": {
 13                     "description": "学校",
 14                     "type": "string"
 15                 },
 16                 "course": {
 17                     "description": "课程",
 18                     "type": "string"
 19                 }
 20             },
 21             "required": ["school", "course"]
 22         }
 23     }
 24 }, {
 25     "type": "function",
 26     "function": {
 27         "name": "get_course_teacher",
 28         "description": "查询某课程的老师",
 29         "parameters": {
 30             "type": "object",
 31             "properties": {
 32                 "class_number": {
 33                     "description": "上课编号",
 34                     "type": "string"
 35                 }
 36             },
 37             "required": ["class_number"]
 38         },
 39     }
 40 }]
 41  
 42 def get_class_number(school: str, course: str):
 43     class_number = {
 44         "清华大学": {
 45             "高等数学": "MATH101",
 46             "线性代数": "MATH102",
 47         },
 48         "北京大学": {
 49             "大学英语": "ENG201",
 50             "中国历史": "HIST202",
 51         }
 52     }
 53     return {"class_number": class_number[school][course]}
 54  
 55 def get_course_teacher(class_number: str):
 56     course_teacher_mapping = {
 57         "MATH101": "张老师",
 58         "MATH102": "李老师",
 59         "ENG201": "王老师",
 60         "HIST202": "赵老师",
 61     }
 62     teacher = course_teacher_mapping.get(class_number)
 63     return {"teacher": teacher}
 64  
 65 messages = []
 66 messages = [
 67     {
 68         "role": "system",
 69         "content": "你是一位高效的教育助手,现在需要查询某高校的老师名称。"
 70     },
 71     {
 72         "role": "user",
 73         "content": "帮我查询北京大学的中国历史课程是哪位老师(teacher)。"
 74     }
 75 ]
 76  
 77 # 第一次调用
 78 first_response = client.chat.completions.create(
 79     model="gpt-3.5-turbo",
 80     messages=messages,
 81     tools=tools,
 82     tool_choice="auto",
 83 )
 84 print(first_response.choices[0].message)
 85  
 86 messages.append(first_response.choices[0].message)
 87  
 88 first_function = {}
 89 if first_response.choices[0].message.tool_calls:
 90     tool_call = first_response.choices[0].message.tool_calls[0]
 91     args = tool_call.function.arguments
 92     if tool_call.function.name == "get_class_number":
 93         first_function = get_class_number(**json.loads(args))
 94     if tool_call.function.name == "get_course_teacher":
 95         first_function = get_course_teacher(**json.loads(args))
 96  
 97 print(first_function)
 98  
 99 tool_call = first_response.choices[0].message.tool_calls[0]
100 messages.append({
101     "role": "tool",
102     "tool_call_id": tool_call.id,
103     "content": str(json.dumps(first_function)),
104     "name": tool_call.function.name
105 })
106 print("***" * 40)
107 print(messages)
108 print("***" * 40)
109  
110 second_response = client.chat.completions.create(
111     model="gpt-3.5-turbo",
112     messages=messages,
113     tools=tools,
114     tool_choice="auto"
115 )
116 print(second_response.choices[0].message)
117  
118 messages.append(second_response.choices[0].message)
119 second_function = {}
120 if second_response.choices[0].message.tool_calls:
121     tool_call = second_response.choices[0].message.tool_calls[0]
122     args = tool_call.function.arguments
123     if tool_call.function.name == "get_class_number":
124         second_function = get_class_number(**json.loads(args))
125     if tool_call.function.name == "get_course_teacher":
126         second_function = get_course_teacher(**json.loads(args))
127  
128 print(second_function)
129 tool2_call = second_response.choices[0].message.tool_calls[0]
130 # 将函数的结果添加到messages中,继续送入模型问答
131 messages.append(
132     {
133         "role": "tool",
134         "tool_call_id": tool2_call.id,
135         "content": str(json.dumps(second_function)),
136         "name":tool2_call.function.name
137     }
138 )
139  
140 last_response = client.chat.completions.create(
141     model="gpt-3.5-turbo",
142     messages=messages,
143     tools=tools,
144     tool_choice="auto",
145 )
146 print(last_response.choices[0].message.content)
View Code

运行结果

 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)
 
View Code

运行效果

 

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

 

标签:function,name,tool,messages,FunctionCalling,详解,OpenAi,message,response
From: https://www.cnblogs.com/fanghailiang2016/p/18444378

相关文章

  • 网络流与线性规划24题详解(上)
    前言题单刷24题刷魔怔了,写个详解。难度不断递增,T1-T9为蓝题,T10-T23为紫题。(什么?你问我为什么没有T24?)好了,让我们开始吧!T1孤岛营救问题思路:这题数据小,所以用BFS\(key[x][y][k]\)记录\((x,y)\)的第k把钥匙\(wall[x1][y1][x2][y2]\)记录墙和门\(vis[x1][y1][k]\)记录是否走......
  • ABC373 D-F 详解
    D思路说是有向图,实际上可以看作是无向图。因为如果有\(x_{v_j}-x_{u_j}=w_j\),那么就一定有\(x_{u_j}-x_{v_j}=-w_j\)。因为题目保证给出的数量关系没有冲突,所以如果我们知道了一个结点\(a\)的值,那么所有与它有数量关系的结点\(b\)的值都能被推出。从而如果一个连......
  • 页面缓存详解
    在学习Swagger的时候刚开始使用Swagger3.x但是有些配置还是使用之前版本的,所以就一直报404,在查阅一些网上的资料后,(现在还不知道是版本配置问题)大多数都是让清除以下缓存,我知道怎么清除(平时的清除缓存一般指的是清除浏览器缓存),当然之前也零散的接触过一些关于缓存的知识,但是没......
  • 【MySQL】MySQL 数据库主从复制详解
    目录1.基本概念1.1主从架构1.2复制类型2.工作原理2.1复制过程2.2主要组件3.配置步骤3.1准备工作3.2在主服务器上配置3.3在从服务器上配置4.监控和维护4.1监控复制状态4.2处理复制延迟4.3故障恢复5.备份策略5.1逻辑备份与物理备份5.2增量备份6.使......
  • 互联网顶流OpenAI CEO奥特曼的投资版图
    SamAltman,作为OpenAI的CEO,不仅在人工智能领域取得了显著成就,还在多个高科技和新兴行业中进行了广泛的投资。本文将详细介绍SamAltman自2019年以来通过其个人及其相关实体(如HydrazineCapital和ApolloProjects)的投资组合,涵盖AI、生物科技、航空技术、区块链等多个领域。主......
  • Linux 部署Zookeeper集群详解
    Zookeeper是一个分布式协调服务,它可以用来解决分布式系统中的很多问题,如配置管理、分布式锁、集群管理等。以下是如何在Linux环境下部署Zookeeper集群的详细步骤,以及Zookeeper集群的工作原理和选举原理。Zookeeper集群工作原理Zookeeper集群由一个领导者(Leader)和多个跟随......
  • 详解TCP协议(三次握手四次挥手)
    1.TCP通信时序下图是一次TCP通讯的时序图。TCP连接建立断开。包含大家熟知的三次握手和四次握手。在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的......
  • Linux(三)文件管理、复杂操作与实用工具详解
    Linux学习笔记(三)文件管理、复杂操作与实用工具详解Linux学习笔记(二):深入理解用户管理、运行级别与命令行操作1.文件操作的基本操作1.1创建创建目录mkdir:创建目录mkdir/home/dog#创建单级目录mkdir-p/home/animal/tiger#创建多级目录,如果父目录不存在,将连......
  • 虚拟机三种网络模式详解
    在电脑里开一台虚拟机,是再常见不过的操作了。无论是用虚拟机玩只有旧版本系统能运行的游戏,还是用来学习Linux、跑跑应用程序都是很好的。而这其中,虚拟机网络是绝对绕不过去的。本篇文章通俗易懂的介绍了常见的虚拟网络提供的三种网络链接模式NAT、桥接、主机。即使不懂虚拟......
  • 【C++】set详解
    ......