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

传统业务对接AI-AI编程框架-Rasa的业务应用实战(5)--Rasa成型可用 rasa服务化部署及识别意图后的决策及行为

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

上一篇我们已经让Rasa准确识别了我们自然语言指令的开票和查询发票的意图和实体。

# 开具发票场景

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

rasa输出:好的,我将为您开具一张金额为1000元,税率为13%的发票。

# 查询发票场景

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

rasa输出:正在查询发票编号12345的详情,请稍候。

此篇我们要做进一步提升改造,内容如下:

1、当前是命令行界面输入文本来交互,我则希望是前端发送http rest请求来输入自然语言指令。 

比如:前端页面访问 http://localhost:xxx/xxx/ (rasa服务的交互接口)

2、Rasa 接收到前端的自然语言指令后,识别了意图和实体,调用后端的开票/查询业务服务接口

并最终将最后的业务操作结果,返回给前端。

http://localhost:8088/ai/rasa/issue_invoice(开票接口)


http://localhost:8088/ai/rasa/query_invoice/xxx(查票接口)


接下来就是我们具体的改造 

1、定义 Rasa 的后台服务API地址,通过配置 endpoints.yml 文件来实现:(在其中添加以下配置内容)

action_endpoint:url: "http://localhost:5055/webhook"

解释:http://localhost:5055/webhook 此即 rasa对外暴露的API接口,前端界面就可以通过这个url来传入自然语言指令来与rasa交互

2、先改规则配置文件:

 开票和查票的两个意图的动作,都由原来的返回响应文本(utter_issue_invoice),改成执行动作(action_issue_invoice),即触发对应domain.yml中配置的动作项:

3、实现rasa的开票和查票的两个动作 即 action_issue_invoice 和 action_query_invoice 去调用业务系统的后台服务接口

编辑工作目录下的actions/actions.py文件 如下:

from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
from rasa_sdk.events import SlotSet
import requestsclass ActionIssueInvoice(Action):def name(self):return "action_issue_invoice"def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict):amount = tracker.get_slot("amount")tax_rate = tracker.get_slot("tax_rate")if amount and tax_rate:# 替换为你的发票系统 API 地址和参数try:response = requests.post("http://localhost:8088/ai/rasa/issue_invoice",json={"amount": amount.replace("元", ""), "tax_rate": tax_rate.replace("%", "")},headers={"Authorization": "Bearer YOUR_API_TOKEN"})if response.status_code == 200:dispatcher.utter_message(text=f"发票已开具,金额为{amount},税率为{tax_rate}。")else:dispatcher.utter_message(text=f"发票开具失败:{response.json().get('error', '未知错误')}。")except Exception as e:dispatcher.utter_message(text=f"发票开具失败:{str(e)}。")return [SlotSet("amount", amount), SlotSet("tax_rate", tax_rate)]else:dispatcher.utter_message(text="抱歉,无法识别金额或税率,请重新输入。")return []class ActionQueryInvoice(Action):def name(self):return "action_query_invoice"def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: dict):invoice_number = tracker.get_slot("invoice_number")if invoice_number:# 替换为你的发票系统 API 地址和参数try:response = requests.get(f"http://localhost:8088/ai/rasa/query_invoice/{invoice_number}",headers={"Authorization": "Bearer YOUR_API_TOKEN"})if response.status_code == 200:invoice_data = response.json()dispatcher.utter_message(text=f"发票编号{invoice_number}的详情:{invoice_data}。")else:dispatcher.utter_message(text=f"查询失败:{response.json().get('error', '未知错误')}。")except Exception as e:dispatcher.utter_message(text=f"查询失败:{str(e)}。")return [SlotSet("invoice_number", invoice_number)]else:dispatcher.utter_message(text="抱歉,无法识别发票编号,请重新输入。")return []

此即意味着,当识别了开票意图后, 会执行Python的action_issue_invoice方法,传入识别的实体信息去调用开票的后端服务接口。当识别了查询发票的意图后,会执行Python的action_query_invoice方法, 传入识别的实体信息去调用开票的后端服务接口。

 4、以服务方式(非壳方式 即不是shell命令行模式)启动 rasa 执行以下命令:

