当前位置: 首页 > news >正文

传统业务对接AI-AI编程框架-Rasa的业务应用实战(4)--Rasa成型可用 针对业务配置rasa并训练和部署

此篇接续上一篇 传统业务对接AI-AI编程框架-Rasa的业务应用实战(3)--Rasa成型可用 模型及智能体的配置文件介绍

此篇我们针对我预设的(学习目标)发票业务【比如开票 、查询】进行Rasa的预训练配置,训练,直至部署运行,最后整个过程会呈现如何根据具体业务需求定制Rasa项目。

不忘初心,我们的初心概括如下:(详见我的初心文章

# 预期理解的自然语言指令如下

输入:开具一张1000元的发票,税率13%   // 识别开票意图和实体

输入:查询发票编号12345  // 识别发票查询意图和实体

1、先配置预训练数据文件 data/nlu.yml (让rasa训练自然语言理解的数据

version: "3.1"
# 定义自然语言理解(NLU)的训练数据,用于训练Rasa识别发票业务相关的用户意图和实体
nlu:
# 意图:识别用户请求开具发票的意图,提取金额和税率实体
- intent: issue_invoiceexamples: |- 开具一张[1000元](amount)的发票,税率[13%](tax_rate)- 帮我开一张[5000元](amount)的发票,税率[6%](tax_rate)- 开具发票,金额[2000元](amount),税率[13%](tax_rate)- 我要开一张[10000元](amount)的发票,税率是[10%](tax_rate)- 开个[3000元](amount)的发票,税率[5%](tax_rate)- 给我开张发票,[8000元](amount),税率[6%](tax_rate)- 开票,金额[1500元](amount),税率[13%](tax_rate)- 开一张发票,[7000元](amount),[10%](tax_rate)- 帮我开票,金额[4000元](amount),税率[5%](tax_rate)# 意图:识别用户查询发票的意图,提取发票编号实体
- intent: query_invoiceexamples: |- 查询发票编号[12345](invoice_number)- 查一下发票号[67890](invoice_number)- 我想查询发票编号[54321](invoice_number)- 帮我查发票[1234567](invoice_number)- 发票编号[98765](invoice_number)的详情- 查发票[45678](invoice_number)- 查询[112233](invoice_number)的发票信息- 帮我查下[334455](invoice_number)的发票- 看看发票号[78901](invoice_number)# 正则表达式:定义用于提取金额实体的正则规则
- regex: amountexamples: |- \d+元  # 匹配形如“1000元”的金额格式# 正则表达式:定义用于提取税率实体的正则规则
- regex: tax_rateexamples: |- \d+%$  # 匹配形如“13%”的税率格式# 正则表达式:定义用于提取发票编号实体的正则规则
- regex: invoice_numberexamples: |- \d{5,7}  # 匹配5到7位的数字,作为发票编号

注释说明

  • nlu:定义自然语言理解(NLU)的训练数据,Rasa通过这些数据学习如何识别用户输入的意图和提取业务相关的实体。在发票业务中,新增了issue_invoice和query_invoice两个意图,分别用于处理开具发票和查询发票的请求。

  • intent: issue_invoice:表示用户请求开具发票的意图,训练样本中包含金额(amount)和税率(tax_rate)实体,用于提取用户提供的具体开票信息。

  • intent: query_invoice:表示用户查询发票的意图,训练样本中包含发票编号(invoice_number)实体,用于提取用户查询的发票编号。

  • regex:定义正则表达式规则,帮助Rasa更准确地提取实体:

    • amount:匹配金额格式(如“1000元”),用于提取发票金额。

    • tax_rate:匹配税率格式(如“13%”),用于提取发票税率。

    • invoice_number:匹配5到7位数字的发票编号,用于查询发票。

2、配置规则文件 data/rules.yml

version: "3.1"
# 定义对话规则,用于处理发票业务中确定的对话流程,优先于机器学习策略执行
rules:
# 规则1:当用户触发“issue_invoice”意图时,触发开票响应
- rule: Handle issue invoicesteps:- intent: issue_invoice  # 用户请求开具发票的意图- action: utter_issue_invoice  # 触发预定义的开票响应(在domain.yml中定义)# 规则2:当用户触发“query_invoice”意图时,触发查询发票响应
- rule: Handle query invoicesteps:- intent: query_invoice  # 用户请求查询发票的意图- action: utter_query_invoice  # 触发预定义的查询发票响应(在domain.yml中定义)

注释说明

  • rules:定义对话规则(rules),用于处理固定的、确定的对话流程,优先级高于基于机器学习的对话策略(stories)。在发票业务中,规则用于快速响应“开发票”和“查询发票”的用户意图,简化对话逻辑。

  • rule:每条规则由steps组成,指定用户意图(intent)和对应的动作(action)。这里定义了两条规则:

    • Handle issue invoice:当用户表达开票意图(issue_invoice)时,触发utter_issue_invoice动作,回复预定义的开票相关响应。

    • Handle query invoice:当用户表达查询发票意图(query_invoice)时,触发utter_query_invoice动作,回复预定义的查询相关响应。

  • steps:定义规则的执行步骤,连接用户意图和系统动作。动作(如utter_issue_invoice、utter_query_invoice)是预定义的响应模板,具体内容在domain.yml中定义。

 3、配置域文件 domain.yml 

version: "3.1"# 定义对话系统支持的所有意图,与nlu.yml中的意图一致
intents:- issue_invoice- query_invoice# 定义对话中需要提取的实体,匹配nlu.yml中的实体
entities:- amount  # 发票金额(如“1000元”)- tax_rate  # 发票税率(如“13%”)- invoice_number  # 发票编号(如“12345”)# 定义槽,用于存储对话中提取的实体值
slots:# 金额槽:存储用户提供的发票金额amount:type: text  # 槽类型为文本,存储字符串格式的金额influence_conversation: false  # 不影响对话流程,仅用于存储数据mappings:- type: from_entity  # 从实体自动填充槽entity: amount  # 绑定到amount实体intent: issue_invoice  # 仅在issue_invoice意图下填充# 税率槽:存储用户提供的税率tax_rate:type: text  # 槽类型为文本,存储字符串格式的税率influence_conversation: false  # 不影响对话流程,仅用于存储数据mappings:- type: from_entity  # 从实体自动填充槽entity: tax_rate  # 绑定到tax_rate实体intent: issue_invoice  # 仅在issue_invoice意图下填充# 发票编号槽:存储用户提供的发票编号invoice_number:type: text  # 槽类型为文本,存储字符串格式的发票编号influence_conversation: false  # 不影响对话流程,仅用于存储数据mappings:- type: from_entity  # 从实体自动填充槽entity: invoice_number  # 绑定到invoice_number实体intent: query_invoice  # 仅在query_invoice意图下填充# 定义系统回复的响应模板,包含动态变量
responses:# 开票响应:确认开票信息,动态插入金额和税率utter_issue_invoice:- text: "好的,我将为您开具一张金额为{amount},税率为{tax_rate}的发票。"# 查询响应:确认查询发票编号,动态插入发票编号utter_query_invoice:- text: "正在查询发票编号{invoice_number}的详情,请稍候。"# 定义系统可执行的动作,包括响应和自定义动作
actions:- utter_issue_invoice  # 开票的响应动作- utter_query_invoice  # 查询发票的响应动作- action_issue_invoice  # 自定义动作:调用后端API开具发票- action_query_invoice  # 自定义动作:调用后端API查询发票# 定义会话配置,控制对话会话的行为
session_config:# 会话过期时间(分钟):超过60分钟无交互,会话将重置session_expiration_time: 60# 是否在新会话中保留槽值:true表示槽值(如金额、税率)在新会话中继续有效carry_over_slots_to_new_session: true

注释说明

  • entities:定义对话中需要提取的实体,与nlu.yml中的实体一致,用于支持发票业务中的关键信息提取(如金额、税率、发票编号)。

  • slots:定义槽,用于存储用户输入的实体值(如amount、tax_rate、invoice_number),便于在对话中传递给自定义动作(如API调用)。

    • type: text:表示槽存储文本类型的数据,适合金额、税率和发票编号的字符串格式。

    • influence_conversation: false:表示这些槽仅用于存储数据,不影响对话流程的选择(适合发票业务中仅传递数据的场景)。

    • mappings:指定槽如何从实体填充,例如amount槽仅从issue_invoice意图中的amount实体获取值。

  • responses:定义系统回复的模板,动态插入槽值(如{amount}、{tax_rate}、{invoice_number}),用于向用户确认开票或查询信息。

  • actions:列出系统支持的所有动作,包括:

    • 响应动作(utter_issue_invoice、utter_query_invoice):直接回复预定义的模板。

    • 自定义动作(action_issue_invoice、action_query_invoice):用于调用后端API完成开票或查询操作(需在actions.py中实现)。

  • session_config:

    • session_expiration_time:设置会话过期时间(60分钟),超时后对话上下文重置。

    • carry_over_slots_to_new_session:设置为true,确保槽值(如用户输入的金额、税率)在会话重启后保留,适合需要跨会话记忆的业务场景。

4、配置配置文件(此处不是结巴 config.yml

# 配置文件的版本和默认模板
recipe: default.v1# 助手项目的唯一标识符,需在部署时替换为唯一名称
assistant_id: 20250604-111746-slow-piccolo# 定义对话系统的语言,设置为中文以支持中文输入
language: zh# 定义NLU处理流程(pipeline),用于处理用户输入的文本
pipeline:# 分词器:使用Jieba分词器,专门为中文文本分词- name: JiebaTokenizer# 正则特征化:提取正则表达式特征,支持nlu.yml中的正则规则(如金额、税率)- name: RegexFeaturizer# 词汇句法特征化:提取词汇和句法特征,增强意图和实体识别- name: LexicalSyntacticFeaturizer# 词向量特征化:将文本转为词袋模型,基于单词- name: CountVectorsFeaturizer# 字符级特征化:基于字符的n-gram特征(1-4字符),提升中文短语识别- name: CountVectorsFeaturizeranalyzer: char_wbmin_ngram: 1max_ngram: 4# 意图和实体分类器:用于识别意图(如issue_invoice)和提取实体(如amount)- name: DIETClassifierepochs: 100  # 训练轮数,控制模型训练时间和效果entity_recognition: true  # 启用实体识别,提取amount、tax_rate等constrain_similarities: true  # 增强相似度约束,提升分类准确性# 实体同义词映射:处理实体值的同义词(此处发票业务未使用)- name: EntitySynonymMapper# 响应选择器:用于选择预定义的响应(如FAQ场景,此处未广泛使用)- name: ResponseSelectorconstrain_similarities: trueepochs: 100  # 训练轮数# 定义对话管理策略(policies),控制Rasa如何选择下一步动作
policies:# 记忆策略:基于历史对话直接匹配动作,适合简单场景- name: MemoizationPolicy# 规则策略:优先执行rules.yml中的规则,适合发票业务的固定流程- name: RulePolicy# 机器学习策略:基于历史对话预测动作,适合复杂多轮对话- name: TEDPolicymax_history: 5  # 考虑最近5次对话历史epochs: 100  # 训练轮数

注释说明

  • language: zh:设置语言为中文,确保Rasa正确处理中文输入(如“开具发票”),并使用适配中文的组件(如Jieba分词器)。

  • pipeline:定义NLU处理流程,处理用户输入的文本,提取意图和实体:

    • JiebaTokenizer:专为中文设计的分词器,分割中文短语(如“开具一张1000元的发票”)。

    • RegexFeaturizer:支持nlu.yml中的正则规则,提取金额(\d+元)、税率(\d+%$)等实体。

    • LexicalSyntacticFeaturizer:提取词汇和句法特征,提升意图和实体识别的准确性。

    • CountVectorsFeaturizer:将文本转为词袋模型(单词和字符级n-gram),增强中文短语的特征表示。

    • DIETClassifier:核心组件,负责意图分类(如issue_invoice)和实体提取(如amount、tax_rate)。

    • EntitySynonymMapper:处理实体同义词(发票业务中未广泛使用,但保留以支持扩展)。

    • ResponseSelector:处理预定义响应选择(发票业务中主要依赖规则和动作,未广泛使用)。

  • policies:定义对话管理策略,决定Rasa如何根据用户输入选择动作:

    • MemoizationPolicy:直接匹配历史对话,适合简单场景。

    • RulePolicy:优先执行rules.yml中的规则,适合发票业务中固定的开票和查询流程。

    • TEDPolicy:基于机器学习预测动作,适合处理复杂的多轮对话(如用户未提供完整信息时询问)。

5、配置文件改造完以后,训练Rasa。 

# 训练命令

rasa train

训练后,控制台输出大致如下: 

同时会在models目录下生成训练的数据文件。形如2025xxxx-xxxxxx-xxx.tar.gz,如下图 

备注:生成的训练后的数据文件只有当前最新的一个是生效有用的。老的数据文件没什么用,可以删除。可以减少自己电脑的磁盘占用。

6、以调试模式启动Rasa的壳程序,即激活Rasa这个小智能机器人  执行以下命令

rasa shell --debug

启动完以后,输入我们的人类自然语言,看下它是否能识别意图,并提取实体信息(金额和税率),执行结果如下:(我输入:开具一张1000元的发票,税率13%

OK Rasa 完美的识别了我们的意图:想要开票!金额是1000元,税率是13! 

并且我们可以看到日志输出的内容里面有这么一条: 说明精确提取了我们输入语言的金额和税率

2025-06-06 15:43:54 DEBUG    rasa.core.processor  - [debug    ] processor.extract.slots        action_extract_slot=action_extract_slots len_extraction_events=2 rasa_events=[SlotSet(key: amount, value: 1000元), SlotSet(key: tax_rate, value: 13%)]
 

 再输入下查票的自然语言口令试试:查询发票编号12345

 

最终它回复:正在查询发票编号12345的详情,请稍候

OK  完美!Rasa 完美的识别了我们的开票、查票业务的意图和实体!

相关文章:

  • 蓝牙攻防实战指南:发现隐藏设备
  • 数据库管理与高可用-MySQL主从复制与读写分离
  • linux 内存分析
  • Python绘图库及图像类型之特殊领域可视化
  • Git 切换到旧提交,同时保证当前修改不丢失
  • Qt客户端技巧 -- 窗口美化 -- 窗口阴影
  • Truffle 和 Ganache 使用指南
  • 龙石数据中台V3.5.1升级 | 数据实时收集来了!
  • 使用VuePress2.X构建个人知识博客,并且用个人域名部署到GitHub Pages中
  • 从入门到进阶:Python 学习参考书的深度解析
  • 全面理解 Linux 内核性能问题:分类、实战与调优策略
  • MySQL基本操作
  • 山洪径流过程及洪水淹没数值模拟
  • [Java恶补day17] 41. 缺失的第一个正数
  • Meta Prompting 完整指南
  • 1.3 编译程序:单个C文件和多个C文件
  • 编译构建C++程序时ABI一致性问题
  • Java设计模式之状态模式详解
  • Unity基础-数学向量
  • NY118NY120美光固态闪存NY124NY129
  • 政府网站建设招标方案/武汉新闻最新消息
  • 现在做网站怎么赚钱/百度平台客服电话
  • 网站开发嘉比格网络/深圳谷歌网络推广公司
  • 做一家购物网站要多少钱/新闻株洲最新
  • 旅游网站建设报价单/百度推广是什么意思
  • 网站建设需求计划书/百度首页清爽版