AI大模型的雙手-Function Calling調(diào)用外部工具的基本原理

0 評(píng)論 1561 瀏覽 4 收藏 13 分鐘

本文將深入探討Function Calling調(diào)用外部工具的基本原理,幫助大家理解大模型是如何通過(guò)自主解析內(nèi)容、決策使用工具、結(jié)構(gòu)化填槽等步驟,借助外部工具完成任務(wù)的。

如果把大模型比作一個(gè)“人類”,那TA只有大腦,眼睛和嘴巴,沒(méi)有手腳,即它只會(huì)“思考”“看”和“說(shuō)”,不會(huì)使用“工具”,比如我們問(wèn)大模型“今天天氣如何”。大模型本身無(wú)法回答這個(gè)問(wèn)題,它必須借助“外力”調(diào)用相關(guān)“工具”來(lái)完成回答(下文有說(shuō)人話的流程圖舉例)。

  • “外力”:比如可以是“墨跡天氣”等,因?yàn)椤澳E天氣”是知道“天氣”的。所以只要能調(diào)用“墨跡天氣”,大模型就能間接回答用戶的天氣問(wèn)題了。那么,如何“借助”呢?當(dāng)然是我們今天要講的主角–“Function Calling”了。(似乎還沒(méi)有一個(gè)很合適的中文翻譯,先大概理解為函數(shù)調(diào)用或者工具調(diào)用吧)
  • Function Calling:自主“解析”內(nèi)容結(jié)構(gòu)化【填槽】,自主“決策”使用工具結(jié)構(gòu)化【調(diào)用】
  • 自主解析內(nèi)容:指只要看到Prompt里的內(nèi)容,就能自動(dòng)對(duì)內(nèi)容按特定的格式進(jìn)行解析;
  • 自主決策使用工具:指根據(jù)解析后的結(jié)構(gòu)化內(nèi)容,自動(dòng)調(diào)用工具(比如天氣,地理位置,日期等),需要什么就自動(dòng)調(diào)用什么。
  • 結(jié)構(gòu)化:一種Json格式而已。
  • 填槽:指大模型根據(jù)與用戶的歷史對(duì)話內(nèi)容,將信息結(jié)構(gòu)化的解析出來(lái)。填槽的槽是個(gè)什么?是槽位,什么是槽位?可以理解為“參數(shù)”,比如用戶詢問(wèn)今天北京天氣時(shí),那么填槽的參數(shù)就是:日期,城市;這兩參數(shù)就是槽位。

槽位舉例:

例1:

  • 出發(fā)地:
  • 目的地:

例2:

  • 城市:
  • 日期:

例3:

  • 報(bào)銷事由:
  • 報(bào)銷金額:
  • 發(fā)生時(shí)間:

例4:

  • 目的地城市:
  • 酒店單價(jià)上限:
  • 酒店單價(jià)下限:
  • 區(qū)域偏好:

大模型調(diào)用工具的基本原理(即即大模型借助Function Calling具備了調(diào)用外部工具的基本原理)看不懂沒(méi)關(guān)系下方有流程圖解釋

1、System Prompt(系統(tǒng)提示詞)中寫明了都有哪些工具可以使用,使用時(shí)要給出參數(shù),要寫成什么格式;即系統(tǒng)提示詞可理解為寫給大模型看的,是系統(tǒng)對(duì)大模型下達(dá)的命令,既然是命令,大模型就得服從。命令中告訴大模型有哪些工具可以使用,大模型在執(zhí)行任務(wù)時(shí),如果遇到自己解決不了的問(wèn)題時(shí)(比如天氣問(wèn)題)就看可以隨時(shí)調(diào)用工具,但必須按工具要求的格式才能調(diào)用。

  • 如果是DeepSeek或豆包等我們?nèi)粘J褂玫倪@種應(yīng)用系統(tǒng),其System Prompt是已經(jīng)被官方封裝好的,用戶不可見(jiàn)。即默認(rèn)已經(jīng)將相關(guān)的工具調(diào)用寫到System Prompt里了。比如早期DeepSeek沒(méi)有封裝天氣調(diào)用工具時(shí),我們問(wèn)它天氣問(wèn)題,它是回答不上來(lái)的。
  • 如果是coze等制作Agent的平臺(tái),我們?cè)诖罱ㄒ粋€(gè)Agent時(shí),就可以自己在System Prompt里按實(shí)際業(yè)務(wù)流程,自己去手寫調(diào)用什么工具以及怎么調(diào)用。

