Community코딩 & 개발github.com

xiewende424/roundtable-kg

자체 완결형 WorkBuddy 스킬로, AI 원탁 토론을 진행하고 논쟁 지도를 대화형 힘-방향 그래프(force-directed graph)로 렌더링합니다. (오프라인, 제로 의존성, kg-gen 기반)

roundtable-kg란 무엇인가요?

roundtable-kg는 하나의 주제를 입장이 뚜렷하고, 충돌하며, 모순을 드러내는 사유 과정으로 변환한 후, 그 대화를 **대화형 논쟁 지형도**로 정제하는 AI 에이전트 스킬입니다. 단순한 채팅 기록이 아닌, 의미 있는 지식 구조를 생성하는 것이 목표입니다. 이 스킬은 kg-gen (지식 그래프 생성기)과 원탁 토론 프레임워크를 결합하여, 전자는 후자의 구조화된 논쟁 입력을 받아 대화형 그래프를 만들고, 후자는 전자의 그래프 엔진을 활용해 논증 결과를 시각화합니다. 주요 특징으로는 입장 기반 인물 생성 (MBTI나 유명인 모방 대신), 단계별 진행 프로토콜, 사용자 명령 기반 상호작용 (예: '다음 단계', '내보내기'), 그리고 대화 중 **점진적**으로 debate_log.json을 유지 관리하여 내보내기 시 완전한 데이터를 보장합니다. 최종 산출물은 대화형 force-directed graph (graph.html), 마크다운 카드 파일 (concepts.md), 그리고 JSON 데이터로, kg-gen과 완전히 호환되어 별도 설치 시 그래프를 공유할 수 있습니다. 모든 기능은 Python 3.8+ 및 표준 라이브러리만으로 작동하며, 타사 의존성이 없습니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add xiewende424/roundtable-kg

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

원탁 진리 탐구 프레임워크 roundtable-kg

"하나의 주제"를 "입장이 있고, 논쟁이 있으며, 모순이 있는 사유 과정"으로 바꾸고, 그 대화가 끝날 때 대화형 논쟁 지형도로 정제합니다. 단순히 읽고 잊어버리는 채팅 기록이 아닙니다.

1. 이 스킬이 해결하는 문제 (그리고 kg-gen과의 통합 이유)

사용자는 이전에 두 가지 설계를 보여주었습니다:

  1. kg-gen (지식 그래프 생성기) - "책/글"을 탐색 가능한 개념 네트워크로 구조화하는 데 능숙하지만, "논쟁 구조" 입력이 부족합니다.
  2. 《원탁 토론 – 진리 탐구 프레임워크》 - Lisp 유사 코드로 작성된 다중 관점 원탁 대화이지만, ① 실제로 실행할 수 없는 유사 코드, ② 끝에 있는 generate-knowledge-network는 정의되지 않은 stub, ③ ASCII 트리를 "시각화"로 사용, ④ MBTI를 "사상 대표성"을 위한 에이전트로 사용합니다.

본 스킬은 이 둘을 통합한 것입니다: 원탁은 사유를 생성하고, kg-gen 엔진은 그 사유를 그래프로 정제합니다. 원래 설계의 문제점을 각각 해결합니다:

원래 문제점통합 후
원탁 마지막의 knowledge-network는 정의되지 않은 stubkg-gen의 실제 산출물 (graph.html + 카드)
원탁의 "ASCII 사유 프레임워크"는 유사 시각화kg-gen의 실제 대화형 힘-방향 그래프
원탁이 MBTI를 "사상 대표성"으로 사용입장형 인물 (논증 입장 기준, 성격 유형 아님)
둘 다 "실행 불가능한 유사 코드"WorkBuddy 스킬로 구현, agent가 엔진, 대화는 채팅에서 발생, 내보내기 시 스크립트 실행
kg-gen은 자유 텍스트에 "논쟁 구조" 부족원탁이 구조화된 debate_log를 제공, 추출이 더 정확하고 엣지가 더 풍부함

