深入浅出:多功能 Copilot 智能助手如何借助 LLM 实现精准意图识别

阅读原文

1. Copilot中的意图识别

如果要搭建一个 Copilot 智能助手,比如支持 知识问答数据分析智能托管AIGC 等众多场景或能力,那么最核心的就是基于LLM进行意图识别分发能力,意图识别的准确率直接决定了 Copilot 智能助手的能力上限。

针对丰富且复杂的 query,需要构建足够强的意图识别模型来准确理解 query 背后的意图和深层次的需求,并将其分发至相应的服务模块对 query 进行承接。对此,我们可以通过高质量的数据预处理与增强技术获得大批高质量数据,能够帮助模型学习丰富的语义特征,使其学会识别意图的语义边界,提升意图识别的准确性。

2. 垂域意图识别的挑战

领域封闭性:Copilot智能助手一般都是在特定的业务领域中进行搭建,比如“商家智能助手”,垂域意图范围集中且高度专业化,通用语义模型的泛化能力难以完全满足实际需求,有时意图数量高达几百个且每个都与业务属性密切相关,需要更深的行业语义理解。

语义边界模糊:多种意图之间具有高度相关性(或相似性),意图的语义边界不够清晰。

3. 数据驱动方法论

可以回顾一下,在日常的算法工作中,经常会遇到两类需求:

  1. 规则化:要求模型必须做什么,必须不能做什么。针对这种需求,简单且有效的方法是将规则写入 prompt,让模型遵循硬规则的指令,或者调用函数工具,处理成符合硬规则的结果。
  2. 表现力:要求模型提升某种表现力,但这种表现力较为复杂,难以被简单的规则所描述。例如意图识别就是一种表现力,哪些query应该被分配到哪些意图是难以被简单的硬规则所描述的。而实践证明针对这种表现力的需求,最佳实践是数据驱动

数据驱动实际上是一种思维方式,它告诉我们大部分问题无法通过类似if-else的方法映射地去解决,而是需要 Case-Based Learning,让模型学习通过大量高质量样本学习到能力。这也是大模型和 ImageNet 共通的构建思路。

2006 年,计算机视觉研究仍然是一个缺乏资金,且很少收到外界关注的学科。许多研究人员专注于构建更好的算法。他们坚信,算法是计算机视觉的中心,如果把机器智能与生物智能做类比,那么算法就相当于机器的突触,或者说是大脑中错综复杂的神经回路。有什么比让这些回路变得更好、更快、更强大还要重要的呢?
但李飞飞并不这么认为。彼时,她刚刚获得加州理工大学的博士学位,在伊利诺伊大学厄巴纳-香槟分校担任助理教授的职位。在攻读博士期间,李飞飞意识到了这种研究思路的局限性:如果训练算法的数据不能很好地反映现实世界,那么即使是最好的算法也无法很好地完成工作。
李飞飞的想法是:构建一个能够完全反映真实世界的数据集。

因此,做好意图识别的第一步就是构建一个能够尽可能反映真实世界的意图语义的数据集,特别是各个意图语义的边界,来让模型准确区分意图。此外,这个数据集还需要支持快速的意图迭代节奏,能够保持意图准确的情况下,根据意图迭代点及时变化意图分布,刻画新的意图边界。

3.1 数据增强

通用LLM说在垂域的意图识别数据上的泛化性并不强,本质上是原因是样本不具有多样性,无法刻画意图的语义边界。

为了让模型掌握分类的语义边界,需要一批处于语义边界的 hard sample,即困难样本加入训练集。因此,可以从原有的少量样本(实际业务场景中通过人工标注的几百到上千条)出发,自动扩展出困难样本,并且保证这种自动扩展是低成本且鲁棒的(不会出现意图标签的变化),也就是数据增强。

方法描述增强比例
随机重复分为词级的随机重复和字符级的随机重复。对于词级的随机重复,首先进行分词,随后随机挑选一个词进行重复;对于字符级的随机重复,随机挑选三个字符进行重复。1:2
错别字替换采用《A Hybrid Approach to Automatic Corpus Generation for Chinese Spelling Check》的错别字字典,随机挑选三个字符进行错别字替换。1:1
随机位置替换随机选择邻近的两个字,对这两个字的顺序进行变换1:1
同义改写调用 GPT-4,编写 Prompt 提示大模型同义改写1:3
同义扩写调用 GPT-4,编写 Prompt 提示大模型同义扩写1:3
多句融合随机选择两个意图不同的query,调用 GPT-4,编写Prompt 提示大模型将两个标问改写为一个query,意图标签是2个意图2:1