2、意圖識(shí)別:大模型根據(jù)和用戶的對(duì)話信息進(jìn)行自主識(shí)別用戶要求做什么任務(wù);

3、大模型自主決策回答用戶當(dāng)前的問(wèn)題是否需要使用工具,以及決策使用哪個(gè)工具(比如天氣工具);

4、決策使用哪個(gè)工具后,然后確定調(diào)取工具設(shè)定的信息傳遞結(jié)構(gòu)(提示詞寫了調(diào)用工具的格式以及調(diào)用什么工具需要傳遞什么參數(shù),大模型按命令執(zhí)行即可比如天氣工具需“城市”和“日期”參數(shù));

5、調(diào)取與用戶的所有的歷史上下文的內(nèi)容解析,并填槽(目的是尋找“城市”“日期”這兩個(gè)參數(shù));

6、缺少參數(shù)就向用戶發(fā)起追問(wèn),直到全部填槽完畢(直到“城市”和“日期”兩個(gè)參數(shù)全部確定);

7、按照槽的格式,大模型調(diào)用工具,生成模型回復(fù);

以上,就是Function Calling的基本原理,看不懂沒(méi)關(guān)系,我們接下來(lái)作解釋:

我們看看System Prompt里該寫些什么,大模型就能乖乖的借助Function Calling來(lái)調(diào)用工具了呢?

說(shuō)明:下面描述中,如果是“//”后的文字,僅表示對(duì)這句話的旁白解釋,并不是Prompt里的內(nèi)容;

System Prompt舉例:

人設(shè)與回復(fù)邏輯:

如果用戶問(wèn)到天氣問(wèn)題,你在完成用戶要求時(shí),可以使用工具; //這句Prompt可理解為:我們可以把Prompt看成是系統(tǒng)對(duì)大模型下達(dá)的任務(wù)命令,大模型會(huì)聽(tīng)話的按命令完成任務(wù)。因?yàn)榇竽P陀姓Z(yǔ)義識(shí)別能力即它像一個(gè)“人類”一樣能理解語(yǔ)言,所以這句Prompt就是在命令大模型–如果用戶在問(wèn)天氣情況時(shí),你就自己去使用工具,怎么使用工具呢,見(jiàn)下面的Prompt。這里的“你”即“大模型”,“工具”指如果是讓研發(fā)同學(xué)去開發(fā)一個(gè)Agent的話,那么調(diào)用什么天氣工具由業(yè)務(wù)自己去決定(比如可能是“墨跡天氣”或其他什么天氣的MCP,不了解MCP沒(méi)關(guān)系,就先當(dāng)它是一個(gè)API或者插件去理解就行),或者如果是coze里搭A(yù)gent時(shí),我們可以在搭建過(guò)程中自行選擇調(diào)用什么“天氣”工具。

##工具1? ? //這是Prompt提供的一個(gè)工具。上一句Prompt已經(jīng)命令大模型,如果要使用工具的話可以自行使用,那么大模型作為一個(gè)執(zhí)行命令的“人”,它會(huì)非常信任給它下達(dá)命令的“Prompt”,那它就會(huì)去調(diào)用工具,所以你“Prompt”作為大模型的主人你不能坑人家大模型,于是,“Prompt”就把工具放在這里,意思是說(shuō)大模型你如果要用這個(gè)工具的話你就自己拿去用吧,工具就是下面這段內(nèi)容。

根據(jù)“城市和日期”查詢天氣,你在使用時(shí)必須提供城市日期兩個(gè)參數(shù),提供參數(shù)的方式要滿足如下結(jié)構(gòu):? ? //如下結(jié)構(gòu)“即指前面提到的Json格式,也就是所謂的“結(jié)構(gòu)化”;這段Json可理解為是調(diào)用天氣工具的開關(guān),開關(guān)里有“城市”和“日期”兩個(gè)零件,缺一不可(你大模型自己根據(jù)自己和用戶的歷史對(duì)話去判斷是否能識(shí)別出用戶詢問(wèn)的天氣的城市和日期,如果不能,就向用戶發(fā)起追問(wèn))