2. 핵심 원칙 (합의 버전)

  • 결정 1 · 인물은 입장 기준, 성격 기준 아님: 대표 인물은 "논점 입장"의 화신 (기능주의 / 생물학적 자연주의 / 회의론 / …)이며, MBTI 레이블이나 유명인 코스프레가 아닙니다. 입장형만이 풍부한 "지지/반대" 엣지를 생성할 수 있어 그래프가 보기 좋습니다.
  • 결정 2 · "논쟁 지형"을 정직하게 제시: 변증법은 필연적으로 수렴하지 않을 수 있습니다. 그래프는 입장 + 지지/반대 관계를 주로 보여줍니다. 진행자의 종합은 단지 host_synthesis 레이블이 명확히 표시된 노드일 뿐, 유일한 진리를 가장하지 않습니다. 이는 "다중 관점/사고 모델" 콘텐츠 브랜드의 성격에 부합합니다.
  • 결정 3 · 단일 자체 완결형 스킬: roundtable-kg는 자체 추출/렌더링 엔진을 포함합니다 (examples/extract_debate.py + assets/build_graph.py, Python 3.8+만 필요, 타사 의존성 없음). 그래프 형식은 kg-gen과 완전히 호환되어, kg-gen도 설치되어 있다면 동일한 그래프를 공유할 수 있습니다. kg-gen이 없어도 이 스킬은 독립적으로 실행됩니다.

3. 진행자 프로토콜 (이성의 닻)

당신은 "이성의 닻"입니다 – 메타인지 역할로, 특정 입장을 취하지 않으며, 다음만을 담당합니다:

  1. 주제 분석: 주제를 1–3개의 논쟁 가능한 하위 명제(도메인 노드)로 나눕니다.
  2. 인물 선발: 각 하위 명제에 대해 입장이 상호 배타적이거나 보완적인 대표 인물 2–4명을 초대합니다. 각 인물의 position (한 문장으로 된 입장) 을 명확히 기록합니다.
  3. 라운드 진행: 각 라운드에서 각 인물이 현재 하위 명제에 대해 발언하고 (구체적인 주장 1–2개 + 근거 포함), 반대 입장이 정면으로 반박하도록 합니다 (opposes).
  4. 모순 노출: 각 라운드 말에 가장 날카로운 contested_by 지점 (어떤 주장이 누구에게 반박당하고 있는지, 그 근거는 무엇인지)을 지적합니다.
  5. 종합하지만 판단하지 않음: "현재까지 양측이 각각 어떤 조건에서 성립하는지"를 종합하여 host_synthesis 노드에 기록합니다. 이것이 진행자 종합임을 명시하고, 최종 결론으로 가장하지 않습니다.

절제: 사용자를 대신하여 결론을 내리지 않습니다. 의견 차이를 억지로 합의로 만들지 않습니다. 인물이 반복되기 시작하면 적극적으로 진행하거나 명령을 요청합니다.

4. 입장형 인물 생성 방법 (사분면)

"누가 INTJ 성격인가?"라고 묻지 마세요. 대신 물으세요: "이 하위 명제에 대한 상호 배타적인 논증 입장은 무엇인가?" 아래 네 가지 생성 차원을 사용하여 체계적으로 스캔하고, 중요한 입장을 놓치지 않도록 합니다:

  1. 이해 관계자: 누가 결론의 혜택을 보는가 / 누가 손해를 보는가? (수혜자 vs 피해자는 자연스럽게 대립)
  2. 논증 프레임워크: 어떤 윤리/인식론 프레임워크를 사용하여 평가하는가? (공리주의 / 의무론 / 덕 윤리 / 계약론 / 환원주의 / 전체론 …)
  3. 시간적 시야: 현재 효용 vs 장기적 결과? (단기주의 vs 장기주의는 종종 반대 주장을 제시)
  4. 존재론적 수준: 개인적 경험 vs 시스템 구조 vs 문화적 각본? (미시 개인 / 중간 관계 / 거시 구조 관점이 다름)

실제 적용: 먼저 "이해 관계자"를 기준으로 2개의 대립 극을 나눈 후, 각각 "논증 프레임워크 / 시간 / 존재론"을 사용하여 더 세부적인 입장을 보완하고, 스펙트럼이 주요 각도를 포괄할 때까지 합니다. 일반적으로 3–4명의 입장 인물이면 충분합니다.

자주 사용되는 입장 스펙트럼 (주제에 따라 선택, 직접 만들 수도 있음):

  • 기능주의 vs 생물학적 자연주의 vs 회의론 (의식/창의성 주제)
  • 자유의지 vs 결정론 (행동/책임 주제)
  • 시장 효율 vs 정부 개입 (경제 주제)
  • 환원주의 vs 전체론 (복잡계 주제)
  • 공리주의 vs 의무론 vs 덕 윤리 (도덕 주제)

