Google AI Edge Function Calling: Android 端模型也能調用工具函數

大家好,我是拭心。

上篇文章我們了解了如何在 Android 手機上實現 RAG。這篇文章我們來聊聊端上大模型應用開發的核心概念:Function Calling(函數調用能力,簡寫為 FC)。

Function Calling 本質上是讓大模型在回答過程中,不直接給出最終答案,而是根據需求,調用外部函數/API/工具,拿到外部數據后再繼續回答。

在這里插入圖片描述

它把大模型從「只會聊天的模型」變成了「會用工具的智能體」。

AI Edge Function Calling 是 Google 為 Android/iOS 等終端設備提供的函數調用 SDK,它的出現讓端上模型也能調用外部函數,實現一些復雜的業務功能。

一、了解 AI Edge Function Calling API

一般來說,Function Calling 主要包括這幾步:

  1. 定義函數聲明:聲明 LLM 可以調用的函數的結構和參數。
  2. 設置提示和輸出格式:將函數的數據結構轉換為字符串以及將字符串轉換為函數結構,以便 LLM 能夠以適當的格式顯示信息。
  3. 解析輸出:檢測生成的響應是否包含函數調用,如果有將其解析為函數結構的數據類型,以便應用能夠執行函數調用。
  4. 檢查響應:檢測到輸出有函數調用,使用適當的參數和結構化數據類型調用該函數。否則,它會返回自然語言文本。

AI Edge Function Calling SDK 提供相關的 API:

  1. 函數定義,定義工具函數的名稱和參數: FunctionDeclaration
  2. 輸入格式設置器: ModelFormatter,用于將函數聲明轉換為 LLM 所需的特定于模型的格式,并將其插入系統提示
  3. 輸出解析器: 還是 ModelFormatter,用于檢測模型的輸出是否表示函數調用,并將其解析為數據結構
  4. 推理后端,封裝 LLM Inference API 和 ModelFormatter: InferenceBackend,最終通過 LlmInferenceBackendSession 實現核心功能

二、如何使用

只看文檔不容易理解,接下來我們通過 Google 的 Function Calling demo,來看看 FC API 如何使用。

2.1 demo 功能

demo 功能:在用戶錄音后,將錄音數據轉化為表格里的內容,提升信息錄入效率。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

在 demo 中,Function Calling 扮演著"信息提取器"的角色。

當用戶通過語音輸入"我叫拭心,生日是1990年5月12日"時,函數調用機制能識別出"拭心"是姓名,"1990年5月12日"是生日,并將其與預定義的 first_namelast_name等參數相對應。

2.2 通過 demo 的實現了解怎么使用

了解 demo 功能后,接下來我們通過 demo 的源碼了解下 Function Calling SDK 怎么使用。

在 demo 項目中,整體流程包括這幾步:
在這里插入圖片描述

2.2.1 初始化

在這里插入圖片描述

在初始化時,創建了 FormViewModel,在其中會創建 HammerFormatter(ModelFormatter 的一個實現):

```kotlin
// in FormViewModel.createGenerativeModel()
val formatter =HammerFormatter(ModelFormatterOptions.builder().setAddPromptTemplate(true).build())
```

ModelFormatter 是連接模型與函數調用邏輯的關鍵:

  1. 請求格式化: 它將用戶的文本輸入、系統指令(systemInstruction)以及在 Tools.kt 中定義的可用工具(函數簽名)打包成一個符合 Hammer 模型預期的提示(Prompt)。
  2. 響應解析: 當模型返回結果時,格式化器會解析輸出,判斷它是一個普通的文本回答還是一個結構化的函數調用請求。

隨后創建了 GenerativeModel,它是 Function Calling SDK 的核心入口,整合了推理后端、系統指令和工具集。

```kotlin
// in FormViewModel.createGenerativeModel()
val systemInstruction = Content.newBuilder().setRole("system").addParts(Part.newBuilder().setText("This assistant will help you fill out a medical form.")).build()val model = GenerativeModel(llmInferenceBackend,systemInstruction,listOf(Tools.medicalFormTools).toMutableList() // 關鍵:定義模型可用的工具
)
```

2.2.2 函數注冊

