Rasa 是一个开源的对话式 AI 框架,用于构建带有上下文记忆的多轮对话机器人。与单纯的意图分类工具不同,Rasa 覆盖了从自然语言理解(NLU,即从用户文本中识别意图与实体)到对话管理(决定下一步回应什么)的完整链路,并提供自定义动作(Action)机制,让机器人能够调用外部 API、查询数据库、完成表单收集等真实业务操作。它采用 Apache 2.0 协议,支持完全自托管,数据不出服务器,因此广泛用于金融、政务、电商等对数据安全要求较高的领域。Rasa 的核心能力围绕三个层面展开:data/ 目录下的 NLU 样本与对话故事(Stories)定义行为数据,config.yml 中的管道(Pipeline)与策略(Policy)定义模型结构,actions/ 中的 Python 代码实现业务扩展。本文按“工具速览 → 安装配置 → 快速上手 → 核心能力 → 生产部署 → 选型对比 → 常见误区 → 面试题”的路径组织,读完即可运行第一个 Rasa 机器人并理解其生产架构。

岗位关联

掌握 Rasa 意味着你具备了构建生产级多轮对话系统的核心能力——从意图识别、对话状态管理到与业务系统深度集成,这是 AI 从业者从“调用模型”走向“交付系统”的关键一步。

目录
  1. 为什么需要 Rasa:通用多轮对话系统的完整解法
  2. 安装与环境配置:4 步就绪
  3. 快速上手:5 分钟跑通第一个机器人
  4. 核心能力详解:5 大支柱
  5. 生产部署与监控:从上线到运维
  6. 版本迭代
  7. AI 应用场景
  8. 常见误区
  9. 面试题
  10. 参考来源
工具类型
开源对话式 AI 框架
开发商
Rasa Technologies(德国·柏林)
开源协议
Apache 2.0(可商用)
GitHub Stars
无
主要语言
Python
当前版本
4.x(2024 年 4 月发布)
安装方式
pip install rasa
官方文档
上手难度
★★★★☆(较高)
适合人群
NLP 工程师、对话机器人团队、客服系统研发
同类工具
Dialogflow CX、Microsoft Bot Framework、Dify
托管服务
无

速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。

为什么需要 Rasa:通用多轮对话系统的完整解法

传统对话机器人开发有两种路径:一是基于关键词匹配的脚本机器人,通过 if-else 规则响应特定触发词,遇到语义变化(如“查余额”与“我卡里还有多少钱”)就失效,维护成本随话术数量爆炸式增长;二是使用 SaaS 对话平台(如 Dialogflow),虽降低了开发门槛,但对话数据全部经过第三方服务器,且深度的业务定制(如对接内部 CRM 系统)受平台能力限制,难以满足金融、政企的合规要求。这两种路径分别暴露了“理解能力弱”与“自主可控差”的痛点。

Rasa 的解决方案是提供一个可自托管的全栈框架:NLU 管道负责意图识别与实体提取,对话管理模块基于故事样本训练策略模型决定下一步动作,自定义动作机制把机器人与外部系统连接起来。所有模型权重与对话数据都留在本地服务器,满足数据安全要求。同时,Rasa 的管道(Pipeline)是模块化的——你可以自由替换分词器、特征提取器、分类器,甚至可以嵌入 Hugging Face 的预训练模型,针对中文等特定语言做定制优化。

与 LangChain、Dify 等 LLM 应用框架相比,Rasa 的气质差异在于它面向“有状态、可测试、可控”的生产对话系统:对话策略是可训练的模型而非自由的提示词编排,每条回复路径都有固定的状态转移逻辑,可以用 rasa test 做回归测试。LLM 框架更适合开放式任务执行,而 Rasa 擅长的是高频、确定性要求高的业务对话场景。

安装与环境配置:4 步就绪

步骤一:准备 Python 环境。 Rasa 4.x 要求 Python 3.9+,建议使用虚拟环境隔离依赖。Rasa 对依赖版本敏感,直接装在系统 Python 中容易与既有包冲突。

步骤二:安装 Rasa。 使用 pip 安装 rasa 包,该包同时包含 NLU 与对话管理功能,无需分别安装。

步骤三:验证安装。 通过 rasa --version 查看安装信息,确认 CLI 可用。

