Funcion Calling介紹
函式呼叫允許您將模型如gpt-4o與外部工具和系統連線起來。這對於許多事情都很有用,比如為AI助手賦能,或者在你的應用程式與模型之間建立深度整合。
如果您瞭解或者使用過Semantic Kernel可能會發現除了OpenAI支援Function Calling的模型之外,自動函式呼叫好像並不好用,國產大模型幾乎都不能使用,由於想解決這個問題,在GitHub上找到了一個大佬的方法。
GitHub地址:https://github.com/Jenscaasen/UniversalLLMFunctionCaller
大佬是透過提示工程與Semantic Kernel中呼叫本地函式的原理來做的,我看了大佬的程式碼,將提示詞改為了中文,可能會更適用於國產大模型。
之前寫了一篇文章:
但是當時自己並沒有開源專案,感興趣的朋友,沒有辦法快速地上手體驗,只能自己重新來一遍,現在已將這部分內容整合到我的開源專案SimpleRAG中,感興趣的朋友只需填入自己的API Key即可快速體驗,也可以方便地檢視程式碼了。
GitHub地址:https://github.com/Ming-jiayou/SimpleRAG
一種通用的Function Calling方法
在開始介紹之前,先看一下效果:
對比一下不使用FunctionCalling的效果:
再來一個示例:
對比不使用Function Calling的效果:
具體程式碼可在GitHub中檢視,這裡重點介紹一下實現的過程。
這裡以Qwen2-7B-Instruct為例。
首先建立一個Kernel:
在Kernel中匯入外掛:
以上只是用於測試的模擬函式。
只需這樣寫即可:
現在探究一下里面的過程。
首先將外掛轉化為文字:
在對話歷史中加入示例:
在對話歷史中加入一個指令:
將所有可用的函式嵌入到這個Prompt中了,如下所示:
將指令加入到對話歷史中了,如下所示:
讓LLM根據任務選擇應該先呼叫哪個函式或者不用呼叫函式:
LLM返回完成這個任務需要呼叫的函式:
驗證這個函式:
呼叫外掛中的函式:
第一個函式返回的結果:
再向LLM傳送請求,現在該呼叫哪個函式,LLM的返回如下所示:
同樣執行外掛中的第二個函式:
第二個函式的返回:
然後再向LLM傳送請求:
呼叫的函式名為Finished,表示流程已完成,可以跳出來了,如下所示:
獲得了最後的資訊:
結果如下所示:
以上就是這個方法的大概流程,具體實現可以看GitHub開源的程式碼。
經過測試這種方法可用的LLM
平臺 | 可用模型 |
---|---|
矽基流動 | Llama-3.1-405/70/8B、Llama-3-70/8B-Instruct、DeepSeek-V2-Chat、deepseek-llm-67b-chat、Qwen2-72/57/7/1.5B-Instruct、Qwen2-57B-A14B-Instruct、Qwen1.5-110/32/14B-Chat、Qwen2-Math-72B-Instruct、Yi-1.5-34/9/6B-Chat-16K、internlm2_5-20/7b-chat |
訊飛星火 | Spark Lite、Spark Pro-128K、Spark Max、Spark4.0 Ultra |
零一萬物 | yi-large、yi-medium、yi-spark、yi-large-rag、yi-large-fc、yi-large-turbo |
月之暗面 | moonshot-v1-8k、moonshot-v1-32k、moonshot-v1-128k |
智譜AI | glm-4-0520、glm-4、glm-4-air、glm-4-airx、glm-4-flash、glm-4v、glm-3-turbo |
DeepSeek | deepseek-chat、deepseek-coder |
階躍星辰 | step-1-8k、step-1-32k、step-1-128k、step-2-16k-nightly、step-1-flash |
Minimax | abab6.5s-chat、abab5.5-chat |
阿里雲百鍊 | qwen-max、qwen2-math-72b-instruct、qwen-max-0428、qwen2-72b-instruct、qwen2-57b-a14b-instruct、qwen2-7b-instruct |
以上不一定完備,還有一些模型沒測,歡迎大家繼續補充。