多function-calling 调用

2024-05-28 14:20
文章标签 调用 function calling

本文主要是介绍多function-calling 调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

多function-calling 调用

接上一篇function-calling调用,本篇实现了一个多function-calling的调用。OpenAI会根据function的描述自己来判断应该调用哪个function。最终调用function的动作是由我们来决定的,当然你也可以不调对应的函数。

两个函数分别是:

  1. 根据POI名称查询经纬度坐标
  2. 搜索给定坐标附近的POI

下面上代码,代码中如有方法未找到,请翻看之前的文章:

import requests
## 这里的ampKey可以通过高德开发者平台免费注册一个,个人开发者可免费的少量调用
amap_key = "XXXX"def get_location_coordinate(location, city):url = f"https://restapi.amap.com/v5/place/text?key={amap_key}&keywords={location}&region={city}"print(url)r = requests.get(url)result = r.json()if "pois" in result and result["pois"]:return result["pois"][0]return Nonedef search_nearby_pois(longitude, latitude, keyword):url = f"https://restapi.amap.com/v5/place/around?key={amap_key}&keywords={keyword}&location={longitude},{latitude}"print(url)r = requests.get(url)result = r.json()ans = ""if "pois" in result and result["pois"]:for i in range(min(3, len(result["pois"]))):name = result["pois"][i]["name"]address = result["pois"][i]["address"]distance = result["pois"][i]["distance"]ans += f"{name}\n{address}\n距离:{distance}米\n\n"return ans# 定义tools和要调用的函数
def get_completion(messages, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,temperature=0,  # 模型输出的随机性,0 表示随机性最小seed=1024,      # 随机种子保持不变,temperature 和 prompt 不变的情况下,输出就会不变tool_choice="auto",  # 默认值,由 GPT 自主决定返回 function call 还是返回文字回复。也可以强制要求必须调用指定的函数,详见官方文档tools=[{"type": "function","function": {"name": "get_location_coordinate","description": "根据POI名称,获得POI的经纬度坐标","parameters": {"type": "object","properties": {"location": {"type": "string","description": "POI名称,必须是中文",},"city": {"type": "string","description": "POI所在的城市名,必须是中文",}},"required": ["location", "city"],}}},{"type": "function","function": {"name": "search_nearby_pois","description": "搜索给定坐标附近的poi","parameters": {"type": "object","properties": {"longitude": {"type": "string","description": "中心点的经度",},"latitude": {"type": "string","description": "中心点的纬度",},"keyword": {"type": "string","description": "目标poi的关键字",}},"required": ["longitude", "latitude", "keyword"],}}}],)return response.choices[0].messageprompt = "我想在北京三里屯附近喝咖啡,给我推荐几个"
# prompt = "我到北京出差,给我推荐北京三里屯附近的酒店,和北京三里屯附近的咖啡"messages = [{"role": "system", "content": "你是一个地图通,你可以找到任何地址。"},{"role": "user", "content": prompt}
]
response = get_completion(messages)
messages.append(response)  # 把大模型的回复加入到对话中
print("=====GPT回复=====")
print_json(response)while (response.tool_calls is not None):# 新版模型支持一次返回多个函数调用请求,所以要考虑到这种情况for tool_call in response.tool_calls:args = json.loads(tool_call.function.arguments)print("函数参数展开:")print_json(args)if (tool_call.function.name == "get_location_coordinate"):print("Call: get_location_coordinate")result = get_location_coordinate(**args)elif (tool_call.function.name == "search_nearby_pois"):print("Call: search_nearby_pois")result = search_nearby_pois(**args)print("=====函数返回=====")print_json(result)messages.append({"tool_call_id": tool_call.id,  # 用于标识函数调用的 ID"role": "tool","name": tool_call.function.name,"content": str(result)  # 数值result 必须转成字符串})response = get_completion(messages)print(response)messages.append(response)  # 把大模型的回复加入到对话中print("=====最终回复=====")
print(response.content)
print("=====对话历史=====")
print(messages)

运行结果:

