多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)]

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

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

相關文章

案例研究|MeterSphere助力萬物云構建高效自動化測試平臺

萬物云空間科技服務股份有限公司(以下簡稱為“萬物云”),前身為萬科物業發展股份有限公司,是國內領先的物管龍頭上市公司。作為一家科技引領的全域空間服務商,萬物云致力于打造產業級共享服務平臺,基于空間…

1. lambda初體驗

首先聲明一個函數式接口,就只接口內只有一個抽象方法 //函數式接口 public interface Factory {Object getObject();}接口實現類 public class SubClass implements Factory {Overridepublic Object getObject() {return new User();}}User類 public class User …

酒店提前線上訂房小程序源碼系統 PHP+MySQL組合開發 源碼開源可二開 帶完整的安裝代碼包以及搭建教程

系統概述 隨著移動互聯網的普及,越來越多的人習慣通過手機進行酒店預訂。傳統的線下訂房方式逐漸無法滿足用戶的需求,酒店提前線上訂房小程序的出現成為必然趨勢。該源碼系統的開發旨在為酒店提供一個便捷、高效的線上訂房平臺,提升用戶體驗…

基于微信小程序+ JAVA后端實現的【醫院掛號預約系統】 設計與實現 (內附設計LW + PPT+ 源碼+ 演示視頻 下載)

項目名稱 項目名稱: 《基于微信小程序的醫院掛號預約系統設計與實現》 項目技術棧 該項目采用了以下核心技術棧: 后端框架/庫: Java, SSM框架數據庫: MySQL前端技術: 微信小程序, uni-app 項目展示 全文概括 本…

設置單群聊消息擴展

根據消息 ID ,對單聊會話或群聊會話中已經發送的消息設置擴展信息。每次最多可以設置 100 個擴展屬性信息,最多可設置 300 個。 通過 Server API 操作消息擴展,默認不會向操作者的客戶端同步,會導致擴展信息不一致。如有需要&…

MySQL觸發器實戰:自動執行的秘密

歡迎來到我的博客,代碼的世界里,每一行都是一個故事 🎏:你只管努力,剩下的交給時間 🏠 :小破站 MySQL觸發器實戰:自動執行的秘密 前言觸發器的定義和作用觸發器的定義和作用觸發器的…

大模型領域新聞跟蹤

楊值麟 月之暗面楊植麟:大模型開發是“承包森林”月之暗面集結最強創投,“清華師姐”是最強“助攻”月之暗面楊植麟:互聯網研發是“種樹”,大模型研發是“承包森林”月之暗面楊植麟復盤大模型創業這一年:向延綿而未知…

搜維爾科技:穿上Xsens Link動作捕捉套裝,進行精準的運動捕捉

穿上Xsens Link動作捕捉套裝,進行精準的運動捕捉 搜維爾科技:穿上Xsens Link動作捕捉套裝,進行精準的運動捕捉

vue 筆記01

目錄 01 vuejs中屬性的基本使用 02 v-show指令的使用 03 v-if 指令的使用 04 v-for指令的使用 05 v-model 指令 06 template模板標簽 07 v-on事件的綁定指令 08 事件中的event對象 01 vuejs中屬性的基本使用 {{ }} 叫做mustache模板語法 雙花括號 小胡子語法 雙花括號…

安卓手機APP開發__構建通話應用

安卓手機APP開發__構建通話應用 目錄 概述 依賴項和權限 注冊應用 平臺集成 注冊通話 添加通話 接聽來電 拒接來電 去電 將通話置于保持狀態 斷開連接 轉接音頻 前臺支持 Surface 支持 概述 使用 Telecom Jetpack 庫為用戶提供最佳視頻和音頻體驗。借助 Teleco…

GO語言 linux部署

https://blog.csdn.net/wangye135/article/details/136177171 一、簡述 1. 可以直接在服務器上運行編譯好的二進制文件,不需要在服務器上下載語言環境。 2. 內置運行時環境:可執行文件中內置了運行時環境,包括垃圾回收、調度器等&#xff…

Java深拷貝淺拷貝

在Java中,深拷貝和淺拷貝是兩種不同的對象復制方式。 淺拷貝:創建一個新對象,然后將原對象的非靜態字段復制到新對象中。如果字段是值類型的,那么對該字段執行逐位復制。如果字段是引用類型的,則復制引用但不復制引用的…

SAP 根據報錯消息號快速定位問題

通常用戶在業務的操作過程中,經常會遇到報錯信息,有些報錯是系統控制拋出的信息,但是有些報錯的信息是根據不同地點業務場景對填寫的數據進行判斷校驗,然后給出的報錯信息,正常情況報錯信息一般是有文本,或…

【C語言】文件操作講解

C語言文件操作講解 文件文件名文件類型數據在內存中的存儲 文件緩沖區文件指針文件的打開與關閉fopenfclosefopen與fclose的使用文件的打開方式 文件的順序讀寫fputcfgetcfputsfgetsfprintffscanffwritefread輸入流與輸出流對比scanf\fscanf\sscanf與printf\fprintf\sprintfssc…

【區分vue2和vue3下的elementUI和elementUI Plus的button組件,介紹如何安裝,屬性,事件,方法等以及使用案例】

區分vue2下的Element UI和vue3下的Element Plus的Button組件 Element UI (vue2) Button組件:基于Vue 2的Element UI庫中的Button組件提供了多種樣式和類型,如默認、主要、成功、警告、危險等。 Element Plus (vue3) Button組件:作為Element …

匯編原理(二)寄存器——內存訪問

一個字 兩個字節 雙字 字節為8位 字為16位(看兩格) 雙子dword32位(看四格) 內存中字的存儲: 0地址單元中存放的字節型數據是多少? 0地址字單元中存放的字型數據是多少? 2地址字單元中存放…

Secure Operation

文章目錄 Secure Summation OperationSecure Set Union Operation Secure Summation Operation 讓我們通過一個具體的例子來說明這個算法。 假設有三個數據擁有者 S1, S2 和 S3,他們分別持有以下值: S1 持有 value1 10S2 持有 value2 20S3 持有 val…

基坑氣膜:建筑工地環保新利器—輕空間

隨著城市化進程的加快,建筑行業的飛速發展帶來了嚴重的環境問題,如噪音和粉塵污染,給人們的生活帶來諸多不便。為了解決這些問題,建筑行業一直在探索更為環保和高效的施工方式。近年來,基坑氣膜技術逐漸嶄露頭角&#…

Audition 2024 for Mac/Win:音頻錄制與編輯的卓越之選

隨著數字媒體的不斷發展,音頻內容創作已經成為各行各業中不可或缺的一部分。無論是音樂制作、廣播節目、播客錄制還是影視配音,都需要高品質的音頻錄制和編輯工具來實現專業水準的作品。在這個充滿競爭的時代,要想在音頻創作領域脫穎而出&…

解線性方程組——最速下降法及圖形化表示 | 北太天元 or matlab

一、思路轉變 A為對稱正定矩陣, A x b Ax b Axb 求解向量 x x x這個問題可以轉化為一個求 f ( x ) f(x) f(x)極小值點的問題,為什么可以這樣: f ( x ) 1 2 x T A x ? x T b c f(x) \frac{1}{2}x^TAx - x^Tb c f(x)21?xTAx?xTbc 可…