上个月,我接了个活儿,要给一款金融科技 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 对象能让你拿到所有收集到的槽位值——在我们这个例子里就是 recipient 和 amount。
见证奇迹:流畅对话与死板逻辑的碰撞
到了这儿,我彻底信了。让我给你看看这套配置是怎么处理实际对话的:
顺畅路径(一步步来):
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
这会打开一个交互式会话,你可以直接在终端里测试对话。我花了整整一个小时拿各种边界情况去刁难它——错别字、黑话、话说到一半改主意——它处理得出奇地好,大部分都接住了。
我犯的第一个错:一开始我忘了单独启动动作服务器,怎么都想不通为什么转账动作老是不触发。收集完槽位后机器人就没动静了。别学我——一定要同时运行这两个进程。
实用建议与坦白的局限性
建议:
- 写好描述。 LLM 非常依赖你的流程描述来路由对话。“Send money to another person” 比 “money_transfer” 好用一万倍。
- 测试奇葩路径。 用户会说“给我室友转个大概 50 块钱吧也许”这种话,你的机器人得能处理这种不确定性。尽早测试这些情况。
- 加上确认步骤。 对于任何会产生真实世界后果的操作,执行前一定要加确认步骤。在 Rasa 里,这很容易加到流程中。
- 槽位验证是好帮手。 为收集到的槽位定义验证规则——金额必须是正数,收款人必须在你的用户数据库里,等等。
局限性:
- 学习曲线确实陡。 Rasa 基于 YAML 的配置水很深,文档虽然全面,但看着让人头大。做好花个周末光是为了搞懂架构的心理准备。
- 依赖 LLM 就意味着有延迟。 每条用户消息都要过一遍 LLM 来做意图分类和回复生成。到了生产环境,你得好好琢磨模型托管和响应时间的问题。
- 流程调试有时像开盲盒。 当对话跑偏时,想搞清楚 LLM 为什么做出特定的路由决策并不总是那么直观。Rasa X 的可视化工具能帮上忙,但这又多了一层复杂性。
- 免费版有极限。 Developer Edition 用来学习很棒,但生产环境使用你得买付费许可证。
Rasa 完美解决了我面临的痛点:构建一个既能自然聊天,又能严守业务规则的对话机器人。如果你只是想做个简单的 FAQ 机器人,它不是合适的工具——有更轻量的方案。但当你需要一个能引导用户走完多步流程、处理他们的天马行空、且绝不跳过关键确认步骤的机器人时,花时间学习 Rasa 绝对物超所值。