端侧大模型系列 | 斯坦福手机端侧Agent大模型,为Android API而生!

news2024/9/20 22:54:03

0. 引言

峰峦或再有飞来,坐山门老等。泉水已渐生暖意,放笑脸相迎

小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖铁观音的小男孩。今天这篇小作文主要介绍端侧大模型中的函数调用,即常说的Function calling能力。这是构建Agent必不可少的一个环节,Agent调用各个API或者应用都需要依赖该能力。如想进一步沟通,可以到微信公众号《小窗幽记机器学习》添加小编微信号。

1. 简介

语言模型在自动工作流中的有效性得到了验证,尤其是在函数调用方面。尽管大规模语言模型在云环境中表现优异,但隐私和成本问题仍令人担忧。当前端侧模型在延迟和准确性上面临挑战,研究人员提出了名为Octopus的模型,其2B参数版本在准确性和延迟上超越了GPT-4,并将上下文长度减少了95%。与Llama-7B相比,Octopus的延迟提高了35倍,适合在各种边缘设备上部署。

论文地址:

https://arxiv.org/abs/2404.01744

模型下载地址:

https://huggingface.co/NexaAIDev/Octopus-v2

2. 介绍

大型语言模型在函数调用方面的能力显著促进了AI Agent的发展,如MultiOn、Adept AI等已进入市场。尽管取得了进展,云端部署引发了隐私和成本问题。使用大型语言模型的成本很高,例如与GPT-4互动1小时可能需0.24美元,而基于RAG的方法也需处理大量token,导致成本累积。此外,隐私风险使得许多人对使用GPT-4持谨慎态度。

为了降低成本并增强隐私保护,趋势是开发更小的模型并将其部署于边缘设备。但边缘计算模型往往响应慢,且电池寿命有限。研究指出,10亿参数模型的能耗高达每个token 0.1焦耳,传统方法下会迅速消耗设备电池。因此,Octopus的研究者开发了一种新方法,通过2B参数模型提升精度并降低延迟,达到SOTA效果。Octopus v2的推理过程中节省了95%上下文长度,使得在iPhone上能增加37倍的函数调用,且延迟减少35倍。

3. 相关工作

端侧设备上部署语言模型:将大型语言模型部署到边缘设备面临挑战,但小型模型的应用正变得热门,如Gemma-2B和Llama-7B。MLC LLM框架展示了跨硬件的兼容性。

语言模型中的函数调用:小模型的函数调用能力快速发展,项目如Toolformer和Taskmatrix证明了7B和13B模型能有效调用外部API。

语言模型的微调和适配器:微调已成为常见方法,LoRA在有限资源下训练模型,显示出良好的扩展性。

4. 方法

本节介绍Octopus v2模型的方法及数据集的收集过程。以Android API为例,探讨Octopus v2的训练细节。

4.1 因果模型作为分类模型

成功调用函数需准确选择函数并生成参数,包含函数选择和参数生成两个步骤。可将函数选择视为softmax分类问题。

另一种方法是基于检索,通过语义相似性识别最接近用户query的函数。自回归模型如GPT可预测正确的函数名称。为提高推理速度,采用统一的GPT模型策略。

在函数名称预测中,使用唯一的函数token(functional tokens),如<nexa_0><nexa_N-1>,将预测任务简化为单token分类,提升准确性并减少token需求。通过函数描述纳入训练数据集,使模型理解这些token的重要性,并设计兼容多种响应样式的提示模板。

Below is the query from the users, please choose the correct function and generate the
parameters to call the function.
Query: {query}
# for single function call
Response: <nexa_i>(param1, param2, ...)<nexa_end>
# for parallel function call
Response:<nexa_i>(param1, param2, ...);<nexa_j>(param1, param2,
...)<nexa_end>
# for nested function call
Response:<nexa_i>(param1, <nexa_j>(param1, param2, ...),
...)<nexa_end>
Function description: {function_description}

这种方法有一个额外的好处。在模型针对理解函数token的重要性进行了微调之后,在推理的时候可以通过采用添加的特殊token <nexa_end>作为提前停止的策略。这种策略无需分析函数描述中的token的必要性,从而避免了检索相关函数和处理它们的描述。因此,这大大减少了准确识别函数名所需的token数量。Figure 2显示了基于检索的方法和当前提出的Octopus v2模型之间的区别。

Figure 2:function call处理流程差异,基于检索 vs Octopus 模型

4.2 数据集收集

这一部分概述了训练、验证和测试阶段搭建高质量数据集的方法,此外还介绍了用于训练阶段的数据组织过程。