步骤四:初始化项目骨架。 rasa init --no-prompt 会在当前目录生成完整的示例项目,包括 data/(训练数据)、actions/(动作代码)、config.yml(管道配置)、domain.yml(领域声明)、endpoints.yml(外部服务连接配置)等文件。--no-prompt 参数表示跳过交互式问答,直接生成默认数据。

bash12 行
# 创建并激活虚拟环境python -m venv .venvsource .venv/bin/activate # 安装 Rasapip install rasa # 验证版本rasa --version # 初始化示例项目(生成对话机器人骨架)rasa init --no-prompt

快速上手:5 分钟跑通第一个机器人

最小可用流程的核心思路是三步:喂数据、训模型、对话测试。rasa init --no-prompt 生成的示例项目已经包含一份“查心情”机器人,但它仅用于演示。要让机器人理解你的业务,需要修改三类文件——data/nlu.yml 定义意图样本,domain.yml 声明意图与回应,data/stories.yml 定义对话流转路径。以下操作在项目根目录进行:

1. 编辑 data/nlu.yml,在 nlu: 段下新增一个 intent: greet,并在 examples: | 后逐行添加中文问候语示例。示例覆盖越多说法,意图识别越准。

2. 编辑 domain.yml,在 intents: 段声明 greet,在 responses: 段定义 utter_greet 对应的回复文本。

3. 编辑 data/stories.yml,新增一条 story: greeting path,定义“用户问候 → 机器人回复”的对话流转。

4. 运行 rasa train 训练模型,训练完成后模型文件会写入 models/ 目录。

5. 运行 rasa shell,在命令行中输入“你好”测试对话,机器人应返回 utter_greet 中定义的文本。

完成上述配置后,模型即可在 CLI 中交互。进阶技巧:用 rasa interactive 以人机对话方式生成更多 stories 样本,Rasa 会在对话过程中自动记录意图与动作,生成对应故事数据。这是扩充对话训练集的推荐方式。

yaml25 行
# data/nlu.yml 中新增意图样本version: "3.1"nlu:- intent: greet  examples: |    - 你好    - 您好    - 早上好    - hi 你好 # domain.yml 中声明意图与响应version: "3.1"intents:- greetresponses:  utter_greet:  - text: "你好!请问需要什么帮助?" # data/stories.yml 中定义对话路径version: "3.1"stories:- story: greeting path  steps:  - intent: greet  - action: utter_greet

核心能力详解:5 大支柱

支柱一:NLU 管道——意图识别与实体提取。 Rasa 的 NLU 能力由 config.yml 中的管道组件决定。默认管道包含 WhitespaceTokenizer(分词器)、CountVectorsFeaturizer(特征提取器)和 DIETClassifier(分类器)。其中 DIET(Dual Intent and Entity Transformer,联合意图与实体变换器)采用 Transformer 架构,同时学习意图分类与实体识别两个任务,共享语义表示,因此部署体积小、训练效率高。中文场景下,默认的空白分词器无法处理连续汉字,需要替换为 JiebaTokenizer(结巴分词器)或接入语言模型 Featurizer。

支柱二:对话策略——TED、Rules 与 Memoization。 对话管理是“下一步该说什么”的决策层。Rasa 提供三类策略:RulePolicy 定义确定性规则,优先级最高,适合处理“必须如此回应”的场景(如 fallback 兜底);MemoizationPolicy 记录训练数据中精确匹配的历史对话路径;TEDPolicy(Transformers Embedding Dialogue Policy,变换器嵌入对话策略)从 stories 中学习对话模式,可泛化到未见过的对话轨迹。三种策略按优先级组合决策,权重可在 config.yml 的 policies: 段调优。

支柱三:自定义动作——连接外部业务系统。 纯文本回复无法满足真实业务需求。自定义动作(Custom Actions)是运行在独立服务(Action Server)中的 Python 函数,通过继承 Action 类实现。动作可以查询数据库、调用外部 HTTP API、写入工单系统,并将结果以 SlotSet(设置槽位)、BotUttered(发送回复)等事件列表的形式返回给 Rasa 核心。动作服务器与 Rasa 主服务通过 endpoints.yml 中的 URL 解耦,可独立扩容。

