无论是 LLM 还是 Agent 发挥胜寒里的核心点是「工具调用」或者说「函数调用」, 但是目前来看说通用的模型,函数调用的性能还不能很好满足我们的需求。本文探讨 如何提升函数调用准确性的一些方案。
先提个醒,论文内容并不一定(大多时候不)适合我们的场景, 而且论文提出的方法也并不是创新性的,而是工程实验性的。 大家核心关注作者们怎么发现问题、实验以及解决问题的思路。 这个思路是我们大多数应用设计开发中经常面对的。
这部分内容主要来自下面论文: 《Robust Function-Calling for On-Device Language Models via Function Masking》:
函数调用的过程
函数调用的过程
我们先介绍一个典型的函数调用过程,如上图所示。 在这个过程中,
-
每个候选函数都包含几个部分, 包括函数名、参数名、默认值和描述。该
-
模型的目标是输出完整、准确的函数调用代码,以实现用户的意图,
-
或者输出一个空列表,表示给定的候选函数都不能满足用户的要求。
实现这一目标取决于模型能否准确地将用户的意图与候选函数的功能相匹配, 即选择合适的函数,以及模型能否理解每个参数的用法,即用正确的参数填充函数。
发现的问题
在实践中观察到了一些反复出现的问题:
-
函数名称和参数名称的误导
-
过度关注命名的影响
函数名称和参数名称的误导
函数的定义通常包括函数名称、参数名称和描述。 函数和参数名称的格式通常非常紧凑,例如 cal_sum
或 max_value
, 并且受设计者的个人风格和偏好的影响。 当模型试图仅从函数名称推断函数的用途时, 这种紧凑性可能会导致歧义,从而误导模型的选择, 尤其是在存在复杂功能的情况下。
例如,名为parse_data
的函数可能用于解析 JSON 数据, 但同一名称可能指在不同上下文中解析 CSV 文件,从而导致潜在的误解。
同样,在根据参数名称推断参数用法时,模型可能会受到训练数据集中类似名称参数的历史用法的误导。 更具体地说,这些误导场景可以分为几种情况。
函数名称误导。当用户意图与训练标签中存在的函数名称高度一致时, 模型可能会在测试期间错误地将该函数从候选列表中优先考虑,即使其功能与预期操作有很大差异。
例如,如果训练对中包含一个名为fetch_data
的函数用于从数据库检索用户数据, 但在测试集中,同名函数从外部 API 检索数据,则模型可能会错误地仅根据名称选择它。
参数名称误导。在测试环境中,当参数的功能和描述发生变化时, 模型经常会坚持其原始的参数使用模式,从而导致错误的函数调用。
例如,如果函数的参数超时在一个上下文中应为表示秒的整数,但 在另一个上下文中,它被定义为“10s”格式的字符串,则模型对原始整数格式的依赖可能会导致错误调用。
命名偏好带来的困扰。当测试环境中函数或参数的命名约定与训练数据集中的命名约定不同时, 模型的稳健性可能会降低。诸如CamelCase
和snake_case
之间的差异等变化可能会降低模型的置信度, 因为设备上的轻量级模型可能难以在不同的命名风格中进行推广。
过度关注命名的影响
下面看看我们在测试集中屏蔽了函数和参数名称,即用随机字符串替换它们,并观察模型性能的变化。 受测试模型的性能大幅下降。
Hammer 模型在相同设置下的性能, 性能下降要小得多,证明了它在面对任意函数和参数命名模式时具有很强的适应性。
下面看如何实现。
方法
函数屏蔽
缓解上述问题的直接方法是尽量减少函数名称和参数名称的干扰,同时强制模型根据候选函数的描述理解其功能和用法。
描述的优点:
-
描述提供了更灵活的自然语言解释,通常封装了函数和参数名称想要传达的信息。
-
虽然描述在某种程度上也能反映设计者的个人风格,但它们往往更准确、更详细,从而降低了出现歧义或误导的可能性。
下图展示了函数屏蔽的过程:
函数屏蔽
论文结果肯定是好的,看下测试结果:
Hammer2.0
Hammer2.0[2] 已经在 HuggingFace 上发布,最小的仅为 0.5B,最大的为 7B, 大家可以在自己的环境或者 MaaS 平台部署测试。
Hammer2.0
注意
最后大家在注意一下,论文中的函数屏蔽方案可能 大多数时候并不使用与我们自己的场景。
我接触的客户多是基于API调用,其函数数量也不会太多, 所以性能而本身更依赖函数 Schema 的定义,以及基础模型本身和的性能。
大规模函数调用当函数数量到达一定数量级的时候,我们可以使用 RAG+Func Template 的方式 来实现,可以参考我之前讲 Chat SQL 的相关文章。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。