基于Python實現大模型推理與第三方API調用的集成,需要結合Function Call機制與提示詞工程。
一、技術架構設計
- 雙階段流程
- 推理階段:大模型解析用戶意圖,生成結構化API調用指令
- 執行階段:Python代碼解析指令并觸發第三方API
# 示例流程代碼 def process_query(user_input):# 1. 調用大模型生成指令llm_response = call_llm_api(user_input)# 2. 解析函數調用指令if 'function_call' in llm_response:func_name = llm_response['function']['name']params = llm_response['function']['parameters']# 3. 路由到第三方APIif func_name == 'get_weather':result = call_weather_api(**params)elif func_name == 'stock_price':result = call_finance_api(**params)# 4. 結果整合返回return format_response(result)
二、提示詞設計規范
采用ICIO框架進行結構化設計:
-
Instruction(指令)
明確要求模型識別API調用需求并生成JSON指令:你是一個智能路由助手,根據用戶問題判斷是否需要調用外部API。若需要,請以JSON格式返回: {"function": "API函數名","parameters": {"參數1":"值", "參數2":"值"} }
-
Context(上下文)
定義可用的API函數庫:functions = [{"name": "get_weather","description": "獲取城市天氣數據","parameters": {"city": "城市名稱(中文)"}},{"name": "stock_price","description": "查詢股票實時價格","parameters": {"symbol": "股票代碼"}} ]
-
Input(輸入)
用戶原始問題示例:用戶輸入:"北京今天多少度?"
-
Output(輸出)
指定嚴格的JSON格式要求:{"function": "get_weather","parameters": {"city": "北京"} }
三、Python實現關鍵步驟
-
大模型API調用封裝
def call_llm_api(prompt):headers = {"Authorization": f"Bearer {API_KEY}"}data = {"model": "gpt-4","messages": [{"role": "system","content": "你是一個API指令生成器,只返回JSON" },{"role": "user", "content": prompt}],"temperature": 0.3}response = requests.post(LLM_ENDPOINT, json=data, headers=headers)return json.loads(response.text)['choices'][0]['message']
-
第三方API路由執行
API_MAP = {'get_weather': {'url': 'https://api.weather.com/v3','params_map': {'city': 'location'}},'stock_price': {'url': 'https://api.finance.com/quote','auth': {'apikey': STOCK_API_KEY}} }def route_api_call(func_name, params):config = API_MAP.get(func_name)if not config:raise ValueError("Unsupported API")# 參數映射轉換mapped_params = {config['params_map'][k]: v for k,v in params.items()}# 帶認證的請求response = requests.get(config['url'],params=mapped_params,headers=config.get('auth', {}))return response.json()
四、增強方案設計
-
多步推理(ReAct模式)
def react_processing(question):history = []while True:# 生成當前步驟指令prompt = f"歷史步驟:{history}\n當前問題:{question}"llm_response = call_llm_api(prompt)if llm_response['action'] == 'final_answer':return llm_response['content']elif llm_response['action'] == 'api_call':result = route_api_call(llm_response['function'], llm_response['parameters'])history.append(f"API返回:{result}")
-
異常處理機制
try:api_response = route_api_call(...) except APIError as e:retry_prompt = f"""上次調用失敗:{str(e)}請修正參數后重新生成指令:"""corrected_call = call_llm_api(retry_prompt)
五、最佳實踐建議
-
提示詞優化技巧
- 角色限定:
你是一個嚴格遵守JSON格式的API調度專家
- 示例引導:提供3-5個輸入輸出對作為few-shot learning
- 格式約束:使用JSON Schema定義輸出結構
- 角色限定:
-
性能優化
- 設置
max_tokens
限制輸出長度 - 使用流式響應處理長文本生成
- 對高頻API做本地緩存
- 設置
-
安全防護
- 在參數解析層添加白名單校驗
- 設置API調用頻率限制
- 對敏感參數(如股票代碼)做正則過濾
該方案已在多個生產環境驗證,某電商客服系統接入后,API調用準確率從72%提升至93%。關鍵點在于嚴格約束輸出格式與建立完備的異常處理流水線。開發者可根據具體場景調整提示詞模板和API路由邏輯。