138 lines
4.8 KiB
Markdown
138 lines
4.8 KiB
Markdown
# AI Debate Room — 설계서 v4
|
|
|
|
> 확정 구조: 파일 기반 토론 + Wiki 동기화
|
|
|
|
## 아키텍처
|
|
|
|
```
|
|
사용자 (관전/개입/방향지시)
|
|
↕ Discord #variet-debate (펜딩 시에만 질문)
|
|
사회자 (Gemini CLI Flash)
|
|
├→ AG 로컬 폴더에서 response.md 읽기
|
|
├→ 상대 AG 로컬 폴더에 input.md 쓰기
|
|
├→ 양쪽 wiki/ 폴더 동기화
|
|
├→ Wiki.js에 합의 기록
|
|
├→ 합의 감지 → Wiki 기록 + 사용자에게 검토 요청
|
|
└→ 펜딩 감지 → 사용자에게 질문
|
|
↕ ↕
|
|
AG(Gemini) AG(Claude/Opus)
|
|
debate_gemini/ debate_opus/
|
|
```
|
|
|
|
## 각 AG 로컬 폴더 구조
|
|
|
|
```
|
|
debate_gemini/ debate_opus/
|
|
GEMINI.md (참여자 프롬프트) GEMINI.md (참여자 프롬프트)
|
|
response.md ← AG가 Output response.md
|
|
input.md ← 사회자가 Input input.md
|
|
wiki/ ← Wiki 미러링 wiki/
|
|
agenda.md agenda.md
|
|
working_document.md working_document.md
|
|
... ...
|
|
```
|
|
|
|
| 파일 | 작성자 | 소비자 | 용도 |
|
|
|------|--------|--------|------|
|
|
| `response.md` | AG | 사회자 | AG의 전문 답변 (길이 무제한) |
|
|
| `input.md` | 사회자 | AG | 상대 의견 + 사회자 해설 + 방향 지시 |
|
|
| `wiki/` | 사회자 | AG | Wiki.js 페이지 미러 (현재 합의 상태) |
|
|
| `GEMINI.md` | 사전 세팅 | AG | 참여자 역할 + 행동 규칙 |
|
|
|
|
## 턴 흐름 (자동 반복)
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
S[!debate-start 주제] --> M1[사회자: 첫 발언자 선택]
|
|
M1 --> W1[input.md 작성 + wiki/ 동기화]
|
|
W1 --> D1[Discord 시그널 전송]
|
|
D1 --> AG1[AG 발언: response.md 작성]
|
|
AG1 --> M2[사회자: response.md 읽기]
|
|
M2 --> WIKI[Wiki.js 업데이트]
|
|
WIKI --> CHECK{합의 판정}
|
|
CHECK -->|대립 중| W2[상대 input.md 작성 + wiki/ 동기화]
|
|
W2 --> D2[Discord 시그널]
|
|
D2 --> AG2[상대 AG 발언]
|
|
AG2 --> M2
|
|
CHECK -->|합의| DONE[Wiki 최종 기록 + 사용자 검토 요청]
|
|
CHECK -->|펜딩| ASK[사용자에게 질문]
|
|
ASK --> USER[사용자 응답]
|
|
USER --> W2
|
|
```
|
|
|
|
## 사용자 개입 시점
|
|
|
|
| 상황 | 트리거 | 사회자 행동 |
|
|
|------|--------|-----------|
|
|
| **합의 완료** | 양쪽 agree 2+ 연속 | Wiki 최종 기록 → Discord에 "검토 요청" |
|
|
| **의견 필요** | 양쪽 모두 user_input 요구 | Discord에 질문 → 응답 대기 |
|
|
| **중간 업데이트** | N 라운드마다 | Wiki Working-Document 업데이트 + Discord 요약 |
|
|
| **사용자 임의 개입** | `!debate-inject 의견` | 다음 턴 input.md에 반영 |
|
|
| **방향 전환** | 주제 이탈 감지 | 사회자가 redirect 지시 |
|
|
|
|
## 합의 판정 기준
|
|
|
|
사회자(Flash)가 매 턴 후 판정:
|
|
```json
|
|
{
|
|
"decision": "continue | ask_user | conclude",
|
|
"agreement_level": "disagree | partial | agree",
|
|
"reason": "판정 근거",
|
|
"wiki_update": true/false
|
|
}
|
|
```
|
|
|
|
- `continue`: 자동 다음 턴
|
|
- `ask_user`: Discord에 질문 → 응답 올 때까지 대기
|
|
- `conclude`: 합의 완료 → Wiki 최종 기록
|
|
|
|
## Wiki.js 구조
|
|
|
|
```
|
|
/Debates/{주제}/
|
|
Agenda ← 토론 의제 + 범위
|
|
Working-Document ← 진행 중 합의 사항 (라이브)
|
|
Round-Log ← 라운드별 요약 기록
|
|
Conclusion ← 최종 합의 (종료 후)
|
|
```
|
|
|
|
- 사회자만 Wiki 쓰기 권한
|
|
- 매 라운드 후 Working-Document 업데이트
|
|
- AG는 로컬 `wiki/` 폴더에서 읽기만
|
|
|
|
## Discord 채널 역할
|
|
|
|
| 채널 | 용도 |
|
|
|------|------|
|
|
| `#variet-debate` | 사용자 커맨드 + 요약 게시 + 승인 요청 |
|
|
| `#ag-debate_gemini` | AG(Gemini)에게 시그널 전송 |
|
|
| `#ag-debate_opus` | AG(Opus)에게 시그널 전송 |
|
|
|
|
Discord 메시지는 **시그널 용도**만. 전문은 모두 로컬 파일로 전달.
|
|
|
|
## 과금 구조 (변경 없음)
|
|
|
|
| 역할 | 모델 | 과금 |
|
|
|------|------|------|
|
|
| 사회자 | Gemini Flash (CLI) | 무료/구독 쿼터 |
|
|
| 토론자 A | AG (Gemini 3.1 Pro) | 구독 쿼터 |
|
|
| 토론자 B | AG (Claude Opus) | 구독 쿼터 |
|
|
|
|
## 구현 파일
|
|
|
|
| 파일 | 역할 |
|
|
|------|------|
|
|
| `handlers/debate_handler.py` | 세션 관리, 파일 읽기/쓰기, 턴 관리 |
|
|
| `prompts/debate/participant_base.md` | AG 참여자 프롬프트 (→ GEMINI.md로 복사) |
|
|
| `prompts/debate/moderator.md` | 사회자 프롬프트 |
|
|
| `api/discord_bot.py` | 커맨드 + AG 메시지 감지 |
|
|
| `tools/wiki_helper.py` | Wiki.js 연동 |
|
|
|
|
## 미결 사항
|
|
|
|
1. AG가 `response.md`에 쓰라는 지시를 **확실히 따르는지** 검증 필요
|
|
2. UTF-8 인코딩 — `debate_handler.py`에서 파일 읽기/쓰기 시 명시
|
|
3. Wiki.js 페이지 → 로컬 폴더 동기화 함수 구현 (`wiki_helper.py`)
|
|
4. 합의 판정 Flash 프롬프트 정교화
|
|
5. 컨텍스트 창 관리 — 토론이 길어질 때 히스토리 압축 전략
|