μμΈAIμ¬λ¨ μ°ννλ ₯ νλ‘μ νΈ | λκ΅λνκ΅ 2025-CSC4019-03
μμΈμ μλΉ λΆλͺ¨ λ° μ΄λ³΄ λΆλͺ¨λ₯Ό μν μμ Β·μΆμ°Β·μ‘μ ν΅ν© μ 보 AI μ±λ΄μ
λλ€.
μμΈ μ΄λ¦°λ°μ΄ν°κ΄μ₯ 곡곡 API, μ λΆ ν¬νΈ ν¬λ‘€λ§ λ°μ΄ν°, μλ λΌλ²¨λ§ μ μ±
λ°μ΄ν°λ₯Ό κ²°ν©ν RAG(Retrieval-Augmented Generation) νμ΄νλΌμΈμ ν΅ν΄, μ¬μ©μμ μ§λ¬Έμ λ§λ μ§μκΈΒ·μμ€Β·νλ‘κ·Έλ¨ μ 보λ₯Ό κ²μνκ³ μμ°μ΄ λ΅λ³μ μμ±ν©λλ€.
| μν | μ΄λ¦ |
|---|---|
| νμ₯ | μλ건 |
| νμ | μ΄μλ¦Ό |
| νμ | μ΄μ€μ |
- νλ‘μ νΈ κ°μ
- μμ€ν μν€ν μ²
- λ°μ΄ν° νμ΄νλΌμΈ
- λ°±μλ (AWS Lambda) μμΈ
- νλ‘ νΈμλ μμΈ
- κ΄λ ¨ 리ν¬μ§ν 리
- λ‘컬 μ€ν λ°©λ²
- κΈ°μ μ€ν
μμΈμμλ μμ°λΆΒ·μμ μ κ°κ΅¬λ₯Ό μν μ§μκΈ, λλ΄ μμ€, κ΅μ‘ νλ‘κ·Έλ¨μ΄ λ€μνκ² μ‘΄μ¬νμ§λ§, μ λ³΄κ° μ¬λ¬ κΈ°κ΄Β·μ¬μ΄νΈμ λΆμ°λμ΄ μμ΄ νλμ νμ νκΈ° μ΄λ ΅μ΅λλ€. SEOUL-Iλ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ€μ κΈ°λ₯μ μ 곡ν©λλ€.
- μμ°μ΄ μ§μμλ΅ β "κ°λ¨κ΅¬ ν€μμΌν° λͺ©λ‘ 보μ¬μ€", "첫λ§λ¨μ΄μ©κΆ μ μ² μ격 μλ €μ€" λ± μΌμμ μΈ λ¬Έμ₯μΌλ‘ μ§λ¬Έ
- RAG κΈ°λ° λ΅λ³ μμ± β μ¬μ μμ§λ μ μ± Β·μμ€Β·νλ‘κ·Έλ¨ λ°μ΄ν°λ₯Ό κ²μν λ€, LLMμ΄ λ§₯λ½μ μ°Έκ³ ν΄ λ΅λ³ μμ±
- λ§μΆ€ μ μ± μλ¦Ό β νμκ°μ μ μ λ ₯ν κ°κ΅¬ μ 보(κ±°μ£Ό ꡬ, μλ μμ€, μλ μ 무 λ±)λ₯Ό κΈ°λ°μΌλ‘ ν΄λΉλλ μ μ± μ μλ¦Ό
- νΌλλ°± μμ§ β λ΅λ³μ λν μ’μμ/μ«μ΄μ νΌλλ°±μ μμ§νμ¬ μλΉμ€ νμ§ κ°μ μ νμ©
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μ¬μ©μ (λΈλΌμ°μ ) β
β React SPA ββ SEOUL-I νλ‘ νΈμλ β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ¬βββββββββββββββββββ
β REST API (POST /question) β REST API (POST /feedback)
βΌ βΌ
ββββββββββββββββββββββββββββ βββββββββββββββββββββββββββββββ
β API Gateway (AWS) β β Feedback Lambda (μ ν) β
ββββββββββββ¬ββββββββββββββββ βββββββββββββββββββββββββββββββ
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β seoulBaby_answerGeneratorLambda (μ€μΌμ€νΈλ μ΄ν°) β
β β
β 1. μ¬μ©μ μ§λ¬Έ μμ β
β 2. seoulBaby_queryInfoLambda νΈμΆ β κ΄λ ¨ μ 보 κ²μ (Retrieve) β
β 3. κ²μ κ²°κ³Ό + μ§λ¬ΈμΌλ‘ ν둬ννΈ κ΅¬μ± (Augment) β
β 4. Bedrock LLM νΈμΆ β μ΅μ’
λ΅λ³ μμ± (Generate) β
ββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Lambda Invoke
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β seoulBaby_queryInfoLambda (κ²μ μμ§) β
β β
β βββββββββββββββββββββββ β
β β LLM Router (Haiku) β μ§λ¬Έ λΆμ β λ°μ΄ν° μμ€ & κ²μ νλ κ²°μ β
β ββββββββββ¬βββββββββββββ β
β ββββΆ [μμ€ 1] Manual μ μ±
β λ²‘ν° μ μ¬λ κ²μ (Titan Embed) β
β ββββΆ [μμ€ 2] Dynamic νλ‘κ·Έλ¨ β ν€μλ + λ μ§ νν° κ²μ β
β ββββΆ [μμ€ 3] API μμ€/μ
체 β μμΉκ΅¬ + μ ν ν€μλ κ²μ β
β β
β λ°μ΄ν° μλ³Έ: Amazon S3 (seoul-baby λ²ν·) β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββ λ°μ΄ν° μμ§ (μ€νλΌμΈ / μ€μΌμ€) βββββββββββββββββββββββββββββββββββββ
β β
β seoulBaby_dataFetcher μμΈ μ΄λ¦°λ°μ΄ν°κ΄μ₯ Open API β S3 μ μ₯ β
β (곡곡 API 5μ’
) semi-dynamic/*.json β
β β
β seoulBaby-site-crawler μ λΆ ν¬νΈ 4κ³³ μΉ ν¬λ‘€λ§ β S3 μ μ₯ β
β (GitHub Actions μ€μΌμ€) dynamic_programs/*.json β
β β
β seoulBaby_manualDataProcessor μλ λΌλ²¨λ§ JSON β Titan Embed 벑ν°ν β
β (μλ νΈλ¦¬κ±°) static/*_vectors.json β S3 μ μ₯ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SEOUL-Iκ° μ¬μ©νλ λ°μ΄ν°λ κ°±μ μ£ΌκΈ°μ λ°λΌ μΈ κ³μΈ΅μΌλ‘ λλ©λλ€.
| νλͺ© | μ€λͺ |
|---|---|
| μλ³Έ | static/seoulBaby_manual_labeled_data.json β 첫λ§λ¨μ΄μ©κΆ, λΆλͺ¨κΈμ¬, μλμλΉ λ± ν΅μ¬ μ μ±
μ μ§μ ꡬ쑰ν |
| μ²λ¦¬ | seoulBaby_manualDataProcessor Lambdaκ° κ° μ μ±
νλͺ©μ κ²μμ© ν
μ€νΈλ‘ λ³ν ν Amazon Titan Embed Text v2λ‘ λ²‘ν°ν |
| κ²°κ³Ό | static/seoulBaby_manual_labeled_vectors.json β λ²‘ν° + μλ³Έ λ°μ΄ν° μ |
| κ²μ λ°©μ | μ½μ¬μΈ μ μ¬λ κΈ°λ° λ²‘ν° κ²μ + μμ μ£ΌκΈ°/μμΉκ΅¬/μ μ± μ ν κ°μ€μΉ |
| νλͺ© | μ€λͺ |
|---|---|
| μμ§κΈ° | seoulBaby_dataFetcher Lambda |
| λ°μ΄ν° μμ€ (5μ’ ) | λͺ½λ
μ 보 λ§λ₯ν€ (VwSmpBizInfo), λ€λ₯μ΄ ν볡카λ νλ ₯μ
체 (InfoHappycard), μ°λ¦¬λλ€ ν€μμΌν° (TnFcltySttusInfo1001), μ§μμλμΌν° (TnFcltySttusInfo1003), μμΈν ν€μ¦μΉ΄ν (tnFcltySttusInfo1011) |
| κ²°κ³Ό | semi-dynamic/*.json β μ μ λ μμ€/μ
체 λͺ©λ‘ |
| κ²μ λ°©μ | μμΉκ΅¬(gu) νν° + μμ€μ ν(facility_type) ν€μλ λ§€μΉ |
| νλͺ© | μ€λͺ |
|---|---|
| μμ§κΈ° | seoulBaby-site-crawler β GitHub Actionsλ‘ μ£ΌκΈ°μ μ€ν |
| ν¬λ‘€λ§ λμ (4κ³³) | μμΈ μμ μΆμ° μ 보μΌν° 보건μ κ΅μ‘, μμΈ μμ μΆμ° μ 보μΌν° 곡μ§μ¬ν, μμ΄μ¬λ μΆμ°μ§μκΈ, μμΈ λ§μΌμ΄ 곡μ§μ¬ν |
| κ²°κ³Ό | dynamic_programs/*.json β μ΅μ λͺ¨μ§ κ³΅κ³ Β·κ³΅μ§μ¬ν |
| κ²μ λ°©μ | ν€μλ λ§€μΉ + λ μ§ νν°(μ§λ κ³΅κ³ μ μΈ) + μμ μ£ΌκΈ° λ§€μΉ |
seoul-baby/
βββ static/
β βββ seoulBaby_manual_labeled_data.json β μλ λΌλ²¨λ§ μλ³Έ
β βββ seoulBaby_manual_labeled_vectors.json β 벑ν°ν κ²°κ³Ό
βββ semi-dynamic/
β βββ all_programs_info.json β λͺ½λ
μ 보 λ§λ₯ν€
β βββ happy_card_vendors.json β λ€λ₯μ΄ ν볡카λ νλ ₯μ
체
β βββ kium_centers.json β μ°λ¦¬λλ€ ν€μμΌν°
β βββ community_child_centers.json β μ§μμλμΌν°
β βββ seoul_kids_cafes.json β μμΈν ν€μ¦μΉ΄ν
βββ dynamic_programs/
βββ seoul_agi_education.json β 보건μ κ΅μ‘ 곡κ³
βββ seoul_agi_notices.json β μμ μΆμ° μ 보μΌν° 곡μ§
βββ childcare_support_fund.json β μΆμ°μ§μκΈ μμ
βββ seoul_momcare_notices.json β λ§μΌμ΄ 곡μ§μ¬ν
λ°±μλλ 4κ°μ AWS Lambda ν¨μλ‘ κ΅¬μ±λλ©°, μ΄ λ¦¬ν¬μ§ν 리μλ ν¬ν¨λμ΄ μμ§ μμ΅λλ€.
API Gatewayλ‘λΆν° μ¬μ©μ μ§λ¬Έμ λ°μ μ 체 RAG νλ‘μΈμ€λ₯Ό μ΄κ΄ν©λλ€.
- Retrieve β
seoulBaby_queryInfoLambdaλ₯Ό λκΈ° νΈμΆνμ¬ κ΄λ ¨ μ 보 κ²μ - Augment β κ²μ κ²°κ³Όμ μ¬μ©μ μ§λ¬Έμ κ²°ν©νμ¬ 'μμΈλ§λΉμ' νλ₯΄μλ ν둬ννΈ κ΅¬μ±
- Generate β Amazon Bedrockμ Claude λͺ¨λΈμ νΈμΆνμ¬ μ΅μ’ λ΅λ³ μμ±
λͺ¨λΈ νΈμΆ μ μμ μ±μ μν΄ λ©ν°-리μ , λ©ν°-λͺ¨λΈ Fallback μ λ΅μ μ¬μ©ν©λλ€.
μ°μ μμ: Claude 3.5 Haiku (us-east-1, us-west-2)
β Claude 3 Haiku (ap-southeast-2)
β Claude 3 Sonnet (ap-southeast-2, us-east-1, us-west-2)
μ¬μ©μ μ§λ¬Έμ λΆμνμ¬ κ°μ₯ μ ν©ν λ°μ΄ν° μμ€λ₯Ό μ ννκ³ κ²μμ μνν©λλ€.
μ§λ¬Έ λΌμ°ν (LLM Router)
Claude Haikuμκ² μ§λ¬Έμ λ³΄λ΄ λ€μμ νλ¨ν©λλ€.
| μμ€ | λμ λ°μ΄ν° | μμ μ§λ¬Έ |
|---|---|---|
| 0 (off-topic) | - | "μλ νμΈμ", "μ€λ λ μ¨ μ΄λ?" |
| 1 (manual) | ν΅μ¬ μ μ± Β·μ§μκΈ (λ²‘ν° κ²μ) | "첫λ§λ¨μ΄μ©κΆ μ μ² μ격", "λΆλͺ¨κΈμ¬ μΌλ§?" |
| 2 (program) | μ€μκ° λͺ¨μ§ κ³΅κ³ (ν€μλ κ²μ) | "μ§κΈ μ μ² κ°λ₯ν λΆλͺ¨ κ΅μ‘", "μ΅μ 곡μ§" |
| 3 (api) | μμ€Β·μ 체 λͺ©λ‘ (ν€μλ κ²μ) | "κ΄μ ꡬ ν€μμΌν° λͺ©λ‘", "λ€λ₯μ΄ μΉ΄λ μλΉ" |
LLM λΌμ°ν μ€ν¨ μ, ν€μλ κΈ°λ° Fallback λ‘μ§μ΄ λμν©λλ€.
κ²μ μκ³ λ¦¬μ¦
- Manual (λ²‘ν° κ²μ): μ§λ¬Έμ Titan Embedλ‘ λ²‘ν°ν β λͺ¨λ μ μ± λ²‘ν°μ μ½μ¬μΈ μ μ¬λ κ³μ° β μμ μ£ΌκΈ°Β·μμΉκ΅¬Β·μ μ± μ ν κ°μ€μΉ μ μ© β μμ 5건 λ°ν
- Dynamic (ν€μλ κ²μ): ν€μλ λ§€μΉ(20μ ) + μμ μ£ΌκΈ° λ§€μΉ(15μ ) + λͺ¨μ§ μν 보λμ€(10μ ) + λ μ§ κ·Όμ μ± λ³΄λμ€(8μ ) β μ μμ μμ 10건
- API (ν€μλ κ²μ): μμΉκ΅¬ νν°(νμ, 50μ ) + μμ€μ ν λ§€μΉ(30μ ) β μ μμ μμ 15건
μμΈ μ΄λ¦°λ°μ΄ν°κ΄μ₯ Open API 5μ’
μ νΈμΆνμ¬ λ°μ΄ν°λ₯Ό μ μ ν S3μ μ μ₯ν©λλ€.
κ° APIλ³ μ μ© νμ²λ¦¬ ν¨μκ° μλ³Έ λ°μ΄ν°λ₯Ό νμ€ κ΅¬μ‘°λ‘ λ³νν©λλ€.
μλ λΌλ²¨λ§λ μ μ± JSONμ μ½μ΄ κ° νλͺ©μ κ²μμ© ν μ€νΈλ‘ λ³νν λ€, Amazon Titan Embed Text v2λ‘ λ²‘ν°ννμ¬ S3μ μ μ₯ν©λλ€.
μ΄ λ¦¬ν¬μ§ν 리μ μ½λλ React κΈ°λ° SPA(Single Page Application)μ λλ€.
| κΈ°λ₯ | μ€λͺ |
|---|---|
| μ€νλμ νλ©΄ | μ± μ§μ μ 3.2μ΄κ° λ‘κ³ λ° λ‘λ© μ λλ©μ΄μ νμ |
| λλ© νμ΄μ§ | ν΅μ€ννΈ λ²νΌ(μΆμ° μ€λΉ, μ°λͺ¨μ μμ 건κ°κ΄λ¦¬), μμ£Ό 묻λ μ§λ¬Έ(FAQ) λͺ¨λ¬ |
| μ±ν μΈν°νμ΄μ€ | μ¬μ©μ μ§λ¬Έ μ λ ₯ β νμ΄ν μΈλμΌμ΄ν° β AI λ΅λ³ νμ, λ΅λ³ λ΄ URL μλ λ§ν¬ λ³ν |
| νμκ°μ /λ‘κ·ΈμΈ | κ°κ΅¬ μ 보(κ±°μ£Ό ꡬ, μλ, μλ , μμ μ¬λΆ λ±) μ λ ₯ β λ§μΆ€ μ μ± μλ¦Όμ νμ© |
| λ§μΆ€ μ μ± μλ¦Ό | public/data/policies.csv κΈ°λ°μΌλ‘ λ‘κ·ΈμΈ μ¬μ©μμ 쑰건μ λ§€μΉλλ μ μ±
μ μλ¦Ό 벨μ νμ |
| νΌλλ°± | κ° λ΄ λ΅λ³μ π/π λ²νΌ β νΌλλ°± Lambdaλ‘ μ μ‘ |
| μ¬μ΄λλ° | μ±ν κΈ°λ‘, κ΄λ ¨ ν¬νΈ μ¬μ΄νΈ λ°λ‘κ°κΈ°, κ°μΈμ 보 μ²λ¦¬ λ°©μΉ¨ |
| 1:1 λ¬Έμ | νλ‘ν λ²νΌ β μ΄λ¦/μ΄λ©μΌ/λ©μμ§ μ λ ₯ ν μ μ‘ |
2025-CSC4019-03-captAIn/
βββ public/
β βββ data/
β β βββ policies.csv β λ§μΆ€ μλ¦Όμ© μ μ±
CSV
β βββ images/ β λ‘κ³ , μμ΄μ½ λ± μ μ μ΄λ―Έμ§
βββ src/
β βββ App.js β λ©μΈ μ»΄ν¬λνΈ (μ±ν
, μΈμ¦, μλ¦Ό λ±)
β βββ App.css β μ 체 μ€νμΌ
β βββ PrivacyPolicyModal.js β κ°μΈμ 보 μ²λ¦¬ λ°©μΉ¨ λͺ¨λ¬
β βββ components/
β β βββ interactive/
β β βββ FAQList.js β μμ£Ό 묻λ μ§λ¬Έ 그리λ μ»΄ν¬λνΈ
β βββ index.js
β βββ index.css
βββ package.json
βββ README.md
| λ³μλͺ | μ€λͺ |
|---|---|
REACT_APP_API_ENDPOINT |
answerGeneratorLambdaμ API Gateway URL |
REACT_APP_FEEDBACK_ENDPOINT |
νΌλλ°± μμ§ Lambdaμ API Gateway URL |
λ―Έμ€μ μ νλ‘ νΈμλ λ΄μ₯ λ°λͺ¨ μλ΅(DEMO_RESPONSES)μ΄ λ°νλ©λλ€.
| 리ν¬μ§ν 리 | μ€λͺ |
|---|---|
| 2025-CSC4019-03-captAIn | νλ‘ νΈμλ (λ³Έ 리ν¬μ§ν 리) |
| seoulBaby-site-crawler | μΉ ν¬λ‘€λ¬ β μμΈ μμ μΆμ° μ 보μΌν°, μμ΄μ¬λ, λ§μΌμ΄ λ± 4κ° μ¬μ΄νΈ ν¬λ‘€λ§, GitHub Actionsλ‘ μ£ΌκΈ°μ μ€ν ν S3 μ λ‘λ |
λ°±μλ Lambda ν¨μ 4μ’ (answerGenerator, queryInfo, dataFetcher, manualDataProcessor)μ AWS μ½μμμ μ§μ κ΄λ¦¬λλ©°, λ³λ 리ν¬μ§ν 리μ ν¬ν¨λμ΄ μμ§ μμ΅λλ€.
# ν΄λ‘
git clone https://github.com/CSID-DGU/2025-CSC4019-03-captAIn.git
cd 2025-CSC4019-03-captAIn
# μμ‘΄μ± μ€μΉ
npm install
# (μ ν) νκ²½ λ³μ μ€μ β μμΌλ©΄ λ°λͺ¨ λͺ¨λλ‘ λμ
# .env νμΌ μμ±
echo "REACT_APP_API_ENDPOINT=https://your-api-gateway-url/prod" > .env
echo "REACT_APP_FEEDBACK_ENDPOINT=https://your-feedback-url/prod" >> .env
# κ°λ° μλ² μ€ν
npm startREACT_APP_API_ENDPOINTλ₯Ό μ€μ νμ§ μμΌλ©΄, ν΅μ€ννΈ λ²νΌ λ° FAQμ νν΄ νλ‘ νΈμλ λ΄μ₯ λ°λͺ¨ λ΅λ³μ΄ νμλ©λλ€.
| κ³μΈ΅ | κΈ°μ |
|---|---|
| νλ‘ νΈμλ | React, CSS (λ°μν), Create React App |
| λ°±μλ | AWS Lambda (Python 3.x), API Gateway |
| AI / LLM | Amazon Bedrock β Claude 3.5 Haiku, Claude 3 Sonnet (λ΅λ³ μμ± & λΌμ°ν ) |
| μλ² λ© | Amazon Titan Embed Text v2 (λ²‘ν° κ²μ) |
| μ€ν λ¦¬μ§ | Amazon S3 |
| λ°μ΄ν° μμ§ | μμΈ μ΄λ¦°λ°μ΄ν°κ΄μ₯ Open API, Python μΉ ν¬λ‘€λ¬ (GitHub Actions) |
| λ§μΆ€ μλ¦Ό | CSV κΈ°λ° νλ‘ νΈμλ νν°λ§ |