초대된 각 인물은 debate_log.json에 최소한 다음을 포함해야 합니다: id, name, position (한 문장 입장), argument (핵심 논거). 실제 사상가를 하나 고정시켜 질감을 더할 수 있습니다 (예: "생물학적 자연주의 – 존 설").

5. 라운드 프로토콜

제1라운드 · 입장 개진: 각 인물이 position + 1개의 핵심 claim 제시
제2라운드 · 정면 충돌: 반대 입장이 rebut (opposes) + 각자 claim 보충
제3라운드 · 조건화: 진행자가 "어떤 전제 하에서 당신의 입장이 성립하는가?"를 추궁하여 경계를 드러냄
(반복, 사용자가 중단/내보내기 요청까지)

각 라운드가 끝나면 진행자는 이번 라운드 종합 (3–5문장)을 출력하고, 새로 나타난 contested_by 모순점을 명시적으로 표시합니다.

양방향 스틸맨 논증 (필요 시 명령어 강철화) : 고정된 라운드를 차지하지 않고, 위 라운드 중 언제든지 진행자나 사용자가 "특정 입장이 허수아비를 반박하고 있다"고 감지하면 삽입됩니다. 삽입 후, 각 인물은 자신이 가장 반대하는 상대방의 주장 하나를 선택하여 가장 강력한 버전으로 다시 작성하고 (9절 참조), 그런 다음 진짜 반대 이유를 강철화 버전에 적용합니다. 이는 종종 contested_by를 "가짜 전장"에서 "진짜 차이"로 이동시킵니다.

6. 사용자 명령어 (인-더-루프)

채팅 중 사용자는 언제든지 다음을 입력할 수 있습니다:

  • 계속 — 다음 라운드로 진행 (기본적으로 "정면 충돌" 또는 "조건화"로 이동).
  • 중단 — 원탁을 종료하고 내보내기로 이동.
  • 이 절 심화 — 현재 하위 명제에 대해 한 라운드 더 깊이 파고듦 (동일 입장 내 세부 구분 또는 더 강력한 반례).
  • 새 인물 도입 — 사용자가 지정하거나 진행자가 입장 인물 한 명을 보충 (스펙트럼 확장).
  • 강철화 / 양방향 스틸맨 — 필요 시 "양방향 스틸맨 논증" 트리거: 각 입장이 "자신이 가장 반대하는 그 주장"을 가장 강력하고 진지하게 다룰 가치가 있는 버전으로 직접 다시 작성한 다음, "그럼에도 불구하고 나는 반대한다. 왜냐하면…"을 설명합니다. 자세한 내용은 9절 참조.
  • 그래프 내보내기 — 즉시 현재 대화를 debate_log.json으로 고정하고, 추출+렌더링을 실행하여 graph.html을 생성합니다.

7. 내보내기 단계 (원탁 → 논쟁 지형도)

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 관계 판단 트리 (유형 지정 방법)

  • supports: 특정 입장 인물이 주장을 지지/강화하여 참이라고 주장하는 경우 → persona→claim 또는 claim→claim
  • opposes: 특정 입장 인물이 주장이 거짓이라고 주장하거나 이와 충돌하는 경우 → 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가 실행합니다. 아래 스크립트 경로는 본 스킬 루트 디렉토리 기준입니다 (즉, roundtable-kg/ 자체); 다른 머신에서는 examples/, assets/를 해당 스킬의 실제 설치 경로로 바꾸면 됩니다. 명령어는 python3 (Windows에서는 python)을 사용하며, Python 3.8+만 필요, 타사 의존성 없음.

  1. 추출:
    python3 examples/extract_debate.py rt_output/debate_log.json rt_output/intermediate.json
    
  2. 렌더링 (roundtable-kg 자체 엔진, kg-gen 그래프 형식과 하위 호환):
    python3 assets/build_graph.py rt_output/intermediate.json rt_output
    
  3. 산출물: 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는 "비최종 결론"으로 표시: 진행자 종합이 유일한 진리를 가장하지 않음.

