【GPT入門】第14課 openai調用高德地圖案例實現多輪會話與多輪接口調用
- 1.使用openai調用高德地圖API概述
- 2. 高德接口調用申請
- 3.實現代碼(多個function調用,多輪對話)
- 4.執行結果
1.使用openai調用高德地圖API概述
任務描述:使用openai調用高德地圖API,實現用戶問地理有關的信息時,調用高德API,并返回相關信息
例如:
問:我想在廣州珠江新城附近喝咖啡,給我推薦幾個
答:在廣州珠江新城附近,有幾個不錯的咖啡店推薦:
- 星巴克 - 經典的咖啡連鎖店,提供多種咖啡和輕食。
- 咖啡陪你 - 適合休閑放松的咖啡店,環境舒適。
- Maan Coffee - 以其獨特的韓式風格和美味的咖啡而聞名。
你可以根據自己的喜好選擇去哪個咖啡店!
實現思路:
- 了解高德地圖API
- 定義OPENAI接口, 目的是準備好高德地圖API需要的參數
- 程序調用高德地圖API
- 調用結果使用多輪對話的方式實現
- 注意:用戶的prompt可能包含多個地點,需要直線多個地點的回答
2. 高德接口調用申請
申請高德地圖的AMAP_KEY,主要有以下步驟:
- 注冊登錄:訪問高德開放平臺官網,點擊“立即注冊”按鈕,填寫郵箱、密碼等相關信息完成注冊。如果已有賬號,直接登錄。
- 創建應用:登錄后,點擊頁面左側菜單欄中的“我的應用”,再點擊“創建應用”按鈕,輸入應用名稱、描述等信息,選擇合適的應用類別后點擊創建。
- 添加Key:進入“我的應用”,選擇需要創建Key的應用,點擊“添加Key”。表單中的服務平臺根據需求選擇,如用于Web開發選“Web服務”;用于安卓應用選“Android平臺SDK”;用于iOS應用選“iOS平臺SDK”等。
- 獲取Key:填寫必要信息后點擊提交,創建成功即可獲取AMAP_KEY和安全密鑰。
3.實現代碼(多個function調用,多輪對話)
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json
from myjson import print_json
_ = load_dotenv(find_dotenv())client = OpenAI()def get_completion(messages, model="gpt-4o-mini"):response = client.chat.completions.create(model=model,messages=messages,temperature=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].messageimport requests
import osamap_key = os.getenv("AMAP_KEY")
amap_base_url = os.getenv("AMAP_URL") # 默認是 https://restapi.amap.com/v5print(amap_base_url)def get_location_coordinate(location, city):url = f"{amap_base_url}/place/text?key={amap_key}&keywords={location}®ion={city}"r = requests.get(url)result = r.json()print("get_location_coordinate接口返回:")print(result)if "pois" in result and result["pois"]:return result["pois"][0]return Nonedef search_nearby_pois(longitude, latitude, keyword):url = f"{amap_base_url}/place/around?key={amap_key}&keywords={keyword}&location={longitude},{latitude}"r = requests.get(url)result = r.json()print("search_nearby_pois 結構返回:")print(result)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
def search_nearby_pois2(longitude, latitude, keyword):url = f"{amap_base_url}/place/around?key={amap_key}&keywords={keyword}&location={longitude},{latitude}"r = requests.get(url)result = r.json()ans = ""if "posi" in result and result['pois']:for i in range(min(3,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#prompt = "我想在廣州珠江新城附近喝咖啡,給我推薦幾個"
prompt = "我到廣州出差,給我推薦電視塔附近的酒店,和珠江新城附近的咖啡" # 一次請求兩個調用messages = [{"role": "system", "content": "你是一個地理通,你可以找到任何地址"},{"role": "user", "content": prompt}
]response = get_completion(messages)
messages.append<