意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

我们在开发AI-Agent智能体时,通常会使用提示词工程设置场景的带入,在实际项目中会有很多场景,如果所有提示词都放一起就会超过Token限制,则不得不拆分很多场景的提示词。
很多场景下,用户就必须要选择一个场景进入聊天,这样很不智能,意图识别用来做前置处理,判断用户输入的意图,然后帮用户选择场景。

意图识别:理解用户需求的第一步

在问答对话中,准确理解用户的意图是构建有效回答的关键。意图识别,即判断用户想要什么,相当于为系统定向选择场景,帮助系统更精确的选择回复路径。
例如:当用户询问:“查询电影票” 时,系统必须确定用户是想查询电影票,而不是演唱会票,飞机票等。

意图识别的难点:
    1. 多意图问题;用户的表达可能含有多个含义
    1. 语义模糊:用户输入不规范,或语言表达不标准,如错别字等。
    1. 上下文理解:不同场景和时间节点下相同的表达可能具有不同的意图。
常用的意图识别方法:
    1. 规则模板匹配:通过人工设定模板,如"从[地点]到[地点]的航班",将用户输入与模板匹配,从而判断意图。虽然精确度高,但需大量人力维护,不易推广。
    1. 统计机器学习: 通过提取文本特征,如词性标注和词向量化表示,借助支持向量机等模型进行分类。适合简单的分类,但在复杂意图下效果有限。
    1. 深度学习: 借助神经网络和预训练模型,无需人工设计特征,自动完成意图分类。尽管效果好,但需要大量标注数据。

在RAG系统中,意图识别是基础的前置任务,它将用户输入映射到最可能的意图,为后续的回答生成奠定基础。

基于BERT的对话意图

运行环境
Python 3.8
下载代码
git clone https://github.com/Linear95/bert-intent-slot-detector.git

pycharm开发工具导入项目

数据准备

示例代码里自带了测试数据在:data/SMP2019下,我们这里直接使用,先了解是怎么样使用,然后在根据自己的需求去训练数据

  1. 训练数据:
    以json格式给出,每条数据包括三个关键词:
    text表示待检测的文本,
    intent代表文本的类别标签,
    slots是文本中包括的所有槽位以及对应的槽值,以字典形式给出。
    在data/路径下,给出了SMP2019数据集作为参考。

数据样例如下:

 {"text": "开微信","domain": "app","intent": "LAUNCH","slots": {"name": "微信"}}

利用data/SMP2019/split_data.py,我们可以再将SMP2019的所有数据拆分成一个训练集split_train.json和一个测试集split_test.json

运行split_data.py程序 报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 35: illegal multibyte sequence

在这里插入图片描述

增加编码格式:encoding=‘utf-8’

open('train.json', 'r', encoding='utf-8') as f

在这里插入图片描述

  1. 生产意图标签和槽位标签

运行extract_labels.py程序, 同样报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 35: illegal multibyte sequence

同样也是要增加编码格式:encoding=‘utf-8’

open('train.json', 'r', encoding='utf-8') as f
  1. 意图标签:

以txt格式给出,每行一个意图,未识别意图以[UNK]标签表示。以SMP2019/intent_labels.txt为例:

[UNK]
LAUNCH
QUERY
ROUTE
...
  1. 槽位标签:

与意图标签类似,以txt格式给出。包括三个特殊标签: [PAD]表示输入序列中的padding token, [UNK]表示未识别序列标签, [O]表示没有槽位的token标签。对于有含义的槽位标签,又分为以’B_'开头的槽位开始的标签, 以及以’I_'开头的其余槽位标记两种。
以SMP2019/slot_labels.txt为例:

[PAD]
[UNK]
[O]
I_ingredient
B_ingredient
...
根据示例数据,训练意图模型

可以直接修改train.py代码,然后运行