支柱四:表单与槽位——多轮信息收集机制。 槽位(Slots)是对话中的状态变量,如用户名、订单号、日期。表单(Forms)用于“按固定流程收集多个槽位”的场景——机器人逐轮询问缺失的槽位,用户回答后由 FormValidationAction 校验输入合法性(如日期格式、订单号是否存在),校验通过则填充槽位并进入下一项,最终触发提交动作。这是 Rasa 处理火车票预订、身份核验等结构化对话的核心机制。

支柱五:渠道适配——一次开发多端接入。 Rasa 通过渠道(Channels)对接不同消息平台。credentials.yml 中为每个渠道配置认证信息。内置渠道包括 REST(HTTP API,通用接入)、Slack、Telegram、Facebook Messenger、WhatsApp 等。REST 渠道是 Web 端定制的常用入口,前端通过 POST http://<host>:5005/webhooks/rest/webhook 发送用户消息并获取回复流。自定义渠道可通过继承 InputChannel 类实现。

生产部署与监控:从上线到运维

部署方式一:Docker Compose 双服务部署。 生产环境推荐将 Rasa 主服务与 Action Server 拆分为两个容器:rasa/rasa 镜像运行模型推理,rasa/rasa-sdk 镜像运行业务动作。主服务以 rasa run --enable-api 启动,--enable-api 开启 HTTP API 入口供渠道调用。通过 volume 挂载 models/、credentials.yml、endpoints.yml,使用 docker-compose up 一键启动。容器间通过 Compose 内部网络通信。

部署方式二:独立进程部署。 不使用容器时,在同一台机器以两个终端进程(或 systemd 服务)分别运行 rasa run --enable-api --port 5005 和 rasa run actions --port 5055。endpoints.yml 中配置 action_endpoint.url: "http://localhost:5055/webhook"。前端应用通过 REST 渠道调用主服务,主服务在对话过程中按需回调动作服务器。此方案适合中小流量的内部系统。

可观测性。 Rasa 自身不提供可视化监控面板,但可以通过三个层面搭建观测体系:一是日志,rasa run --log-file logs/rasa.log --log-level DEBUG 记录请求与预测详情,可接入 ELK 做日志检索;二是回归测试,用 rasa test 在 CI 中运行 NLU 评估与故事(Stories)测试,生成意图混淆矩阵与对话准确率报告,防止模型迭代引入回归;三是业务层面,在自定义动作中埋点上报用户意图分布、动作执行耗时与失败率,结合 Prometheus + Grafana 监控动作服务器健康度。

<p class="para-label">避坑清单:</p>

<ul class="dash-list"><li>坑一:升级 3.x 到 4.x 时直接替换包导致启动失败——Rasa 4 要求 Python ≥ 3.9,且旧模型无法直接加载,升级前先运行 rasa --version 确认环境,对照官方迁移文档逐项检查配置,升级后必须重新训练模型。</li><li>坑二:自定义动作始终不生效或返回通用回复——多数原因是动作服务器未启动或 endpoints.yml 未配置 action_endpoint.url,先确认 rasa run actions 进程存活,再检查配置指向的端口是否与动作服务器一致。</li><li>坑三:中文意图识别效果差——默认 WhitespaceTokenizer 按空格与标点切分,不适合中文连续文本;应改用 JiebaTokenizer 并配合语言模型 Featurizer,同时为每个意图提供至少 10-15 条覆盖不同说法的中文示例。</li></ul>

维度RasaDialogflow CXMicrosoft Bot FrameworkDify
定位开源对话式 AI 框架Google Cloud 托管对话 Agent企业级对话机器人框架LLM 应用开发平台
编排范式故事(Stories)+ 策略模型Agent/Flow 图形化编排对话转接 + 瀑布流对话框可视化工作流 + Agent
类型约束Python 强类型服务端托管配置TypeScript/C#/PythonPython + 可视化编排
学习曲线较高中等中高低
生态集成管道组件可替换、自定义动作丰富Google Cloud 生态深度绑定Azure 生态(LUIS、QnA)多模型接入(OpenAI、Claude等)
生产部署自托管(Docker/裸机)完全托管(SaaS)Azure Bot Service 托管云托管或自托管
LicenseApache 2.0商业闭源MIT(SDK 开源)+ 商业托管Apache 2.0
适合谁NLP 工程师、高定制需求团队已有 Google 云依赖的团队深植微软生态的大型企业快速搭建 LLM 应用的团队

