【AI大模型】Function Calling

目錄

什么是Function Calling

示例 1:調用本地函數

Function Calling 的注意事項

支持 Function Calling 的國產大模型

百度文心大模型

MiniMax

ChatGLM3-6B

訊飛星火 3.0

通義千問

幾條經驗總結


什么是Function Calling

? ? ?Function Calling 是一種函數調用機制,在使用 大模型進行prompt 提問時,大模型現有的知識庫不一定有能力立即回答你的問題,但我們在提問時可以告訴大模型,我們有幾個函數,讓它結合我們的提問告訴程序,應該去調用哪個函數,并從給的提問中解析出參數。程序會根據大模型返回的函數和入參生成一個結果。然后程序將 最初的提問和函數調用結果一并發給 大模型進行 prompt ,這個時候,大模型就能回答出我們的問題了。

? ? ?舉例:

? ? ? 1. 我們調用API向大模型提問:推薦北京五道口附近的咖啡店。同時告訴大模型,我們定義了一個函數,這個函數需要參數是:地名、關鍵詞

? ? ? 2. 大模型從我們的提問中解析出地名、關鍵詞和函數的對應關系返回。如:地點搜索函數,入參是 北京五道口,咖啡店。

? ? ? 3. 程序根據大模型返回的參數調用 高德API返回咖啡店的位置信息。、

? ? ? 4. 程序將咖啡店的位置信息和最初的提問一并告訴大模型。

? ? ? 5. 大模型基于程序給的信息就能回答出這個問題了。

Function Calling 完整的官方接口文檔:https://platform.openai.com/docs/guides/function-calling?

示例 1:調用本地函數

需求:實現一個回答問題的 AI。題目中如果有加法,必須能精確計算。