需要注意的是,为了保证增强样本的意图和原样本一致,可以人工总结一些关键业务实体列表(比如“服务竞争力”、“体验分”等),并在增强过程中避免对这些业务实体进行改变,从而保证关键语义没有被改变。然后经人工筛查验证,保证增强样本的意图一致率。

另外,为了保证一个 query 对应唯一的意图,并且避免模型对单个重复 query 的过拟合,需要对所有样本进行去重,保证每个 query 仅出现1次。

经过上述数据增强方法,样本数可从 几百上千扩展至几万,以下是扩展数据前后的训练Loss变化情况:

样本训练 Loss验证 Loss
增强样本在这里插入图片描述在这里插入图片描述
未增强样本在这里插入图片描述在这里插入图片描述

可以发现:

  1. 未进行数据增强时,训练 loss 在前期快速收敛,然而,由于训练样本少,模型无法在验证集上有好的泛化效果,验证 loss 维持在一个较高的水平(0.057 以上)。而到了训练后期,模型呈现出过拟合的趋势,虽然训练 loss 趋近于 0,但验证 loss 逐步上升至 0.06 左右。
  2. 进行数据增强后,训练 loss 呈现出随着 epoch 阶梯式下降的趋势,这是因为训练集具备多样性,各个样本语义差异大,因此模型仅在“看”过整个训练集后才能对已“看”过的样本做出较好的推理。此外,由于训练集蕴含的规律模式较为丰富,模型在验证集上有较好的泛化性,最佳验证 loss 在 0.036 左右。

上述的结论在全链路评测中也得到了验证,经过数据增强后,模型在各个数据集上的意图准确率都得到了大幅提高。

3.2 负样本构造

在上述增强方法中,我们关注的是意图之间的语义边界,而忽略了 Copilot 的意图识别实际上是封闭域的,应当将意图的外部边界也纳入建模范围内,否则会导致过拟合现象。例如,在对数据集进行 badcase 分析时,你会发现在数据增强后,模型对于特定意图存在过拟合现象。这是因为某类意图的样本占比非常高(比如20%甚至更多),导致当输入一些简短 query 时(意图不明确时),模型会倾向于输出占比高的(20%)样本的意图。针对上述问题,可以专门构造一个“其他”意图,用来承接除业务意图之范围外的开放域 query。

在这里插入图片描述

主要构造方法包括:

  1. 闲聊语料:调用 GPT-4,套取非业务意图的闲聊query,例如:你今天过得怎么样?
  2. 模糊短语:真实的用户query一般都很简短且部分query意图非常模糊,因此,为了针对性优化这些简短模糊的query,可以收集一些高频且表达模糊的短语,具体操作为
    a. 采用 n-grams 进行分词得到短语,其中 n 取 1、2、3
    b. 统计短语的出现频次比例和对应的意图个数
    c. 筛选频次比例 >= 0.001(高频) 且 意图个数 >= 40(意图模糊)的短语作为样本,标注意图为“其他”

经过实践证明,通过上述的负样本优化,可以进一步地提高意图准确率。

3.3 标注提效

为了积累更多真实的样本,可以抽取线上真实的用户query进行批量的标注,主要方法是可以先通过 GPT-4 或者其它开源LLM等进行批量的标注,然后再对部分数据进行人工校验。

在这里插入图片描述

  1. 调用 GPT-4 进行意图标注,并挨个进行人工校验
  2. 调用 GPT-4 和其它多个开源LLM进行意图标注,通过投票方式将多个模型标注一致的样本直接进入样本库,并对模型标注不一致的样本(困难样本)进行人工校验。这个方案本质上和集成学习(Ensemble Learning)的原理差不多。

在标注的过程中,应该更加关注那些容易混淆的困难样本,因为这些困难样本就是在意图语义空间中处于边界的样本,对于意图准确率的提升至关重要,可以通过一种智能筛选的方法以快速筛选困难样本:可以统计各个 query 的语义距离,如果语义距离小于一个阈值(比较相似),但标注的意图不同,则可以认为这两个样本是难以区分的,加入到困难样本池中,最后进行人工重标注。

语义相似度的计算方法很多,例如编辑距离、LLM Embedding余弦距离、BGE余弦距离等,考虑到速度和便利性的话,建议使用编辑距离来计算语义相似度。

4. 训练优化

4.1 训练方式

为了找出高效的训练方法,使用不同的训练方式、不同的批大小、不同的学习率进行了大量实验,最终可以找到合适的训练方式和训练参数设置。

