如何在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
相关产品推荐
相关产品推荐