API收集

以Android API为例,选择标准包括可用性、使用频率和技术实现的复杂性。最终收集了20个Android API,并将它们分为三个不同的类别,确保每个函数都可以在设备上通过Android应用程序开发实际执行,前提是开发人员拥有必要的系统权限。此外,还收集了车载可用的API。更多示例见于附录。

  1. Android系统API。该类别包括手机基本操作所需的系统级功能API,如拨打电话、发送短信、设置闹钟、修改屏幕亮度、创建日历条目、管理蓝牙、启用勿扰模式和拍照。此外,排除了高度敏感任务,如访问系统状态信息或更改辅助功能设置。

  2. Android应用API。官方研究了预装在Android设备上的Google应用程序的API,如YouTube、Google Chrome、Gmail和Google Maps。同时探索了访问热门新闻、获取天气更新、搜索YouTube内容和地图导航等功能。

  3. Android智能设备管理API。将关注进一步范围扩展到Google Home生态系统,包括各种智能家居设备。目标是通过API改善智能设备管理,包括调节Nest恒温器、管理Google Nest设备上的媒体播放以及使用Google Home应用程序控制门锁等功能。

数据集生成

数据集生成方法如Figure (3)所示。创建数据集涉及三个关键阶段: (1)生成相关查询及其关联的函数调用参数;(2)开发带有函数体的无关查询;(3)通过Google Gemini进行是非验证

  1. 谷歌Gemini生成查询和函数调用。创建高质量数据集依赖于制定明确的查询和准确的函数调用参数。官方为每个单一API生成正向查询(正样本)。有了查询和预定义的API描述,利用谷歌Gemini API生成所需的函数调用参数。

  2. 负样本 为提高模型的分析能力和实际应用,同时使用正负样本。正负样本的平衡由Figure 3 中的比率M/N 决定。具体而言,官方将M和N设为相等,均为1000。

Figure 3:生成数据集的过程,包括两个关键阶段:(1)创建特定于某些API的可解决查询(query),并为它们生成适当的函数调用;(2)创建无法解决的查询,并补充无关的函数主体。引入是非验证机制进行严格验证,以优化收集训练数据集,从而大大改善模型功能。

数据集验证

尽管像OpenAI的GPT-4和谷歌的Gemini这样的大型语言模型拥有先进的能力,但在生成函数调用参数方面仍存在一定错误率。这些错误可能表现为缺少参数参数类型不正确对预期查询的误解。为了缓解这些缺陷,引入验证机制。该系统允许谷歌Gemini评估其生成的函数调用的完整性和准确性,如果输出存在缺陷,它将启动重新生成过程。

4.3 模型开发和训练

在框架中使用谷歌Gemma-2B模型作为预训练模型。方法包括两种不同的训练方法:全参数模型训练和LoRA模型训练。对于全参数模型训练,使用AdamW优化器,学习率设置为5e-5,warm-up step为10,并采用线性学习率scheduler。相同的优化器和学习率配置也应用于LoRA训练。将LoRA的秩指定为16,并将LoRA应用于以下模块:q_proj、k_proj、v_proj、o_proj、up_proj、down_proj。LoRA alpha参数设置为32。对于全参数训练和LoRA训练,训练轮数都设置为3。

至于实验部分,这里直接省略,感兴趣的小伙伴可以去阅读原文。

5. 实战

模型涉及的android API如下,android_functions:https://huggingface.co/NexaAIDev/Octopus-v2/blob/main/android_functions.txt

5.1 英文示例1

输入:

input_text = "Take a selfie for me with front camera"
nexa_query = f"Below is the query from the users, please call the correct function and " \
             f"generate the parameters to call the function.\n\nQuery: {input_text} \n\nResponse:"

输出结果如下:

nexa model result:
 {'output': ' <nexa_0>(\'front\')<nexa_end>\n\nFunction description: \ndef take_a_photo(camera):\n    """\n    Captures a photo using the specified camera and resolution settings.\n\n    Parameters:\n    - camera (str): Specifies the camera to use. Can be \'front\' or \'back\'. The default is \'back\'.\n\n    Returns:\n    - str: The string contains the file path of the captured photo if successful, or an error message if not. Example: \'/storage/emulated/0/Pictures/MyApp/IMG_20240310_123456.jpg\'\n    """\n<eos>', 'latency': 3.5724620819091797}
latency: 3.572577714920044  s

可以看出,命中的函数是take_a_photo。因为从android_functions可以看出,<nexa_0>对应的函数正是take_a_photo