if __name__ == '__main__':# 训练示例数据,生成意图模型parser = argparse.ArgumentParser()# environment parametersparser.add_argument("--cuda_devices", type=str, default='0', help='set cuda device numbers')parser.add_argument("--no_cuda", action='store_true', default=False, help='whether use cuda device for training')# model parametersparser.add_argument("--tokenizer_path", type=str, default='bert-base-chinese',  help="pretrained tokenizer loading path")parser.add_argument("--model_path", type=str, default='bert-base-chinese',  help="pretrained model loading path")# data parametersparser.add_argument("--train_data_path", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\SMP2019\split_train.json',  help="training data path")parser.add_argument("--test_data_path", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\SMP2019\split_test.json',  help="testing data path")parser.add_argument("--slot_label_path", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\SMP2019\slot_labels.txt',  help="slot label path")parser.add_argument("--intent_label_path", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\data\SMP2019\intent_labels.txt',  help="intent label path")# training parametersparser.add_argument("--save_dir", type=str, default='D:\PycharmProjects\\ai\\bert-intent-slot-detector\saved_model',  help="directory to save the model")parser.add_argument("--max_training_steps", type=int, default=0, help = 'max training step for optimizer, if larger than 0')parser.add_argument("--gradient_accumulation_steps", type=int, default=1, help="number of updates steps to accumulate before performing a backward() pass.")parser.add_argument("--saving_steps", type=int, default=300, help="parameter update step number to save model")parser.add_argument("--logging_steps", type=int, default=10, help="parameter update step number to print logging info.")parser.add_argument("--eval_steps", type=int, default=10, help="parameter update step number to print logging info.")parser.add_argument("--saving_epochs", type=int, default=1, help="parameter update epoch number to save model")parser.add_argument("--batch_size", type=int, default=128, help = 'training data batch size')parser.add_argument("--train_epochs", type=int, default=10, help = 'training epoch number')parser.add_argument("--learning_rate", type=float, default=5e-5, help = 'learning rate')parser.add_argument("--adam_epsilon", type=float, default=1e-8, help="epsilon for Adam optimizer")parser.add_argument("--warmup_steps", type=int, default=0, help="warmup step number")parser.add_argument("--weight_decay", type=float, default=0.0, help="weight decay rate")parser.add_argument("--max_grad_norm", type=float, default=1.0, help="maximum norm for gradients")args = parser.parse_args()train(args)

在这里插入图片描述

也可以使用命令行动态传参的方式运行

可以使用以下命令进行模型训练,这里我们选择在bert-base-chinese预训练模型基础上进行微调:

python train.py \--cuda_devices 0 \--tokenizer_path "bert-base-chinese" \--model_path "bert-base-chinese" \--train_data_path "xxx\bert-intent-slot-detector\data\SMP2019\split_train.json" \--test_data_path "xxx\bert-intent-slot-detector\data\SMP2019\split_test.json" \--intent_label_path "xxx\bert-intent-slot-detector\data\SMP2019\intent_labels.txt" \--slot_label_path "xxx\bert-intent-slot-detector\data\SMP2019\slot_labels.txt" \--save_dir "xxx\bert-intent-slot-detector\saved_model" \--batch_size 32 \--train_epochs 5

运行成功后会在saved_model生成微调后的模型
在这里插入图片描述

运行模型 测试意图识别

运行detector.py程序,准备识别用户输入的意图

if __name__ == '__main__':model_path = 'saved_model/model/model_epoch2'tokenizer_path = 'saved_model/tokenizer/'intent_path = 'data/SMP2019/intent_labels.txt'slot_path = 'data/SMP2019/slot_labels.txt'model = JointIntentSlotDetector.from_pretrained(model_path=model_path,tokenizer_path=tokenizer_path,intent_label_path=intent_path,slot_label_path=slot_path)while True:text = input("input: ")print(model.detect(text))

下图能正确的识别输入的意图。
在这里插入图片描述

参考链接:https://github.com/Linear95/bert-intent-slot-detector

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网管平台(基础篇):路由器的介绍与管理

路由器简介 路由器(Router)是一种计算机网络设备,它的主要作用是将数据通过打包,并按照一定的路径选择算法,将网络传送至目的地。路由器能够连接两个或更多个网络,并根据信道的情况自动选择和设定路由&…

开发者工具的模块化与可扩展性设计

文章目录 前言模块化设计的重要性可扩展性设计的重要性设计模式与技术实现实战代码插件管理器类:PluginManager注册插件方法:register_plugin执行插件方法:execute_plugin 插件实现插件 1:代码格式化插件插件 2:代码行…

杭州乘云联合信通院发布《云计算智能化可观测性能力成熟度模型》

