From 57fd297068b2496fbdd370b91385eccc400aa342 Mon Sep 17 00:00:00 2001 From: LsMin124 Date: Fri, 26 Jun 2026 06:08:12 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20README=20=EA=B0=B1=EC=8B=A0=20=E2=80=94?= =?UTF-8?q?=20AI=20=ED=99=9C=EC=9A=A9=20+=20API=20=ED=99=9C=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=A9=EC=A0=90=20(v1.0=20=E2=86=92=20v2=20=ED=98=84?= =?UTF-8?q?=ED=96=89=ED=99=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stale v1.0 내용(4-node architect/designer/coder/executor·418 tests·Claude 4.7· Phase 2c 91.2% 표)을 v2 현행으로 교체. 사용자 요청대로 AI 활용에 방점 + API 활용 포함. - 🤖 AI 활용: 멀티에이전트 LangGraph 파이프라인(13노드 역할/모델 표) + 모델 티어링(Opus 정밀=formalizer/faithfulness·Sonnet 발산=전략/서술/QA/검산·golden↔ brute 모델 다양성) + 구조화 출력(typed tool call) + 단일-IR consistency-by- construction + 자기교정 루프(faithfulness round-trip·QA back-route) + 'AI 판단 vs 결정론 경계'(정답성은 symbolic verifier가 결정). - 🔌 API 활용: (A) Anthropic API(langchain_anthropic·with_structured_output·모델 ID·비용 $0.4~0.6/run) + (B) FastAPI 서비스(healthz/generate/jobs 3엔드포인트·202 async job·idempotency·429·stateless·계약 v3.2). - 파이프라인 위상(P1/P2 노브 표)·19 algorithm catalog·Quick Start(main_v2/batch/ api/difficulty)·문서 SSOT(계약 포함) 현행화. 모든 수치 실측 검증: 903 passed·Python 3.11+·모델 상수(config/노드)·API 3엔드포인트· 계약 v3.2. 코드/스키마/DB 무변경(docs-only). --- README.md | 297 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 180 insertions(+), 117 deletions(-) diff --git a/README.md b/README.md index da1ea5f..dbe61da 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ # IPE — Infinite Problem Engine -> **알고리즘 문제 생성 + 결정론적 검증 파이프라인**. LangGraph + Claude 4.7 -> Opus/Sonnet 으로 problem spec → algorithm design → code → symbolic verifier -> 4-node pipeline. 19 algorithm × 4 invariants 누적 catalog. - -[![Status](https://img.shields.io/badge/status-v1.0%20D%EC%95%88%20(19%20algo%2C%20anchor%20freeze)-blue)](CHANGES.md) -[![Tests](https://img.shields.io/badge/tests-418%20passed-brightgreen)](tests/) -[![e2e](https://img.shields.io/badge/Phase%202c%20RCA3-52%2F57%20(91.2%25)-brightgreen)](CHANGES.md#67) -[![Engaged](https://img.shields.io/badge/samples_engaged-99.1%25-brightgreen)](CHANGES.md#67) -[![Coverage](https://img.shields.io/badge/coverage-93%25-brightgreen)](https://github.com/LsMin124/IPE/actions) +> **AI 멀티에이전트가 알고리즘 문제를 생성하고, 결정론적 검증으로 정답을 보증하며, +> REST API 로 서비스에 공급하는 파이프라인.** LangGraph 상태그래프 위에서 Claude +> (Opus 4.8 / Sonnet 4.6) 가 시드 → 형식 동결 → 은닉 지문 → 정해/검산 코드를 짜고, +> LLM 과 독립된 symbolic verifier · golden↔brute differential 이 정답성을 결정한다. + +[![Tests](https://img.shields.io/badge/tests-903%20passed-brightgreen)](tests/) +[![mypy](https://img.shields.io/badge/mypy--strict-100%20files-blue)](pyproject.toml) [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](pyproject.toml) +[![Models](https://img.shields.io/badge/Claude-Opus%204.8%20%2F%20Sonnet%204.6-8A2BE2)](ipe/v2/config.py) +[![API](https://img.shields.io/badge/contract-v3.2-orange)](docs/integration/pipeline-service-api-contract.md) > 🌐 인터랙티브 대시보드: [lsmin124.github.io/IPE](https://lsmin124.github.io/IPE/) @@ -17,57 +17,179 @@ ## 무엇 -IPE 는 **알고리즘 문제 생성 + 결정론적 검증** 시스템: +IPE 는 **AI 로 문제를 만들고, 결정론으로 정답을 보증**하는 시스템이다. + +- **AI 멀티에이전트 생성** — 다수의 Claude 노드가 역할을 나눠 알고리즘 문제를 설계·서술·구현 +- **은닉 + 위장** — 정답 알고리즘을 숨기고 현실 도메인 스토리로 위장 (응시자가 환원을 발견해야 함) +- **결정론적 검증** — 정답성은 LLM 판단이 아니라 **symbolic verifier + golden↔brute differential** 이 결정 +- **QA 비평 게이트** — 모호성·공정성·난이도·정답 유출을 병렬 critic 이 심사 +- **BOJ 티어 난이도 calibration** — 생성 문제를 Bronze~Platinum 으로 자동 등급화 +- **서비스 공급** — FastAPI REST API 로 백엔드에 비동기 job 형태로 제공 + +핵심 명제: **"생성은 AI 가, 정답 보증은 결정론이."** LLM 은 창의적 설계·서술·코딩을 +맡고, 채점 정답(expected output)은 검증된 golden 코드 **실행** 으로 부트스트랩하며, +정답성은 LLM 과 독립된 알고리즘별 수학적 invariant 로 교차검증한다. + +--- + +## 🤖 AI 활용 + +### 1. 멀티에이전트 파이프라인 (LangGraph 상태그래프) + +문제 생성을 단일 LLM 호출이 아니라 **역할 분리된 노드들의 상태그래프**로 분해한다. +각 노드는 frozen Pydantic 상태(`V2State`)를 읽고 자기 산출만 채운다. + +| 노드 | 역할 | 모델 | 종류 | +|---|---|---|---| +| **strategist** | 은닉 코어 + 합성 기법 + 위장 도메인 결정 (발산) | Sonnet 4.6 | LLM | +| **formalizer** | 입출력 형식 계약(`io_schema`) **FREEZE** | Opus 4.8 | LLM (정밀) | +| **narrative** | 은닉 지문 렌더 (도메인 스토리) | Sonnet 4.6 | LLM (창작) | +| **faithfulness** | 지문 ↔ 형식계약 충실성 round-trip 검증 | Opus 4.8 | LLM (검증) | +| **spec_bridge** | blueprint → solver spec 투영 | — | 결정론 | +| **designer** | 알고리즘 설계 + 불변식 도출 | Sonnet 4.6 | LLM | +| **golden coder ×K** | 정해 코드 (모델 다양성으로 병렬) | Opus 4.8 + Sonnet 4.6 | LLM | +| **brute coder** | 독립 무차별 검산 코드 (golden 과 distinct) | Sonnet 4.6 | LLM | +| **reconciler** | golden ↔ brute differential 합의 | — | 결정론 | +| **executor** | 샌드박스 실행 + symbolic verifier dispatch | — | 결정론 | +| **input_generator** | 시드 기반 입력 **결정론** 생성 | — | 결정론 | +| **suite_assembler** | golden 실행으로 expected 부트스트랩 | — | 결정론 | +| **qa reviewer ×N** | 모호성·공정성·난이도·유출 병렬 비평 | Sonnet 4.6 | LLM (critic) | +| **difficulty** | BOJ 티어 calibration (anchor 기반) | Sonnet 4.6 | LLM | + +### 2. 모델 티어링 — 작업 난이도에 맞춘 분담 + +| 모델 | 쓰임 | 이유 | +|---|---|---| +| **Claude Opus 4.8** | 형식 동결(formalizer) · 충실성 검증(faithfulness) · 정해 1 | 계약을 못 박고 모순을 잡는 정밀·추론 작업 | +| **Claude Sonnet 4.6** | 전략·서술·설계·QA 비평·무차별 검산·난이도 | 발산·창작·검산은 빠르고 다양하게 | +| **모델 다양성** | golden(Opus+Sonnet) vs brute(Sonnet) | 같은 코드를 **다른 모델**이 독립 작성 → 우연한 동일 버그가 상쇄되어 differential 신뢰도↑ | + +### 3. 구조화 출력 (typed tool call) + +모든 LLM 노드는 자유 텍스트가 아니라 **검증된 Pydantic 스키마**로 반환한다 +(`langchain_anthropic` + `with_structured_output`). 형식 위반 시 모델이 재시도하므로 +파싱 실패·환각 필드가 파이프라인에 새지 않는다. + +### 4. 단일-IR — consistency-by-construction + +문제의 모든 표면(입력 형식 / 제약 / 지문 / 정해)을 하나의 동결 IR(`ProblemBlueprint`) +**투영**으로 만든다. 같은 사실을 여러 LLM 이 따로 서술해 어긋나던 모순(O(N²) 표면)을 +구조적으로 붕괴시킨다. 예: 정렬성·문자집합·참조 의미(위치 인덱스 vs 개수)·출력 형식의 +도메인 의미를 IR 한 곳에 핀하고 모든 곳이 그것을 **읽는다**. + +### 5. 자기교정 루프 (faithfulness round-trip · QA back-route) + +- **faithfulness**: 지문이 형식계약을 왜곡하면 narrative 를 재생성 (예산 바운드). +- **QA critic 패널**: 모호성/공정성/난이도/(은닉 시)정답유출을 병렬 심사 → fail 시 + 지문/스펙을 패치하고 재리뷰하는 back-route 루프. + +### 6. AI 판단 vs 결정론의 경계 + +> **정답성은 절대 LLM 이 결정하지 않는다.** expected output 은 검증된 golden 코드 +> 실행으로 채우고, 정답 보증은 알고리즘별 수학적 invariant(예: Dijkstra ↔ Bellman-Ford +> 교차검증, segment tree ↔ naive O(NQ))로 교차검증한다. LLM 은 *무엇을 만들지* 를, +> 결정론은 *그것이 맞는지* 를 맡는다. + +--- + +## 🔌 API 활용 + +### A. Anthropic API (Claude 호출) + +- `langchain_anthropic.ChatAnthropic` 로 호출, 모든 노드가 `with_structured_output(...)` + 으로 **typed tool call** 반환. +- 모델 ID: `claude-opus-4-8`, `claude-sonnet-4-6` (난이도/검산은 Sonnet). +- 인증: `.env` 의 `ANTHROPIC_API_KEY`. +- 비용 실측: 1 run ≈ $0.4~0.6, 출하당 ≈ $1~2 (재시도 포함, 모드·합성수에 따라). + +### B. 서비스 API (FastAPI) — 백엔드 공급 계약 + +파이프라인을 **stateless REST 서비스**로 노출한다. 문제 영속화는 서비스 백엔드 DB 가 +전담하고, 이 서버는 진행 중 job 만 in-memory 로 유지한다. + +| 메서드 · 경로 | 역할 | +|---|---| +| `GET /healthz` | 헬스체크 | +| `POST /v1/problems/generate` | 비동기 생성 시작 → `202 {job_id}`. `idempotency_key` 로 중복 방지, 용량 초과 시 `429 + Retry-After`. | +| `GET /v1/jobs/{job_id}` | job 폴링 — `running`/`completed`/`failed` + 완료 시 문제 패키지 | + +요청 본문(`mode` 가 노브 4종을 결정): +```jsonc +{ "mode": "p1", // p1=단일·공개·QA3 / p2=합성·은닉·QA4 + "seed_algorithm": "dijkstra", // p1=고정 타겟, p2=힌트(은닉) + "with_qa": true, + "idempotency_key": "req-..." } ``` -target_algorithm → [architect → designer → coder → executor] → 검증된 문제 + 코드 - (Opus) (Sonnet) (Opus) (verifier) + +```bash +# 서버 기동 +IPE_API_KEY=... uv run uvicorn 'ipe.v2.api:create_app' --factory --port 8000 ``` -각 algorithm 의 **수학적 invariants** 를 코드로 결정론적 검증 (LLM judgment -와 독립된 anchor). 19 algorithm × 4 invariants = 76 invariants 누적. +- 계약 SSOT: [`docs/integration/pipeline-service-api-contract.md`](docs/integration/pipeline-service-api-contract.md) (**v3.2**) +- 배포 가이드: [`docs/integration/pipeline-deploy.md`](docs/integration/pipeline-deploy.md) · DB 접근: [`docs/integration/db-access-handoff.md`](docs/integration/db-access-handoff.md) +- 패키지 필드(문제/정해/채점셋/메타 — `meta.difficulty`/`problem_number`/`algorithm` N:M 등)는 계약이 SSOT. + +--- -### v0 → v1 D안 architecture 진화 +## 파이프라인 아키텍처 (P1 / P2 모드) + +```text +START → strategist → formalizer → narrative → faithfulness ──(왜곡)─→ narrative 재생성 + (시드) (FREEZE) (은닉지문) (round-trip) (예산 바운드) + │(faithful) + ▼ + spec_bridge → designer → dispatch ─┬→ golden_0..K (Opus+Sonnet) ─┐ + (순수 투영) (불변식) └→ brute (Sonnet, distinct) ──┴→ reconciler + (differential) + reconciler ─(합의)→ sample/edge filler → executor (샌드박스 + symbolic verifier) + │(pass) + ▼ + generator_designer → input_generator → suite_assembler (결정론 채점셋, golden→expected) + │ + ▼ + qa_{ambiguity·fairness·difficulty·(leakage)} 병렬 → aggregator ─(pass)→ 출하 + ▲ (fail) spec_patch / narrative_revise back-route ┘ +``` -| 시점 | run-level | 비고 | +| 노브 | **P1** (단일·공개) | **P2** (합성·은닉) | |---|---|---| -| v0 single LLM baseline | 27% | 단일 LLM call 의 정확도 anchor | -| v1 Phase 1 (Dijkstra MVR) | 100% (3/3) | D안 architecture 시작 | -| v1 Phase 2a (5 algo) | 93.3% (14/15) | baseline + 4 algo | -| v1 Phase 2b (13 algo) | 87.2% (34/39) | +8 algo (Search/DS/DP/Sort/String/...) | -| v1 Phase 2c (19 algo) | 82.5% (47/57) | +6 algo (Graph/DS/DP) | -| **v1 Phase 2c RCA3 final** | **91.2% (52/57)** | **architect prompt 일반화 — v1.0 anchor ✅** | +| `hidden` | False | True | +| `composition` | 빈값 (단일 알고리즘) | ≥1 (총 2개+ 합성) | +| `qa_kinds` | ambiguity·fairness·difficulty | + leakage (4종) | +| `seed_algorithm` | 고정 공개 타겟 | 힌트 (은닉) | -**+64pp vs v0 baseline + 99.1% samples_engaged**. catalog ×3.8 확장. 추가 -측정은 diminishing returns 로 판단해 anchor freeze. P3 후속 (PR #104 Option B -routing 확장, PR #105 outputs/ persistence) 까지 반영. +자세한 노드 의미: [`ipe/v2/graph.py`](ipe/v2/graph.py) docstring. --- -## 19 Algorithm Catalog (Phase 2c) +## 19 Algorithm Catalog | family | algorithm | verifier 핵심 invariant | |---|---|---| -| Graph | Dijkstra | Bellman-Ford cross-check (non-negative weight) | -| Graph | BFS | Floyd-Warshall cross-check (edge=1) | +| Graph | Dijkstra | Bellman-Ford 교차검증 (non-negative weight) | +| Graph | BFS | Floyd-Warshall 교차검증 (edge=1) | | Graph | Topological Sort | edges_respect_order + Kahn DAG check | -| Graph | Bellman-Ford | Floyd-Warshall cross-check (negative weight) | -| Graph | Floyd-Warshall | V × Bellman-Ford cross-check (all-pairs) | -| Graph | Kruskal MST | Prim cross-check | -| Graph | Max Flow | brute min-cut (max-flow min-cut theorem) | -| Search | Binary Search | linear scan cross-check | +| Graph | Bellman-Ford | Floyd-Warshall 교차검증 (negative weight) | +| Graph | Floyd-Warshall | V × Bellman-Ford 교차검증 (all-pairs) | +| Graph | Kruskal MST | Prim 교차검증 | +| Graph | Max Flow | brute min-cut (max-flow min-cut 정리) | +| Search | Binary Search | linear scan 교차검증 | | Search | LIS | patience sort O(N log N) | -| Array | Two Sum | brute O(N²) pair enumeration | +| Array | Two Sum | brute O(N²) pair 열거 | | Sort | Sort cluster | Python `sorted()` | | String | String Match cluster | brute O(NM) substring search | | DS | Segment Tree | naive O(NQ) range sum | -| DS | Heap (Min-PQ) | sorted-list simulation | +| DS | Heap (Min-PQ) | sorted-list 시뮬레이션 | | DS | Fenwick Tree (BIT) | naive prefix-sum | | DSU | Union-Find | BFS over union edges | -| DP | Knapsack 0/1 | brute O(2^N) subset enum | +| DP | Knapsack 0/1 | brute O(2^N) subset 열거 | | DP | Coin Change | DP O(N*A) tabulation | | NumTheory | Sieve of Eratosthenes | trial division O(N√N) | +각 algorithm 의 **수학적 invariant** 를 코드로 결정론 검증 (LLM 판단과 독립한 anchor). + --- ## Quick Start @@ -75,59 +197,26 @@ routing 확장, PR #105 outputs/ persistence) 까지 반영. ```bash # 환경 설정 uv sync --extra dev - -# .env 에 ANTHROPIC_API_KEY 설정 echo "ANTHROPIC_API_KEY=sk-ant-..." > .env -# 단일 algorithm 문제 생성 (verbose 으로 spec/code 확인) -uv run python -m ipe.v1.main_v1 --algorithm dijkstra --max-iter 4 --verbose - -# N=3 measurement (단일 algo) -uv run python -m ipe.v1.measurement \ - --algorithm knapsack --n 3 \ - --output docs/baseline/data/my-run.jsonl +# 단일 문제 생성 (P1 단일·공개 / P2 합성·은닉) +uv run python -m ipe.v2.main_v2 --algorithm dijkstra --mode p1 +uv run python -m ipe.v2.main_v2 --algorithm dijkstra --mode p2 --max-iter 6 --verbose -# Phase 2c 19 algo × N=3 = 57 runs (Gate 측정) -uv run python -m ipe.v1.measurement \ - --phase-2c --n 3 \ - --output docs/baseline/data/phase-2c.jsonl -``` - -지원되는 `--algorithm` 값: `dijkstra` / `lis` / `segtree` / `two_sum` / -`bfs` / `binary_search` / `union_find` / `toposort` / `knapsack` / `sort` / -`string_match` / `max_flow` / `sieve` / `bellman_ford` / `floyd_warshall` / -`kruskal_mst` / `heap` / `fenwick` / `coin_change` +# 배치 측정 (시드 × N, 출하율/비용 집계) +uv run python -m ipe.v2.batch --seeds binary_search,lis --runs-per-seed 3 --mode p1 \ + --out outputs/my-run -산출물: `docs/baseline/data/*.jsonl` (RunOutcome JSONL) — 각 line 에 -`run_id, final_status, sample_pass_count, sample_total, samples_engaged, -invariant_violations[], blocking_signatures[], elapsed_seconds`. +# API 서버 (서비스 백엔드 공급) +IPE_API_KEY=... uv run uvicorn 'ipe.v2.api:create_app' --factory --port 8000 ---- - -## 아키텍처 - -```text -USER CLI - ↓ -initial_state (V1State, Pydantic v2 frozen) - ↓ -LangGraph pipeline: - [architect (Opus)] → ProblemSpec - ↓ - [designer (Sonnet)] → AlgorithmDesign (+ invariants[]) - ↓ - [coder (Opus)] → SolutionAttempt (Python code) - ↓ - [executor (no LLM)] → 4-phase verification: - ├ Phase A: subprocess run per sample - ├ Phase B: SymbolicVerifier dispatch (19 verifier registry) - ├ Phase C: StructuredFeedback build (failure_mode + target_node) - └ Phase D: routing decision (loop or terminate) - ↓ -[record] → final V1State + JSONL outcome +# 난이도 백필 (DB 적재 문제를 BOJ 티어로 calibration) +uv run python -m ipe.v2.difficulty --db-url postgresql://... [--force] ``` -자세한 visualization: [`docs/v1-pipeline-flow.md`](docs/v1-pipeline-flow.md). +지원 `--algorithm` (seed): `dijkstra` `bfs` `toposort` `bellman_ford` `floyd_warshall` +`kruskal_mst` `max_flow` `binary_search` `lis` `two_sum` `sort` `string_match` +`segtree` `heap` `fenwick` `union_find` `knapsack` `coin_change` `sieve` --- @@ -137,46 +226,20 @@ LangGraph pipeline: |---|---| | [`docs/SPEC.md`](docs/SPEC.md) | 기능/비기능 요구사항 | | [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) | 모듈 설계 + Pydantic schema SSOT | -| [`docs/v1-pipeline-flow.md`](docs/v1-pipeline-flow.md) | v1 D안 ASCII pipeline 시각화 | -| [`docs/PRINCIPLES.md`](docs/PRINCIPLES.md) | 5 운영 룰 (N≥3 / cross-algo regression / baseline anchor / complexity budget / RCA rollback) | -| [`docs/baseline/`](docs/baseline/) | Measurement raw data + 보고서 (Phase 2a/2b/2c) | -| [`CHANGES.md`](CHANGES.md) | 변경 이력 (§1~§66+) | - ---- - -## 가설 (H1/H2/H3) Evidence - -- **H1 (structured routing)**: API error 0 / budget_exhausted 0 / typed - feedback 으로 architect↔coder 라우팅 결정론적 (Phase 2c 47/57 runs 전부 - 결정적 종료) -- **H2 (algorithm-specific verifier)**: **samples_engaged 100%** 유지 across - 19 algo. Verifier dispatch (LLM 독립) 가 sample-level 정답성 결정. -- **H3 (IterationContext multi-iter recovery)**: binary_search r1/r2 + - segtree r1 + toposort retries 모두 iter=2 recover. fail_oscillation 은 - 외부 routing 한계 (P3 후속). +| [`docs/PRINCIPLES.md`](docs/PRINCIPLES.md) | 운영 룰 (N≥3 측정 / baseline anchor / RCA rollback 등) | +| [`docs/integration/pipeline-service-api-contract.md`](docs/integration/pipeline-service-api-contract.md) | 파이프라인 ↔ 서비스 백엔드 API 계약 (v3.2) | +| [`ipe/v2/graph.py`](ipe/v2/graph.py) | v2 LangGraph 위상 (P1/P2 노브) | +| [`CHANGES.md`](CHANGES.md) | 변경 이력 | --- ## 개발 ```bash -make ci # ruff + mypy --strict + pytest -uv run pytest tests/v1 -q --ignore=tests/v1/test_e2e_real_llm.py -uv run python -m ipe.v1.main_v1 --algorithm sieve --max-iter 4 --verbose +make ci # ruff + mypy --strict + pytest (903 passed) +uv run pytest tests/v2 -q +uv run python -m ipe.v2.main_v2 --algorithm sieve --mode p1 --verbose ``` -자세한 운영 룰 → [`docs/PRINCIPLES.md`](docs/PRINCIPLES.md). - ---- - -## 기여 / 알려진 이슈 - -- **Two Sum persistent fail**: architect 가 array 작성 시 multiple valid pair - 생성하는 경우 expected_output mismatch. P3 routing 확장 (sample_mismatch + - invariant_violations=[] → architect back-route) 으로 systematic recovery - 계획. -- **outputs/ persistence**: v1 D안 은 RunOutcome metric 만 jsonl 저장. spec/ - code 영속화는 후속 (verbose flag 로 console 출력만). - -PR 환영. [PRINCIPLES.md](docs/PRINCIPLES.md) 의 5 운영 룰 (N≥3 측정 / cross-algo -regression / baseline anchor / complexity budget / RCA rollback) 준수 권장. +운영 룰 → [`docs/PRINCIPLES.md`](docs/PRINCIPLES.md). 측정은 N≥3 + baseline anchor, +과측정은 diminishing returns 로 중단하는 것이 이 저장소의 규율이다.