Spaces:
Sleeping
PROTEUS ๋ช ๋ น์ด ์ฌ์ฉ๋ฒ (ํ๊ตญ์ด)
LLM์ด ๋ค๋ฅธ ์์ด์ ํธ์ ๋๊ธฐ๋ฅผ ์ฝ๋์ง๋ฅผ ์ธก์ ํ๋ ๊ทธ๋ฆฌ๋ ์๋ ๋, PROTEUS์ ๋ช
๋ น์ด ์๋ด์์
๋๋ค.
์ฒ์ ์ฐ์๋ ๋ถ๋ ๋ฐ๋ผ์ฌ ์ ์๊ฒ ์์๋๋ก ์ ๋ฆฌํ์ต๋๋ค. ๋ชจ๋ ๋ช
๋ น์ proteus CLI๋ก ์คํํฉ๋๋ค.
ํ ์ค ์์ฝ: ๊ฒ์์ LLM์ด๋ ์ฌ๋์ด ํ๋ ์ด โ ๊ทธ ๊ธฐ๋ก(trace)์ JSONL๋ก ์ ์ฅ โ ํ ์คํธยทํธ๋ฃจ์ปฌ๋ฌยทPNGยทGIF๋ก ๋ค์ ๋ณด๊ธฐ โ ์ฌ๋ฌ ๊ธฐ๋ก์ ๋ชจ์ ๋น๊ต.
0. ์ฌ์ ์ค๋น โ ๊ฐ์ํ๊ฒฝ(.venv)
์ด ํ๋ก์ ํธ๋ python์ด PATH์ ์๊ณ , ์ ์ฅ์ ์์ .venv ๋ฅผ ์ง์ ๊ฐ๋ฆฌ์ผ ์คํํฉ๋๋ค.
๋ชจ๋ ๋ช
๋ น์ python ๋์ .venv/bin/python ์ผ๋ก ์์ํฉ๋๋ค.
# ์์
๋๋ ํฐ๋ฆฌ์์
.venv/bin/python -m proteus --help
.venv๊ฐ ์๋ค๋ฉด(์ ๋จธ์ ๋ฑ) ์ด๋ ๊ฒ ๋ค์ ๋ง๋ญ๋๋ค:
uv venv --python 3.12 .venv
uv pip install --python .venv/bin/python \
"pydantic>=2" "numpy>=1.26" "pyyaml>=6" "pytest>=8" "matplotlib>=3.8"
์ฐธ๊ณ : LLM provider SDK(openai/anthropic ๋ฑ)๋ ์ผ๋ถ๋ฌ
.venv์ ์ค์นํ์ง ์์ต๋๋ค(์คํ๋ผ์ธ ๋ถ๋ณ). ์ค์ ๋ชจ๋ธ์ ๋๋ฆด ๋๋ง ๋ณ๋ ์์ venv๋ฅผ ์๋๋ค(๋งจ ์๋ "์ค์ ๋ชจ๋ธ๋ก ์คํ" ์ฐธ๊ณ ).
1. ์๋๋ฆฌ์ค ๋ชฉ๋ก ๋ณด๊ธฐ โ list-scenarios
๋ฑ๋ก๋ ์๋๋ฆฌ์ค ์ด๋ฆ์ ์ถ๋ ฅํฉ๋๋ค.
.venv/bin/python -m proteus list-scenarios
ํ์ฌ๋ predator_evade(ํฌ์์ ํํผ = ์์กด ๋๊ธฐ) ํ๋์
๋๋ค.
2. ์ฌ๋์ด ์ง์ ํ๋ ์ด โ play
๊ฐ์ ๊ฒ์์ ์ฌ๋์ด ํค๋ณด๋๋ก ํ๋ ์ดํฉ๋๋ค. LLM๊ณผ ์์ ํ ๋์ผํ ํ๋ฉด(ASCII) ์ ๋ณด๋ฉฐ ๋๋ฏ๋ก, ์ฌ๋ ๊ธฐ๋ก๊ณผ LLM ๊ธฐ๋ก์ ๊ณต์ ํ๊ฒ ๋น๊ตํ ์ ์์ต๋๋ค.
.venv/bin/python -m proteus play \
--scenario predator_evade \
--difficulty easy \
--seed 42 \
--play-turns 10 \
--out runs/me.jsonl
- ๋งค ํด
up/down/left/right/stay์ค ํ๋๋ฅผ ์ ๋ ฅํฉ๋๋ค. (w/a/s/d๋จ์ถํค๋ ๋จ, ๋์๋ฌธ์ยท๊ณต๋ฐฑ ๋ฌด์) up์ ํ(row)์ ์ค์ด๊ณ ,down์ ๋๋ฆฝ๋๋ค.left/right๋ ์ด(column)์ ๋ฐ๋ผ ์ด๋ํฉ๋๋ค.- ์๋ชป ์ ๋ ฅํ๋ฉด ๋ค์ ๋ฌผ์ด๋ด ๋๋ค.
์ฃผ์ ์ต์
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--scenario |
์๋๋ฆฌ์ค ์ด๋ฆ | predator_evade |
--difficulty |
๋์ด๋: easy / medium / hard / expert |
easy |
--seed |
์๋๋ฅผ ๊ณ ์ ํ๋ ์๋(๊ฐ์ ์๋ = ๊ฐ์ ๋งต) | ์์ |
--play-turns |
ํ๋ ์ดํ ํด ์(์์กด ์์ฐ) | 15 |
--probe |
ํด๋ง๋ค ์ดํด๋ ์ง๋ฌธ(probe)๋ ๋ฐ๊ธฐ | ๊บผ์ง |
--out |
๊ธฐ๋ก์ ์ ์ฅํ JSONL ๊ฒฝ๋ก(์๋ต ๊ฐ๋ฅ) | ์ ์ฅ ์ ํจ |
ํ: ํ์ดํ๋ก ์ ๋ ฅ์ ๋ฏธ๋ฆฌ ๋ฃ์ด ์๋ ํ๋ ์ด๋ ๋ฉ๋๋ค.
printf 'up\nup\nleft\n' | .venv/bin/python -m proteus play --scenario predator_evade --seed 42 --play-turns 3 --out runs/me.jsonl
3. LLM์ด ํ๋ ์ด โ run
์ง์ ํ ๋ชจ๋ธ์ด ๊ฒ์์ ํ๋ ์ดํ๊ณ ๊ธฐ๋ก์ ๋จ๊น๋๋ค. --out์ ํ์์
๋๋ค.
# ์คํ๋ผ์ธ ์ค๋ชจํฌ(๊ฐ์ง ๋ชจ๋ธ) โ ๋คํธ์ํฌ ๋ถํ์
.venv/bin/python -m proteus run \
--scenario predator_evade \
--model fake:demo \
--difficulty easy \
--seed 42 \
--play-turns 10 \
--out runs/llm.jsonl
--model์์ด๋ฆ:๋ชจ๋ธํ์์ ๋๋ค.fake:<์๋ฌด์ด๋ฆ>์ ์คํ๋ผ์ธ ๊ฐ์ง ๋ชจ๋ธ(ํ ์คํธยท๋ฐ๋ชจ์ฉ).- ์ค์ ๋ชจ๋ธ(openai/anthropic/gemini/ollama ๋ฑ)์ ๋งจ ์๋ ์ ์ ์ฐธ๊ณ ํ์ธ์.
- ๋๋๋ฉด ๊ฒฐ๊ณผ ์์ฝ(์์กด/ํฌํ, motive_reading_accuracy, reactivity_index)์ ์ถ๋ ฅํฉ๋๋ค.
์ฃผ์ ์ต์
(play์ ๊ฑฐ์ ๋์ผ)
| ์ต์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
|---|---|---|
--model |
provider ์คํ ์ด๋ฆ:๋ชจ๋ธ (ํ์) |
โ |
--no-probe |
ํด๋ง๋ค probe ์ง๋ฌธ์ ๋๊ธฐ | probe ์ผ์ง |
--out |
๊ธฐ๋ก JSONL ๊ฒฝ๋ก (ํ์) | โ |
run์ probe๊ฐ ๊ธฐ๋ณธ ์ผ์ง,play๋ ๊ธฐ๋ณธ ๊บผ์ง์ ๋๋ค(์ฌ๋์๊ฒ ๋งค ํด ์ง๋ฌธ์ด ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก).
4. ๊ธฐ๋ก ๋ค์ ๋ณด๊ธฐ โ replay
์ ์ฅํ trace(JSONL)๋ฅผ ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๋ค์ ๋ด ๋๋ค.
4-1. ํ ์คํธ(๊ธฐ๋ณธ)
ํด๋ณ ํ๋ vs ๋๊ธฐ(motive)/์ต๊ด(habit), ์ ๋ต ์ฌ๋ถ, ๋ณด์, ๊ทธ๋ฆฌ๊ณ ๋ฉํธ๋ฆญ์ ์ถ๋ ฅํฉ๋๋ค.
.venv/bin/python -m proteus replay runs/me.jsonl
4-2. ํธ๋ฃจ์ปฌ๋ฌ ํฐ๋ฏธ๋ ์ฌ์ โ --visual
๊ทธ๋ฆฌ๋๋ฅผ 24๋นํธ ์ปฌ๋ฌ ๋ธ๋ก์ผ๋ก ๊ทธ๋ฆฌ๊ณ , ์์ ํ๋/๋๊ธฐ/์ต๊ด/๋ณด์/ํ ํฐ/์ถ๋ก ํจ๋์ ๋ณด์ฌ์ค๋๋ค.
.venv/bin/python -m proteus replay runs/me.jsonl --visual --fps 0
--fps 0: ํ๋ ์๋ง๋ค ๋ฉ์ถค(์ํฐ๋ก ์งํ)--fps 2: ์ด๋น 2ํ๋ ์ ์๋ ์ฌ์ (๊ธฐ๋ณธ๊ฐ์ 4)
4-3. PNG ํ๋ ์์ผ๋ก ์ ์ฅ โ --png DIR
ํ๋ ์๋ณ frame_000.png, frame_001.png โฆ ๋ฅผ ํด๋์ ์๋๋ค.
.venv/bin/python -m proteus replay runs/me.jsonl --png runs/me_frames
5. PNG โ GIF๋ก ํฉ์น๊ธฐ
CLI์ GIF ์ถ๋ ฅ์ ์์ง๋ง, --png๋ก ๋ฝ์ ํ๋ ์์ Pillow(์ด๋ฏธ .venv์ ์์)๋ก ํฉ์น๋ฉด ๋ฉ๋๋ค.
# 1) ํ๋ ์ ์์ฑ
.venv/bin/python -m proteus replay runs/me.jsonl --png runs/me_frames
# 2) GIF๋ก ํฉ์น๊ธฐ
.venv/bin/python - <<'PY'
from pathlib import Path
from PIL import Image
frames = sorted(Path("runs/me_frames").glob("frame_*.png"))
imgs = [Image.open(p).convert("RGBA") for p in frames]
# ํฐ ๋ฐฐ๊ฒฝ์ ํฉ์ฑ ํ ํ๋ ํธ ๋ณํ(GIF๋ ์ํ๊ฐ ์์)
flat = []
for im in imgs:
bg = Image.new("RGBA", im.size, (255, 255, 255, 255))
flat.append(Image.alpha_composite(bg, im).convert("P", palette=Image.ADAPTIVE))
durations = [600] * len(flat) # ํ๋ ์๋น 0.6์ด
if durations:
durations[-1] = 1500 # ๋ง์ง๋ง ํ๋ ์์ 1.5์ด ์ ์ง
flat[0].save("runs/me.gif", save_all=True, append_images=flat[1:],
duration=durations, loop=0, disposal=2, optimize=True)
print("wrote runs/me.gif")
PY
# 3) ์ด์ด ๋ณด๊ธฐ (macOS)
open runs/me.gif
ffmpeg ๋ฒ์ (๋ ๋ถ๋๋ฌ์ด ๊ณ ํ์ง GIF, 2-pass ํ๋ ํธ):
ffmpeg -y -framerate 2 -i runs/me_frames/frame_%03d.png \ -vf "palettegen" runs/palette.png ffmpeg -y -framerate 2 -i runs/me_frames/frame_%03d.png -i runs/palette.png \ -lavfi "paletteuse" runs/me.gif
6. ์ฌ๋ฌ ๊ธฐ๋ก ๋ชจ์ ๋น๊ต โ compare
์ฌ๋ยทLLM ๊ธฐ๋ก์ (๋ชจ๋ธ, ๋์ด๋)๋ณ๋ก ๋ฌถ์ด ๋ฉํธ๋ฆญ ํ๊ท ๊ณผ ๊ฐ์(n)๋ฅผ ๋
๋๋ค. ํด๋จผ ๋ฒ ์ด์ค๋ผ์ธ ๋น๊ต์ฉ์
๋๋ค.
.venv/bin/python -m proteus compare runs/me.jsonl runs/llm.jsonl --out runs/summary.json
- ์ฌ๋ฌ JSONL ํ์ผ์ ํ ๋ฒ์ ๋ฃ์ ์ ์์ต๋๋ค.
--out์ ์ฃผ๋ฉด ์ง๊ณ ๊ฒฐ๊ณผ๋ฅผ JSON์ผ๋ก๋ ์ ์ฅํฉ๋๋ค.- ์ถ๋ ฅ ํค์
๋ชจ๋ธ์--model์ ์ฝ๋ก ๋ค ๋ถ๋ถ์ ๋๋ค(์:fake:demoโdemo).
๊ณต์ ํ ๋น๊ต ํ: ์ฌ๋(
play --out)๊ณผ LLM(run --out)์ ๊ฐ์--seedยท--difficulty๋ก ๋๋ฆฐ ๋ค ๋น๊ตํ์ธ์.
7. ์์ฃผ ์ฐ๋ ํ๋ฆ ํ๋์
# (a) ์ฌ๋์ผ๋ก ํ ํ + ์ ์ฅ
.venv/bin/python -m proteus play --scenario predator_evade --difficulty easy --seed 42 --play-turns 10 --out runs/me.jsonl
# (b) ํธ๋ฃจ์ปฌ๋ฌ๋ก ๋ค์ ๋ณด๊ธฐ
.venv/bin/python -m proteus replay runs/me.jsonl --visual --fps 0
# (c) GIF๋ก ๋ง๋ค๊ธฐ
.venv/bin/python -m proteus replay runs/me.jsonl --png runs/me_frames
# โ 5์ ์ Pillow ์ค๋ํซ ์คํ โ runs/me.gif
# (d) LLM(๊ฐ์ง)๋ก ๊ฐ์ ์กฐ๊ฑด ํ ํ
.venv/bin/python -m proteus run --scenario predator_evade --model fake:demo --difficulty easy --seed 42 --play-turns 10 --out runs/llm.jsonl
# (e) ์ฌ๋ vs LLM ๋น๊ต
.venv/bin/python -m proteus compare runs/me.jsonl runs/llm.jsonl --out runs/summary.json
8. ์ข ๋ฃ ์ฝ๋(์๋ฌ ์ฒ๋ฆฌ)
| ์ฝ๋ | ์๋ฏธ |
|---|---|
0 |
์ ์ |
1 |
์
๋ ฅ์ ์ฐพ์์ผ๋ ๋น์ด ์์(์: replay/compare์ ๋น trace) |
2 |
์๋ชป๋/์๋ ์ธ์(์๋ ๋ชจ๋ธยท์๋๋ฆฌ์ค, ํ์ผ ์์, play ์ค stdin ์กฐ๊ธฐ ์ข
๋ฃ) |
9. ์ค์ ๋ชจ๋ธ๋ก ์คํ (์ ํ)
.venv์๋ provider SDK๊ฐ ์์ผ๋ฏ๋ก, ์ค์ LLM์ ๋๋ฆด ๋๋ ์์ venv๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ์๋๋ค(์คํ๋ผ์ธ ๋ถ๋ณ ์ ์ง).
# ์: Ollama Cloud
python3 -m venv /tmp/proteus-real && \
/tmp/proteus-real/bin/pip install pydantic numpy pyyaml httpx && \
PYTHONPATH="$PWD" OLLAMA_API_KEY="<ํค>" \
/tmp/proteus-real/bin/python -m proteus run \
--scenario predator_evade --model ollama:gpt-oss:120b-cloud \
--difficulty easy --seed 42 --play-turns 10 --out runs/real.jsonl
- ์ฌ์ฉ ๊ฐ๋ฅํ provider ์ด๋ฆ์
run --help์--model์ค๋ช ์ ๋์ต๋๋ค. - API ํค์
runs/๋.gitignore๋์์ด๋ผ ์ปค๋ฐ๋์ง ์์ต๋๋ค.
10. ๋์๋ง์ ์ธ์ ๋
.venv/bin/python -m proteus --help # ์ ์ฒด ๋ช
๋ น
.venv/bin/python -m proteus run --help # ๋ช
๋ น๋ณ ์ต์
.venv/bin/python -m proteus play --help
.venv/bin/python -m proteus replay --help
.venv/bin/python -m proteus compare --help
๊ถ๊ธํ ์ ์ด ์์ผ๋ฉด docs/superpowers/specs/์ ์ค๊ณ ๋ฌธ์์ HANDOFF.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.