文章目錄
- Function Calling介紹
- **核心原理**
- 1. **動態擴展模型能力**
- 2. **JSON結構化交互**
- **實現步驟**(以支持Function Calling的模型為例)
- 1. **定義可用函數**
- 2. **模型匹配與生成**
- 3. **開發者執行函數**
- 4. **結果反饋給模型**
- **DeepSeek R1的當前限制**
- **替代方案建議**
- 1. **自定義流程控制**
- 2. **關注更新動態**
- 💡 **擴展閱讀**
- Function Calling調用流程
- **Function Calling 核心流程**
- 1. **用戶輸入請求**
- 2. **模型解析意圖**
- 3. **生成函數調用請求**
- 4. **執行外部函數**
- 5. **返回函數結果**
- 6. **生成最終響應**
- **流程圖**
- **關鍵點說明**
- 1. **兩次模型交互(如OpenAI)**
- 2. **結構化參數驗證**
- 3. **錯誤處理**
- **參考案例(天氣查詢)**
- 1. **用戶輸入**
- 2. **模型返回函數調用**
- 3. **執行天氣API查詢**
- 4. **模型生成最終響應**
- **擴展閱讀**
- Function Calling Python代碼示例(以調用OpenAI模型為例)
- 代碼
- 代碼解析:
- 1. **函數定義**
- 2. **API交互流程**
- 3. **關鍵參數說明**
- 執行示例輸出:
- 注意事項:
- 1. 需替換為有效的OpenAI API密鑰(`sk-your-api-key-here`)
- 2. GPT-3.5-turbo版本需 >= 0613 才能支持函數調用
- 3. 實際生產環境需要:
Function Calling介紹
根據官方文檔和搜索結果,DeepSeek的 Function Calling(函數調用) 功能允許模型通過調用外部工具來增強其能力。以下是其核心原理與實現步驟:
核心原理
1. 動態擴展模型能力
通過預定義函數,模型可將用戶查詢映射到具體操作(如調用API、執行計算等),從而突破純文本生成的限制。
2. JSON結構化交互
模型不直接執行函數,而是生成包含函數名和參數的JSON對象,開發者據此執行外部邏輯。
實現步驟(以支持Function Calling的模型為例)
1. 定義可用函數
開發者在API請求中聲明函數列表,包括:
- 函數名(如
get_weather
) - 參數描述(如
{"location": "string", "unit": "celsius|fahrenheit"}
)
2. 模型匹配與生成
用戶輸入查詢后,模型判斷是否需要調用函數。若需要,則生成JSON對象,例如:
{"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"location\": \"北京\"}"}}]
}
3. 開發者執行函數
解析JSON并調用對應函數,獲取結果(如調用天氣API返回數據)。
4. 結果反饋給模型
將執行結果返回給模型,模型整合信息生成最終回復(如“北京今天晴天,25℃”)。
DeepSeek R1的當前限制
🔴 注意:根據官方文檔(DeepSeek API Docs),DeepSeek R1目前不支持Function Calling,且舊版模型(如 deepseek-chat
)的此功能存在以下問題:
- 可能出現循環調用(模型重復生成函數請求)
- 返回空響應或無意義JSON
- 開發團隊正在修復,預計下一版本改進。
替代方案建議
1. 自定義流程控制
通過Prompt Engineering引導模型輸出結構化文本,開發者手動解析后調用外部工具。
示例Prompt:
若需查詢天氣,請以JSON格式回復:{"action": "weather", "location": "城市名"}
2. 關注更新動態
建議定期查閱DeepSeek GitHub倉庫或官方文檔,獲取Function Calling支持進展。
💡 擴展閱讀
- OpenAI式Function Calling詳解: OpenAI函數調用機制
- DeepSeek工具調用優化方向: Reddit討論
Function Calling調用流程
好的,用戶需要理解Function Calling的流程,并希望有一個流程圖來輔助理解。我之前提供的搜索結果里提到,Function Calling的基本流程包括用戶輸入、模型解析、生成函數調用請求、執行函數、返回結果和生成響應。用戶可能已經了解了一些基本步驟,但可能對具體細節或流程圖有疑問。
首先,需要確認用戶的實際需求。他們可能是在開發中使用大模型,需要集成外部工具,比如天氣API或數據庫查詢。流程圖的請求表明他們希望有一個可視化的步驟說明,可能用于教學或系統設計。
根據搜索結果,尤其是來自CSDN和知乎的鏈接,流程通常包括兩次模型調用:第一次判斷是否需要調用函數,生成請求;第二次根據函數返回的結果生成最終響應。例如,OpenAI的流程是先發送用戶輸入和可用函數列表,模型返回需要調用的函數及參數,執行后再次將結果傳給模型生成回答。
需要注意用戶提到的DeepSeek R1目前不支持Function Calling,但其他模型如GPT-4有該功能。用戶的示例可能基于通用流程,但需要明確說明不同模型的差異。
用戶可能遇到的困惑點在于如何將模型和外部系統連接,以及具體步驟間的數據傳遞。流程圖應清晰展示從用戶輸入到最終響應的閉環過程,包括模型判斷和執行函數的環節。
綜合搜索結果,可以構建一個包含以下步驟的流程圖:
- 用戶輸入問題。
- 模型解析并判斷是否需要調用函數。
- 生成函數調用請求(名稱和參數)。
- 應用程序執行函數并獲取結果。
- 結果返回給模型。
- 模型整合結果生成最終響應。
需要指出的是,部分實現可能需要兩次模型交互,如OpenAI的流程,而有些可能整合為一次。此外,函數參數的驗證和錯誤處理也是重要環節,但可能不在基礎流程中體現。
最后,確保流程圖簡潔易懂,用文字說明每個步驟的關鍵點,如模型生成結構化請求(JSON),應用程序執行外部API調用等。同時,參考提供的鏈接中的示意圖,但可能無法直接訪問圖片,需用文字描述結構。
以下是 Function Calling(函數調用) 的詳細流程及示意圖,結合大模型與外部工具的交互機制:
Function Calling 核心流程
1. 用戶輸入請求
- 用戶提出自然語言請求(如“北京今天的天氣如何?”)。
2. 模型解析意圖
- 大模型(如GPT-4)分析用戶意圖,判斷是否需要調用外部函數(如天氣API)。
3. 生成函數調用請求
- 模型返回結構化請求(JSON格式),包含函數名和參數:
{"tool_calls": [{"function": {"name": "get_weather", "arguments": "{\"location\": \"北京\"}"}}] }
4. 執行外部函數
- 應用程序解析請求,調用對應的函數(如查詢天氣API)。
5. 返回函數結果
- 函數執行結果(如溫度、天氣狀況)返回給模型。
6. 生成最終響應
- 模型將結果整合為自然語言回復(如“北京今天晴天,25℃”)。
流程圖
用戶輸入│▼
大模型解析意圖│▼
是否需要調用函數? ——是→ 生成函數調用請求(JSON)│ │否 ▼│ 執行外部函數(如API、數據庫)▼ │
直接生成回答 ▼│ 獲取函數結果▼ │
返回用戶響應 ←───────────┘
關鍵點說明
1. 兩次模型交互(如OpenAI)
- 第一次請求:發送用戶輸入 + 可用函數列表,模型返回需調用的函數及參數。
- 第二次請求:發送函數執行結果,模型生成最終回復。
2. 結構化參數驗證
- 應用程序需校驗參數格式(如參數類型、必填字段),避免錯誤調用。
3. 錯誤處理
- 若函數調用失敗,模型可能重新生成請求或提示用戶修正輸入。
參考案例(天氣查詢)
1. 用戶輸入
“上海明天會下雨嗎?”
2. 模型返回函數調用
{"function": "get_weather", "arguments": {"location": "上海", "date": "2024-06-20"}}
3. 執行天氣API查詢
調用第三方API獲取天氣數據(如{"weather": "rain", "temp": 22}
)。
4. 模型生成最終響應
“上海明天有雨,氣溫22℃。”
擴展閱讀
- OpenAI Function Calling 官方文檔
- 大模型函數調用原理與實戰(CSDN)
- LangChain 函數調用實現
通過流程圖和分步解釋,可以更清晰地理解大模型如何通過函數調用與外部系統協同工作。
Function Calling Python代碼示例(以調用OpenAI模型為例)
代碼
以下是使用OpenAI Function Calling的Python代碼示例,實現天氣查詢功能:
import openai
import json# 配置OpenAI API密鑰
openai.api_key = "sk-your-api-key-here"def get_current_weather(location, unit="celsius"):"""模擬天氣API調用(實際應替換為真實API調用)"""weather_data = {"location": location,"temperature": "25","unit": unit,"forecast": ["sunny", "windy"],}return json.dumps(weather_data)def run_conversation():# 第一步:發送用戶查詢和函數定義messages = [{"role": "user", "content": "北京今天天氣怎么樣?"}]functions = [{"name": "get_current_weather","description": "獲取指定地區的當前天氣","parameters": {"type": "object","properties": {"location": {"type": "string","description": "城市或地區名稱,例如:北京",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"],"description": "溫度單位"}},"required": ["location"],},}]# 初始API調用response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,functions=functions,function_call="auto",)response_message = response.choices[0].message# 第二步:處理函數調用if hasattr(response_message, "function_call"):# 解析函數調用信息function_name = response_message["function_call"]["name"]function_args = json.loads(response_message["function_call"]["arguments"])# 調用對應函數if function_name == "get_current_weather":function_response = get_current_weather(location=function_args.get("location"),unit=function_args.get("unit", "celsius"))# 第三步:發送函數結果給模型messages.append(response_message) # 添加助理的消息messages.append({"role": "function","name": function_name,"content": function_response,})# 獲取最終響應final_response = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",messages=messages,)return final_response.choices[0].message['content']else:return response_message['content']# 運行對話
print(run_conversation())
代碼解析:
1. 函數定義
get_current_weather
:模擬天氣API調用(實際開發需替換為真實API)- 參數驗證邏輯可在此函數中添加
2. API交互流程
用戶輸入 → 模型判斷需要函數調用 → 生成函數調用請求 →
執行函數 → 返回結果給模型 → 生成最終響應
3. 關鍵參數說明
functions
:聲明模型可用的函數列表function_call
:設置為"auto"讓模型自主決策
執行示例輸出:
北京今天天氣晴朗,當前氣溫為25攝氏度,風力較大。請注意防曬。
注意事項:
1. 需替換為有效的OpenAI API密鑰(sk-your-api-key-here
)
2. GPT-3.5-turbo版本需 >= 0613 才能支持函數調用
3. 實際生產環境需要:
- 添加錯誤處理(網絡錯誤/參數錯誤)
- 實現真正的天氣API調用
- 設置合理的temperature參數控制輸出穩定性
如果需要DeepSeek版本的實現,請關注其API文檔的更新,當前(截至2024年6月)DeepSeek R1尚未開放Function Calling支持。