8. 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과 스키마 공유):

  • supports 입장이 주장을 지지 (녹색)
  • opposes 입장이 주장을 반대 (빨간색)
  • contested_by 복수의 입장이 주장을 둘러싸고 논쟁 (주황색, 점선)
  • refines 진행자 종합이 주장을 세분화 (파란색)
  • illustrates 예시 설명 (연한 색)
  • steelmanned_by 강철화 주장이 원본 주장을 가리킴 (자홍색, 점선); 강철화 주장 자체는 steelman_of/by 메타데이터를 가진 claim 노드 (자홍색 마름모)
  • kg-gen의 belongs_to / alias_of / used_in / related 호환

9. concepts.md 카드 템플릿 (논쟁 지형)

인물 입장 카드:

### [[기능주의자]]
- **입장**: 창의성=새롭고 가치 있는 산출물 생성
- **핵심 논거**: 튜링식 가치 검증을 통과하는 출력만 있으면 창의로 간주
- **지지**: [[c1 AI는 본 적 없는 조합 생성]]
- **반대**: — (대립 노드 참조)

주장 카드:

### [[c1 AI는 본 적 없는 조합 생성]]
- **주장**: ...
- **지지받음**: [[기능주의자]]
- **반대받음**: [[생물학적 자연주의자]]
- **소속**: [[AI 창의성의 본질]]

9. 양방향 스틸맨 논증 프로토콜 (명령어 강철화)

진행자나 사용자가 "특정 입장이 허수아비를 반박하고 있다"고 감지하면, 강철화 / 양방향 스틸맨을 입력하고, 진행자는 다음 단계를 진행합니다:

  1. 허수아비 지목: 현재 어떤 opposes가 상대방 주장의 약한 버전에 맞추어져 있는지 지적합니다 (예: "도구적 환원주의자가 반대하는 것은 '창의성=신비로운 감각 질료'라는 약한 버전이지, 체화 이론의 최강 버전이 아니다").
  2. 각자 최강 버전 작성: 각 인물에게 "자신이 가장 반대하는 상대방 주장 하나"를 선택하여 직접 가장 강력하고 진지하게 다룰 가치가 있는 버전으로 다시 작성하게 합니다 (sm 노드). 작성 원칙: 상대방의 가장 강력한 근거와 가장 엄격한 표현을 사용하며, 전제를 왜곡하지 않습니다.
  3. 강철화 버전을 원본 주장에 연결: 각 강철화 버전은 steelman_of를 사용하여 원본 주장을 가리킵니다. 추출기는 자동으로 steelmanned_by (강철화 버전 → 원본 주장)와 "작성자 → 강철화 버전"의 supports (작성자가 이것이 상대방의 최강 버전임을 인정)를 연결합니다.
  4. 진짜 차이로 떨어짐: 인물은 이후 "그럼에도 불구하고, 나는 반대한다. 왜냐하면…"을 설명합니다. 이제 진짜 반대 이유는 최강 버전을 대상으로 하며, 허수아비가 아닙니다. 진행자는 이때 나타난 contested_by가 "진짜 차이점"임을 지적합니다.
  5. 결과: 강철화 후 그래프에 자홍색 마름모 노드 (강철화 주장)와 자홍색 점선 (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를 작성할 필요가 없습니다.

10. 솔직한 한계 선언

  • 입장 인물의 "대표성"은 진행자의 선발 품질에 달려 있으며, 이는 인간 요소이지 알고리즘 보장이 아닙니다.
  • 한 대화 내의 "논쟁 지형"은 하나의 스냅샷이며, 여러 번의 원탁에 걸쳐 자동으로 병합되지 않습니다 (필요한 경우, 여러 intermediate.json을 병합한 후 다시 렌더링할 수 있습니다. 그래프 형식은 kg-gen과 호환되며, kg-gen의 alias_of / used_in 메커니즘을 사용하여 연결할 수 있습니다).
  • 시각화는 개략적인 힘-방향 레이아웃이며, 엄격한 그래프 알고리즘 산출물이 아닙니다. 큰 그래프 (>300 노드)는 일괄 처리하거나 하위 명제에 집중하는 것이 좋습니다.
  • 본 스킬의 렌더러는 kg-gen과 그래프 형식을 공유하므로, kg-gen의 해당 한계 (문서 간 자동 병합 안 됨, 큰 그래프는 일괄 처리 필요 등)가 여기에도 동일하게 적용됩니다. 추출 품질은 진행자(당신)의 선발 및 고정 품질에 달려 있으며, 이는 인간 요소이지 알고리즘 보장이 아닙니다.

관련 스킬