Skip to content

Latest commit

ย 

History

163 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์ฃผ์—ญ ์‹ฌ์ธต AI ์ƒ๋‹ด (I-Ching AI Consultant)

์ฃผ์—ญ 64๊ด˜์™€ ์†ก๋Œ€ ์ฃผ์„(์ด์ฒœ์—ญ์ „ยท์ฃผ์—ญ๋ณธ์˜)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ, ๋‹จ์ˆœํ•œ ์ ๊ด˜๊ฐ€ ์•„๋‹Œ ์‚ถ์˜ ๋ณ€ํ™”๋ฅผ ์ฝ๊ณ  ์„ฑ์ฐฐํ•˜๋Š” ์‹ฌ์ธต ๋ฉ€ํ‹ฐํ„ด ๋Œ€ํ™”ํ˜• ์˜์‚ฌ๊ฒฐ์ • ์ƒ๋‹ด AI

Architecture Frontend Backend Tests Socratic Counsel Security License: Code License: Data

ํ•œ๊ตญ์–ด ยท 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) ๋ณ€์กฐ๋ฅผ ์›์ฒœ ์ฐจ๋‹จ

๐Ÿ“‹ 4๋‹จ๊ณ„ ๊ณ ํ’ˆ๊ฒฉ ์ฃผ์—ญ ์ปจ์„คํŒ… ๋ฆฌํฌํŠธ ๊ตฌ์กฐ (Report Agent v4.1)

๋ฐฑ์—”๋“œ LLM(Gemini)์ด ๋‚ด๋‹ด์ž ์‚ฌ์—ฐ์— ๋งž๊ฒŒ 100% ๊ฐ€๋ณ€ํ˜•์œผ๋กœ ์ง์ ‘ ์ง‘ํ•„ํ•˜๋Š” 1:1 ์‹ฌ์ธต ์„ฑ์ฐฐ ๋ณด๊ณ ์„œ ์„œ์‹์ž…๋‹ˆ๋‹ค.

1. ์งˆ๋ฌธ ๋ฐ ๋งˆ์Œ๊ฐ€์ง ์„ธํŒ… (์‚ฌ๋ก€ ์„ค์ •)
   - ์งˆ๋ฌธ์ž์˜ ๊ณ ๋ฏผ ์‚ฌ์—ฐ 100% ๋ฐ˜์˜
   - ์žฌ์‚ผ๋… ๊ธˆ๊ธฐ ์ ์„œ ์˜ˆ์‹ ๋ช…์‹œ (์‚ฌ๋ฆฌ์‚ฌ์š•์„ ๋น„์šด ๊ฒฝ๊ฑดํ•œ ๋‹จ 1ํšŒ ์ ์„œ ์›์น™)

2. ๊ด˜ ๋„์ถœ ๊ณผ์ • (์ˆ˜๋ฆฌ ๋„์ถœ ๋ฐ ํšจ ์Œ“๊ธฐ)
   - 1ํšจ(์ดˆํšจ) ~ 6ํšจ(์ƒํšจ) ์ˆ˜๋ฆฌ ์‚ฐ์ถœ (์†Œ์–‘ 7, ์†Œ์Œ 8, ๋…ธ์–‘ 9โ—‹, ๋…ธ์Œ 6โœ•)
   - โ‘  ๋ณธ๊ด˜(ๆœฌๅฆ) ์„ฑ๋ฆฝ ๋ฐ ์ƒ์ง• ์˜๋ฏธ
   - โ‘ก ๋ณ€ํšจ(ๅ‹•็ˆป) ๋ฐ ์ง€๊ด˜(ไน‹ๅฆ) ๋„์ถœ ๋ฐ ์ƒ์ง• ์˜๋ฏธ

3. ๊ณ ๋ณ€์ (่€ƒ่ฎŠๅ ) ๋ฐ ์ฒด์šฉ(้ซ”็”จ) ํ•ด์„ ๊ทœ์น™ ์ ์šฉ
   - ๋™ํšจ ๊ฐœ์ˆ˜๋ณ„ ์ฃผ์ž ๊ณ ๋ณ€์  ๊ทœ์น™ ์ ์šฉ ๋‚ด์—ญ (์˜ˆ: ๋™ํšจ๊ฐ€ 2๊ฐœ์ผ ๋•Œ ์ƒ์ธต๋ถ€ ํšจ์‚ฌ ์ฑ„ํƒ)
   - ์ฒด(้ซ”, ๋ณธ๊ด˜ ๋Œ€์ „์ œ)์™€ ์šฉ(็”จ, ์ง€๊ด˜ ๋ฏธ๋ž˜ ์ง€ํ–ฅ์ )์˜ ํ๋ฆ„ ๋ช…์‹œ