5.2 英文示例2

输入:

input_text = "What news is there today?"
nexa_query = f"Below is the query from the users, please call the correct function and " \
             f"generate the parameters to call the function.\n\nQuery: {input_text} \n\nResponse:"

输出结果:

nexa model result:
 {'output': ' <nexa_1>(\'What news is there today?\')<nexa_end>\n\nFunction description: \ndef get_trending_news(query):\n    """\n    Retrieves a collection of trending news articles relevant to a specified query.\n\n    Parameters:\n    - query (str): Topic for news articles.\n\n    Returns:\n    - list[str]: A list of strings, where each string represents a single news article. Each article representation includes the article\'s title and its URL, allowing users to easily access the full article for detailed information.\n    """\n<eos>', 'latency': 2.888906717300415}
latency: 2.8890953063964844  s

可以看出,结果符合预期。

5.3 中文示例1

input_text_zh = "目前热门的新闻是什么?"
nexa_query = f"以下是来自用户的query, 请调用正确的函数并生成调用对应函数所需的参数。\n\nQuery: {input_text_zh} \n\nResponse:"

输出结果如下:

nexa model result:
 {'output': ' <nexa_1>(\' 目前热门の新闻は?\', \'media\')<nexa_end>\n\nFunction description: \ndef search_youtube_videos(query):\n    """\n    Searches YouTube for videos matching a query.\n\n    Parameters:\n    - query (str): Search query.\n\n    Returns:\n    - list[str]: A list of strings, each string includes video names and URLs.\n    """\n<eos>', 'latency': 2.5285379886627197}
latency: 2.528637647628784  s

跟android_functions对比,发现其实上述的函数参数是错误的。根据android_functions中定义的get_trending_news函数:

def get_trending_news(query, language):
    """
    Retrieves a collection of trending news articles relevant to a specified query and language.

    Parameters:
    - query (str): Topic for news articles.
    - language (str): ISO 639-1 language code. The default language is English ('en'), but it can be set to any valid ISO 639-1 code to accommodate different language preferences (e.g., 'es' for Spanish, 'fr' for French).

    Returns:
    - list[str]: A list of strings, where each string represents a single news article. Each article representation includes the article's title and its URL, allowing users to easily access the full article for detailed information.
    """

看出,上述生成结果,杂合了get_trending_newssearch_youtube_videos的结果。可能是中文识别效果差,需要针对中文进一步微调。

6. 总结

Octopus v2的训练结果表明,特定函数可以通过新型的功能性标记(函数token)进行封装,这种token可无缝集成到模型中。该高效的训练过程成本低廉,促进了快速、准确的人工智能代理部署。

Octopus的广泛影响显著,应用开发者如DoorDash和Yelp可以将常用API转化为函数token,实现更自动化的工作流程,类似于苹果Siri,但响应速度和准确性更高。

此外,将Octopus应用于PC、智能手机及可穿戴设备的操作系统也是一个重要方向。开发者可以针对不同操作系统训练小型LoRA,提升跨系统组件的函数调用效率,尤其是在Android生态系统中。

未来的目标是开发专用于设备内推理的模型,提升云部署速度超越GPT-4,并支持本地部署,为关注隐私和成本的用户提供解决方案。这一策略增强了模型的实用性,满足了不同用户对速度、效率、隐私及成本的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

即插即用!高德西交的PriorDrive:统一的矢量先验地图编码,辅助无图自动驾驶

Driving with Prior Maps: Unified Vector Prior Encoding for Autonomous Vehicle Mapping 论文主页&#xff1a;https://misstl.github.io/PriorDrive.github.io/ 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 代码链接&#xff1a;https://github.com/missTL/Pr…

【数据结构】排序算法---直接插入排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 7. 折半插入排序代码实现——C 结语 1. 定义 直接插入排序是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分&#xff0c;每次从「未排序的」…

PHP Swoole实现简易聊天室,附加小程序端连接websocket简易代码

目录 用到的工具&#xff1a; PHP Swoole拓展 | PHP Redis拓展 | Redis 7 一、安装上述必要工具&#xff08;下面是以宝塔面板中操作为例&#xff09; 给PHP安装Swoole和Redis拓展&#xff1a; 安装Redis软件 二、创建websocket服务器文件"wss_server.php" 具…

node.js+Koa框架+MySQL实现注册登录