选型建议:如果对话逻辑复杂、需要深度定制 NLU 管道且数据必须本地化,选 Rasa 是唯一可靠出路;如果团队希望零运维快速上线且无数据合规问题,Dialogflow CX 更省成本;如果整个技术栈已基于 Azure,Bot Framework 与其云服务闭环最顺;如果是偏向 LLM 自由对话而非严格状态控制的场景,Dify 的 Agent 工作流学习成本更低。

版本迭代

Rasa 从 2017 年开源的 NLU + Core 双引擎起步,1.x 完成包合并,2.x 统一策略体系,3.x 全面 YAML 化配置,4.x 聚焦运行时性能与精简(截至训练数据,可能已有更新版本)。每次主版本升级都伴随配置格式与 API 的调整,升级需对照官方迁移文档。

版本时间变化提升
1.02019-06合并 Rasa NLU 与 Rasa Core统一为单一 `rasa` 包,提供统一 CLI 入口
2.02020-10重构对话策略体系引入 RulePolicy、MemoizationPolicy,统一 `rasa train` 训练命令
3.02022-03全面 YAML 化配置领域声明、管道配置、故事数据全部迁移至 YAML 格式
3.52023-05稳定性与配置优化改进槽位映射逻辑、提升长对话训练稳定性
3.62023-10依赖升级与性能调优升级内部依赖、修复已知安全问题、优化训练速度
4.02024-04核心运行时重构要求 Python 3.9+,大幅精简运行时、提升推理速度,配置格式兼容 3.x 主体但需重新训练模型
结论

Rasa 未发布统一的公开模型评测榜单,各版本的实际能力差异需在自有语料上通过 rasa test 对比意图准确率、F1 与故事完成率。选型建议:新项目直接采用 4.x;若因历史原因停留在 3.x,在 3.6 上仍可长期维护,但需注意 Python 版本限制与依赖安全更新。

AI 应用场景

智能客服机器人(电商/零售)

阶段:多轮对话管理 + 表单信息收集

解决的问题:传统 FAQ 机器人只能回答固定问题,遇到“我的订单为什么还没发货”这类需要查询订单号的咨询便无法处理。Rasa 通过意图识别判断用户诉求,用表单逐轮收集订单号与问题类型,再通过自定义动作调用订单系统 API 返回实时物流状态。

具体案例:示意案例——某电商团队用 Rasa 构建售后助手,覆盖订单查询、退换规则、发票申请三类高频场景。上线后约 60% 的售后咨询由机器人直接完成,转人工率下降约 40%,人工客服聚焦于投诉等高复杂度工单。

银行自助服务(金融)

阶段:槽位填充 + 高风险身份核验

解决的问题:余额查询、开户预填、网点导航等低频但量大业务占用客服座席资源,且涉及敏感数据不能交由外部 SaaS 处理。Rasa 的自托管能力满足金融数据合规要求,槽位机制支持多要素身份验证(身份证号 + 手机号 + 短信验证码),验证通过后才执行查询动作。

具体案例:示意案例——某股份制银行将 30 个标准化对话场景接入 Rasa,每日处理量超过 2 万次,业务办理平均耗时从 3 分 20 秒降至 1 分 10 秒,身份核验环节准确率达 99%以上。

企业内部 IT 工单助手

阶段:意图路由 + 外部系统联动

解决的问题:员工遇到电脑故障时不知如何联系支持团队,工单填写流程繁琐。Rasa 识别“网络故障”“软件安装”等意图后,通过自定义动作查询员工信息、自动创建工单并分配给对应支持小组,全程无需人工介入。

具体案例:示意案例——某科技公司 IT 服务台接入 Rasa 后,工单创建从平均 40 秒缩短至 3 秒,重复性咨询(密码重置、VPN 配置)解决率达 85%,IT 支持团队人均处理工单量提升 2.1 倍。

常见误区

误区很多初学者以为 Rasa 就是一个开源的意图分类库,像调用 scikit-learn 一样,训练一个分类器就完事了,重点全放在 NLU 样本上。

