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

发布于:2025-06-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

此篇接续上一篇 传统业务对接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 requests

class 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));
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到