完整视频展示&#xff1a;https://item.taobao.com/item.htm?ftt&id831092436619&spma21dvs.23580594.0.0.52de2c1bg9gTfM 效果展示&#xff1a; 一、项目介绍 本项目是基于node.jsKoamysql的注册登录的项目,主要是给才学习node.js和Koa框架的萌新才写的。 二、项目…

java数据结构----图

图的存储结构: 代码实现 public class Graph {// 标记顶点数目private int V;// 标记边数目private int E;// 邻接表private Queue<Integer>[] adj;public Graph(int v) {V v;this.E 0;this.adj new Queue[v];for (int i 0; i < adj.length; i) {adj[i] new Queu…

C++的类与对象中(主讲默认成员函数)

目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造&#xff08;调用编译器自动生成的默认构造函数&#xff09; 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…

微服务——网关路由(Spring Cloud Gateway)

网关路由 1.什么是网关 网关又称网间连接器、协议转换器&#xff0c;是在网络层以上实现网络互连的复杂设备&#xff0c;主要用于两个高层协议不同的网络之间的互连。网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由…

【深度智能】:迈向高级时代的人工智能全景指南

​ ​ 前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;人工智能立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 第一阶段&#xff1a;基础知识 1. 计算机科…

人脸防伪检测系统源码分享

人脸防伪检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【Python基础】Python 装饰器(优雅的代码增强工具)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、装饰器基础三、语法糖 四、带参数的装饰器五、多层装饰器六、总结 一、前言 在Python编程的世界里…

【手撕】快排-分治

1. 颜色分类 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/sort-colors/description/ 代码 class Solution {public…

Neo4j入门案例:三星堆

创建一个关于三星堆的知识图谱可以是一个非常有趣的项目&#xff0c;它可以帮助理解如何使用Neo4j来存储和查询复杂的关系数据。三星堆文化以其独特的青铜器、金器和其他文物而闻名&#xff0c;这为我们提供了一个丰富的历史背景来构建知识图谱。 数据模型定义 实体类型&#…

数据安全查询-—SAAS本地化及未来之窗行业应用跨平台架构

一、数据库安全查询 默认数据库查询是不区分大小写的&#xff0c;这样无法区分Mm&#xff0c;Admin&#xff0c;admin 二、thinkphp 区分大小写 $condition "binary appdhj_sn {$应用sn}"; 三、原始mysql select * from TableA where binary columnA aaa; 四、…

mtk7628 网口灯问题

板子上电插入网线到网口&#xff0c;只有wan口灯会亮&#xff0c;插入lan口灯不会亮。对比了ok的代码&#xff0c;先对比设备树&#xff0c;未看到网口相关的GPIO。 mt7628an_WMD-7688A-12816.dts mt7628an_hilink_hlk-7628n.dts 继续查看网口相关代码&#xff0c;加打印&…

Android应用程序启动源码分析

文章目录 Android应用程序启动源码分析一、启动流程二、Launcher通知AndroidOS(用户点击图标)2.1 Activity.java2.2 Instrumentation.java2.3 ActivityTaskManagerService.java2.4 ActivityStarter.java2.5 RootWindowContainer.java2.5.1 Task.java2.5.2 TaskFragment.java 2.…

基于python+django+vue的个性化餐饮管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的视…

勇于尝试,永远行动 - 《洛克菲勒写给儿子的38封信》读书笔记

两倍速听过好几遍的书&#xff0c;洛克菲勒的思想和志向&#xff0c;配得上他的成就。 “在尝试中寻找突破&#xff0c;在行动中成就自我。”这是洛克菲勒写给儿子的箴言&#xff0c;也是他一生的真实写照。在这38封信中&#xff0c;他不仅分享了自己的工作心得&#xff0c;更…

Docker安装mysql安装nginx安装Redis

Docker安装mysql 下载镜像 docker pull mysql:8.0注意,使用此方法安装镜像需要提前配置镜像源,详情看之前的文章 安装 docker run -d -p 3306:3306 \ --name mysql \ --restartalways \ --privilegedtrue \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ mysql:8.0进…

【重学 MySQL】二十九、函数的理解

【重学 MySQL】二十九、函数的理解 什么是函数不同 DBMS 函数的差异函数名称和参数功能实现数据类型支持性能和优化兼容性和可移植性 MySQL 的内置函数及分类单行函数多行函数&#xff08;聚合函数&#xff09;使用注意事项 什么是函数 函数&#xff08;Function&#xff09;在…

【PHP代码审计】 PHP环境搭建

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 安装phpstudy 泥菩萨-CSDN博客 安装vscode 直接去官网下载安装包&#xff0c;然后双击安装即可。官网地址&#xff1a;htt…