训练方式批大小学习率耗时验证 loss
LoRA321e-41 h0.0066
325e-41 h0.0044
641e-51 h0.014
642e-51 h0.0087
645e-51 h0.0084
641e-41 h0.0076
645e-41 h0.0056
641e-31 h0.0044
1285e-41 h0.0062
1281e-31 h0.0052
SFT(全量)45e-75 h0.0047
81e-73 h0.0056
85e-73 h0.0058
81e-63 h0.0044
82e-63 h0.0044
85e-63 h0.0042
81e-53 h0.0050
165e-72 h 20 mins0.0052
165e-62 h 20 mins0.0029
161e-52 h 20 mins0.0037
325e-72 h 15 mins0.0044
325e-62 h 15 mins0.0034
321e-52 h 15 mins0.0034
645e-72 h 4 mins0.0041
645e-62 h 4 mins0.0045
641e-52 h 4 mins0.0040
1285e-72 h 4 mins0.0042
  1. 相比于 LoRA,SFT(全量) 消耗的算力和时间较多,但是 SFT(全量) 在验证集上的 loss 更低,说明训练效果更好一些。这是因为意图识别所需的样本量较大(~10万),而 LoRA 只引入了低秩矩阵来调整模型,因此其对模型的修改是有限的,相比于全量微调在样本量较大的情况下会损失一些泛化能力。
  2. 当批大小提高时,整体的训练时间也在逐步减少,但是存在效益低减的情况。这是因为批大小的增大虽然能够减少整体所需算力,但是最终会受到 IO 和并行的影响,导致整体 GPU 利用率较低。
  3. 在学习率的选取上,大的学习率可能会导致 loss 不稳定,而小学习率可能会导致欠拟合。通过经验和实验确定,全参微调的学习率应设定在 5e-6 至 1e-5 之间,而LoRA的学习率应设定在 5e-4 左右。

4.2 基座选择

为了验证不同的大模型基座对下游意图识别任务的影响,可以对不同尺寸的大模型基座进行实验

模型验证 Loss
Qwen2.5-7B-Instruct在这里插入图片描述
Qwen2.5-14B-Instruct在这里插入图片描述

可以看到,随着模型尺寸的增大,eval loss 略微下降,这说明模型的泛化能力有略微的提升。从评测指标上来看,随着模型尺寸的增大,准确率略有上升,但上升幅度不大。这种趋势符合《Scaling Laws for Neural Language Models》中描述的缩放定律。

此外,还可以对比相同尺寸的大模型基座对下游意图识别任务的影响

模型验证 Loss
Qwen2.5-7B-Instruct在这里插入图片描述
Qwen2.5-7B在这里插入图片描述

可以发现,相同尺寸的大模型在微调后的表现几乎一致,这说明意图识别仅需要大模型预训练所带来的语义理解能力,而不需要指令微调带来的指令遵循能力。这和意图识别本身的任务特点有关(重点在于语义的理解,而非复杂指令的遵循)。

阅读原文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ZED-OpenCV项目运行记录

项目地址:GitCode - 全球开发者的开源社区,开源代码托管平台 使用 ZED 立体相机与 OpenCV 进行图像处理和深度感知 • 使用 ZED 相机和 OpenCV 库捕获图像、深度图和点云。 • 提供保存并排图像、深度图和点云的功能。 • 允许在不同格式之间切换保存的深度图和点云…

Linux 常见用例汇总

注:本文为 Linux 常见用例文章合辑。 部分内容已过时,未更新整理。 检查 Linux 上的 glibc 版本 译者:joeren | 2014-11-27 21:33 问:检查 Linux 系统上的 GNU C 库(glibc)的版本? GNU C 库&…

PHP阶段一

PHP 一门编程语言 运行在服务器端 专门用户开发网站的 脚本后缀名.php 与HTML语言进行混编,脚本后缀依然是.php 解释型语言,不要编译直接运行 PHP运行需要环境: Windows phpstudy Linux 单独安装 Web 原理简述 1、打开浏览器 2、输入u…

REMOTE_LISTENER引发的血案

作者:Digital Observer(施嘉伟) Oracle ACE Pro: Database PostgreSQL ACE Partner 11年数据库行业经验,现主要从事数据库服务工作 拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、P…

Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)

1、概述 在使用Redis作为MySQL的缓存层时,缓存一致性问题是指Redis中的缓存数据与MySQL数据库中的实际数据不一致的情况。这可能会导致读取到过期或错误的数据,从而影响系统的正确性和用户体验。 为了减轻数据库的压力,通常读操作都是先读缓…

