financial-rag-chatbot / USAGE_GUIDE.md
Claude
Add complete Financial RAG system with Metacognitive Agent
f6b05db unverified

A newer version of the Gradio SDK is available: 6.13.0

Upgrade

๐Ÿ“– ์‚ฌ์šฉ ๊ฐ€์ด๋“œ (ํ•œ๊ตญ์–ด)

๋ชฉ์ฐจ

  1. ์„ค์น˜
  2. PDF ์ธ๋ฑ์‹ฑ
  3. API ์„œ๋ฒ„ ์‹คํ–‰
  4. ์งˆ๋ฌธํ•˜๊ธฐ
  5. ๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ•
  6. ๋ฌธ์ œ ํ•ด๊ฒฐ

1. ์„ค์น˜

1-1. Python ํ™˜๊ฒฝ ํ™•์ธ

python --version  # 3.8 ์ด์ƒ ํ•„์š”

1-2. ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ
python -m venv venv

# ํ™œ์„ฑํ™” (๋งฅ/๋ฆฌ๋ˆ…์Šค)
source venv/bin/activate

# ํ™œ์„ฑํ™” (์œˆ๋„์šฐ)
venv\Scripts\activate

1-3. ์˜์กด์„ฑ ์„ค์น˜

pip install -r requirements.txt

์„ค์น˜๋˜๋Š” ์ฃผ์š” ํŒจํ‚ค์ง€:

  • FastAPI (์›น ์„œ๋ฒ„)
  • Anthropic (Claude API)
  • ChromaDB (๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)
  • Sentence Transformers (์ž„๋ฒ ๋”ฉ)
  • PyPDF2, pdfplumber (PDF ์ฒ˜๋ฆฌ)

2. PDF ์ธ๋ฑ์‹ฑ

2-1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

.env ํŒŒ์ผ ์ƒ์„ฑ:

cp .env.example .env

.env ํŒŒ์ผ ํŽธ์ง‘:

# ํ•„์ˆ˜: Anthropic API ํ‚ค
ANTHROPIC_API_KEY=sk-ant-api03-xxx...

# ํ•„์ˆ˜: PDF ํŒŒ์ผ ๊ฒฝ๋กœ (๋กœ์ปฌ ๋งฅ๋ถ)
PDF_SOURCE_PATH=/Users/seongjincho/Desktop/HYU-06-๊ณตํ•™๋ฐ•์‚ฌ ๋„์ „๊ธฐ/25.8.15(ํŽ€๋”๋ฉ˜ํ„ธ DB ๋ ˆํผ๋Ÿฐ์Šค)/data/

# ์„ ํƒ: ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ (๊ธฐ๋ณธ๊ฐ’ ์‚ฌ์šฉ ๊ถŒ์žฅ)
EMBEDDING_MODEL=sentence-transformers
EMBEDDING_MODEL_NAME=all-MiniLM-L6-v2

2-2. ์ธ๋ฑ์‹ฑ ์‹คํ–‰

python scripts/index_pdfs.py

์˜ˆ์ƒ ์†Œ์š” ์‹œ๊ฐ„:

  • 2,639๊ฐœ PDF ํŒŒ์ผ
  • ์•ฝ 30-60๋ถ„ (๋ฌด๋ฃŒ ๋ชจ๋ธ ์‚ฌ์šฉ ์‹œ)
  • ์ฒ˜์Œ ์‹คํ–‰ ์‹œ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ ์ถ”๊ฐ€ (~90MB)

์ง„ํ–‰ ๊ณผ์ •:

[1/4] PDF ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ค‘...
  - ์ „์ฒด ๋ฌธ์„œ: 2639๊ฐœ
  - ์ „์ฒด ํŽ˜์ด์ง€: 50000+ํŽ˜์ด์ง€

[2/4] ํ…์ŠคํŠธ ์ฒญํ‚น ์ค‘...
  - ์ „์ฒด ์ฒญํฌ: 30000+๊ฐœ

[3/4] ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ ์ค‘...
  - ์ž„๋ฒ ๋”ฉ ๊ฐœ์ˆ˜: 30000+๊ฐœ
  - ์ž„๋ฒ ๋”ฉ ์ฐจ์›: 384์ฐจ์›

[4/4] Vector DB์— ์ €์žฅ ์ค‘...
  - ์ €์žฅ ์™„๋ฃŒ!