正解NLU 只是 Rasa 三层架构中的第一层。对话管理(Dialogue Management)负责追踪多轮对话状态、通过策略决定下一步动作;自定义动作负责执行真实业务逻辑。三个层级协同才构成一个完整的对话系统。只调 NLU 会导致机器人能“听懂”但不会“接话”,多轮对话无法保持连贯。

为何常见:Rasa 的 DIET 分类器在技术上极具代表性,中文教程多数从意图分类讲起,容易让人误以为 NLU 就是全部。

误区认为 stories 是训练对话策略的唯一燃料,样本越多,TEDPolicy 泛化能力越强,于是无差别堆叠大量对话记录。

正解TEDPolicy 确实从 stories 中学习,但低质量或重复的样本会引入噪声,降低策略稳定性。正确做法是:用 rasa interactive 生成覆盖主要业务路径的干净样本,用规则(Rules)处理确定性行为,用 fallback 兜底未知输入,最后用 rasa test 的对话准确率验证故事质量。

为何常见:“数据越多模型越强”是机器学习通识,但对话数据不同于静态样本,路径冲突与标签不一致会造成策略模型混淆。

误区不少老项目升级时只更新 pip 包版本,保留旧格式的 domain、stories 配置,期望正常运转。

正解Rasa 2.x 与 3.x 的配置格式存在重大差异——2.x 的 stories 使用 Markdown 格式,3.x 全面切换为 YAML 并改变了策略名称与管道定义方式;4.x 又移除了一批废弃参数。升级必须参考官方迁移指南,逐文件比对后再重新训练模型。

为何常见:Rasa 大版本迭代频繁,而市面大量教程停留在 2.x 时代,按旧教程改新版配置自然处处报错。

误区初学者写了 actions.py 后直接运行 `rasa shell`,发现动作不执行、机器人返回默认回复,误以为是代码写错了。

正解自定义动作运行在独立的动作服务器(Action Server)上,必须先用 rasa run actions 启动服务,并在 endpoints.yml 中配置 action_endpoint.url 指向该服务地址。rasa shell 只加载模型,并不会自动拉起动作服务器。

为何常见:Rasa 官方教程的快速开始部分通常不含动作服务器启动,导致新手在进入自定义动作阶段时缺乏路径依赖认知。

面试题

Q1. Rasa 中负责“意图识别与实体提取”的模块是?

单选题 · easy

  • A.Rasa Core
  • B.Rasa NLU← 正确答案
  • C.Rasa SDK
  • D.Rasa X

答案:B。Rasa NLU(自然语言理解)管道负责从用户消息中识别意图与提取实体,DIETClassifier 是其核心组件。Rasa Core 是对话管理模块,负责策略决策;Rasa SDK 用于开发自定义动作;Rasa X 是对话数据标注与查看工具。因此选 B。

Q2. 在 domain.yml 中通过哪个配置段声明自定义动作?

单选题 · mid

  • A.intents
  • B.actions← 正确答案
  • C.responses
  • D.entities

答案:B。domain.yml 通过 actions: 段声明自定义动作名称(如 action_check_weather),Rasa 才能识别并调用该动作。intents 声明意图,responses 定义纯文本回复,entities 声明实体类型,均不是自定义动作的声明位置,故答案选 B。

Q3. Rasa 中“故事(Stories)”数据的主要训练对象是?

单选题 · mid

  • A.DIETClassifier
  • B.TEDPolicy← 正确答案
  • C.RulePolicy
  • D.JiebaTokenizer

答案:B。Stories 是以“用户意图 → 动作”序列构成的多轮对话样本,TEDPolicy 基于这些样本训练对话策略模型,学习上下文到动作的映射关系。DIETClassifier 的训练数据是 NLU 意图样本,RulePolicy 依赖规则定义而非 stories,JiebaTokenizer 是分词组件,故答案选 B。

Q4. 以下哪个命令用来启动命令行对话测试?

单选题 · easy

  • A.rasa test
  • B.rasa shell← 正确答案
  • C.rasa run actions
  • D.rasa init

答案:B。rasa shell 会在终端加载已训练模型并开启交互式对话,用于快速验证机器人行为。rasa test 运行自动化评估,rasa run actions 启动动作服务器,rasa init 创建新项目,均非命令行对话测试,故答案选 B。