# 初始化
from openai import OpenAI
from dotenv import load_dotenv, find_dotenv
import json_ = load_dotenv(find_dotenv())client = OpenAI()def print_json(data):"""打印參數。如果參數是有結構的(如字典或列表),則以格式化的 JSON 形式打印;否則,直接打印該值。"""if hasattr(data, 'model_dump_json'):data = json.loads(data.model_dump_json())if (isinstance(data, (list))):for item in data:print_json(item)elif (isinstance(data, (dict))):print(json.dumps(data,indent=4,ensure_ascii=False))else:print(data)def get_completion(messages, model="gpt-3.5-turbo"):response = client.chat.completions.create(model=model,messages=messages,temperature=0.7,tools=[{  # 用 JSON 描述函數。可以定義多個。由大模型決定調用誰。也可能都不調用"type": "function","function": {"name": "sum","description": "加法器,計算一組數的和","parameters": {"type": "object","properties": {"numbers": {"type": "array","items": {"type": "number"}}}}}}],)return response.choices[0].messagefrom math import *prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10."
# prompt = "桌上有 2 個蘋果,四個桃子和 3 本書,一共有幾個水果?"
# prompt = "1+2+3...+99+100"
# prompt = "1024 乘以 1024 是多少?"   # Tools 里沒有定義乘法,會怎樣?
# prompt = "太陽從哪邊升起?"           # 不需要算加法,會怎樣?messages = [{"role": "system", "content": "你是一個數學家"},{"role": "user", "content": prompt}
]
response = get_completion(messages)# 把大模型的回復加入到對話歷史中。必須有
messages.append(response)print("=====GPT 第一次回復=====")
print_json(response)# 如果返回的是函數調用結果,則打印出來
if (response.tool_calls is not None):# 是否要調用 sumtool_call = response.tool_calls[0]if (tool_call.function.name == "sum"):# 調用 sumargs = json.loads(tool_call.function.arguments)result = sum(args["numbers"])print("=====函數返回結果=====")print(result)# 把函數調用結果加入到對話歷史中messages.append({"tool_call_id": tool_call.id,  # 用于標識函數調用的 ID"role": "tool","name": "sum","content": str(result)  # 數值 result 必須轉成字符串})# 再次調用大模型print("=====最終 GPT 回復=====")print(get_completion(messages).content)
=====GPT回復=====
{"content": null,"role": "assistant","function_call": null,"tool_calls": [{"id": "call_4Crnxkt4kj0bOspDxIiAJ6lD","function": {"arguments": "{\"numbers\":[1,2,3,4,5,6,7,8,9,10]}","name": "sum"},"type": "function"}]
}
=====函數返回=====
55
=====最終回復=====
The sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, and 10 is 55.

劃重點:

  1. Function Calling 中的函數與參數的描述也是一種 Prompt
  2. 這種 Prompt 也需要調優,否則會影響函數的召回、參數的準確性,甚至讓 GPT 產生幻覺

Function Calling 的注意事項

劃重點:

  1. 只有?gpt-3.5-turbo-1106?和?gpt-4-1106-preview?及更高版本的模型可用本次課介紹的方法
  2. 使用模型別名?gpt-3.5-turbo?和?gpt-4-turbo?會調用最新模型,但要防范模型升級帶來的負面效果,做好充足測試
  3. 函數聲明是消耗 token 的。要在功能覆蓋、省錢、節約上下文窗口之間找到最佳平衡
  4. Function Calling 不僅可以調用讀函數,也能調用寫函數。但官方強烈建議,在寫之前,一定要有真人做確認

支持 Function Calling 的國產大模型

  • 國產大模型基本都支持 Function Calling 了
  • 不支持 FC 的大模型,某種程度上是不大可用的

百度文心大模型

官方文檔:文心千帆文檔首頁-百度智能云

百度文心 ERNIE-Bot 系列大模型都支持 Function Calling,參數大體和 OpenAI 一致,支持 examples。

MiniMax

官方文檔:MiniMax-與用戶共創智能

  • 這是個公眾不大知道,但其實挺強的大模型,尤其角色扮演能力
  • 如果你曾經在一個叫 Glow 的 app 流連忘返,那么你已經用過它了。現在叫「星野」
  • 應該是最早支持 Function Calling 的國產大模型
  • V2 版 Function Calling 的 API 和 OpenAI 完全一樣,但其它 API 有很大的特色

ChatGLM3-6B

官方文檔:ChatGLM3/tools_using_demo at main · THUDM/ChatGLM3 · GitHub

  • 最著名的國產開源大模型,生態最好
  • 早就使用?tools?而不是?function?來做參數,其它和 OpenAI 1106 版之前完全一樣

訊飛星火 3.0

官方文檔:星火認知大模型Web API文檔 | 訊飛開放平臺文檔中心

和 OpenAI 1106 版之前完全一樣

通義千問

官方文檔:如何使用通義千問API_模型服務靈積(DashScope)-阿里云幫助中心

和 OpenAI 接口完全一樣。

幾條經驗總結

在傳統與 AI 之間徘徊:

  1. 詳細拆解業務 SOP,形成任務 flow。每個任務各個擊破,當前別幻想模型一攬子解決所有問題
  2. 不是所有任務都適合用大模型解決。傳統方案,包括傳統 AI 方案,可能更合適
  3. 一定要能評估大模型的準確率(所以要先有測試集,否則別問「能不能做」)
  4. 評估 bad case 的影響面
  5. 大模型永遠不是 100% 正確的,建立在這個假設基礎上推敲產品的可行性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23002.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23002.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23002.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++ | 構造函數】類的構造函數詳解

😁博客主頁😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客內容🤑:🍭嵌入式開發、Linux、C語言、C、數據結構、音視頻🍭 ?發布時間?:2024-06-06 0…

HCIA-RS基礎-VLAN配置

目錄 前言創建拓撲創建VLAN查看創建的VLAN配置trunk口并放行VLAN配置access接口查看所有vlan基本信息測試網絡連通性命令合集 前言 VLAN定義:VLAN是一種將局域網內的設備從邏輯上劃分成一個個網段,從而實現虛擬工作組的新興數據交換技術。VLAN優點&…

設計模式-單例模式(創建型)

創建型-單例模式 了解單例 單例模式是一種創建型設計模式,它提供了一種創建對象的最佳方式;它必須保證: 單例類只能有一個實例化對象;單例類必須創建自己的唯一實例;單例類必須給其他對象提供實例; 另外:…

【面試筆記】嵌入式軟件工程師,汽車電子軟件相關

文章目錄 1. C語言基礎1.1 const1.2 static1.3 回調函數的用法1.4 宏定義1.5 編譯、鏈接過程1.6 堆與棧的區別?1.7 簡單的字符串算法題,C語言實現1.7.1 給定一個字符串,按順序篩選出不重復的字符組成字符串,輸出該字符串1.7.2 給定…

Python3 迭代器和生成器

前言 本文主要介紹Python中的迭代器和生成器,主要內容包括 迭代器概述、生成器簡介。 文章目錄 前言一、迭代器簡介二、生成器簡介 一、迭代器簡介 在 Python 中,迭代器(iterator)是一個實現了迭代器協議(Iterator Protocol)的…

opencv進階 ——(十一)基于RMBG實現生活照生成寸照

實現步驟 1、檢測人臉,可以使用opencv自帶的級聯分類器或者dlib實現人臉檢測 2、放大人臉范圍,調整到正常寸照尺寸 3、基于RMGB算法得到人像掩碼 4、生成尺寸相同的純色背景與當前人像進行ALPHA融合即可 alpha融合實現 void alphaBlend(cv::Mat&…

1 機器人軟件開發學習所需通用技術棧(一)

機器人軟件工程師技術路線(如有缺失,歡迎補充) 1. 機器人軟件開發工程師技術路線 1.1 基礎知識 C/C編程:掌握C/C語言基礎,包括數據結構、算法、內存管理等。操作系統:了解Linux或Windows等操作系統的基本…

android 13 aosp 預置so庫

展訊對應的main.mk配置 device/sprd/qogirn**/ums***/product/***_native/main.mk $(call inherit-product-if-exists, vendor/***/build.mk)vendor/***/build.mk PRODUCT_PACKAGES \libtestvendor///Android.bp cc_prebuilt_library_shared{name:"libtest",srcs:…

2.1 初識Windows程序

Windows程序設計是一種面向對象的編程。Windows操作系統以數據結構的形式定義了大量預定義的對象作為操作系統的數據類型。Windows動態鏈接庫提供了各種各樣的API接口函數供Windows應用程序調用。一個Windows應用程序是運行在Windows操作系統之上的。這些API接口函數的調用所實…

1349:【例4-10】最優布線問題

【解題思路】 最小生成樹模板題&#xff0c;求最小生成樹所有邊權加和。 該題輸入的是鄰接矩陣&#xff0c;因此使用鄰接矩陣解決該問題。當然也可以保存為鄰接表。 【參考代碼】 //示例代碼 Prim算法 #include <iostream> #include <cstring> #include <cs…

【Vue】路由的基本使用

文章目錄 一、固定5個固定的步驟二、代碼示例三、兩個核心步驟四、完整代碼 vue-router插件作用 修改地址欄路徑時&#xff0c;切換顯示匹配的組件 說明 Vue 官方的一個路由插件&#xff0c;是一個第三方包 官網 https://v3.router.vuejs.org/zh/ VueRouter的使用&#xff0…

TCP/IP協議介紹——三次握手四次揮手

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;傳輸控制協議/網際協議&#xff09;是指能夠在多個不同網絡間實現信息傳輸的協議簇。TCP/IP協議不僅僅指的是TCP 和IP兩個協議&#xff0c;而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議…

CSS學習|css三種導入方式、基本選擇器、層次選擇器、結構偽類選擇器、屬性選擇器、字體樣式、文本樣式

第一個css程序 css程序都是在style標簽中書寫 打開該網頁&#xff0c;可以看到h1標簽中的我是標題被渲染成了紅色 可以在同級目錄下創建一個css目錄&#xff0c;專門存放css文件&#xff0c;可以和html分開編寫 然后在html頁面中&#xff0c;利用link標簽以及css文件地址&…

大模型基架:Transformer如何做優化?

大模型的基礎模式是transformer&#xff0c;所以很多芯片都實現先專門的transformer引擎來加速模型訓練或者推理。本文將拆解Transformer的算子組成&#xff0c;展開具體的數據流分析&#xff0c;結合不同的芯片架構實現&#xff0c;分析如何做性能優化。 Transformer結構 tr…

go的反射和斷言

在go中對于一個變量&#xff0c;主要包含兩個信息變量類型&#xff08;type&#xff09;和變量值&#xff08;value&#xff09; 可以通過reflect包在運行的時候動態獲取變量信息&#xff0c;并能夠進行操作 對于Type可以通過reflect.TypeOf()獲取到變量的類型信息 reflect.Ty…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用軟件工程的方法來單獨解決前端的開發流程中模塊化、組件化、規范化、自動化的問題,其主要目的為了提高效率和降低成本。 前后端分離&#xff08;前端代碼工程化獨立出來形成一個單獨的app&#xff09; 1.開發分離 2.部署分離 3.服務器分離…

信號(上)

本節目標&#xff1a; 1. 掌握Linux信號的基本概念 2. 掌握信號產生的一般方式 3. 理解信號遞達和阻塞的概念&#xff0c;原理。 4. 掌握信號捕捉的一般方式。 5. 重新了解可重入函數的概念。 6. 了解競態條件的情景和處理方式 7. 了解SIGCHLD信號&#xff0c; 重新編寫信號處理…

ChatGPT基本原理詳細解說

ChatGPT基本原理詳細解說 引言 在人工智能領域&#xff0c;自然語言處理&#xff08;NLP&#xff09;一直是研究的熱點之一。隨著技術的發展&#xff0c;我們見證了從簡單的聊天機器人到復雜的語言模型的演變。其中&#xff0c;ChatGPT作為一項突破性技術&#xff0c;以其強大…

【Vue】自定義指令-v-loading指令的封裝

場景 實際開發過程中&#xff0c;發送請求需要時間&#xff0c;在請求的數據未回來時&#xff0c;頁面會處于空白狀態 > 用戶體驗不好 需求 封裝一個 v-loading 指令&#xff0c;實現加載中的效果 分析 本質 loading效果就是一個蒙層&#xff0c;蓋在了盒子上 數據請求…

從零開始精通Onvif之設備發現

設備發現的意義 在復雜的網絡環境中&#xff0c;如何快速而準確地識別網絡上的Onvif設備&#xff0c;對于攝像頭廠商、系統集成商、開發人員乃至最終用戶來說&#xff0c;都顯得至關重要。 首先&#xff0c;設備發現有效簡化了集成的復雜度。在沒有統一標準之前&#xff0c;每個…