์ฃผ์ญ 64๊ด์ ์ก๋ ์ฃผ์(์ด์ฒ์ญ์ ยท์ฃผ์ญ๋ณธ์)์ ๊ธฐ๋ฐํ์ฌ, ๋จ์ํ ์ ๊ด๊ฐ ์๋ ์ถ์ ๋ณํ๋ฅผ ์ฝ๊ณ ์ฑ์ฐฐํ๋ ์ฌ์ธต ๋ฉํฐํด ๋ํํ ์์ฌ๊ฒฐ์ ์๋ด AI
ํ๊ตญ์ด ยท English
I-Ching AI Consultant๋ ์ฌ์ฉ์์ ๊ณ ๋ฏผ์ ๊ฒฝ์ฒญํ๊ณ , ์ฃผ์ ๋ณํจ ๊ท์น ์์ง์ ํตํด ๊ด๋ฅผ ๋์ถํ ๋ค, ์ ํต ์๋ฌธ(๊ด์ฌยทํจ์ฌ)๊ณผ ์ก๋ ์ฃผ์(์ ์ ยท๋ณธ์ 2,536๊ฑด)์ ํ๋์ ์ฌ๋ฆฌ ์๋ด ์ธ์ด๋ก ํ์ด๋ด๋ AI ์๋ด ์์คํ ์ ๋๋ค.
- ํฌ์ง์ ๋: ๋ฏธ๋๋ฅผ ๋จ์ ์ง๋ '์์ธ์'๊ฐ ์๋, ์ค์ค๋ก ๋ด๋ฉด์ ๋ต์ ์ฐพ๋๋ก ๋๋ '์์ฌ๊ฒฐ์ ์ง์ ๋๋ฐ์์ด์ ๊ฑฐ์ธ'
- 5ํด ์ํฌ๋ผํ
์ค ์ฝ์นญ ๋ํ ์์ง (v0.5.0 NEW): ์ฑ๋ฆฌํ์ ์์ฑ(่ช็)๊ณผ ํด๊ณ์ ๊ฒฝ(ๆฌ) ์ฒ ํ์ ๊ธฐ๋ฐํ 5๋จ๊ณ ์ํฌ๋ผํ
์ค ์ฝ์นญ ๋ชจ๋ธ ๋์
. ๋ฌดํ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ๋ํ๋ฅผ ๋ฐฉ์งํ๋ 5ํด ํ๋ ๊ฐ๋๋ ์ผ(
is_final: true) ๋ฐ 4 Quality Gates ์์๋นํ(Critique & Refinement) ๋ฃจํ๋ฅผ ํตํด ์ํฌ์ด/ํด๋ฆฌ์ ฐ๋ฅผ ๋ฐฐ์ ํ๊ณ ๋์ ํ๊ฒฉ์ ํ๊ตญ์ด ์๋ด์ ์ ๊ณตํฉ๋๋ค. - ์ฑ์ฐฐ ๊ฒฐ๊ณผ ์ก์ ์นด๋ v2 ๋ฐ ์นด๋ ์บ๋ฒ์ค ๋ ๋๋ฌ (v0.5.0 NEW): 5ํด ์๋ด ์๋ฃ ์ ๋ด๋ด์์ 1๊ฐ์ง ๊ตฌ์ฒด์ ์ค์ฒ ๋ค์ง(Action Pledge)์ ๊ตฌ์กฐํํ์ฌ, ๋ชจ๋ฐ์ผ/์น ์ ์ฅ ๋ฐ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ ๊ทธ๋ํฝ ์ก์ ์นด๋๋ก ๋ ๋๋งํ๊ณ ์์ ์ํธํ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.
- ์์ ์ฃผ์ญ AI 1:1 ๋ง์ถค ์ปจ์คํ
๋ฆฌํฌํธ ๊ฒฐํฉ: TCREI ํ๋ ์์ํฌ ๊ธฐ๋ฐ ์ ์ฉ
Report Agent๊ฐ 6ํจ ์๋ฆฌ ์ฐ์ถ, ์ฃผ์ ๊ณ ๋ณ์ ๋ฃฐ, DB ํจ์ฌ ํ๋ฌธ ์๋ฌธ, RAG ๊ณ ์ ์ฃผ์์ ์ข ํฉ ์ตํฉํ์ฌ 4๋จ๊ณ ๊ณ ํ๊ฒฉ 1:1 ๋ง์ถค ๋ฆฌํฌํธ๋ฅผ ์งํํ๋ฉฐ, ํ์ ๋ ๋ฆฌํฌํธ ํต์ฌ ๊ฒฐ๋ก ์Counsel Agent์๋ด ๋ํ ๋งฅ๋ฝ์ 1:1 ๋ฐ์ธ๋ฉํฉ๋๋ค. - ๋ฆฌํฌํธ ์ปจํ
์คํธ ์์ํ: ์ฒซ ํด์์ ์งํํ ๋ฆฌํฌํธ ์ ๋ฌธ์ ์ธ์
(
counsel_sessions.report_data)์ ์ ์ฅํ๊ณ , ์ดํ ๋ชจ๋ ํด์ ์๋ด ํ๋กฌํํธ์ ๋ค์ ์ฃผ์ ํฉ๋๋ค. 2ํด์งธ ์ดํ ๋ต๋ณ์ด 1ํด ๋ฆฌํฌํธ์ ํ๋ ์ง์นจยท์ต์ข ์์ฝ๊ณผ ์ด๊ธ๋์ง ์์ต๋๋ค. ์์ฑ ์ํ๋report_status(ready/failed/not_requested)์report_error_code๋ก ์ถ์ ํฉ๋๋ค. - ๊ทผ๊ฑฐ ํฌ๋ช ์ฑ (Provenance): AI ํ๊ฐ(Hallucination) ์์ด DB 1:1 ํ์ ์๋ฌธ๊ณผ pgvector RAG ์ฃผ์์ ํ๋ก ํธ์๋ ๊ทผ๊ฑฐ ํจ๋์ ํฌ๋ช ํ๊ฒ ๊ณต๊ฐ
- ๋ค๊ณ์ธต ์์ ๋ง & SaMD ์ฐ๋์ค: ์๊ธฐ ์ ํธ(์์ด/์ํด, ํญ๋ ฅ) ๊ฐ์ง ์ ๊ด ๋์ถ์ ์ฐจ๋จํ๊ณ 24์๊ฐ ์์ด์๋ฐฉ ์๋ด์ ํ(
109)๋ก ์ฆ์ ์์ ์ด๊ด (24์๊ฐ ์๊ธฐ ๋์น ์ ์ฉ ๋ฐ 100% ์๋ ํฌ๋ ๋ง ํ๋ถ) - ์ ๋ก ํธ๋ฌ์คํธ ๋ณด์ (Zero-Trust): ์์ฒญ ๋ณธ๋ฌธ
user_id๋ฅผ ๋ถํํ๊ณ , Supabase JWT ์๋ช ๊ฒ์ฆ(HS256,audience="authenticated")์ ํตํด ์ ์์ ๊ฐ์ ํ์ ํ์ฌ ์๊ธฐ ๋์น ๋ฐ ์ธ์ ์์ ๊ถ(BOLA) ๋ณ์กฐ๋ฅผ ์์ฒ ์ฐจ๋จ
๋ฐฑ์๋ LLM(Gemini)์ด ๋ด๋ด์ ์ฌ์ฐ์ ๋ง๊ฒ 100% ๊ฐ๋ณํ์ผ๋ก ์ง์ ์งํํ๋ 1:1 ์ฌ์ธต ์ฑ์ฐฐ ๋ณด๊ณ ์ ์์์ ๋๋ค.
1. ์ง๋ฌธ ๋ฐ ๋ง์๊ฐ์ง ์ธํ
(์ฌ๋ก ์ค์ )
- ์ง๋ฌธ์์ ๊ณ ๋ฏผ ์ฌ์ฐ 100% ๋ฐ์
- ์ฌ์ผ๋
๊ธ๊ธฐ ์ ์ ์์ ๋ช
์ (์ฌ๋ฆฌ์ฌ์์ ๋น์ด ๊ฒฝ๊ฑดํ ๋จ 1ํ ์ ์ ์์น)
2. ๊ด ๋์ถ ๊ณผ์ (์๋ฆฌ ๋์ถ ๋ฐ ํจ ์๊ธฐ)
- 1ํจ(์ดํจ) ~ 6ํจ(์ํจ) ์๋ฆฌ ์ฐ์ถ (์์ 7, ์์ 8, ๋
ธ์ 9โ, ๋
ธ์ 6โ)
- โ ๋ณธ๊ด(ๆฌๅฆ) ์ฑ๋ฆฝ ๋ฐ ์์ง ์๋ฏธ
- โก ๋ณํจ(ๅ็ป) ๋ฐ ์ง๊ด(ไนๅฆ) ๋์ถ ๋ฐ ์์ง ์๋ฏธ
3. ๊ณ ๋ณ์ (่่ฎๅ ) ๋ฐ ์ฒด์ฉ(้ซ็จ) ํด์ ๊ท์น ์ ์ฉ
- ๋ํจ ๊ฐ์๋ณ ์ฃผ์ ๊ณ ๋ณ์ ๊ท์น ์ ์ฉ ๋ด์ญ (์: ๋ํจ๊ฐ 2๊ฐ์ผ ๋ ์์ธต๋ถ ํจ์ฌ ์ฑํ)
- ์ฒด(้ซ, ๋ณธ๊ด ๋์ ์ )์ ์ฉ(็จ, ์ง๊ด ๋ฏธ๋ ์งํฅ์ )์ ํ๋ฆ ๋ช
์
4. ๊ด์ฌยทํจ์ฌ ์ข
ํฉ ํด์ ๋ฐ ์ค์ง์ ์กฐ์ธ
- โ ํ์ฌ ์ํฉ ์ง๋จ (๋ณธ๊ด์ ๋ฐ ๋ด๋ด์ ์๊ณต๊ฐ์ ์์น ํ์ด)
- โก ํต์ฌ ํ๋ ์ง์นจ (์ฃผ ์ฃผ์ ํด์ ๋์ + ํ๋ฌธ ํจ์ฌ ์๋ฌธ + ํ๋์ ์ค์ฒ ํด์ค)
- โข ๋ณด์กฐ ๊ฒฝ๊ณ ์ง์นจ (ํจ๊ป ๋ํ ํจ์ฌ + ํ๋ฌธ ํจ์ฌ ์๋ฌธ + ์กฐ๊ธํจ ๊ฒฝ๊ณ ์กฐ์ธ)
- โฃ ๋ฏธ๋์ ๊ท๊ฒฐ ๋ฐ ์ฃผ์์ (์ง๊ด ๋์์ /๊ด์ฌ + ํ๋ฌธ ์๋ฌธ + ๋ด์ค ์์ก ์ง์นจ)
- ๐ก ์ง๋ฌธ์์ ๋ํ ์ต์ข
์ข
ํฉ ์ปจ์คํ
์์ฝ (ํ๋ฌธ ์๋ฌธ ์ธ์ฉ + ๊ฒฐ๋ก ๊ฐ์กฐ)flowchart TD
subgraph Client ["ํด๋ผ์ด์ธํธ (๋ด๋ด์)"]
Browser[Next.js Modern Zen Web UI]
end
subgraph Vercel ["Vercel Edge (Seoul icn1)"]
NextApp[Next.js 16 App Router]
AuthCallback["/auth/callback ํด๋ผ์ด์ธํธ ํ์ด์ง"]
end
subgraph Supabase ["Supabase Cloud (Seoul ap-northeast-2)"]
Auth[Supabase Auth - Google OAuth]
DB[(PostgreSQL 16 + pgvector)]
RLS[RLS & 50 ์ฐ์ปด ํฌ๋ ๋ง ์๋ ์ง๊ธ]
end
subgraph CloudRun ["Google Cloud Run (Seoul asia-northeast3)"]
FastAPI[FastAPI ๋ฐฑ์๋ ์ปจํ
์ด๋ - Non-root]
JWTAuth[JWT ์๋ช
๊ฒ์ฆ & Rate Limiter]
Engine[์ฃผ์ ๋ณํจ ๊ท์น ์์ง]
Pipeline[๋ฉํฐ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์
]
end
subgraph AI ["Google Cloud Vertex AI"]
Gemini["Gemini 2.5 Flash<br/>thinking_budget=0 ยท 1ํด 3์ด"]
end
Browser -->|1. Google ์์
๋ก๊ทธ์ธ & ์ธ์
๋ฐ๊ธ| Auth
Browser -->|2. ์น ํ์ด์ง ๋ ๋๋ง| NextApp
Browser -->|3. ์๋ด API ํธ์ถ - Bearer JWT ํค๋| FastAPI
FastAPI -->|4. JWT ์๋ช
๊ฒ์ฆ & user_id ํ์ | JWTAuth
FastAPI -->|5. 2,536๊ฑด ์ก๋ ์ฃผ์ ๊ท ํ ๊ฒ์| DB
FastAPI -->|6. 64๊ด 386ํจ ๊ท์น ์์ง & ์์ด์ ํธ ์ถ๋ก | Gemini
FastAPI -->|7. 4๋จ๊ณ ๊ณ ํ๊ฒฉ ๋ฆฌํฌํธยท์ฑ์ฐฐ ์ง๋ฌธยท์ค์๊ฐ ๊ทผ๊ฑฐ ๋ฐํ| Browser
[0] ์์ ์คํฌ๋ฆฌ๋ (Safety Screener)
- ์ฌ์ฉ์ ๋ฐํ ๋ฐ ์๊ธฐ ์ ํธ ๊ฐ์ง
- ์๊ธฐ ๊ฐ์ง ์ ๊ด ๋์ถ ์์ด ์ฆ์ ๊ณต๊ณต ํซ๋ผ์ธ ์๋ด๋ก ๋ถ๊ธฐ (BLOCK_CRISIS)
- 24์๊ฐ ์ฌ์ฉ์ ๋์น(CRISIS_LATCH_HOURS)๋ก ์ฐํ ์ฐจ๋จ
โ (์ ์ ํต๊ณผ ์)
[1] ์ ์ยท์ ๋ฆฌ ์์ด์ ํธ (Intake Agent)
- ๊ณ ๋ฏผ ๊ตฌ์ฒดํ ๋ฐ ์นดํ
๊ณ ๋ฆฌ ๋ถ๋ฅ
- ๋์ผ ์ง๋ฌธ ์ฌ๋์ถ(์ฌ์ผ๋
๋ชฝ๊ด ์์น) ๊ฐ์ง ๋ฐ ์ด์ ๊ด ์ธ๊ณ
โ
[2] ๊ด ๋์ถยทํด์ ์์ด์ ํธ (Interpretation Agent)
- ๊ท์น ์์ง(core.hexagram_engine)์ผ๋ก 6ํจ ๋ฐ ๋ํจ(๋
ธ์/๋
ธ์) ์ฐ์ถ
- ์ฃผ์ ์ ๋ฒ(Focus Rule)์ ๋ฐ๋ผ DB 1:1 ํ์ ๊ด์ฌยทํจ์ฌ ์กฐํ
- RAG(core.rag)๋ฅผ ํตํด ์ ์ (็จๅณ 1,752๊ฑด) ๋ฐ ๋ณธ์(ๆฌ็พฉ 784๊ฑด) ๊ท ํ ๊ฒ์
โ
[โ
] ๋ฆฌํฌํธ ์์ด์ ํธ (Report Agent v4.1)
- ๋ด๋ด์ ์ง๋ฌธ, 6ํจ ์๋ฆฌ ๋ฐฐ์ด, ๊ณ ๋ณ์ ๋ฃฐ, ํ๋ฌธ ํจ์ฌ ์๋ฌธ, RAG ์ฃผ์ ์ตํฉ
- 4๋จ๊ณ ๊ณ ํ๊ฒฉ 1:1 ๋ง์ถค ์ฃผ์ญ ์ปจ์คํ
๋ณด๊ณ ์ ๊ตฌ์กฐํ JSON ์งํ
โ
[3] ์๋ด ์์ด์ ํธ (Counsel Agent - 5ํด ์ํฌ๋ผํ
์ค ์ฝ์นญ ๋ชจ๋ธ v0.5.0)
- ์ธ์
์ ์ ์ฅ๋ ๋ฆฌํฌํธ(report_data)๋ฅผ ๋งค ํด ํ๋กฌํํธ์ ์ฌ์ฃผ์
ํ์ฌ ํด์ ๊ธฐ์ค ์ ์ง
- ์ฑ๋ฆฌํ ์์ฑ(่ช็)๊ณผ ๊ฒฝ(ๆฌ) ์ฒ ํ ๊ธฐ๋ฐ 5๋จ๊ณ ์ฝ์นญ (ํ๋ โ ๋งน์ โ ์ฒ๋ฐฉ โ ๋ฏธ๋ โ ์ค์ฒ ๋ค์ง)
- 5ํด ํ๋ ๊ฐ๋๋ ์ผ (`is_final: true`)๋ก ๋ฌดํ ๊ผฌ๋ฆฌ๋ฌผ๊ธฐ ๋ํ ์์ฒ ์ฐจ๋จ
- 4 Quality Gates ์์๋นํ(Critique & Refinement) ๋ฃจํ๋ก ์ํฌ์ด 0๊ฑด ์ต์
โ (5ํด ์๋ฃ ์)
[โ
] ์ก์
์นด๋ v2 ๋ ๋๋ฌ (Action Card Generator v2 - NEW)
- 1๊ฐ์ง ๊ตฌ์ฒด์ ์ค์ฒ ๋ค์ง(Action Pledge) ๊ตฌ์กฐํ ๋ฐ ์บ๋ฒ์ค ๊ทธ๋ํฝ ์นด๋ ์์ฑ
- ์์ ์ํธํ ์นด๋ ๋ด๋ณด๋ด๊ธฐ ์ง์
โ
[+1] ์ ๋ ์์ด์ ํธ (Journal Agent)
- ์ ์ฒด ๋ํ ์์ฝ, ํต์ฌ ์ฑ์ฐฐ ๋ฐ ์ค์ฒ ์ง๋ฌธ(Action Items) DB ๊ธฐ๋ก
| ์์ญ | ๋์ ๊ธฐ์ ๋ฐ ์ต์ ํ ๋ด์ฉ | ํจ๊ณผ |
|---|---|---|
| ์ธ์ฆ ๋ฐ ์ ์ ๊ฒ์ฆ | Supabase JWT ์๋ช
๊ฒ์ฆ (PyJWT, HS256, aud="authenticated") |
user_id ์์กฐ, ์๊ธฐ ๋์น ์ฐํ ๋ฐ BOLA(์ธ์
ํ์ทจ) ์์ฒ ๋ฐฉ์ด |
| ๋์์ฑ ์์ฅ ์์ ์ฑ | ์กฐ๊ฑด๋ถ ์์์ UPDATE (credit_balance >= amount + RETURNING) |
ํฌ๋ ๋ง ์ฐจ๊ฐ ์ ๋ ์ด์ค ์ปจ๋์ (Race Condition) 100% ๋ฐฉ์ด |
| ์ถ๋ก ์๋ ์ต์ ํ | Gemini 2.5 Flash types.ThinkingConfig(thinking_budget=0) |
1ํด ์ง์ฐ์๊ฐ 18์ด โ 3์ด (6๋ฐฐ ๋จ์ถ) |
| ํ ํฐ ๋ค์ด์ดํธ | ๋ํ ์ด๋ ฅ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (์ต๊ทผ 3ํด/6๋ฐํ) ๋ฐ ๋ถํ์ํ ํ๋ ์์ถ | ๊ธด ์ธ์ ํ ํฐ ์๋ชจ 50% ์ด์ ์ ๊ฐ (1์ธ์ ์๊ฐ ์ฝ 1.5~3์) |
| DoS ๋ฐ ๊ณผ๊ธ ๋ฐฉ์ด | ์ฌ๋ผ์ด๋ฉ ์๋์ฐ Rate Limiter (IP/์ฌ์ฉ์๋น 1๋ถ 30ํ) + ๋ฉ๋ชจ๋ฆฌ ์๋ ์ ๋ฆฌ | ๋น์ธ๊ฐ ํธ์ถ ๋ฐ Financial DoS ๋ฐฉ์ด |
| ์ปจํ ์ด๋ ํ๋๋ | Dockerfile ๋น๋ฃจํธ ์ฌ์ฉ์(appuser:1000) ์คํ ๋ฐ ์ง์
์ ๊ณ ์ |
์ปจํ ์ด๋ ์ดํ ๋ฐ ๋ฃจํธ ๊ถํ ํ์ทจ ๋ฐฉ์ง |
| ์ ๋ณด ๋ ธ์ถ ๋ฐฉ์ง | OWASP ํ์ค ๋ณด์ ํค๋ + ์๋ฌ ์คํํธ๋ ์ด์ค ๋ง์คํน | ๋ฏผ๊ฐํ ์ธํ๋ผ ๋ด๋ถ ์ ๋ณด ํด๋ผ์ด์ธํธ ๋ ธ์ถ ์ฐจ๋จ |
| ์ด์ ๊ด์ธก์ฑ | ๊ตฌ์กฐํ JSON ๋ก๊น
(core/logging_config.py) โ ์ด์์์ severity ํ๋๋ฅผ ๋ช
์ํด Cloud Logging์ด ์ค์ ๋ ๋ฒจ๋ก ์ธ์ |
๋ฆฌํฌํธ ์์ฑ ์ํ์ duration_ms๋ฅผ ๋ก๊ทธ๋ก ์ถ์ . httpxยทgoogle_genai๋ WARNING์ผ๋ก ๋ฎ์ถฐ ์๋ด 1๊ฑด๋น 20์ฌ ์ค์ ํธ์ถ ๋ก๊ทธ ์ต์ |
| ํฌ์ค ์ฒดํฌ | /health๊ฐ DB์ SELECT 1 ์คํ (3์ด ํ์์์) |
์ ์ 200 database: ok, DB ์ฅ์ ์ 503 database: unavailable |
- Python 3.9+ / FastAPI: ๋น๋๊ธฐ REST API ์๋ฒ (๋ผ์ฐํฐ ๋ชจ๋ํ:
api/routers/{counsel,card,safety}.py) - Google Cloud Run: ์์ธ ๋ฆฌ์ (
asia-northeast3) ๋ฌด์ํ ์ปจํ ์ด๋ (0~10 Scale-to-Zero) - SQLAlchemy (AsyncIO) / asyncpg: ๋น๋๊ธฐ PostgreSQL ORM (๋ค์ค DB ํธํ
UUIDType์ ์ฉ) - Google GenAI / Vertex AI (Gemini 2.5 Flash): ๋ฉํฐ์์ด์ ํธ LLM ํ์ดํ๋ผ์ธ
- PyJWT: Supabase JWT ์๋ช ๊ฒ์ฆ ๋ฐ ์ธ์ฆ ์์กด์ฑ
- Supabase Cloud (PostgreSQL 16 + pgvector): ์์ธ ๋ฆฌ์ (
ap-northeast-2) - HNSW ๋ฒกํฐ ์ธ๋ฑ์ค: ์ก๋ ์ด์ฒ์ญ์ (์ ์ ) 1,752๊ฑด + ์ฃผ์ญ๋ณธ์(๋ณธ์) 784๊ฑด = 2,536๊ฑด ์ฃผ์ ๋ฒกํฐ
- RLS (Row Level Security): SELECT Only ๊ถํ ๋ฐ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ
- Next.js 16 (App Router, Turbopack): Vercel ์์ธ ๋ฆฌ์ (
icn1) ๋ฐฐํฌ - React 19 / TypeScript
- Tailwind CSS / Framer Motion / Lucide React
- Modern Zen UI: ์ฃผ์ญ 6ํจ ์ ๋๋ฉ์ด์ , 4๋จ๊ณ ๊ณ ํ๊ฒฉ ๋ฆฌํฌํธ ๋ทฐ์ด, 5ํด ์ํฌ๋ผํ ์ค ๋ํ ์ธํฐํ์ด์ค, ์ค์ฒ ์ก์ ์นด๋ ๋ชจ๋ฌ ๋ ๋๋ฌ, ์ค์๊ฐ ํฌ๋ ๋ง ์์ก ๋ฐฐ์ง ๋๊ธฐํ
# ์ ์ฅ์ ๋ณต์
git clone https://github.com/casareborgia/IChing-AI-Consultant.git
cd IChing-AI-Consultant
# ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ์์กด์ฑ ์ค์น
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# ํ๋ก ํธ์๋ ์์กด์ฑ ์ค์น
cd frontend
npm install
cd ..์์ด์ ํธ ํ๋กฌํํธ(prompts/*.md)๋ ์ด ์ ์ฅ์์ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ์ด ์ ์ฅ์๋ ๊ณต๊ฐ์ด๊ณ ํ๋กฌํํธ๋ ๊ณต๊ฐ ๋์์ด ์๋๋ผ .gitignore๋ก ์ ์ธํ์ต๋๋ค. ํ๋กฌํํธ ์์ด๋ ๋ฐฑ์๋๊ฐ ์ํฌํธ ๋จ๊ณ์์ FileNotFoundError๋ก ์ฃฝ์ต๋๋ค.
์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด ๋น๊ณต๊ฐ ์ ์ฅ์์์ ๋ฐ์์ต๋๋ค.
rm -rf prompts
git clone https://github.com/casareborgia/iching-prompts.git prompts๊ถํ์ด ์๋ค๋ฉด core/prompts.py๊ฐ ์๊ตฌํ๋ ํ์ผ 9๊ฐ(counsel.md, duplicate_response.md, intake.md, interpret.md, journal.md, rag_translation.md, report.md, safety_response.md, safety_screening.md)๋ฅผ ์ง์ ์์ฑํด์ผ ํฉ๋๋ค. ๊ฐ ํ์ผ์ ## ์์คํ
ํ๋กฌํํธ ์ ๋ชฉ๊ณผ ๊ทธ ์๋ ์ฝ๋ํ์ค(```)๋ฅผ ํฌํจํด์ผ ํ๋ฉฐ, ๋ก๋๋ ๊ทธ ํ์ค ์์ ๋ด์ฉ๋ง ์ฝ์ต๋๋ค(core/prompts.py).
- ๋ก์ปฌ ๊ฐ๋ฐ์ฉ
.env์ค์ (์์:.env.example์ฐธ์กฐ) - ํ๋ก๋์
๋ฐฐํฌ ์:
env.production.yaml.example์ ๋ณต์ฌํ์ฌenv.production.yaml์ ์์ฑํ๊ณ ์ค์ GCP ํ๋ก์ ํธ ID์ ๋ฐฐํฌ ๋๋ฉ์ธ์ ์ ๋ ฅํฉ๋๋ค.
# Database
DATABASE_URL=postgresql+asyncpg://user:password@localhost:5432/iching
# Gemini / Vertex AI
LLM_PROVIDER=gemini
GEMINI_MODEL=gemini-2.5-flash
GOOGLE_CLOUD_PROJECT=your-gcp-project-id
# Supabase JWT Secret (๊ฒ์ฆ์ฉ)
SUPABASE_JWT_SECRET=your-supabase-jwt-secret.venv/bin/uvicorn api.main:app --host 0.0.0.0 --port 8008 --reloadcd frontend
npm run dev๋ธ๋ผ์ฐ์ ์์ **http://localhost:3000**์ ์ ์ํ์ฌ ์๋ด์ ์์ํ ์ ์์ต๋๋ค.
๋ณธ ํ๋ก์ ํธ๋ 167๊ฐ์ ์๋ํ ํ ์คํธ ์ค์ํธ์ Codex/CI ๊ฒ์ฆ์ ์ํ ํ์ค ํ๊ฐ ํ๋ค์ค๋ฅผ ์ ๊ณตํฉ๋๋ค:
# 1. ์ ์ฒด ๋จ์ ๋ฐ ๋ณด์ ํตํฉ ํ
์คํธ ์คํ (167 passed, 4 skipped)
.venv/bin/pytest -v
# 2. ํฌ๋ ๋ง ๋์์ฑ(Race Condition) ๋ฐ ๊ฒฐ์ ๊ฐ๋ ์ ์ฉ ํ
์คํธ
.venv/bin/pytest tests/test_credit_system.py -v
# 3. 5ํด ์ํฌ๋ผํ
์ค ์๋ด 6๋ ํต์ฌ KPI ์ธก์ ๊ธฐ ๊ฐ๋
.venv/bin/python scripts/evaluate_counsel_kpi.py --mock --json
# 4. JWT ์ธ์ฆ ๋ฐ BOLA ๋ฐฉ์ด ์ ์ฉ ํ
์คํธ
.venv/bin/pytest tests/test_jwt_auth.py -v
# 5. ์์ ์คํฌ๋ฆฌ๋ ์ฑ์ ๋ฒค์น๋งํฌ (115๊ฑด)
.venv/bin/python scripts/score_safety.py -p gemini์ข ํฉ ํ๊ฐ ๊ฐ์ด๋: ํ๋ก์ ํธ ์ ์ฒด์ ๋ํ ์ ๋์ ๊ฐ์ฌ ๊ธฐ์ค ๋ฐ ํ๊ฐ ๋ฃจ๋ธ๋ฆญ์
docs/PROJECT_EVALUATION_KPI.md๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- ๋ณธ ์๋น์ค๋ ์๋ฃ๊ธฐ๊ธฐ(SaMD) ๋๋ ์ ๋ฌธ ์ฌ๋ฆฌ์น๋ฃ๋ฅผ ๋์ฒดํ์ง ์์ผ๋ฉฐ, ์๊ธฐ ์ฑ์ฐฐ๊ณผ ์์ฌ๊ฒฐ์ ์ ๋๋ ์ฐ๋์ค AI ๋๊ตฌ์ ๋๋ค.
- ์๊ธฐ ์ํฉ ๋ฐ์ ์ 24์๊ฐ ์์ด์๋ฐฉ ์๋ด์ ํ(
109) ๋๋ ์ ์ ๊ฑด๊ฐ ์๊ธฐ์๋ด์ ํ(1577-0199)์ ๋์์ ๋ฐ์ผ์ค ์ ์์ต๋๋ค.
| ๋์ | ๋ผ์ด์ ์ค | ํ์ผ |
|---|---|---|
| ์์ค ์ฝ๋ | MIT License (์์ ๋ก์ด ์ฌ์ฉ, ์์ ๋ฐ 2์ฐจ ๋ฐฐํฌ ๊ฐ๋ฅ) | LICENSE |
data/ ํ
์คํธ ๋ฐ ํ์๋ฌผ |
CC BY-SA 4.0 (์ถ์ฒ ํ๊ธฐ ๋ฐ ๋์ผ ์กฐ๊ฑด ๋ณ๊ฒฝ ํ๋ฝ ๊ณ์น) | data/PROVENANCE.md |
์์ค ์ฝ๋๋ MIT License ์กฐ๊ฑด ํ์ ์์ ๋กญ๊ฒ ํ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๋ฐ์ดํฐ์ ๋ฐ ์์ ์๋ฃ๋ CC BY-SA 4.0 ์ ์๊ถ ํ์ ์กฐ๊ฑด์ ๋ฐ๋ฆ ๋๋ค.