rasa run --enable-api --cors "*" --port 5005

执行后运行如下:

这样 rasa 就以http server模式启动了,前端就可以通过http请求与之交互对话了。

5、启动 rasa 的动作服务器。  在工程目录下,新开个 powershell 执行界面,执行以下命令:

rasa run actions

 此一步正是第3步中的 actions/actions.py 的服务端实现的部署启动,用来对外调用业务接口

如上图所示 就是启动成功了 动作服务器的端口默认为:5055 

6、模拟业务前端界面发起开票的自然语言指令试试效果

如下图,我用自然语言,作为传入参数,调用rasa的server,它成功调用了业务端接口并返回了正确的预期结果。大功告成!

上图是我的模拟开票服务的后端接口日志输出,证明rasa在识别到开票的自然语言指令后确实成功调用了业务接口。 

再试试查票的识别:

也是OK 完美识别。 


末尾,顺带附上我测试用的业务接口的代码 (模拟开发票和查发票的业务API) 

@RestController
@RequestMapping("/ai/rasa")
public class Ai4BizController extends BaseController {private static final Logger logger = LoggerFactory.getLogger(Ai4BizController.class);@PostMapping("/issue_invoice")public JSONObject issueInvoice(@RequestBody JSONObject reqObj) {String amount = reqObj.getString("amount");String taxRate = reqObj.getString("tax_rate");if (StringUtils.isEmpty(amount) || StringUtils.isEmpty(taxRate)) {return fail("开票失败,缺少开票信息!");}logger.info("业务系统后台成功开具了一张发票!金额:{}, 税率:{}", reqObj.getString("amount"), reqObj.getString("tax_rate"));JSONObject data = new JSONObject().fluentPut("info", "发票开具成功!").fluentPut("fee", reqObj.getString("amount")).fluentPut("tax_rate", reqObj.getString("tax_rate"));return success(data);}@GetMapping("/query_invoice/{invoice_number}")public JSONObject queryInvoice(@PathVariable("invoice_number") String invoiceNumber) {if (StringUtils.isEmpty(invoiceNumber)) {return fail("查询失败,缺少发票号码!");}return success(new JSONObject().fluentPut("info", "您查询的发票号码是:" + invoiceNumber));}
}

http://www.xdnf.cn/news/12323.html

相关文章:

  • 企业私有化部署的平价革命:五步实现“低成本高可控”AI落地——破除百万投入迷思,中小企业也能玩转私有化大模型
  • JDBC(二) 综合案列、SQL注入问题、封装工具类、ORM
  • Windows Server 2016 域环境搭建
  • 类Transformer架构
  • 【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
  • Linux LVM与磁盘配额
  • RFID推动新能源汽车零部件生产系统管理应用案例
  • React---day10
  • Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法
  • Spring Cloud核心组件深度解析(2025终极指南)
  • 数学复习笔记 28
  • 2123:图的存储与访问
  • Java -jar命令运行外部依赖JAR包的深度场景分析与实践指南
  • 内容力重塑品牌增长:开源AI大模型驱动下的智能名片与S2B2C商城赋能抖音生态种草范式
  • 哈希(Hash)
  • 使用VSCode开发Django指南
  • 短视频矩阵SaaS系统:开源部署与核心功能架构指南
  • 飞算 JavaAI 与国内外一些常见 AI 编程工具对比的优势:
  • JavaSec-SPEL - 表达式注入
  • 数据结构之常用排序算法(冒泡、选择等)
  • 使用 Docker Compose 部署 Jenkins(LTS 版)持续集成环境
  • uniapp 开发ios, xcode 提交app store connect 和 testflight内测
  • 学习STC51单片机29(芯片为STC89C52RCRC)
  • RabbitMQ 学习
  • Gerrit+repo管理git仓库,如果本地有新分支不能执行repo sync来同步远程所有修改,会报错
  • 因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力
  • 使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现
  • Python: 操作 Excel折叠
  • [蓝桥杯]矩阵翻硬币
  • 降雨预测系统(机器学习)