=====GPT回复=====
{"content": null,"role": "assistant","function_call": null,"tool_calls": [{"id": "call_C4xbz7ABvNOde510rStBhK8K","function": {"arguments": "{\"location\":\"三里屯\",\"city\":\"北京\"}","name": "get_location_coordinate"},"type": "function"}]
}
函数参数展开:
{"location": "三里屯","city": "北京"
}
Call: get_location_coordinate
https://restapi.amap.com/v5/place/text?key=59b58777beb50f8f180ac36ebe2159d9&keywords=三里屯&region=北京
=====函数返回=====
{"parent": "","address": "朝阳区","distance": "","pcode": "110000","adcode": "110105","pname": "北京市","cityname": "北京市","type": "地名地址信息;热点地名;热点地名","typecode": "190700","adname": "朝阳区","citycode": "010","name": "三里屯","location": "116.455294,39.937492","id": "B0FFF5BER7"
}
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_TZc2RkF2uKmRag6PI1s67RKw', function=Function(arguments='{"longitude":"116.455294","latitude":"39.937492","keyword":"咖啡"}', name='search_nearby_pois'), type='function')])
函数参数展开:
{"longitude": "116.455294","latitude": "39.937492","keyword": "咖啡"
}
Call: search_nearby_pois
https://restapi.amap.com/v5/place/around?key=59b58777beb50f8f180ac36ebe2159d9&keywords=咖啡&location=116.455294,39.937492
=====函数返回=====
星巴克(北京三里屯三点三大厦店)
三里屯路33号3.3大厦1层1010号
距离:52米内山咖啡店(3·3大厦店)
三里屯路33号3·3大厦B1层
距离:82米春丽咖啡(3·3大厦店)
三里屯路33号3.3大厦东门1层1099
距离:93米ChatCompletionMessage(content='以下是在北京三里屯附近的几家咖啡店推荐:\n\n1. 星巴克(北京三里屯三点三大厦店)\n   地址:三里屯路33号3.3大厦1层1010号\n   距离:52米\n\n2. 内山咖啡店(3·3大厦店)\n   地址:三里屯路33号3·3大厦B1层\n   距离:82米\n\n3. 春丽咖啡(3·3大厦店)\n   地址:三里屯路33号3.3大厦东门1层1099\n   距离:93米\n\n您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!', role='assistant', function_call=None, tool_calls=None)
=====最终回复=====
以下是在北京三里屯附近的几家咖啡店推荐:1. 星巴克(北京三里屯三点三大厦店)地址:三里屯路33号3.3大厦1层1010号距离:52米2. 内山咖啡店(3·3大厦店)地址:三里屯路33号3·3大厦B1层距离:82米3. 春丽咖啡(3·3大厦店)地址:三里屯路33号3.3大厦东门1层1099距离:93米您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!
=====对话历史=====
[{'role': 'system', 'content': '你是一个地图通,你可以找到任何地址。'}, {'role': 'user', 'content': '我想在北京三里屯附近喝咖啡,给我推荐几个'}, ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_C4xbz7ABvNOde510rStBhK8K', function=Function(arguments='{"location":"三里屯","city":"北京"}', name='get_location_coordinate'), type='function')]), {'tool_call_id': 'call_C4xbz7ABvNOde510rStBhK8K', 'role': 'tool', 'name': 'get_location_coordinate', 'content': "{'parent': '', 'address': '朝阳区', 'distance': '', 'pcode': '110000', 'adcode': '110105', 'pname': '北京市', 'cityname': '北京市', 'type': '地名地址信息;热点地名;热点地名', 'typecode': '190700', 'adname': '朝阳区', 'citycode': '010', 'name': '三里屯', 'location': '116.455294,39.937492', 'id': 'B0FFF5BER7'}"}, ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_TZc2RkF2uKmRag6PI1s67RKw', function=Function(arguments='{"longitude":"116.455294","latitude":"39.937492","keyword":"咖啡"}', name='search_nearby_pois'), type='function')]), {'tool_call_id': 'call_TZc2RkF2uKmRag6PI1s67RKw', 'role': 'tool', 'name': 'search_nearby_pois', 'content': '星巴克(北京三里屯三点三大厦店)\n三里屯路33号3.3大厦1层1010号\n距离:52米\n\n内山咖啡店(3·3大厦店)\n三里屯路33号3·3大厦B1层\n距离:82米\n\n春丽咖啡(3·3大厦店)\n三里屯路33号3.3大厦东门1层1099\n距离:93米\n\n'}, ChatCompletionMessage(content='以下是在北京三里屯附近的几家咖啡店推荐:\n\n1. 星巴克(北京三里屯三点三大厦店)\n   地址:三里屯路33号3.3大厦1层1010号\n   距离:52米\n\n2. 内山咖啡店(3·3大厦店)\n   地址:三里屯路33号3·3大厦B1层\n   距离:82米\n\n3. 春丽咖啡(3·3大厦店)\n   地址:三里屯路33号3.3大厦东门1层1099\n   距离:93米\n\n您可以选择其中一家前往享受咖啡时光。祝您喝咖啡愉快!', role='assistant', function_call=None, tool_calls=None)]

这篇关于多function-calling 调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010816

相关文章

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

Vue 调用摄像头扫描条码功能实现代码

《Vue调用摄像头扫描条码功能实现代码》本文介绍了如何使用Vue.js和jsQR库来实现调用摄像头并扫描条码的功能,通过安装依赖、获取摄像头视频流、解析条码等步骤,实现了从开始扫描到停止扫描的完整流... 目录实现步骤:代码实现1. 安装依赖2. vue 页面代码功能说明注意事项以下是一个基于 Vue.js

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最