- 引言
- 简介
- LLM函数调用
- 数据生成
- 模型微调
- 用Tool RAG提效
- 边缘部署与量化
- 总结
- 引言 =======
从此音尘各悄然,春山如黛草如烟。
小伙伴们好,我是微信公众号《小窗幽记机器学习》的小编:卖香芋的小女孩。延续之前端侧大模型系列:
端侧大模型系列 | 端侧Agent合纵连横AI江湖,破局端侧大模型之困!Octopus v4
端侧大模型系列 | 不到10亿参数的端侧Agent竟媲美GPT-4V,AI手机端倪初现?且看Octopus v3
端侧大模型系列 | 斯坦福手机端侧Agent大模型:Octopus v2
端侧大模型系列 | 陈天奇MLC-LLM重磅升级:基于机器学习编译的通用LLM部署引擎
端侧大模型系列 | 如何将千问大模型Qwen部署到手机上?环境安装及其配置(上篇)
端侧大模型系列 | 如何将千问大模型Qwen部署到手机上?实战演示(下篇)
端侧大模型系列 | PowerInfer-2助力AI手机端侧部署47B大模型
今天这篇小作文主要介绍一种名为TinyAgent的端侧Agent方案。大语言模型(LLMs)通过自然语言来执行指令,增强了AI Agent系统的能力,尤其是在协调工具如ToolFormer和Gorilla时。然而,由于这些模型需要大量计算资源,通常在云端进行推理,这带来了隐私、安全和延迟等问题。为了应对这些挑战,许多研究者探索边缘设备上本地部署模型的可能性。
TinyAgent项目提出了一种解决方案:训练小型语言模型(SLM)以模仿大模型的关键能力,但不依赖于记忆通用世界知识。通过使用高质量、专用的数据集,研究人员展示了小型模型在函数调用任务中可以超越GPT-4-Turbo的性能。这些小型模型能够高效地在边缘设备上部署,确保隐私和实时响应,特别适用于语义系统中的应用场景,如在类似Siri的应用中协调工具和API集。TinyAgent的研究方向包括提高小型模型的函数调用能力,并通过创新的Tool RAG方法进一步优化性能。
以下是官方在Macbook M3 Pro上本地运行的TinyAgent-1B和Whisper-v3演示。
如果对 端侧模型 感兴趣可以订阅整个合集。
- 简介 =======
TinyAgent是一个旨在实现边缘设备上函数调用的小型语言模型项目。主要特点和贡献包括:
- 目标是开发能在边缘设备上安全私密部署的小型语言模型(SLM),实现复杂推理能力。
- 通过在高质量的函数调用数据集上微调,使1.1B和7B参数的小模型在函数调用任务上超越了GPT-4-Turbo。
- 提出了Tool RAG方法,通过高效选择相关工具来减少提示词长度,提高性能。
- 使用4位量化进行高效边缘部署,减少了30%的延迟和4倍的模型大小。
- 以MacOS助手为应用场景,实现了16种不同功能的本地交互,包括邮件、日历、文件管理等。
- 最终的TinyAgent-1.1B模型可以在MacBook上本地部署运行,支持语音输入,精度超过GPT-4-Turbo。
- 该项目展示了通过特定数据和技术,小型语言模型也能实现复杂的函数调用和推理能力,为边缘AI应用开辟了新的可能性。
这个项目证明,通过精心设计的数据集和训练策略,小型语言模型也能在特定任务上达到甚至超越大模型的表现,同时保证了隐私和高效部署。
论文地址:https://arxiv.org/abs/2409.00608
GitHub地址:https://github.com/SqueezeAILab/TinyAgent
模型下载:https://huggingface.co/squeeze-ai-lab/TinyAgent-1.1B
更多大模型相关,如 模型解读、模型微调、模型部署、推理加速 等,可以留意本微信公众号《小窗幽记机器学习》
- LLM函数调用 ============
图1:LLMCompiler函数调用规划器概述。规划器理解用户query并生成任务序列及其相互依赖关系。然后,LLMCompiler框架调度这些任务以完成用户命令。在此示例中,任务2被一起获取,以独立检索Sid和Lutfi的电子邮件地址。 正如上文所述,TinyAgent官方主要关注的是将用户查询转换为函数调用序列以完成任务的应用。在这些应用中,模型不需要自己编写函数定义,因为函数(或API)大多是预定义且已可用的。因此,模型需要做的是确定:
- 需要调用哪些函数
- 相应的输入参数
- 以及基于函数调用之间的依赖关系来确定正确的调用顺序(即函数编排)。
首要问题是找到一种有效的方法来让小型语言模型(SLMs)执行函数调用。大型模型如GPT-4能够执行函数调用,但如何实现开源模型的这一功能?LLMCompiler是TinyAgent团队最近开发的一个框架,它通过指导LLM输出一个函数调用计划来实现这一点,该计划包括需要调用的函数集合、输入参数及其依赖关系(见图1示例)。一旦生成了函数调用计划,可以解析它,并根据依赖关系调用每个函数。
关键部分在于教会模型以正确的语法和依赖关系创建这个函数调用计划。最初的LLMCompiler论文仅考虑了大型模型,如LLaMA-2 70B, 当提供足够的提示时,这些模型具备复杂的推理能力来创建计划。然而,小型模型是否可以通过相同的方式提示以输出正确的函数调用计划?遗憾的是,实验显示,现成的小型模型如TinyLLaMA-1.1B(甚至是更大的Wizard-2-7B模型)无法输出正确的计划。错误包括使用错误的函数集、幻觉式命名、错误的依赖关系、不一致的语法等问题。
这在意料之中,因为这些小型模型是在通用数据集上训练的,主要目标是在一般基准测试中取得高的准确性,这些测试大多考察模型的世界知识和一般推理或基本指令遵循能力。为了解决这一问题,TinyAgent研究员探索通过在专门为函数调用和规划精心策划的高质量数据集上微调这些模型,并试验是否可以提高小型语言模型在特定任务中的准确性,甚至超过大型模型。接下来,首先讨论如何生成这样的数据集,然后讨论微调方法。
- 数据生成 =========
作为一个应用实例,TinyAgent研究人员为Apple的Macbook开发一个本地Agent系统,以解决用户的日常任务,如图2所示。
图2:TinyAgent是一个助手,可以与各种MacOS应用程序交互以协助用户。用户可以通过Spotlight输入文本或通过语音向其发出命令。 这个Agent配备了16种不同的功能,可以与Mac上的不同应用程序交互,包括:
- 电子邮件 :撰写新邮件或回复/转发邮件
- 联系人 :从联系人数据库中检索电话号码或电子邮件地址
- 短信 :向联系人发送短信
- 日历 :创建日历事件,包括标题、时间、参与者等详细信息
- 便笺 :在各种文件夹中创建、打开或追加内容到便笺
- 提醒 :为各种活动和任务设置提醒
- 文件管理 :打开、阅读或总结不同文件路径中的文档
- Zoom会议 :安排和组织Zoom会议
这些功能/工具都有预定义的Apple脚本,模型所需做的只是利用这些预定义的API,并确定正确的函数调用计划来完成给定任务,如图1所示。但如先前所述,由于小型语言模型的现成函数调用能力较差,所以需要一些数据来评估和训练它们。
纯人工创建多样化的函数调用计划的数据既具有挑战性又不可扩展,为此,TinyAgent官方使用像GPT-4-Turbo这样的LLM来合成数据。这种方法正在日趋常态化,使用一个功能强大的LLM,根据指示生成类似于给定样本或模板的数据(参见LLM2LLM和Self-Instruct)。在研发TinyAgent的工作中,研究人员使用了类似的方法,但不是提供通用的用户query作为模板,而是提供各种函数集,并指示它生成需要这些函数来完成任务的真实用户query,以及关联的函数调用计划和输入参数,如图1所示。为了验证生成数据的有效性,在函数调用计划上进行了合理性检查,以确保它们形成一个可执行的图,并且函数名称和输入参数类型都是正确的。通过这种方法,创建了8万条训练数据、1千条验证数据和1千条测试数据,总成本仅约为500美元。
- 模型微调 =========
图3:图同构成功率。只有当模型生成计划的有向无环图(DAG)与真实计划的DAG同构时,其成功率为1,否则为0。在上面的例子中,对于顶部情况,虽然获取电子邮件地址的顺序与真实计划不同(真实计划先获取Lutfi的电子邮件地址,生成的计划先获取Sid的电子邮件地址),但由于两个DAG是同构的,因此计划的成功率为1。对于底部情况,由于预测的DAG包含错误的节点,对应错误的函数调用,计划的成功率为0。 紧随前文数据集构建的介绍,可以着手微调现成的小型语言模型(SLM),以增强其函数调用能力。从两个基础小模型开始:TinyLlama-1.1B(instruct-32k版本)和Wizard-2-7B。微调这些模型前,首先需要定义一个评估其性能的指标。目标是让这些模型准确生成正确的计划,这不仅涉及选择正确的函数集,还要正确地按顺序组织它们。因此,定义了一个成功率指标,如果同时满足这两个标准,则赋值为1,否则为0。检查模型是否选择了正确的函数调用集相对简单。为了确保这些函数的编排正确,基于依赖关系构建一个函数调用的有向无环图(DAG),如图3所示,其中每个节点代表一个函数调用,节点A到B的有向边表示它们的依赖关系(比如,函数B只能在函数A执行后执行)。然后,比较这个DAG是否与真实计划的DAG相同,以验证依赖关系的准确性。
在定义了评估指标后,使用LoRA以7e-5的学习率在8万条训练样本上对模型进行3轮微调,并根据验证集性能选择最佳的检查点。对于微调,提示(prompt)不仅包括真实计划中使用的函数的描述,还包括其他不相关的函数作为负样本。实验发现负样本对于教会模型如何为特定query选择合适的工具特别有效,从而提高了训练后的性能。此外,还包括几个上下文示例,展示如何将query转换为函数调用计划。这些上下文示例是通过基于训练数据集中用户query的检索增强生成(RAG)过程选择的。
使用上述设置,微调了TinyLlama-1.1B和Wizard-2-7B模型。微调后,1.1B模型的成功率从12.71%提高到78.89%,7B模型的性能从41.25%提高到83.09%,比GPT-4-Turbo高约4%。
- 用Tool RAG提效 ================
图4:基于用户输入的高效工具选择。并非所有用户输入都需要使用所有可用工具,因此选择合适的工具集以最小化提示(prompt)大小并提高性能是至关重要的。在这个case下,LLM只需在其提示中包含获取电子邮件地址和创建日历事件的功能即可完成任务。
这里的主要目标是在Macbook上本地部署TinyAgent模型,相较于像GPT这样的闭源模型所使用的GPU,Macbook可用的计算和内存资源有限。为了实现低延迟的高效性能,一方面要确保模型尺寸较小,同时需要让输入的提示尽可能简洁。后者由于注意力机制对序列长度的二次复杂性,对延迟和计算资源消耗有重要影响。
前面讨论的微调TinyAgent模型在提示中包含了所有可用工具的描述 ,但这种效率很低。可以通过仅包含用户query相关工具的描述来显著减少提示大小。例如,图4中展示的例子中,用户要求创建一个包含两个人的日历邀请。在这种情况下,LLM只需要在其提示中包含获取电子邮件地址和创建日历事件的功能。
为了践行上述观察,需要确定完成用户命令所需的功能,这被称为Tool RAG,因为它类似于检索增强生成(RAG)的工作方式。然而,这里有一个重要的细微区别。如果使用基本的RAG方法,计算用户query的嵌入并用它来检索相关工具,性能会很低。这是因为完成用户query通常需要使用几个辅助工具,而如果辅助工具的嵌入与用户query不相似,简单的RAG方法可能会遗漏这些工具。例如,图4中的例子,虽然用户query只是询问创建日历邀请,但是需要调用获取电子邮件地址的功能。
为此,可以通过将问题视为所需工具的分类来解决这一问题。为此,在训练数据上微调了一个DeBERTa-v3-small模型,进行16类分类,如图5所示。用户query作为输入提供给该模型,然后通过一个简单的全连接层(大小为768x16)将CLS token 转换为一个16维向量(即候选工具的总数)。这一层的输出通过一个sigmoid层来生成每个工具被选择的概率。在推理过程中,选择概率高于50%的工具,并在提示中含括它们的描述。平均而言,发现只检索到3.97个工具,召回率为0.998,而基本RAG需要使用前6个工具才能达到0.968的工具召回率。
图5:Tool RAG方案概述。将工具检索表述为一个多标签分类问题。用户查询作为输入提供给微调的DeBERTa-v3-small模型,该模型输出一个16维向量表示工具概率。选择概率高于50%的工具,平均每个查询选择3.97个工具,而基本RAG选择6个工具。 在引入Tool RAG后,评估了模型性能。结果如表1所示,报告了简单RAG系统与微调的DeBERTa方法的性能。可以看到,基于DeBERTa的Tool RAG方法几乎达到了完美的召回性能,提高了基线准确性,同时将提示大小减少了约一半。
表1:TinyAgent在使用DeBERTa、基本RAG和无使用RAG设置下的性能比较。
Tool RAG方法 | 工具召回率 | 提示大小(token数) | TinyAgent 1.1B成功率(%) | TinyAgent 7B成功率(%) |
---|---|---|---|---|
无RAG(提示中包含所有工具) | 1 | 2762 | 78.89 | 83.09 |
基本RAG | 0.949(前3个) | 1674 | 74.88 | 78.50 |
微调DeBERTa-v3-small(TinyAgent官方的) | 0.998(概率>50%的工具) | 1397 | 80.06 | 84.95 |
- 边缘部署与量化 ============
即使是小型的O(1B)参数模型,在消费者MacBook等边缘设备上部署模型仍然具有挑战性,因为加载模型参数可能会消耗大量可用内存。解决这些问题的一种方法是量化,以降低的位精度存储模型。量化不仅减少了存储需求和模型占用,还降低了将模型权重加载到内存所需的时间和资源,从而也减少了整体推理延迟(有关量化的更多信息,请参见此处)。
为了更高效地部署模型,这里将模型量化为4位,并将group size设置为32。具体是使用llama.cpp框架中的量化感知训练(QAT)方法。如表2所示,4 bit模型的延迟缩短了30%,同时模型大小减少了4倍。此外,还注意到准确率略有提高,这归因于使用模拟量化进行的额外微调。
表2:TinyAgent模型在量化前后的延迟、模型大小和成功率。延迟是函数调用计划器的端到端延迟,包括提示处理时间和生成时间。
模型 | 权重精度 | 延迟(秒) | 模型大小(GB) | 成功率(%) |
---|---|---|---|---|
GPT-3.5 | 未知 | 3.2 | 未知 | 65.04 |
GPT-4-Turbo | 未知 | 3.9 | 未知 | 79.08 |
TinyAgent-1.1B | 16 | 3.9 | 2.2 | 80.06 |
TinyAgent-1.1B | 4 | 2.9 | 0.68 | 80.35 |
TinyAgent-7B | 16 | 19.5 | 14.5 | 84.95 |
TinyAgent-7B | 4 | 13.1 | 4.37 | 85.14 |
- 总结 =======
总结来说,本文介绍了TinyAgent,并实证训练一个小型语言模型并用它来支持处理用户查询的语义系统是可行的。 特别是,将类似Siri的Mac助手作为驱动应用。 实现这一目标的关键组件是:
- 训练小型语言模型通过LLMCompiler框架执行函数调用
- 为当前任务策划高质量的函数调用数据
- 在生成的数据上微调现成模型
- 通过一种称为ToolRAG的方法仅根据用户查询检索。
前文在Macbook Pro M3上的演示是基于 TinyAgent-1.1B模型,此外可以下载该app并安装在你的Mac上进行测试。 它不仅在你的计算机上本地运行所有模型推理,还允许你通过麦克风提供语音命令。 TinyAgent官方也使用Whisper-v3模型在本地处理音频,该模型通过whisper.cpp框架本地部署。 令人惊讶的是,1.1B模型的准确性超过了GPT-4-Turbo,并且在本地私密部署时速度非常快。#端侧大模型 #端侧部署 #智能体 #Agent #端侧Agent #AIOS #函数调用 #Apple生态 #Mac