Phono3py hdf5文件数据读取与处理

Phono3py是一个主要用python写的声子-声子相互作用相关性质的模拟包,可以基于有限位移算法实现三阶力常数和晶格热导率的计算过程,同时输出包括声速,格林奈森常数,声子寿命和累积晶格热导率等参量。 相关介绍和安装请参考往期推荐…

机器学习(四)-回归模型评估指标

文章目录 1. 哪个模型更好?2. 线性回归评估指标3. python 实现线性模型评估指标 1. 哪个模型更好? 我们之前已经对房价预测的问题构建了线性模型,并对测试集进行了预测。 如图所示,横坐标是地区人口,纵坐标是房价&am…

Oracle 适配 OpenGauss 数据库差异语法汇总

背景 国产化进程中,需要将某项目的数据库从 Oracle 转为 OpenGauss ,项目初期也是规划了适配不同数据库的,MyBatis 配置加载路径设计的是根据数据库类型加载指定文件夹的 xml 文件。 后面由于固定了数据库类型为 Oracle 后,只写…

Unity引擎学习总结------动画控件

左侧窗格可以在参数视图和图层视图之间切换。参数视图允许您创建、查看和编辑动画控制器参数。这些是您定义的变量,用作状态机的输入。要添加参数,请单击加号图标并从弹出菜单中选择参数类型。要删除参数,请在列表中选择该参数并按删除键&…

记录:virt-manager配置Ubuntu arm虚拟机

virt-manager(Virtual Machine Manager)是一个图形用户界面应用程序,通过libvirt管理虚拟机(即作为libvirt的图形前端) 因为要在Linux arm环境做测试,记录下virt-manager配置arm虚拟机的过程 先在VMWare中…

VSCode 搭建Python编程环境 2024新版图文安装教程(Python环境搭建+VSCode安装+运行测试+背景图设置)

名人说:一点浩然气,千里快哉风。—— 苏轼《水调歌头》 创作者:Code_流苏(CSDN) 目录 一、Python环境安装二、VScode下载及安装三、VSCode配置Python环境四、运行测试五、背景图设置 很高兴你打开了这篇博客,更多详细的安装教程&…

VBA编程:自定义函数 - 字符串转Hex数据

目录 一、自定义函数二、语法将字符串转换为hex数据MID函数:返回一个字符串中指定位置和长度的子串LEN函数:返回一个字符串的长度(字符数)Asc函数三、定义变量和数据类型变量声明的基本语法常见的数据类型四、For循环基本语法五、&运算符一、自定义函数 定义:用户定义…

jvm字节码中方法的结构

“-Xss”这一名称并没有一个特定的“为什么”来解释其命名,它更多是JVM(Java虚拟机)配置参数中的一个约定俗成的标识。在JVM中,有多个配置参数用于调整和优化Java应用程序的性能,这些参数通常以一个短横线“-”开头&am…

网络架构与IP技术:4K/IP演播室制作的关键支撑

随着科技的不断发展,广播电视行业也在不断迭代更新,其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合,不仅提升了节目制作的画质和效果,还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…

Mac上Stable Diffusion的环境搭建(还算比较简单)

https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon AI兴起的速度是真的快,感觉不了解点相关的东西都要与时代脱节了,吓得我赶紧找个AIGC看看能不能实现我艺术家的人梦想(绷不住了) 我…

什么是虚拟机?常用虚拟机软件有哪些?

目录 VMware Workstation Oracle VM VirtualBox Microsoft Hyper-V 虚拟机(Virtual Machine,简称VM)是一种通过软件模拟的具有完整硬件系统功能的、运行在计算机上的软件。它允许用户在单一物理机器上同时运行多个操作系统,每个…

git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表

好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…

Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)

01.生命周期 Vue生命周期:就是一个Vue实例从创建 到 销毁 的整个过程 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改数据,更新视图 4…

安装SQL Server2019 Developer版本时出现“服务没有及时响应启动或控制请求”的问题

1. 异常描述 2. 异常分析 应该是数据库服务所属账户的权限不够,可以设置为Administrator; 3. 异常解决 参考资料:https://blog.csdn.net/zi_longh/article/details/130293081 注意:SQL Server代理和SQL Server数据库引擎的账户…

【系统移植】制作SD卡启动——将uboot烧写到SD卡

在开发板上启动Linux内核,一般有两种方法,一种是从EMMC启动,还有一种就是从SD卡启动,不断哪种启动方法,当开发板上电之后,首先运行的是uboot。 制作SD卡启动,首先要将uboot烧写到SD卡&#xff…