Rasa命令行模式下如何记录对话(含意图)?
嘿,我来帮你搞定这个问题!确实,Rasa默认在命令行模式(比如用rasa shell启动)下,没有像HTTP服务器那样自带的完善对话/意图记录功能,但咱们有几个实用的方法来实现这个需求:
方法一:利用Rasa事件监听器(Event Brokers)
Rasa的事件 broker 功能其实不局限于HTTP模式,命令行模式下也能配置,它可以把所有对话相关事件(包括识别的意图、实体、用户消息、机器人回复等)自动存储到指定的系统中。
举个配置SQLite数据库的例子:
- 在你的
config.yml文件中添加以下配置:
event_broker: type: sql url: sqlite:///conversation_logs.db
- 正常启动
rasa shell即可。
之后所有对话数据都会被写入conversation_logs.db这个SQLite数据库里,你可以用SQL查询工具直接查看,或者导出成CSV等格式做后续分析。除了SQLite,你还可以配置Redis、Kafka等其他类型的事件 broker,满足不同的存储需求。
方法二:自定义动作实现灵活记录
如果需要更个性化的记录格式(比如自定义字段、存到特定文件或业务系统),写一个自定义动作是最佳选择,完全可控:
步骤1:编写自定义动作代码
在actions/actions.py中创建如下动作类:
from typing import Any, Text, Dict, List from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher import json from datetime import datetime class ActionLogConversation(Action): def name(self) -> Text: return "action_log_conversation" def run(self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]: # 提取关键对话数据 latest_msg = tracker.latest_message intent_name = latest_msg['intent']['name'] intent_confidence = round(latest_msg['intent']['confidence'], 4) user_input = latest_msg['text'] conversation_id = tracker.sender_id timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # 组装日志条目,可按需添加字段 log_entry = { "timestamp": timestamp, "conversation_id": conversation_id, "user_message": user_input, "recognized_intent": intent_name, "intent_confidence": intent_confidence } # 写入JSONL格式日志文件,也可替换为数据库写入逻辑 with open("conversation_logs.jsonl", "a", encoding="utf-8") as log_file: log_file.write(json.dumps(log_entry, ensure_ascii=False) + "\n") return []
步骤2:注册并触发动作
- 在
domain.yml中注册这个动作:
actions: - action_log_conversation
- 在
rules.yml中添加一条全局规则,让这个动作在每次用户发送消息后自动触发:
rules: - rule: 记录每一条用户对话与意图 steps: - intent: * # 匹配所有意图 - action: action_log_conversation
完成后启动rasa shell,每次用户发送消息,识别到意图后,相关数据就会自动追加到conversation_logs.jsonl文件中,格式清晰易读,也方便后续的数据分析。
方法三:命令行重定向+简单解析(临时方案)
如果只是临时需要记录,不想改动代码或配置,可以用命令行重定向把rasa shell的输出保存到文件,再提取所需信息:
启动命令:
rasa shell > rasa_conversation.log 2>&1
这个命令会把所有控制台输出(包括用户消息、识别的意图和置信度)都保存到rasa_conversation.log中。之后你可以写个简单的Python/Shell脚本,提取类似User message: "xxx" (intent: yyy, confidence: zzz)这样的行,解析出意图和对话内容。不过这个方法比较简陋,适合快速临时使用,可靠性不如前两种。
内容的提问来源于stack exchange,提问作者Charlotte Junod

