You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rasa构建的Facebook Messenger机器人中保存用户语言偏好并避免重复询问

嘿,这个需求在Rasa里实现起来思路很清晰——核心就是把用户的语言偏好存成持久化的槽位,每次对话先检查这个槽位,再决定要不要触发语言选择流程。我给你拆解成几个实操步骤:

1. 定义持久化槽位存储语言偏好

首先在你的domain.yml里添加一个槽位,专门用来保存用户选择的语言。关键是要设置它不影响对话分支且可持久化,这样用户下次再来时数据不会丢失:

slots:
  user_language:
    type: text
    influence_conversation: false  # 仅存储信息,不干扰对话流程分支
    mappings:
      - type: custom  # 后续通过自定义动作/表单赋值
2. 用规则区分“首次对话”和“重复对话”

在rules.yml里写两条核心规则:一条处理用户没设置语言的情况(触发选择流程),一条处理已设置语言的情况(直接进入正常对话):

rules:
  - rule: 首次对话触发语言选择
    steps:
      - intent: greet
      - action: action_check_user_language
      - slot_was_set:
          - user_language: null
      - action: language_selection_form
      - active_loop: language_selection_form
      - active_loop: null
      - action: utter_welcome_with_language

  - rule: 已设置语言直接欢迎
    steps:
      - intent: greet
      - action: action_check_user_language
      - slot_was_set:
          - user_language: "en"  # 示例,实际会读取用户的真实槽位值
      - action: utter_welcome_with_language
3. 自定义动作检查槽位状态

创建一个自定义动作action_check_user_language.py,用来在用户打招呼时自动检查语言槽位是否存在:

from typing import Any, Text, Dict, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher

class ActionCheckUserLanguage(Action):
    def name(self) -> Text:
        return "action_check_user_language"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker,
            domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:
        # 从会话追踪器里读取用户的语言槽位
        user_lang = tracker.get_slot("user_language")
        if user_lang is None:
            # 未设置则返回空槽位,触发后续选择流程
            return [{"slot": "user_language", "value": None}]
        else:
            # 已设置则保留槽位值,直接进入正常对话
            return [{"slot": "user_language", "value": user_lang}]
4. 配置会话存储实现持久化

默认Rasa的会话数据存在内存里,重启服务就会丢失。要让语言偏好永久保留,得在endpoints.yml里配置外部存储,比如Redis:

tracker_store:
  type: redis
  url: localhost
  port: 6379
  db: 0
  timeout: 300  # 会话超时时间,按需调整

或者用SQL数据库(比如PostgreSQL):

tracker_store:
  type: sql
  dialect: "postgresql"
  url: "postgresql://用户名:密码@localhost/数据库名"
5. 根据语言槽位切换回复语

最后在domain.yml里为不同语言配置对应的欢迎语,让回复自动匹配用户偏好:

responses:
  utter_welcome_with_language:
    - text: "Hello! Welcome back to the bot."
      condition:
        - slot_was_set:
            - user_language: "en"
    - text: "Bonjour! Ravi de vous revoir."
      condition:
        - slot_was_set:
            - user_language: "fr"
    - text: "你好!欢迎回来使用机器人。"
      condition:
        - slot_was_set:
            - user_language: "zh"

这样一来,用户首次对话时会被询问语言偏好,之后每次打招呼都会直接用对应语言回复,再也不会重复询问啦。Facebook Messenger渠道会自动关联用户的会话ID,每个用户的槽位数据都是独立存储的,不用担心混淆。

内容的提问来源于stack exchange,提问作者mW3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:33:54