BP21 · Bundle 跨品类组合与 ask_user 增强#
定位:面试官追问多品类编排、组合优化、交互设计时的拷问预备。
核心口述(30 秒)#
“用户说「旅行三件套,预算 300」,planner 识别 bundle 意图拆成多个品类槽位(各带独立预算/约束),按槽位 parallel_dispatch_tool 批 fork 并行检索,item_picker 内建 bundle 模式用 MCKP(多重选择背包)在总预算下跨槽位组合优选,最后 ask_user 发可点选 options 让用户确认组成(可删槽、补搜)。Harness 和 fork 机制零改动——bundle 是 planner + picker 的能力扩展,不是新链路。“
拷问链#
Q: 为什么用 MCKP 而不是简单排序?#
跨品类组合是有约束的:总预算要覆盖所有槽位,每个槽选一件。简单按分数排会出现「把预算全给一个槽」的偏斜。MCKP 保证每个槽至少选一件、总价不超预算、总效用(picker 打分)最大。
Q: bundle 模式改了 Harness 吗?#
零改动。planner 返回的 tasks 多了几个槽位,parallel_dispatch_tool 照常按 demands 批 fork,item_picker 根据入参判断是否 bundle 模式。新能力长在工具里,不在编排里——符合同质 fork 的硬约束。
Q: ask_user 的 options 怎么做到单选/多选/默认勾选?#
AskOption(label, value, selected),前端根据 multi_select 标志渲染单选 radio 或多选 checkbox。selected=true 的项默认勾上。点选后自动拼接回复文本,向后兼容——不传 options 仍走纯文本输入。
Q: 用户删了一个槽之后怎么办?#
ask_user 回复里标记删除的槽 → planner 更新 tasks 移除该槽 → 按剩余槽重新算预算分配 → 触发补搜(仅对变化的槽 fork)。不是全部重来。
Q: 前端怎么按槽位分组显示商品?#
shopping_summary 返回的 items 带 slot 标记(来自 planner 的槽位名),前端按 slot 分组渲染。每组标题是槽位名(如「背包」「收纳袋」「洗漱包」),组内按 picker 打分排序。
压力题#
Q: 槽位间有依赖怎么办?(如「书包要装下电脑」)#
当前 MCKP 假设槽位独立——这是诚实边界。跨槽依赖(尺寸兼容、风格统一)需要在 picker 加跨槽约束或后置校验。当前靠 planner 在拆槽时把依赖写进各槽的约束字段(如「背包需 15 寸电脑仓」),让 item_search 在检索词里体现。