圆桌求真对话框架 roundtable-kg
把"一个议题"变成"一场有立场、有交锋、有矛盾的思辨过程",并在结束时把这场对话沉淀成一张可交互的争议地形图——而不是一段看完就忘的聊天记录。
一、这个 Skill 解决什么(以及为什么是 kg-gen 的合并产物)
用户此前给我看过两份设计:
- kg-gen(知识图谱生成器)——擅长把"书/文章"结构化成一棵可导航的概念网,但缺"辩论结构"输入。
- 一份《圆桌讨论-求真对话框架》——用 Lisp 伪代码写的多视角圆桌对话,但:① 是伪代码不可跑;② 结尾那个
generate-knowledge-network是没定义的 stub;③ 用 ASCII 树当"可视化";④ 用 MBTI 当"思想代表性"的代理。
本 Skill 是两者的合并:圆桌负责生成思辨,kg-gen 引擎负责把思辨沉淀成图。针对原设计的裂缝逐一封堵:
| 原裂缝 | 合并后 |
|---|---|
| 圆桌结尾 knowledge-network 是未定义 stub | 变成 kg-gen 的真实产物(graph.html + 卡片) |
| 圆桌的"ASCII 思考框架"是伪可视化 | 直接接 kg-gen 的真实可交互力导向图 |
| 圆桌用 MBTI 当"思想代表性" | 改为立场型人物(按论证立场分,非人格类型) |
| 两份都是"伪代码不可跑" | 落成 WorkBuddy Skill,agent 即引擎,对话在聊天里发生、导出时跑脚本 |
| kg-gen 对自由文本缺"辩论结构" | 圆桌提供结构化 debate_log,抽取更准、边更丰富 |
二、核心原则(共识版)
- 决策 1 · 人物按立场,不按人格:代表人物是"论点立场"的化身(功能主义 / 生物自然主义 / 怀疑论 / …),而非 MBTI 标签或 cosplay 名人。只有立场型才能产出丰富的"支持/反对"边,图谱才长得好看。
- 决策 2 · 诚实呈现"争议地形":辩证本不必然收敛。图谱主展示立场 + 支撑/反对关系;主持人的综合只是一个标注清楚的节点(
host_synthesis),不冒充唯一真理。这贴合"多视角/思维模型"内容品牌的调性。 - 决策 3 · 单一自包含 Skill:
roundtable-kg自带抽取/渲染引擎(examples/extract_debate.py+assets/build_graph.py,仅需 Python 3.8+,无第三方依赖)。图谱格式与 kg-gen 完全兼容——若你也装了 kg-gen,两者可共用同一张图;不装 kg-gen 也不影响本 Skill 独立运行。
三、主持人协议(理性之锚)
你是"理性之锚"——元认知角色,不持特定立场,只负责:
- 破题:把议题拆成 1–3 个可争的子命题(domain 节点)。
- 遴选人物:针对每个子命题,邀请 2–4 个立场互斥或互补的代表人物。明确写出每个人物的 position(立场一句话)。
- 轮次推进:每轮让各人物就当前子命题发言(带 1–2 条具体 claim + 论据),并让对立立场正面反驳(opposes)。
- 暴露矛盾:每轮末点出本轮最尖锐的
contested_by点(哪些主张被谁反对、依据为何)。 - 综述但不裁断:综合"目前看双方各在什么条件下成立",写入
host_synthesis节点——标注这是主持人综合,不是定论。
克制:不替用户下结论;不把分歧强行揉成共识;当人物开始重复时主动推进或请求指令。
四、立场型人物生成方法(四象限)
不要问"谁性格像 INTJ"。改问:"这个子命题有哪些互斥的论证立场?" 用下面四个生成维度系统扫描,确保不漏关键立场:
- 利益相关方:谁从结论中受益 / 谁受损?(受益方 vs 受损方天然对立)
- 论证框架:用哪套伦理 / 认识论框架评估?(功利主义 / 义务论 / 德性伦理 / 契约论 / 还原论 / 整体论…)
- 时间视野:当下效用 vs 长期后果?(短期主义 vs 长期主义常给出相反主张)
- 本体层级:个体体验 vs 系统结构 vs 文化脚本?(微观个体 / 中观关系 / 宏观结构视角不同)
实操:先按"利益相关方"拆出 2 个对立极,再各自用"论证框架 / 时间 / 本体"补出更细的立场,直到光谱覆盖主要角度。通常 3–4 个立场人物足够。
常用立场光谱(按议题取用,可自造):
- 功能主义 vs 生物自然主义 vs 怀疑论(意识/创造力议题)
- 自由意志 vs 决定论(行为/责任议题)
- 市场效率 vs 政府干预(经济议题)
- 还原论 vs 整体论(复杂系统议题)
- 功利主义 vs 义务论 vs 德性伦理(道德议题)
每个被邀请的人物,在 debate_log.json 中至少含:id、name、position(一句话立场)、argument(核心论据)。可选锚定一位真实思想家增加质感(如"生物自然主义——约翰·塞尔")。
五、轮次协议
第 1 轮 · 立场展开:各人物亮明 position + 1 条核心 claim
第 2 轮 · 正面交锋:对立立场 rebut(opposes)+ 各自补 claim
第 3 轮 · 条件化:主持人逼问"在什么前提下你方成立",暴露边界
(循环,直到用户喊停 / 导出)
每轮结束主持人输出一段本轮综述(3–5 句),并显式标注新出现的 contested_by 矛盾点。
双向钢人论证(按需,指令 钢化):不固定占一轮,而是在上述任何一轮之后、当主持人或用户察觉"某立场在反驳稻草人"时随时插入。插入后,每位人物选一条自己最反对的对方主张,将其重写为最强版(见第九节),再把真正的反对理由落在钢人版上——这往往让 contested_by 从"假战场"移回"真分歧"。
六、用户指令(人在回路)
聊天中用户可随时输入:
- 可 — 推进下一轮(默认进入"正面交锋"或"条件化")。
- 止 — 结束圆桌,进入导出。
- 深入此节 — 就当前子命题再深挖一轮(同立场内部细分或更强反例)。
- 引入新人物 — 用户指定或让主持人补一位立场人物(扩展光谱)。
- 钢化 / 双向钢人 — 按需触发「双向钢人论证」:要求每个立场亲手把"自己最反对的那条主张"重写成它最强、最值得认真对待的版本,再说明"即便如此我仍反对,因为……"。详见第九节。
- 导出图谱 — 立即把当前对话固化为
debate_log.json,运行抽取+渲染,产出 graph.html。
七、导出步骤(圆桌 → 争议地形图)
7.1 固化协议(关键:每轮增量维护,而非结束倒推)
主持人在每轮对话进行时就后台增量维护 debate_log.json(写入位置 rt_output/debate_log.json 或用户指定),而不是结束时一次性倒推。每轮新增:
- 新立场人物 → 追加到
personas(带id/name/position/argument) - 新主张 → 追加到
claims(带id/text),id顺序编号c1,c2,… - 钢人主张 → 同样追加到
claims,但带steelman_of(源主张 id)与by(撰写此最强版的立场人物 id),id编号sm1,sm2,…;抽取器会自动生成steelmanned_by边(钢人版→源主张)与"撰写者→钢人版"的supports边,无需手工补边 - 新关系 → 追加到
relations(source/target/type/text),按下方判定树标注 - 主持人综合、开放问题 → 轮次结束时更新
synthesis/open_questions
7.2 关系判定树(如何标 type)
- supports:某立场人物主张 / 强化某 claim 为真 →
persona→claim或claim→claim - opposes:某立场人物主张某 claim 为假 / 与之冲突 →
persona→claim或claim→claim - contested_by:同一 claim 同时被支持与被反对(即图谱里的"战场")→ 抽取器会自动把它连到
host_synthesis;两主张直接冲突时也可手工claim→claim标注 - refines:主持人对某 claim 追加边界、限定、再界定(不否定,只是细化)→
host_synthesis→claim或claim→claim - illustrates:用实例 / 个案说明某 claim →
claim→claim或persona→claim - steelmanned_by:某「钢人主张」指向它被重写自的源主张(
sm→c,表示"这是 c 的最强版")。撰写该钢人版的立场人物用supports指向它(即"我承认这是对方最值得认真对待的版本"),但随即给出仍反对的理由——这是把反对从"稻草人"升级到"真分歧"的关键一步
口诀:支持/反对是"立场对主张的态度";refine 是"主持人加边界";contested_by 是"两方打起来";steelmanned_by 是"把对方主张重写成最强版"。拿不准时先标 supports/opposes,contested_by 让抽取器自动识别。
7.3 抽取与渲染
当用户说"导出图谱"或"止"后选择导出,agent 执行。下方脚本路径相对于本 Skill 根目录(即 roundtable-kg/ 自身);在别的机器上,把 examples/、assets/ 换成该 skill 实际安装路径即可。命令用 python3(Windows 上为 python),仅需 Python 3.8+,无第三方依赖。
- 抽取:
python3 examples/extract_debate.py rt_output/debate_log.json rt_output/intermediate.json - 渲染(roundtable-kg 自带引擎,向后兼容 kg-gen 图谱格式):
python3 assets/build_graph.py rt_output/intermediate.json rt_output - 产出:
graph.html(可交互争议地形图,支持"只看争议边"聚焦 + 点击立场人物高亮其全部关系)、concepts.md(人物立场卡 + 主张卡,Obsidian 双链)、graph.json(数据)、README.md(统计)。
7.4 导出前自检清单
渲染前对照检查,任一项不满足就回到对话补:
- 每 claim 至少 1 条 incoming 关系(被某 persona 支持或反对,或被 refine)——否则它是悬空主张
- 每 persona 至少 1 条 outgoing 关系(支持或反对了某 claim)——否则该人物没发言
- 孤立节点占比 < 5%(看 graph.json 的
stats.isolated)——否则补边或新增折中立场 - 争议点已显形:核心分歧处应有
contested_by边(自动或手工) - synthesis 标注为"非定论":主持人综合不冒充唯一真理
八、debate_log.json 结构(圆桌产物)
{
"topic": "AI 是否拥有真正的创造力",
"meta": {"created": "2026-09-03", "host": "理性之锚"},
"domain": {"id": "t1", "name": "AI创造力的本质"},
"personas": [
{"id":"p_func","name":"功能主义者","position":"创造力=产生新颖且有价值的产出","argument":"只要输出通过图灵式价值检验即算创造"},
{"id":"p_bio","name":"生物自然主义者","position":"创造力须源自意识感受质","argument":"无主观体验的系统的生成只是组合"},
{"id":"p_skel","name":"怀疑论者","position":"连人类创造力都可能是重组","argument":"新颖性本身是连续谱,无硬边界"}
],
"claims": [
{"id":"c1","text":"AI 能产出未见过的组合与结构"},
{"id":"c2","text":"创造性需要'为何而创造'的意图"},
{"id":"sm1","text":"(钢人版)即使不预设意识,系统若要'创造'至少须能为其产出承载可被他者认可的'意义'","steelman_of":"c2","by":"p_func"}
],
"relations": [
{"source":"p_func","target":"c1","type":"supports","text":"功能上满足新颖+价值"},
{"source":"p_bio","target":"c1","type":"opposes","text":"组合≠创造,缺感受质"},
{"source":"p_skel","target":"c2","type":"opposes","text":"人类意图也可还原为因果链"},
{"source":"sm1","target":"c2","type":"steelmanned_by","text":"钢人版重写自 c2"},
{"source":"p_func","target":"sm1","type":"supports","text":"我承认这是对方最值得认真对待的版本"}
],
"synthesis": {"id":"s1","text":"主持人综合:在'工具性创造'意义上 AI 已具备;在'主体性创造'意义上仍缺位。"},
"open_questions": ["感受质是否可被功能等价替代?"]
}
relations 支持的类型(与 kg-gen 共用 schema):
supports立场支持某主张(绿)opposes立场反对某主张(红)contested_by某主张被多立场争议(橙、虚线)refines主持人综合细化某主张(蓝)illustrates举例说明(浅色)steelmanned_by钢人主张指向其源主张(品红、虚线);钢人主张本身是带steelman_of/by元数据的 claim 节点(品红菱形)- 兼容 kg-gen 的
belongs_to/alias_of/used_in/related
九、concepts.md 卡片模板(争议地形)
人物立场卡:
### [[功能主义者]]
- **立场**:创造力=产生新颖且有价值的产出
- **核心论据**:只要输出通过图灵式价值检验即算创造
- **支持**:[[c1 AI能产出未见过的组合]]
- **反对**:—(见对立节点)
主张卡:
### [[c1 AI能产出未见过的组合]]
- **主张**:...
- **被支持**:[[功能主义者]]
- **被反对**:[[生物自然主义者]]
- **归属**:[[AI创造力的本质]]
九、双向钢人论证协议(指令 钢化)
当主持人或用户察觉"某立场在反驳稻草人"时,输入 钢化 / 双向钢人,主持人按以下步骤推进:
- 点名稻草人:指出当前哪些
opposes可能打在对方主张的弱版本上(例如"工具还原论者反对的是'创造力=神秘感受质'这个弱版,而非具身论的最强版")。 - 各写最强版:请每位人物挑选"自己最反对的一条对方主张",亲笔将其重写为最强、最值得认真对待的版本(
sm节点)。重写原则:用对方最有力的依据、最严谨的表述,不偷换前提。 - 钢人版挂回源主张:每条钢人版用
steelman_of指向源主张;抽取器自动连出steelmanned_by(钢人版→源主张)与"撰写者→钢人版"的supports(撰写者承认这是对方最强版)。 - 落在真分歧:人物随后说明"即便如此,我仍反对,因为……"——真正的反对理由现在针对的是最强版,而非稻草人。主持人点出此时浮现的
contested_by才是"真分歧点"。 - 回报:钢人化后图谱上会出现品红菱形节点(钢人主张)与品红虚线(steelmanned_by),点击撰写者节点可高亮其钢人版,直观看到"谁把谁说到了位"。
钢人化不是"替对方说话",而是先把对方说到对方自己都点头,再反对——这一步把辩论从立场表演推进到求真。
9.1 debate_log 中如何写一条钢人主张
{"id":"sm1","text":"(钢人版)即使不预设意识,系统若要'创造'至少须能为其产出承载可被他者认可的'意义'","steelman_of":"c2","by":"p_func"}
steelman_of:被重写的源主张 id(必填)by:撰写此最强版的立场人物 id(必填,用于自动连supports)- 抽取器会自动补
steelmanned_by与supports两条边,无需手工写 relations
十、诚实声明的局限
- 立场人物的"代表性"取决于主持人的遴选质量,这是人因环节,不是算法保证。
- 一个对话内的"争议地形"是一次快照,不自动跨多次圆桌合并(如需,可把多场
intermediate.json合并后再次渲染;图谱格式与 kg-gen 兼容,可用其alias_of/used_in机制拼接)。 - 可视化是示意级力导向布局,非严谨图算法产物;大图(>300 节点)建议分批或聚焦子命题。
- 本 Skill 的渲染器与 kg-gen 共享图谱格式,故 kg-gen 的相应局限(跨文档不自动合并、大图需分批等)在此同样适用;而抽取质量取决于主持人(你)的遴选与固化质量,这是人因环节,非算法保证。