
2024年您產(chǎn)品必備的10大AI API推薦
舉個(gè)例子,你問大模型今天的天氣怎么樣,溫濕度是多少?這樣的問題,即使是人也無法給出準(zhǔn)確的回答,但可以通過天氣APP獲取到這些信息。
因此,只需要讓大模型具有訪問查詢天氣情況接口的能力,那么這個(gè)問題就可以被解決了,而類似于查詢天氣的這種接口,統(tǒng)一稱為工具(tool)。
但大模型本身又不具備調(diào)用網(wǎng)絡(luò)的能力,那么怎么才能實(shí)現(xiàn)這個(gè)功能呢?
這時(shí)函數(shù)調(diào)用的作用就體現(xiàn)出來了,所謂的函數(shù)就是一個(gè)能實(shí)現(xiàn)特定功能的代碼段,它們有設(shè)定的輸入?yún)?shù)和返回值,這樣就可以使用函數(shù)調(diào)用各種工具實(shí)現(xiàn)大模型無法實(shí)現(xiàn)的功能。
之所以選擇函數(shù)調(diào)用,原因就是因?yàn)楹瘮?shù)調(diào)用比較簡單,大模型只需要返回幾個(gè)參數(shù)即可實(shí)現(xiàn)函數(shù)調(diào)用。
function call的實(shí)現(xiàn)過程
在正常的開發(fā)流程中,不論是函數(shù)調(diào)用還是API調(diào)用,都是開發(fā)者進(jìn)行傳參,然后獲得返回值。
沒了解過function call的人可能會(huì)認(rèn)為,函數(shù)調(diào)用就是大模型調(diào)用python等語言的解釋器,執(zhí)行目標(biāo)代碼并獲得結(jié)果。
事實(shí)上,在function call中,大模型并不負(fù)責(zé)函數(shù)的執(zhí)行,大模型的作用是根據(jù)用戶的問題,理解用戶的需求,然后根據(jù)用戶需求確定具體的回調(diào)函數(shù)以及函數(shù)所需要的參數(shù)。
openAI官方文檔明確指出,大模型不會(huì)真正執(zhí)行函數(shù)調(diào)用,而是由應(yīng)用開發(fā)者根據(jù)大模型的返回進(jìn)行具體的函數(shù)調(diào)用。
因此,在實(shí)現(xiàn)function call的過程中,應(yīng)用開發(fā)者需要預(yù)先設(shè)定一個(gè)工具集,并負(fù)責(zé)工具集的實(shí)現(xiàn)。
# 定義工具集
tools = [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "Get the current weather in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city and state, e.g. San Francisco, CA",
},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["location"],
},
},
}
]
# 工具集函數(shù)d 實(shí)現(xiàn)
def get_current_weather(location, unit="fahrenheit"):
"""Get the current weather in a given location"""
if "tokyo" in location.lower():
return json.dumps({"location": "Tokyo", "temperature": "10", "unit": unit})
elif "san francisco" in location.lower():
return json.dumps({"location": "San Francisco", "temperature": "72", "unit": unit})
elif "paris" in location.lower():
return json.dumps({"location": "Paris", "temperature": "22", "unit": unit})
else:
return json.dumps({"location": location, "temperature": "unknown"})
用戶在調(diào)用大模型時(shí),需要把當(dāng)前工具集傳給大模型。
# 在參數(shù)tools中傳入工具集
client = openAI(api_key="你的openai密鑰")
response = client.chat.completions.create(
model='gpt-4o',
messages=messages,
tools= tools,
tool_choice="auto"
)
這時(shí),大模型就可以通過理解用戶的輸入,然后返回所需工具的名稱和參數(shù),然后就可以根據(jù)名稱和參數(shù)調(diào)用具體的工具,如天氣查詢接口。
大模型函數(shù)調(diào)用的流程如下圖所示,從下圖可以看出,大模型使用工具需要兩次輸入。
# 大模型返回的需要調(diào)用的函數(shù)名稱和參數(shù)
{"role": "assistant", "content": "", "tool_calls": [{"function": {"name": "get_current_weather", "arguments": "{\"properties\": {\"location\": {\"description\": \"北京市\(zhòng)", \"type\": \"string\"}}}"}, "id": "", "type": "function"}]}
第一次輸入是用戶提問,大模型根據(jù)提問內(nèi)容解析出需要調(diào)用的函數(shù);第二次是把函數(shù)的執(zhí)行結(jié)果傳入到模型中;最后,模型根據(jù)函數(shù)的執(zhí)行結(jié)果返回給用戶。
1. 用戶向應(yīng)用程序發(fā)出提示詞(prompt)
2. 應(yīng)用程序會(huì)傳遞用戶提供的提示詞和函數(shù)聲明(Function Declaration(s)),即對模型所需工具的描述信息
3. 根據(jù)函數(shù)聲明,模型會(huì)給出工具選取建議和相關(guān)的請求參數(shù)。注意,模型僅會(huì)輸出建議的工具和請求參數(shù),并不會(huì)實(shí)際調(diào)用函數(shù)
4. & 5. 應(yīng)用程序根據(jù)模型響應(yīng)調(diào)用相關(guān) 函數(shù)
6. & 7. 將 函數(shù)的響應(yīng)內(nèi)容再次輸入模型,生成人類可讀的內(nèi)容
8. 應(yīng)用程序?qū)⒆罱K響應(yīng)返回給用戶,然后再次回到第 1 步,如此循環(huán)往復(fù)
文章轉(zhuǎn)自微信公眾號@AI探索時(shí)代
2024年您產(chǎn)品必備的10大AI API推薦
GraphRAG:基于PolarDB+通義千問api+LangChain的知識圖譜定制實(shí)踐
使用Node.js、Express和MySQL構(gòu)建REST API
天氣API推薦:精準(zhǔn)獲取氣象數(shù)據(jù)的首選
基于自定義數(shù)據(jù)集的微調(diào):Alpaca與LLaMA模型的訓(xùn)練
OAuth和OpenID Connect圖解指南
有哪些新聞媒體提供Open API?
現(xiàn)在做大模型,還有靠譜且免費(fèi)的API接口嗎?
如何運(yùn)用AI提高自己的工作效率?