多function-calling 調用
接上一篇function-calling調用,本篇實現了一個多function-calling的調用。OpenAI會根據function的描述自己來判斷應該調用哪個function。最終調用function的動作是由我們來決定的,當然你也可以不調對應的函數。
兩個函數分別是:
- 根據POI名稱查詢經緯度坐標
- 搜索給定坐標附近的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}®ion={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=三里屯®ion=北京
=====函數返回=====
{"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)]