Q5. Rasa 中槽位(Slots)的核心作用是什么?

单选题 · mid

  • A.存储 NLU 模型的中间向量
  • B.记忆多轮对话中的关键状态变量← 正确答案
  • C.记录所有用户消息的原始日志
  • D.管理动作服务器的进程编号

答案:B。槽位是对话状态的关键载体,用于在轮次间记忆用户提供的实体信息(如城市、订单号、日期),策略层据此决定下一步动作。它不存储模型向量或原始日志,与动作服务器进程无关,故答案选 B。

Q6. 在 Rasa 3.x 中,用户输入无法匹配任何意图时应使用哪种兜底机制?

单选题 · hard

  • A.调低 TEDPolicy 的置信度阈值
  • B.在 RulePolicy 中定义 fallback 规则← 正确答案
  • C.启用已废弃的 TwoStageFallbackPolicy
  • D.在 NLU 管道中增加更多分类器

答案:B。Rasa 3.x 起推荐通过 RulePolicy 显式定义 fallback 规则:当意图识别置信度低于阈值或动作预测失败时触发 action_default_fallback(默认回复“我不太明白”)。TwoStageFallbackPolicy 已在 3.x 移除;调低阈值会加剧误判;增加分类器不能解决动作层面的兜底问题。故答案选 B。

Q7. 在 Rasa 3.x 中,用户输入无法匹配任何意图时应使用哪种兜底机制?

单选题 · hard

  • A.在 RulePolicy 中定义 fallback 规则← 正确答案
  • B.调低 TEDPolicy 的置信度阈值
  • C.启用已废弃的 TwoStageFallbackPolicy
  • D.在 NLU 管道中补充更多分类器

答案:A。Rasa 3.x 推荐通过 RulePolicy 显式定义 fallback 规则:当意图识别置信度低于阈值或动作预测失败时,触发 action_default_fallback 给出兜底回复。调低阈值会增加误判概率,TwoStageFallbackPolicy 在 3.x 已移除,补充分类器无法解决动作层兜底问题,故答案选 A。

Q8. Rasa 生产部署中,哪些组件是必需的?(多选)

多选题 · easy

  • A.Rasa 主服务(rasa run --enable-api)← 正确答案
  • B.动作服务器(rasa run actions)← 正确答案
  • C.Docker 容器
  • D.HBase 数据库

答案:AB。Rasa 主服务提供对话 API 入口,动作服务器执行业务自定义动作,两者是生产环境的必要组件。Docker 只是推荐部署方式之一,也可用原生进程部署;HBase 并非 Rasa 依赖组件,Rasa 的对话追踪器与 Redis 等内存存储交互,故选 A、B。

Q9. 以下哪些方式能显著提升 Rasa 在中文语料上的 NLU 效果?(多选)

多选题 · mid

  • A.使用 JiebaTokenizer 替换默认分词器← 正确答案
  • B.加入预训练语言模型 Featurizer← 正确答案
  • C.扩充中文意图样本覆盖不同表达← 正确答案
  • D.关闭实体提取功能

答案:ABC。默认 WhitespaceTokenizer 无法正确处理中文连续文本,需换用中文分词器;接入 BERT 等预训练语言模型可提升语义泛化;充足且多样化的训练样本是模型效果的基础。关闭实体提取(D)会丢失命名实体信息,无法提升整体效果,故答案选 A、B、C。

Q10. 关于 Rasa 3.x 升级到 4.x,下列说法正确的是?(多选)

多选题 · hard

  • A.需要检查 Python 版本兼容性← 正确答案
  • B.旧模型可以直接加载使用
  • C.需要重新训练对话模型← 正确答案
  • D.所有 API 保持完全不变

答案:AC。Rasa 4.x 要求 Python ≥ 3.9,升级前必须确认环境符合要求(A 对)。4.x 对核心运行时进行了重构,3.x 训练出的模型文件无法在 4.x 直接加载,必须重新训练(C 对,B 错)。4.x 移除了一批废弃参数与接口,并非“所有 API 保持不变”(D 错),故答案选 A、C。

参考来源

  • webpageRasa 官网产品介绍、行业案例与企业版信息