Rasa 入门:实用指南

devops入门8 分钟阅读2026/6/30

上个月,我接了个活儿,要给一款金融科技 App 做一个客服机器人。一开始,我们用了最简单的提示词方法——直接把用户消息扔给 LLM,然后祈祷它能搞定。应付基础问答这招还行,但一旦需要机器人真正去执行操作,比如转账或者修改账户信息,就全崩了。LLM 会瞎编交易金额,跳过确认步骤,或者悄无声息地漏掉必填信息。我们需要的是一种既能流畅自然对话,又能严格遵守业务逻辑的方案。就在这时候,我终于开始认真研究 Rasa 了。

Rasa 是一个开源的对话式 AI 框架,它运行在所谓的“Level 3”级别——意思是它不仅能真正理解上下文,还能执行多步骤的工作流,而不是只会机械地复读。下面是我搭建和运行它的过程,以及这一路上踩过的坑。

环境搭建:比预想的要轻松

首先是准备工作。Rasa Pro(带 LLM 功能的版本)需要许可证密钥。你可以去 Rasa 官网申请一个免费的 Developer Edition 许可证——不需要绑信用卡,这点挺赞的。

pip install rasa

核心安装就这一步。接下来,LLM 的部分有点意思。Rasa 在 HuggingFace 上提供了一个专门用于教程的微调模型,但如果你不想让数据打到第三方 API 上,也可以在本地跑。为了省时间,这篇教程里我用的是他们托管的部署版本,但在生产环境中,你肯定得把它换掉。

安装好后,初始化一个新项目:

rasa init --template llm

这会帮你搭好一个自带 LLM 助手结构的项目骨架。你会得到一个包含好几个 YAML 文件的目录——Rasa 的核心配置都在这儿了。

定义流程:Rasa 的闪光点

让我茅塞顿开的核心概念是,Rasa 把机器人能做什么怎么说分开了。你把业务逻辑定义成流程,而 LLM 负责对话的包装。

咱们来建那个转账流程。打开 flows.yml,定义这个过程:

flows:
  transfer_money:
    name: transfer money
    description: Send money to another person
    steps:
      - collect: recipient
      - collect: amount
      - action: action_transfer_money

搞定。就三步:收集收款人,收集金额,执行转账。那个 description 字段非常关键——LLM 就是靠它来理解什么时候该触发这个流程的。

接下来是让我第一个感到惊喜的地方。我本来以为得写一堆训练语料,比如“我想打点钱”或者“给 Joe 转点款”之类的。完全不用。LLLM 会根据那个 description 字段实时推断用户的意图。我一开始还半信半疑,但这招确实管用。

自定义动作:让逻辑落地

action_transfer_money 是个自定义动作,你真正的业务逻辑就放在这里。建一个 actions.py 文件:

from rasa.sdk import Action
from rasa.sdk.executor import CollectingDispatcher
from typing import Any, Text, Dict, List

class ActionTransferMoney(Action):
    def name(self) -> Text:
        return "action_transfer_money"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Dict[Text, Any],
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        
        recipient = tracker.get_slot("recipient")
        amount = tracker.get_slot("amount")
        
        # 这里接入你真实的支付 API
        # process_payment(recipient, amount)
        
        dispatcher.utter_message(
            text=f"搞定啦。${amount} 已经转给 {recipient} 了。"
        )
        
        return []

这就是你要接入真实支付网关的地方。tracker 对象能让你拿到所有收集到的槽位值——在我们这个例子里就是 recipientamount

见证奇迹:流畅对话与死板逻辑的碰撞

到了这儿,我彻底信了。让我给你看看这套配置是怎么处理实际对话的:

顺畅路径(一步步来):

User: 我想转账
Bot: 您想转给谁?
User: 给 Jen
Bot: 您想转多少?
User: 50刀
Bot: 请确认:您要给 Jen 转账 $50.0,对吗?
User: 对
Bot: 搞定啦。$50.0 已经转给 Jen 了。

一次性给全信息:

User: 我想给 Joe 转 100 块钱
Bot: 请确认:您要给 Joe 转账 $100.0,对吗?
User: 对。
Bot: 搞定啦。$100.00 已经转给 Joe 了。

聊到一半改主意:

User: 我得转 50 块钱
Bot: 您想转给谁?
User: Jen
Bot: 请确认:您要给 Jen 转账 $50.0,对吗?
User: 哎不对,转 60 吧
Bot: 好的,我已经修改了金额。
Bot: 请确认:您要给 Jen 转账 $60.0,对吗?
User: 对。
Bot: 搞定啦。$60.00 已经转给 Jen 了。

这第三种情况,正是纯 LLM 方案彻底崩盘的地方。用户在流程中间自我否定,而 Rasa 优雅地处理了——它修正了槽位值并重新确认。没有瞎编的交易,也没有跳过关键步骤。

训练与测试

定义好流程和动作后,训练模型:

rasa train

然后在一个终端里启动动作服务器:

rasa run actions

在另一个终端里启动机器人:

rasa shell

这会打开一个交互式会话,你可以直接在终端里测试对话。我花了整整一个小时拿各种边界情况去刁难它——错别字、黑话、话说到一半改主意——它处理得出奇地好,大部分都接住了。

我犯的第一个错:一开始我忘了单独启动动作服务器,怎么都想不通为什么转账动作老是不触发。收集完槽位后机器人就没动静了。别学我——一定要同时运行这两个进程。

实用建议与坦白的局限性

建议:

  1. 写好描述。 LLM 非常依赖你的流程描述来路由对话。“Send money to another person” 比 “money_transfer” 好用一万倍。
  2. 测试奇葩路径。 用户会说“给我室友转个大概 50 块钱吧也许”这种话,你的机器人得能处理这种不确定性。尽早测试这些情况。
  3. 加上确认步骤。 对于任何会产生真实世界后果的操作,执行前一定要加确认步骤。在 Rasa 里,这很容易加到流程中。
  4. 槽位验证是好帮手。 为收集到的槽位定义验证规则——金额必须是正数,收款人必须在你的用户数据库里,等等。

局限性:

  1. 学习曲线确实陡。 Rasa 基于 YAML 的配置水很深,文档虽然全面,但看着让人头大。做好花个周末光是为了搞懂架构的心理准备。
  2. 依赖 LLM 就意味着有延迟。 每条用户消息都要过一遍 LLM 来做意图分类和回复生成。到了生产环境,你得好好琢磨模型托管和响应时间的问题。
  3. 流程调试有时像开盲盒。 当对话跑偏时,想搞清楚 LLM 为什么做出特定的路由决策并不总是那么直观。Rasa X 的可视化工具能帮上忙,但这又多了一层复杂性。
  4. 免费版有极限。 Developer Edition 用来学习很棒,但生产环境使用你得买付费许可证。

Rasa 完美解决了我面临的痛点:构建一个既能自然聊天,又能严守业务规则的对话机器人。如果你只是想做个简单的 FAQ 机器人,它不是合适的工具——有更轻量的方案。但当你需要一个能引导用户走完多步流程、处理他们的天马行空、且绝不跳过关键确认步骤的机器人时,花时间学习 Rasa 绝对物超所值。

相关 Agent

D

Devin

Cognition AI 的自主 AI 软件工程师

了解更多 →