4. ๊ด˜์‚ฌยทํšจ์‚ฌ ์ข…ํ•ฉ ํ•ด์„ ๋ฐ ์‹ค์งˆ์  ์กฐ์–ธ
   - โ‘  ํ˜„์žฌ ์ƒํ™ฉ ์ง„๋‹จ (๋ณธ๊ด˜์ƒ ๋ฐ ๋‚ด๋‹ด์ž ์‹œ๊ณต๊ฐ„์  ์œ„์น˜ ํ’€์ด)
   - โ‘ก ํ•ต์‹ฌ ํ–‰๋™ ์ง€์นจ (์ฃผ ์ฃผ์š” ํ•ด์„ ๋Œ€์ƒ + ํ•œ๋ฌธ ํšจ์‚ฌ ์›๋ฌธ + ํ˜„๋Œ€์  ์‹ค์ฒœ ํ•ด์„ค)
   - โ‘ข ๋ณด์กฐ ๊ฒฝ๊ณ„ ์ง€์นจ (ํ•จ๊ป˜ ๋™ํ•œ ํšจ์‚ฌ + ํ•œ๋ฌธ ํšจ์‚ฌ ์›๋ฌธ + ์กฐ๊ธ‰ํ•จ ๊ฒฝ๊ณ„ ์กฐ์–ธ)
   - โ‘ฃ ๋ฏธ๋ž˜์˜ ๊ท€๊ฒฐ ๋ฐ ์ฃผ์˜์  (์ง€๊ด˜ ๋Œ€์ƒ์ „/๊ด˜์‚ฌ + ํ•œ๋ฌธ ์›๋ฌธ + ๋‚ด์‹ค ์–‘์œก ์ง€์นจ)
   - ๐Ÿ’ก ์งˆ๋ฌธ์ž์— ๋Œ€ํ•œ ์ตœ์ข… ์ข…ํ•ฉ ์ปจ์„คํŒ… ์š”์•ฝ (ํ•œ๋ฌธ ์›๋ฌธ ์ธ์šฉ + ๊ฒฐ๋ก  ๊ฐ•์กฐ)

๐Ÿ—๏ธ 3๊ณ„์ธต ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜

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
Loading

๐Ÿค– ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ

[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

๐Ÿ’ป ๊ธฐ์ˆ  ์Šคํƒ

Backend

  • 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 ์„œ๋ช… ๊ฒ€์ฆ ๋ฐ ์ธ์ฆ ์˜์กด์„ฑ

Database & RAG

  • Supabase Cloud (PostgreSQL 16 + pgvector): ์„œ์šธ ๋ฆฌ์ „(ap-northeast-2)
  • HNSW ๋ฒกํ„ฐ ์ธ๋ฑ์Šค: ์†ก๋Œ€ ์ด์ฒœ์—ญ์ „(์ •์ „) 1,752๊ฑด + ์ฃผ์—ญ๋ณธ์˜(๋ณธ์˜) 784๊ฑด = 2,536๊ฑด ์ฃผ์„ ๋ฒกํ„ฐ
  • RLS (Row Level Security): SELECT Only ๊ถŒํ•œ ๋ฐ ์‚ฌ์šฉ์ž๋ณ„ ๋ฐ์ดํ„ฐ ๊ฒฉ๋ฆฌ

Frontend

  • Next.js 16 (App Router, Turbopack): Vercel ์„œ์šธ ๋ฆฌ์ „(icn1) ๋ฐฐํฌ
  • React 19 / TypeScript
  • Tailwind CSS / Framer Motion / Lucide React
  • Modern Zen UI: ์ฃผ์—ญ 6ํšจ ์• ๋‹ˆ๋ฉ”์ด์…˜, 4๋‹จ๊ณ„ ๊ณ ํ’ˆ๊ฒฉ ๋ฆฌํฌํŠธ ๋ทฐ์–ด, 5ํ„ด ์†Œํฌ๋ผํ…Œ์Šค ๋Œ€ํ™” ์ธํ„ฐํŽ˜์ด์Šค, ์‹ค์ฒœ ์•ก์…˜ ์นด๋“œ ๋ชจ๋‹ฌ ๋ Œ๋”๋Ÿฌ, ์‹ค์‹œ๊ฐ„ ํฌ๋ ˆ๋”ง ์ž”์•ก ๋ฐฐ์ง€ ๋™๊ธฐํ™”

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘ (Getting Started)

1. ํ™˜๊ฒฝ ์„ค์ •

# ์ €์žฅ์†Œ ๋ณต์ œ
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 ..

2. ํ”„๋กฌํ”„ํŠธ ํŒŒ์ผ ๋ฐฐ์น˜ (ํ•„์ˆ˜)

์—์ด์ „ํŠธ ํ”„๋กฌํ”„ํŠธ(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).

3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (.env ๋ฐ env.production.yaml)

  • ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ .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

4. ๋ฐฑ์—”๋“œ ์‹คํ–‰

.venv/bin/uvicorn api.main:app --host 0.0.0.0 --port 8008 --reload

5. ํ”„๋ก ํŠธ์—”๋“œ ์‹คํ–‰

cd 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 ์ €์ž‘๊ถŒ ํ‘œ์‹œ ์กฐ๊ฑด์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

Releases

Packages

Contributors

Languages