Function Call是什麼 ?
簡單來說就是給 LLM 提供了呼叫外部工具或函式的能力。這個函式或工具可以是可以自定義的,這樣可玩性就很大了,一個是 LLM 本身能力可以依靠Function Call得到極大補充,另一個是 LLM 可以極大地適配你的業務。
應用場景
獲取你的內部業務資料。例如:一個智慧客服系統,客戶可能想查詢自己訂單的情況,在給 LLM 對應的訂單ID後,LLM 可以呼叫Function Call來調取你本地的資料,獲取對應的訂單資訊並解決客戶問題。
對接各種工具獲取更加強大的能力。例如:LLM 可以透過 Function Call 獲取天氣、新聞、股票價格等實時資訊。
執行各種操作。例如:LLM 可以透過 Function Call 傳送郵件、建立日曆事件、控制智慧家居裝置等,對於業務上 LLM 可以透過呼叫 Function Call 完成對應使用者的需求比如傳送退款申請,查詢訂單狀態,完成商品上架等。 是不是感覺 LLM 的能力一下子就上來了?實際上透過Function Call,LLM 已經成爲了一個強大的agent,透過自身的決策,完成各種外部資訊的查詢以及各種操作,放在家裏那就是整個一智慧管家呀。
如何使用Function Call?
deepseek是適配open AI的Function Call的,我們呼叫deepseek來進行演示如何呼叫一個Function Call。
看看結果
首先使用者先向模型提問北京天氣,
模型是無法知道天氣的,透過Function Call呼叫我們識別天氣的函式。
最後模型根據我們給的結果對使用者問題進行解答。
下面我們詳細講一下怎麼實現
定義被呼叫的函式
def get_weather(location): # 這裏可以新增實際的天氣獲取邏輯 # 例如,呼叫一個天氣API並返回結果 # 爲了示例,我們假設返回一個固定的天氣資訊 return f"The weather in {location} is 24℃."
定義函式描述
函式描述中詳細描述了這個函式的功能以及需要填入的引數型別和屬性(比如是否必填),之後模型會根據你的描述使用你的函式,並給你提供對應的引數
tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Get weather of a location, the user should supply a location first", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA", } }, "required": ["location"] }, } }, ]
構建與模型對話的函式
注意key是deepseek的key
def send_messages(messages): response = client.chat.completions.create( model="deepseek-chat", messages=messages, tools=tools ) return response.choices[0].message client = OpenAI( api_key="YOUR_KEY", base_url="https://api.deepseek.com", )
初始化對話
messages = [{"role": "user", "content": "How's the weather in Beijing?"}] message = send_messages(messages) tool = message.tool_calls[0] messages.append(message)
呼叫本地Function Call
注意實際場景需要根據模型給出的回答判斷呼叫什麼Function,我們這裏是預設要呼叫get_weather
# 解析工具呼叫引數 location = json.loads(message.tool_calls[0].function.arguments).get('location') # 在這裏判斷呼叫哪個Function # 使用對應Function weather_info = get_weather(location)
將Function的返回值傳回模型,並獲取模型返回結果
messages.append({"role": "tool", "tool_call_id": tool.id, "content": weather_info}) message = send_messages(messages) print(f"Model>\t {message.content}")
完整程式碼
from openai import OpenAI import json def send_messages(messages): response = client.chat.completions.create( model="deepseek-chat", messages=messages, tools=tools ) return response.choices[0].message def get_weather(location): # 這裏可以新增實際的天氣獲取邏輯 # 例如,呼叫一個天氣API並返回結果 # 爲了示例,我們假設返回一個固定的天氣資訊 return f"The weather in {location} is 24℃." client = OpenAI( api_key="YOUR_KEY", base_url="https://api.deepseek.com", ) tools = [ { "type": "function", "function": { "name": "get_weather", "description": "Get weather of a location, the user should supply a location first", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and state, e.g. San Francisco, CA", } }, "required": ["location"] }, } }, ] print(f"User>\t How's the weather in Beijing?") messages = [{"role": "user", "content": "How's the weather in Beijing?"}] message = send_messages(messages) print(f"Model2>\t {message.tool_calls[0].function}") # 解析工具呼叫引數 location = json.loads(message.tool_calls[0].function.arguments).get('location') tool = message.tool_calls[0] messages.append(message) # 呼叫 get_weather 函式獲取天氣資訊 weather_info = get_weather(location) messages.append({"role": "tool", "tool_call_id": tool.id, "content": weather_info}) message = send_messages(messages) print(f"Model>\t {message.content}")
這就是一個簡單的Function Call的呼叫過程,複雜的Function Call可以根據實際需求進行擴充套件。
Function Call的優勢
Function Call機制為AI模型帶來了許多優勢:
擴充套件功能:模型可以透過呼叫外部函式執行更復雜的任務,擴充套件其功能。
實時互動:模型可以與外部系統進行實時互動,獲取最新的資訊或執行實時操作。
模組化:透過定義和呼叫函式,模型可以實現模組化的設計,提高程式碼的可維護性和可擴充套件性。
Function Call 也為 LLM 真正成為 agent 貢獻了一大步。