原文地址:杭州乘云联合中国信通院等单位正式发布《云计算智能化可观测性能力成熟度模型》标准 2024年12月3日,由全球数字经济大会组委会主办、中国信通院承办的 2024全球数字经济大会 云AI计算创新发展大会(2024 Cloud AI Compute Ignite&…

WordPress酱茄主题 开源版 博客资讯自媒体网站模板

一款免费开源的WordPress主题,主题专为WordPress博客、资讯、自媒体网站而设计 运行环境 支持WordPress版本:5.6 兼容Chrome、Firefox、Safari等主流浏览器 支持设备:响应式布局,不同设备不同展示效果 服务器环境建议&#x…

16-在线blog发布系统

【技术栈】 ①:架构: B/S、MVC ②:系统环境:Windows/Mac ③:开发环境:IDEA、JDK1.8、Maven、Mysql ④:技术栈:Java、Mysql、SpringBoot、Mybatis、Vue、Redis 【功能模块】 ①:登…

从0到1实现项目Docker编排部署

在深入讨论 Docker 编排之前,首先让我们了解一下 Docker 技术本身。Docker 是一个开源平台,旨在帮助开发者自动化应用程序的部署、扩展和管理。自 2013 年推出以来,Docker 迅速发展成为现代软件开发和运维领域不可或缺的重要工具。 Docker 采…

1. 机器学习基本知识(2)——机器学习分类

1.4 机器学习分类 1.4.1 训练监督 1. 监督学习:已对训练数据完成标记 分类:根据数据及其分类信息来进行训练,使模型能够对新的数据进行分类 回归:给出一组特征值来预测目标数值 2. 无监督学习:没有对训练数据进行任…

快速将请求头构建成json结构

1.背景 有时候我们要爬虫(组包)请求一个资源数据,需要构建与原始请求一样的请求头,从浏览器复制过来的请求头,有很多,如果一个一个的配置成json有点慢,那么如何快速构建呢? 今天就使用正则表达式的方式实现 正则表达式实现快速将请求头构建成json结构 将冒号后边的换行符去掉…

【蓝桥杯备战】Day 1

1.基础题目 LCR 018.验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama…

在 Ubuntu 24.04.1 LTS (WSL) 中使用 openssl 生成 keybox.xml

看到“生成 keybox.xml”,大概率都会联想到 PIF 和 Tricky Store。这里就不多解释它们的用途了。最近在网上看到生成非 AOSP keybox 的教程,在这里做一些补充,并将代码打包成一个 Python 脚本。 参考自: Idea 提供者&#xff1a…

哈夫曼树选择题

1. 哈夫曼树的构建方法 哈夫曼树是通过不断合并权值最小的两个节点生成的: 将权值最小的两个节点合并成一个新节点,权值为这两个节点权值之和。将新节点加入队列,并从队列中移除已合并的两个节点。重复以上步骤,直到所有节点合并…

Java 实现给pdf文件指定位置盖章功能

Java 实现给pdf文件指定位置盖章功能 开发中遇到一个需求, 需要给用户上传的的pdf文件, 指定位置上盖公章的功能, 经过调研和对比, 最终确定实现思路. 这里是使用pdf文件中的关键字进行章子的定位, 之所以这样考虑是因为如果直接写死坐标的话, 可能会出现因pdf大小, 缩放, 盖章…

Ubuntu本地快速搭建web小游戏网站,公网用户远程访问【内网穿透】

文章目录 前言1. 本地环境服务搭建2. 局域网测试访问3. 内网穿透3.1 ubuntu本地安装cpolar内网穿透3.2 创建隧道3.3 测试公网访问4. 配置固定二级子域名4.1 保留一个二级子域名4.2 配置二级子域名4.3 测试访问公网固定二级子域名前言 网:我们通常说的是互联网;站:可以理解成…

token失效重新存储发起请求

import axios from axios import { MessageBox, Message } from element-ui import store from /store import Router from /router import { getCookie, setToken, setCookie } from ./auth// 因为后端环境区分v1 v2 剔除测试盛传的环境配置,并添加统一前缀 const …

windows mysql5.7设置慢查询参数

如果没有my.ini,可以复制一份my-default.ini改个名字就可以。 注意重启mysql服务 mysql5.7 直接在配置文件my.ini 中写如下配置 log_slow_admin_statements ON log_slow_slave_statements ON slow_query_log 1 //开启慢查询 (很多博客说on off ,我本机my…

瀑布流实现uniapp,适用与微信小程序

使用uniapp插件,这个是微信小程序最不卡的,其他微信小程序都有点卡顿 瀑布流布局-waterfall - DCloud 插件市场 这个地方需要改一下,要不然会导致下拉刷新不出来 import Waterfall from "/uni_modules/helang-waterfall/components/wa…

AudioSegment 将音频分割为指定长度时间片段 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…

用友U8+ API接口使用教程

前言 U8和其他的公开的开放API接口有一些差异,他是需要先对接的到代理服务器,通过代理服务器进行对接,所以只要保证U8能上网就能对接,和畅捷通T的模式有点类似 流程: 注册成为开发者(用于创建用友U8 API应…

漫漫数学之旅039

文章目录 经典格言数学习题古今评注名人小传伽利略希庇亚斯 经典格言 测量可测量的东西,并把不可测量的东西转化成可测量的东西。——伽利略 伽利略的名言“测量可测量的东西,并把不可测量的东西转化成可测量的东西”强调了量化在科学研究中的核心地位。…

前端项目初始化搭建(二)

一、使用 Vite 创建 Vue 3 TypeScript 项目 PS E:\web\cursor-project\web> npm create vitelatest yf-blog -- --template vue-ts> npx > create-vite yf-blog --template vue-tsScaffolding project in E:\web\cursor-project\web\yf-blog...Done. Now run:cd yf-…