{

“name”:“get_weather”,

“arguments”:{

“city”:要查詢的城市

“date”:要查詢的日期

}

}

##工具2:? //這是Prompt給大模型的另一個(gè)工具,大模型請(qǐng)自取

根據(jù)用戶的描述比如“今天”“昨天”“明天”“下周一”,獲取實(shí)際日期,使用時(shí)必須提供用戶對(duì)于日期的描述這個(gè)參數(shù),提供參數(shù)的方式要滿足如下結(jié)構(gòu):

{

“name”:“get_date”,

“arguments”:{

“query”:用戶對(duì)于日期的描述

}

}

以上,就是這段System Prompt的全部?jī)?nèi)容。

下面我們用一個(gè)例子來(lái)解釋一下:

如果用戶提問(wèn):“今天北京天氣如何?”

大模型就開始自主解析:哦,用戶在問(wèn)天氣,那我需要調(diào)用主人給我的天氣工具“get_weather”,主人還告訴我說(shuō)調(diào)用這個(gè)工具時(shí)必須要先把“城市”和“日期”參數(shù)確定下來(lái),那我找找和用戶的歷史對(duì)話看看能不能獲取到這兩個(gè)參數(shù),誒,用戶說(shuō)了“今天”,那我就可以調(diào)用主人給我提供的日期工具“get_date”了,這個(gè)工具只要一個(gè)參數(shù)(query:用戶對(duì)于日期的描述)即可,那我就把“今天”填進(jìn)去就行啦(填槽)。填好之后,大模型把這段“get_date”的Json返回給DeepSeek(如果在coze里就返回給coze,其他應(yīng)用同理),DeepSeek作為一個(gè)封裝好的應(yīng)用,里面已經(jīng)有一段代碼或插件專門來(lái)接收和處理這段Json了,處理好之后會(huì)將“今天”的取值(比如2025年5月31日)返回給大模型,于是,大模型就拿到了“日期”這個(gè)參數(shù)。

嗯,再來(lái)看看“城市”這個(gè)參數(shù),發(fā)現(xiàn)用戶已經(jīng)告訴我城市是“北京”了,既然“天氣”和“城市”兩個(gè)參數(shù)都確定了,那我就把它們填到天氣工具“get_weather”里吧(填槽),填好之后,再把“get_weather”這段Json返回給Deepseek(和上面類似),Deepseek執(zhí)行這段Json代碼,把“天氣信息”返回給大模型,大模型獲得天氣信息后組織語(yǔ)言(說(shuō)人話),將“人話”輸出給用戶。

如果用戶提問(wèn)時(shí)沒(méi)有說(shuō)哪個(gè)城市,那大模型在自主解析到“get_weather”時(shí)發(fā)現(xiàn)需要“城市”和“日期”兩個(gè)參數(shù),現(xiàn)在“城市”無(wú)法確認(rèn),于是就會(huì)主動(dòng)向用戶發(fā)起追問(wèn):“哥,你要問(wèn)哪個(gè)城市的天氣呢?”當(dāng)然,這只是舉例,現(xiàn)在大部分應(yīng)用已經(jīng)將“位置”工具也封裝好了,大模型在解釋過(guò)程中會(huì)調(diào)用位置工具從而獲得用戶當(dāng)前的位置所屬的城市,也就不用向用戶追問(wèn)了。

小結(jié):記住一句非常重要的話–在應(yīng)用技術(shù)層,無(wú)論我們做了多么炫酷的設(shè)計(jì),最終都只有一個(gè)目的,那就是為了找到相對(duì)更合適的一個(gè)提示詞(Prompt)傳遞給大模型。因?yàn)椋?strong>Prompt是我們【唯一】可以和大模型交互的方式。因?yàn)榇竽P鸵案苫睢钡脑?,我們必須告訴它要干什么活,怎么告訴呢,那就是提示詞,也只能是提示詞,只有提示詞能直接和大模型“交流”。提示詞不清晰,大模型就只能自由發(fā)揮,幻覺(jué)率也就自然更大。(仔細(xì)品味)

本文由 @弋十三 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來(lái)自 Unsplash,基于 CC0 協(xié)議。

該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!