如何为Slot filling chatbot实现两类提示(含suggestion chips)功能?
嘿,我来给你拆解下怎么实现这款槽位填充聊天机器人的需求,分几个核心环节梳理,都是实战中好用的思路:
一、对话初始阶段的开放式问题设计
首先要跳出“上来就硬问参数”的思维,得像真人聊天一样开场,引导用户自然表达,同时悄悄捕捉潜在的槽位信息。举个例子:
- 如果是订机票的机器人,别说“请输入出发地”,改成:“最近有没有出行计划呀?不管是订机票还是查行程,我都能帮到你~”
- 如果是外卖机器人,开场可以是:“今天想吃点啥?我帮你快速筛选合适的商家哦~”
这样用户大概率会主动提到关键信息(比如“下周三去上海”“我想吃川菜”),你就能自动提取对应的槽位(日期/目的地、菜系),后续只需要补全缺失的参数就行,完全贴合自然对话节奏。
二、通用缺失参数提示的实现
核心是先做好槽位状态跟踪,再根据缺失情况生成自然的提示,而不是机械的指令。
1. 先搞个槽位跟踪机制
用一个简单的字典就能搞定,比如:
# 以订机票场景为例,定义需要的槽位和初始状态 slot_tracker = { "departure_city": None, # 出发城市 "arrival_city": None, # 到达城市 "travel_date": None # 出行日期 }
2. 生成自然的缺失提示
写个函数来检测缺失槽位,然后把生硬的“请提供XX”转化成口语化的表达:
def generate_missing_slot_prompt(slot_tracker): # 找出所有未填充的槽位 missing_slots = [slot for slot, value in slot_tracker.items() if value is None] if not missing_slots: return "好的,所有信息我都齐啦,这就帮你处理~" # 优先处理最关键的第一个缺失槽位(你可以自己定义优先级) target_slot = missing_slots[0] # 把槽位名映射成用户听得懂的自然语言 slot_label_map = { "departure_city": "出发城市", "arrival_city": "到达城市", "travel_date": "出行日期" } # 生成基础提示 base_prompt = f"对啦,还需要你告诉我你的{slot_label_map[target_slot]}哦~" return base_prompt
三、Suggestion Chips的触发与实现
Chips的核心作用是降低用户输入成本,尤其是当用户多次输入不符合要求,或者槽位有固定可选范围的时候触发。
1. 触发时机
- 场景1:用户输入的内容不符合槽位规则(比如出发地输入了不存在的城市,日期格式不对)
- 场景2:槽位本身有明确的可选范围(比如常用城市、固定日期选项)
- 场景3:用户连续两次未正确填充该槽位(避免反复无效沟通)
2. 具体实现示例
在刚才的提示函数里加入chips逻辑,比如:
def generate_missing_slot_prompt(slot_tracker, user_input_history=None): missing_slots = [slot for slot, value in slot_tracker.items() if value is None] if not missing_slots: return "好的,所有信息我都齐啦,这就帮你处理~" target_slot = missing_slots[0] slot_label_map = { "departure_city": "出发城市", "arrival_city": "到达城市", "travel_date": "出行日期" } base_prompt = f"对啦,还需要你告诉我你的{slot_label_map[target_slot]}哦~" # 针对不同槽位添加suggestion chips chips_config = { "departure_city": ["北京", "上海", "广州", "深圳"], "travel_date": ["明天", "后天", "本周六", "下周一"] } # 判断是否需要触发chips:比如用户之前输入错误,或者槽位有预设选项 need_chips = False if target_slot in chips_config: need_chips = True # 如果有历史输入,且用户之前填错了该槽位,也触发chips if user_input_history and target_slot in user_input_history and not user_input_history[target_slot]: need_chips = True if need_chips: chips = chips_config[target_slot] # 把chips格式化成友好的选项(用反引号突出) chips_str = " | ".join([f"`{chip}`" for chip in chips]) base_prompt += f"\n你可以直接选择:{chips_str}" return base_prompt
3. 错误场景下的chips触发
比如用户输入“火星”作为出发地,机器人可以这样回复:
抱歉,暂时不支持这个出发地哦~你可以从这些城市里选:
北京|上海|广州|深圳
几个实用小技巧
- Chips选项别太多,3-5个最合适,避免用户选择困难
- 可以根据用户的历史对话调整chips顺序,比如用户之前经常订北京出发的机票,就把北京放在第一个
- 开放式对话和槽位捕捉要平衡,别为了抓槽位打断用户的自然表达,比如用户说“我想下周三去上海看朋友”,要自动提取日期和目的地,只问缺失的出发地就行
内容的提问来源于stack exchange,提问作者Mikul
相关产品推荐
相关产品推荐

