数据截至 (上游 commit fb951af7744d)
03 · Co-STORM:人机圆桌讨论 + 动态思维导图
Co-STORM 把 STORM 从“无人自动写稿”升级成“人能随时插话的协同知识探索”。两个新东西:一套轮次管理策略(谁该说话)和一张动态思维导图(信息怎么组织)。
1. 它解决什么新问题
STORM-Wiki 是“一键出稿”,人无法干预方向。Co-STORM(EMNLP 2024)面向人机协同的信息探索:人可以观察这场讨论,也可以插一句话把讨论引向自己关心的点。
为降低人“看长对话”的认知负担,Co-STORM 维护一张动态更新的思维导图:把零散信息组织成层级概念结构,作为“人和系统共享的概念空间”(见 dataclass.py:291-306 的 KnowledgeBase 文档串,引用 Co-STORM 论文 §3.2)。
2. 三类参与者 + 轮次管理
圆桌上有三类“说话人”:
| 角色 | 干什么 | 代码 |
|---|---|---|
| CoStormExpert(专家) | 某个视角的专家,做 RAG 作答或追问 | collaborative_storm/modules/co_storm_agents.py CoStormExpert |
| Moderator(主持人) | 用“检索到但还没被用过”的信息抛出新角度问题 | co_storm_agents.py Moderator |
| Human / SimulatedUser(人类/模拟用户) | 观察或主动插话引导方向 | co_storm_agents.py SimulatedUser |
谁该下一个说话? 由 DiscourseManager.get_next_turn_policy(collaborative_storm/engine.py:461-502)决定,返回一个 TurnPolicySpec(engine.py:293-316,带 4 个标志:是否重组知识库/是否更新专家列表/是否润色发言/由哪个 agent 发言)。怎么读这套优先级(从上到下,命中即定):
get_next_turn_policy(conversation_history):
├─ simulate_user? → 由模拟用户发言
├─ rag_only_baseline_mode? → 纯 RAG agent(消融基线)
├─ next_turn_moderator_override? → 主持人(warm start 后强制先由主持人开场)
├─ 连续 N 轮没人提问了? → 主持人抛新问题 + 标记“重组知识库”
└─ 否则 → 专家轮流发言(experts.pop(0) 再 append 回队尾)
“连续 N 轮没提问就让主持人介入”靠 _should_generate_question(engine.py:408-423):它倒着数连续的“非提问”轮次,达到 moderator_override_N_consecutive_answering_turn(默认 3)就触发。这保证讨论不会一直在答、不开新方向。
专家列表是动态的: 当上一轮是“提问”时,should_update_experts_list 为真,系统会据这轮内容用 GenerateExpertModule 重新生成一批对口专家(engine.py:446-453)。
3. 一步对话:CoStormRunner.step
人或系统的每一次推进都走 CoStormRunner.step(collaborative_storm/engine.py:661-761)。怎么读这条主线:
step(user_utterance):
├─ 若 user_utterance 非空: # 人插话
│ 直接作为 "Guest / Original Question" 入历史,返回
└─ 否则: # 系统自动推进一轮
① get_next_turn_policy(...) 选出本轮 agent
② agent.generate_utterance(kb, history) 生成发言(专家会做 RAG)
③ should_update_experts_list? 据发言刷新专家名单
④ knowledge_base.update_from_conv_turn 把本轮引用的信息插进思维导图
⑤ should_reorganize_knowledge_base? reorganize() 重组导图
专家发言 CoStormExpert.generate_utterance(co_storm_agents.py:78-107)三步:先取知识库摘要当上下文 → 用 CoStormExpertUtteranceGenerationModule 规划动作并 RAG 作答 → 再润色成更口语化的圆桌发言。RAG 作答的底层是 AnswerQuestionModule(grounded_question_answering.py:50-163),和 STORM 的专家同源:拆查询→检索→带 [1][2] 作答→抽取被引用的源。