然后在 com/google/sample/fcdemo/functioncalling/Tools.kt 中聲明了支持模型調用的函數列表:

val medicalFormTools: Tool = Tool.newBuilder().addFunctionDeclarations(// 1. 姓名函數FunctionDeclaration.newBuilder().setName("provide_name").setDescription("Records the user's first and last name.").setParameters(/* 參數定義 */)).addFunctionDeclarations(// 2. 生日函數FunctionDeclaration.newBuilder().setName("provide_dob").setDescription("Records the user's date of birth.").setParameters(/* 參數定義 */)).addFunctionDeclarations(// 3. 人口統計函數FunctionDeclaration.newBuilder().setName("provide_demographics").setDescription("Records the user's sex and marital status.").setParameters(/* 參數定義 */)).addFunctionDeclarations(// 4. 職業函數FunctionDeclaration.newBuilder().setName("provide_occupation").setDescription("Records the user's occupation or job.").setParameters(/* 參數定義 */)).addFunctionDeclarations(// 5. 醫療歷史函數FunctionDeclaration.newBuilder().setName("update_medical_history").setDescription("Updates the user's medical history based on the conditions provided.").setParameters(/* 參數定義 */)).build()

函數聲明通過 FC SDK 的 FunctionDeclaration。
在這里插入圖片描述

2.2.3 用戶輸入

當用戶輸入"我叫拭心,生日是1990年5月12日"時,HammerFormatter 會構建一個包含以下元素的完整提示:

在這里插入圖片描述

LlmInferenceBackendSession#addSystemMessage:

public void addSystemMessage(Content systemInstruction, List<Tool> tools) {this.systemInstruction = systemInstruction;this.tools = new ArrayList(tools);String systemMessage = this.formatter.formatSystemMessage(systemInstruction, tools);this.llmInferenceSession.addQueryChunk(systemMessage);
}

2.2.4 模型推理

模型接收到格式化后的提示后,會:

  1. 理解用戶意圖:識別出用戶想要填寫表單
  2. 匹配可用函數:從預定義的函數列表中找到最匹配的函數
  3. 提取結構化數據:從自然語言中提取出具體的參數值
  4. 生成函數調用:輸出結構化的函數調用指令

當要調用函數時,模型返回的不是自然語言,而是結構化的函數調用對象:

{"functionCall": {"name": "provide_name","args": {"fieldsMap": {"first_name": {"stringValue": "拭心"},"last_name": {"stringValue": "<unknown>"}}}}
}

2.2.5 函數調用

在這里插入圖片描述

模型返回的響應包含在 Part 對象中,每個 Part 可能包含一個 functionCall


// 1.模型處理
val response = chatSession!!.sendMessage(spokenText)// 2.從響應里找是否有函數調用
response.getCandidates(0).content.partsList?.forEach { part ->// extract the function from all the parts in the responseparts.forEach { part ->part?.functionCall?.args?.fieldsMap?.forEach { (key, value) ->value.stringValue?.let { stringValue ->if (stringValue != "<unknown>") {//3.有函數調用,更新對應的 valuewhen (key) {"first_name" -> _firstName.value = value.stringValue"last_name" -> _lastName.value = value.stringValue"occupation" -> _occupation.value = value.stringValue"sex" -> _sex.value = value.stringValue"marital_status" -> _maritalStatus.value = value.stringValue"date_of_birth" -> _dob.value = value.stringValue"conditions" -> {val currentMap = _medicalConditionsMap.value.toMutableMap()value.listValue.valuesList.forEach { condition ->currentMap[condition.stringValue] = true}_medicalConditionsMap.value = currentMap}else -> {throw Exception("Unknown function: $key value: $value")}}}}}}}

三、總結

好了,這就是 Google AI Edge Function Calling SDK 的相關介紹,它極大地簡化 FC 與端側大語言模型交互的復雜性,開發者無需手動進行復雜的提示工程和響應解析,只需定義好自己的"工具",即可讓 AI 理解并執行任務,專注于應用的核心業務邏輯。

更多詳細信息,請參閱 官方 Android 函數調用指南。

PS:記錄一個容易混淆的問題,MCP 和 Function Calling 的關系?目前我的理解:

  • MCP 包含 Function Calling,但遠不止于 Function Calling
  • MCP 試圖統一所有上下文交互和外部工具接口,把 Function Calling 納入整個智能體協議體系里

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

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

相關文章

模型調試實用技巧 (Pytorch Lightning)

【PL 基礎】模型調試實用技巧 摘要1. 設置斷點2. 快速運行所有模型代碼一次3. 縮短 epoch 長度4. 運行健全性檢查5. 打印 LightningModule 權重摘要6. 打印輸入輸出層尺寸 摘要 本文總結了6種實用的模型調試技巧&#xff1a;1&#xff09;通過設置斷點逐行檢查代碼&#xff1b;…

計算機網絡(四)網際層IP

目錄 一、概念 ?編輯 二、網際層和數據鏈路層的關系? 三、IP地址的基礎認識 四、IP地址的分類 五、無分類地址CIDR 六、子網掩碼 七、為什么要分離網絡號和主機號 八、公有IP和私有IP ?編輯 九、IP地址與路由控制 十、IP分片和重組 十一、IPv6 十二、IP協議…

Java--多態--向上轉型--動態綁定機制--斷點調試--向下轉型

目錄 1. 向上轉型 2. 向下轉型 3. java的動態綁定機制&#xff1a; 4. Object類講解 5. 斷點調試 1. 向上轉型 提前&#xff1a;倆個對象&#xff08;類&#xff09;存在繼承關系 本質&#xff1a;父類的引用指向了子類的對象 語法&#xff1a;父類 類型 引用名 new…

Python爬蟲實戰:研究urllib 庫相關技術

1. 引言 1.1 研究背景與意義 互聯網每天產生海量數據,如何高效獲取和利用這些數據成為重要研究方向。網頁爬蟲作為自動獲取網絡信息的核心技術,在市場調研、輿情分析、學術研究等領域具有廣泛應用。Python 憑借其簡潔語法和豐富庫支持,成為爬蟲開發的首選語言。 1.2 相關…

【機器學習賦能的智能光子學器件系統研究與應用】

目前在Nature和Science雜志上發表的機器學習與光子學結合的研究主要集中在以下幾個方面&#xff1a; 1.光子器件的逆向設計&#xff1a;通過機器學習&#xff0c;特別是深度學習&#xff0c;可以高效地進行光子器件的逆向設計&#xff0c;這在傳統的多參數優化問題中尤為重要。…

Codeforces Round 1034 (Div. 3)

比賽鏈接如下&#xff1a;https://codeforces.com/contest/2123 A. Blackboard Game Initially, the integers from 00 to n?1 are written on a blackboard. In one round, Alice chooses an integer a on the blackboard and erases it;then Bob chooses an integer b on …

微電網系列之微電網的孤島運行

個人主頁&#xff1a;云納星辰懷自在 座右銘&#xff1a;“所謂堅持&#xff0c;就是覺得還有希望&#xff01;” 微電網的孤島運行 微電網具有并網和孤島兩種運行模式&#xff0c;由于孤島運行模式下&#xff0c;分布式電源為微電網內部負荷提供頻率和電壓支撐&#xff0c;由…

JsonCpp的核心類及核心函數使用匯總

文章目錄 JsonCpp的核心類及核心函數使用匯總一、前言二、JsonCpp 核心類介紹三、Value 類函數解析1. 值獲取函數&#xff08;asxxx 系列 &#xff09;2. 值類型判斷函數&#xff08;isxxx 系列 &#xff09;3. 數組操作函數4. 對象操作函數5. 運算符重載6. 迭代器7. JSON 轉化…

Qt寫入excel

1.tableView導出到excel 點擊導出函數按鈕、發送sendMessage信號&#xff08;信號名稱&#xff0c;對象&#xff0c;數據&#xff09; void HydroelectricPowerPluginImpl::exportTableViewSelectedRows(QTableView* tableView, QWidget* parent) {if (!tableView || !tableVie…

OSCP - Proving Grounds - DC - 1

主要知識點 drupal 7 RCEfind SUID提權 具體步驟 nmap起手,80端口比較有意思&#xff0c;安裝了 Drupal 7 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-17 14:23 UTC Nmap scan report for 192.168.57.193 Host is up (0.00087s latency). Not shown: 65531 cl…

仿小紅書交流社區(微服務架構)

文章目錄 framework - 平臺基礎設施starter - jacksoncommonexceptionresponseutil starter - content 全局上下文distributed - id - generate - 分布式 IdSnowflake - 基于雪花算法生成 IdSegment - 基于分段式生成 Id OSS - 對象存儲KV - 短文本存儲筆記評論 user - 用戶服務…

大模型開源技術解析 4.5 的系列開源技術解析:從模型矩陣到產業賦能的全棧突破

提示&#xff1a;本篇文章 1300 字&#xff0c;閱讀時間&#xff1a;5分鐘。 前言 6 月 30 日&#xff0c;百度正式開源文心大模型 4.5 系列&#xff0c;這一動作不僅兌現了 2 月發布會上的技術承諾&#xff0c;更以 10 款全維度模型矩陣刷新了國內開源模型的技術邊界。從學術…

[6-02-01].第05節:配置文件 - YAML配置文件語法

SpringBoot學習大綱 一、YAML語法 1.1.概述&#xff1a; 1.YAML是一種數據序列化格式&#xff1b;2.它是以數據為中心3.容易閱讀&#xff0c;容易與腳本語言交互,如下圖所示&#xff1a; 1.2.基本語法 1.key: value&#xff1a;kv之間有空格2.使用縮進表示層級關系3.縮進時…

FPGA學習

一、module : 定義&#xff1a; 是構建數字系統的基本單元&#xff0c;用于封裝電路的結構和行為。它可以表示從簡單的邏輯門到復雜的處理器等任何硬件組件。 1. module 的基本定義 module 模塊名 (端口列表);// 端口聲明input [位寬] 輸入端口1;output [位寬] 輸出端口1;ino…

26-計組-存儲器與Cache機制

一、存儲器與局部性原理 1. 局部性原理 基礎概念&#xff1a; 時間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;短時間內可能再次被訪問&#xff08;例如循環變量&#xff09;。空間局部性&#xff1a;一個存儲單元被訪問后&#xff0c;其附近單元可能在短時間內被訪…

I/O 線程 7.3

前言 以下&#xff1a; 概述 1.基礎 2.代碼演示 3.練習 4.分析題 1.基礎 一、線程基礎概念 并發執行原理 通過時間片輪轉實現多任務"并行"效果 實際為CPU快速切換執行不同線程 線程 vs 進程 線程共享進程地址空間&#xff0c;切換開銷更小 進程擁有獨立資源&am…

MySQL JSON數據類型完全指南:從版本演進到企業實踐的深度對話

&#x1f4ca; MySQL JSON數據類型完全指南&#xff1a;從版本演進到企業實踐的深度對話 在當今數據驅動的時代&#xff0c;MySQL作為最受歡迎的關系型數據庫之一&#xff0c;不斷演進以滿足現代應用的需求。JSON數據類型的引入&#xff0c;讓MySQL在保持關系型數據庫優勢的同時…

BI × 餐飲行業 | 以數據應用重塑全鏈路業務增長路徑

在競爭激烈的餐飲行業中&#xff0c;數據已成為企業保持競爭力的關鍵資產。通過深入分析顧客數據&#xff0c;餐飲企業能夠洞察消費者的需求和偏好&#xff0c;從而提供更加精準和個性化的服務。此外&#xff0c;利用數據優化業務管理&#xff0c;降低成本&#xff0c;并提高運…

【學習線路】機器學習線路概述與內容關鍵點說明

文章目錄 零、機器學習的企業價值一、基礎概念1. 機器學習定義2. 學習類型3. 學習范式 二、核心算法與技術1. 監督學習2. 無監督學習3. 模型評估與優化 三、深度學習與神經網絡1. 神經網絡基礎2. 深度學習框架3. 應用場景 四、工具與實踐1. 數據處理2. 模型部署3. 機器學習的生…

Linux 命令:cp

Linux cp 命令詳細教程 cp 是 Linux 系統中最常用的命令之一&#xff0c;用于復制文件或目錄。它可以將源文件/目錄復制到指定的目標位置&#xff0c;支持批量復制、強制覆蓋、保留文件屬性等功能。下面詳細介紹其用法。資料已經分類整理好&#xff1a;https://pan.quark.cn/s…