2-3. ์ธ๋ฑ์‹ฑ ํ™•์ธ

python scripts/check_vector_db.py

3. API ์„œ๋ฒ„ ์‹คํ–‰

3-1. ์„œ๋ฒ„ ์‹œ์ž‘

uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

๋˜๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ:

python app/main.py

3-2. ์„œ๋ฒ„ ํ™•์ธ

๋ธŒ๋ผ์šฐ์ €์—์„œ:

ํ„ฐ๋ฏธ๋„์—์„œ:

curl http://localhost:8000/health

4. ์งˆ๋ฌธํ•˜๊ธฐ

4-1. ์›น UI๋กœ ์งˆ๋ฌธ (๊ฐ€์žฅ ์‰ฌ์›€)

  1. http://localhost:8000/docs ์ ‘์†
  2. POST /query ํด๋ฆญ
  3. "Try it out" ํด๋ฆญ
  4. Request body ์ž…๋ ฅ:
{
  "question": "๊ธˆ์œต์œ„๊ธฐ์˜ ์ฃผ์š” ์›์ธ์€?",
  "top_k": 5,
  "enable_metacognition": true
}
  1. "Execute" ํด๋ฆญ

4-2. ํ„ฐ๋ฏธ๋„์—์„œ ์งˆ๋ฌธ

curl -X POST http://localhost:8000/query \
  -H "Content-Type: application/json" \
  -d '{
    "question": "ํฌํŠธํด๋ฆฌ์˜ค ๋‹ค๊ฐํ™”์˜ ํšจ๊ณผ๋Š”?",
    "top_k": 5,
    "enable_metacognition": true
  }'

4-3. Python ์Šคํฌ๋ฆฝํŠธ๋กœ ์งˆ๋ฌธ

python scripts/test_query.py

๋˜๋Š” Python ์ฝ”๋“œ์—์„œ:

import requests

response = requests.post(
    "http://localhost:8000/query",
    json={
        "question": "์ค‘์•™์€ํ–‰ ๊ธˆ๋ฆฌ ์ •์ฑ…์˜ ํšจ๊ณผ๋Š”?",
        "top_k": 5,
        "enable_metacognition": True
    }
)

result = response.json()
print(result["answer"])

5. ๊ณ ๊ธ‰ ์‚ฌ์šฉ๋ฒ•

5-1. ๋ฉ”ํƒ€์ธ์ง€ ๋น„ํ™œ์„ฑํ™” (๋น ๋ฅธ ์‘๋‹ต)

{
  "question": "์งˆ๋ฌธ",
  "top_k": 5,
  "enable_metacognition": false
}

์ฐจ์ด์ :

  • ๋ฉ”ํƒ€์ธ์ง€ ํ™œ์„ฑํ™”: 10-30์ดˆ, ๊ณ ํ’ˆ์งˆ
  • ๋ฉ”ํƒ€์ธ์ง€ ๋น„ํ™œ์„ฑํ™”: 2-5์ดˆ, ์ผ๋ฐ˜ ํ’ˆ์งˆ

5-2. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ ์กฐ์ •

{
  "question": "์งˆ๋ฌธ",
  "top_k": 10,  // ๋” ๋งŽ์€ ๋ฌธ์„œ ๊ฒ€์ƒ‰
  "enable_metacognition": true
}

5-3. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง

ํŠน์ • ์ €์ž์˜ ๋…ผ๋ฌธ๋งŒ ๊ฒ€์ƒ‰:

{
  "question": "์งˆ๋ฌธ",
  "top_k": 5,
  "filter_metadata": {
    "author": "John Doe"
  }
}

5-4. ์‘๋‹ต ๊ตฌ์กฐ ์ดํ•ด

{
  "question": "์›๋ณธ ์งˆ๋ฌธ",
  "answer": "์ƒ์„ฑ๋œ ๋‹ต๋ณ€",
  "sources": [
    {
      "text": "๋ฌธ์„œ ๋‚ด์šฉ...",
      "source_filename": "paper123.pdf",
      "similarity": 0.89,
      "metadata": {
        "title": "๋…ผ๋ฌธ ์ œ๋ชฉ",
        "author": "์ €์ž"
      }
    }
  ],
  "metacognition": {
    "thinking_history": [...],
    "iterations": 2
  },
  "search_stats": {
    "documents_found": 5,
    "top_similarity": 0.89
  }
}

6. ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ฌธ์ œ 1: PDF ๊ฒฝ๋กœ ์˜ค๋ฅ˜

FileNotFoundError: Directory not found

ํ•ด๊ฒฐ:

# .env ํŒŒ์ผ์—์„œ PDF ๊ฒฝ๋กœ ํ™•์ธ
nano .env

# ๊ฒฝ๋กœ๊ฐ€ ์ •ํ™•ํ•œ์ง€ ํ™•์ธ
ls "/Users/seongjincho/Desktop/..."

๋ฌธ์ œ 2: API ํ‚ค ์˜ค๋ฅ˜

AuthenticationError: Invalid API key

ํ•ด๊ฒฐ:

# .env ํŒŒ์ผ ํ™•์ธ
nano .env

# ANTHROPIC_API_KEY๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ
# ํ‚ค๋Š” sk-ant-api03-๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•จ

๋ฌธ์ œ 3: Vector DB๊ฐ€ ๋น„์–ด์žˆ์Œ

total_documents: 0

ํ•ด๊ฒฐ:

# ์ธ๋ฑ์‹ฑ ๋จผ์ € ์‹คํ–‰
python scripts/index_pdfs.py

# ํ™•์ธ
python scripts/check_vector_db.py

๋ฌธ์ œ 4: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ

MemoryError

ํ•ด๊ฒฐ:

# scripts/index_pdfs.py ์ˆ˜์ •
# ๋ฐฐ์น˜ ํฌ๊ธฐ ์ค„์ด๊ธฐ
embeddings = embedder.embed_batch(texts, batch_size=16)  # 32 โ†’ 16

๋ฌธ์ œ 5: ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋˜์ง€ ์•Š์Œ

Address already in use

ํ•ด๊ฒฐ:

# ํฌํŠธ ๋ณ€๊ฒฝ
uvicorn app.main:app --reload --port 8001

# ๋˜๋Š” .env ํŒŒ์ผ์—์„œ
API_PORT=8001

๋ฌธ์ œ 6: ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ ์‹คํŒจ

ConnectionError

ํ•ด๊ฒฐ:

# ์ˆ˜๋™์œผ๋กœ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ
python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('all-MiniLM-L6-v2')"

๐Ÿ’ก ํŒ

์„ฑ๋Šฅ ์ตœ์ ํ™”

  1. SSD ์‚ฌ์šฉ: Vector DB๋Š” SSD์— ์ €์žฅ ๊ถŒ์žฅ
  2. ๋ฉ”๋ชจ๋ฆฌ: ์ตœ์†Œ 8GB RAM ๊ถŒ์žฅ
  3. ๋ฐฐ์น˜ ํฌ๊ธฐ: GPU ์—†์œผ๋ฉด batch_size=16-32

๋น„์šฉ ์ ˆ๊ฐ

  1. ๋ฌด๋ฃŒ ์ž„๋ฒ ๋”ฉ: Sentence Transformers ์‚ฌ์šฉ
  2. ๋ฉ”ํƒ€์ธ์ง€ ๋น„ํ™œ์„ฑํ™”: ๋น ๋ฅธ ํ…Œ์ŠคํŠธ ์‹œ

ํ’ˆ์งˆ ํ–ฅ์ƒ

  1. ๋ฉ”ํƒ€์ธ์ง€ ํ™œ์„ฑํ™”: ๊ณ ํ’ˆ์งˆ ๋‹ต๋ณ€ ํ•„์š” ์‹œ
  2. top_k ์ฆ๊ฐ€: ๋” ๋งŽ์€ ๋ฌธ์„œ ์ฐธ๊ณ 
  3. ์ฒญํฌ ํฌ๊ธฐ ์กฐ์ •: ๊ธด ๋ฌธ๋งฅ ํ•„์š” ์‹œ

๐Ÿ“ž ์ง€์›

๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด:

  1. GitHub Issues ๋“ฑ๋ก
  2. ๋กœ๊ทธ ํŒŒ์ผ ์ฒจ๋ถ€
  3. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ „์ฒด ๋ณต์‚ฌ

๋กœ๊ทธ ํ™•์ธ:

# API ์„œ๋ฒ„ ๋กœ๊ทธ๋Š” ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋จ
# ํ•„์š”์‹œ ํŒŒ์ผ๋กœ ์ €์žฅ
uvicorn app.main:app > server.log 2>&1