Skip to content

hongdaestreet/Persona-ChatBot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

45 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

μœ μž¬μ„ AI 챗봇 FastAPI μ„œλ²„

ChromaDB + LangChain RAG 기반 μœ μž¬μ„ AI 챗봇 μ„œλΉ„μŠ€

πŸ“‹ λͺ©μ°¨

🎯 ν”„λ‘œμ νŠΈ κ°œμš”

이 ν”„λ‘œμ νŠΈλŠ” μœ μž¬μ„μ˜ 성격과 말투λ₯Ό λͺ¨λ°©ν•œ AI 챗봇 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€. ChromaDBλ₯Ό 벑터 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ‚¬μš©ν•˜κ³ , LangChain RAG(Retrieval-Augmented Generation) λ°©μ‹μœΌλ‘œ κ΅¬ν˜„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•

  • FastAPI: κ³ μ„±λŠ₯ μ›Ή API ν”„λ ˆμž„μ›Œν¬
  • ChromaDB: 둜컬 벑터 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μœ μž¬μ„ κ΄€λ ¨ 지식 μ €μž₯
  • LangChain RAG: 검색 증강 μƒμ„±μœΌλ‘œ μ •ν™•ν•œ λ‹΅λ³€ 제곡
  • Upstage Solar API: ν•œκ΅­μ–΄ νŠΉν™” LLM 및 μž„λ² λ”© λͺ¨λΈ μ‚¬μš©
  • μœ μž¬μ„ 페λ₯΄μ†Œλ‚˜: μΉœκ·Όν•˜κ³  μœ λ¨ΈλŸ¬μŠ€ν•œ κ΅­λ―ΌMC μŠ€νƒ€μΌ

기술 μŠ€νƒ

  • Backend: FastAPI, Python 3.11
  • Vector DB: ChromaDB (둜컬 μ €μž₯)
  • AI Models: Upstage Solar Pro (LLM), Solar Embedding (μž„λ² λ”©)
  • Framework: LangChain
  • Deployment: AWS EC2 (κ³„νš)

⚠️ μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­

Python 버전 μ œν•œ

μ€‘μš”: langchain_upstage와 langchain_chroma νŒ¨ν‚€μ§€λŠ” Python 3.13.xμ—μ„œ ν˜Έν™˜μ„± λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

λ°˜λ“œμ‹œ Python 3.11 버전을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ΅œμ†Œ μš”κ΅¬μ‚¬ν•­

  • Python: 3.11.x (ν•„μˆ˜)
  • λ©”λͺ¨λ¦¬: μ΅œμ†Œ 4GB RAM
  • μ €μž₯곡간: μ΅œμ†Œ 2GB (ChromaDB 포함)
  • λ„€νŠΈμ›Œν¬: Upstage API 접근을 μœ„ν•œ 인터넷 μ—°κ²°

πŸ› οΈ ν™˜κ²½ μ„€μ •

1. Python 3.11 κ°€μƒν™˜κ²½ 생성

# 1. venv311μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ κ°€μƒν™˜κ²½ 생성
py -3.11 -m venv venv311

# 2. κ°€μƒν™˜κ²½ ν™œμ„±ν™”
.\venv311\Scripts\activate

# 3. pip μ—…κ·Έλ ˆμ΄λ“œ 및 μ˜μ‘΄μ„± μ„€μΉ˜
pip install --upgrade pip
pip install -r requirements.txt

2. ν™˜κ²½λ³€μˆ˜ μ„€μ •

.env νŒŒμΌμ„ μƒμ„±ν•˜κ³  λ‹€μŒ λ‚΄μš©μ„ μΆ”κ°€:

# Upstage API ν‚€ (ν•„μˆ˜)
UPSTAGE_API_KEY=your_upstage_api_key_here

# ChromaDB μ„€μ •
CHROMA_PERSIST_DIR=./chroma_db

# FastAPI μ„œλ²„ μ„€μ •
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=info

# ν™˜κ²½ μ„€μ •
ENVIRONMENT=development

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

backend/
β”œβ”€β”€ πŸ“„ main.py              # FastAPI 메인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜
β”œβ”€β”€ πŸ“„ chatbot.py           # μœ μž¬μ„ RAG 챗봇 클래슀
β”œβ”€β”€ πŸ“„ run.py              # μ„œλ²„ μ‹€ν–‰ 슀크립트
β”œβ”€β”€ πŸ“„ test_chatbot.py     # 챗봇 단독 ν…ŒμŠ€νŠΈ 슀크립트
β”œβ”€β”€ πŸ“„ requirements.txt     # Python μ˜μ‘΄μ„± νŒ¨ν‚€μ§€
β”œβ”€β”€ πŸ“„ .env                # ν™˜κ²½λ³€μˆ˜ μ„€μ • 파일
β”œβ”€β”€ πŸ“„ README.md           # ν”„λ‘œμ νŠΈ λ¬Έμ„œ (이 파일)
β”œβ”€β”€ πŸ“„ Dockerfile          # Docker μ»¨ν…Œμ΄λ„ˆ μ„€μ •
β”œβ”€β”€ πŸ“ chroma_db/          # ChromaDB 벑터 λ°μ΄ν„°λ² μ΄μŠ€ (νŒ€μ› 제곡 μ˜ˆμ •)
β”œβ”€β”€ πŸ“ venv311/            # Python 3.11 κ°€μƒν™˜κ²½
β”œβ”€β”€ πŸ“ .git/               # Git 버전 관리
β”œβ”€β”€ πŸ“ .github/            # GitHub Actions μ›Œν¬ν”Œλ‘œμš°
β”œβ”€β”€ πŸ“ events/             # ν…ŒμŠ€νŠΈμš© 이벀트 파일
β”œβ”€β”€ πŸ“ tests/              # λ‹¨μœ„ ν…ŒμŠ€νŠΈ νŒŒμΌλ“€
└── πŸ“ __pycache__/        # Python μΊμ‹œ 파일

πŸ”§ 핡심 μ»΄ν¬λ„ŒνŠΈ

1. main.py - FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜

μ—­ν• : μ›Ή API μ„œλ²„μ˜ μ§„μž…μ 

μ£Όμš” κΈ°λŠ₯:

  • FastAPI μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ • 및 CORS 처리
  • 생λͺ…μ£ΌκΈ° 관리 (lifespan 이벀트)
  • API μ—”λ“œν¬μΈνŠΈ μ •μ˜ (/answer, /health, /)
  • μš”μ²­/응닡 λͺ¨λΈ μ •μ˜ (Pydantic)
  • μ˜ˆμ™Έ 처리 및 λ‘œκΉ…

핡심 클래슀:

  • ChatRequest: μ‚¬μš©μž μš”μ²­ λͺ¨λΈ
  • ChatResponse: 챗봇 응닡 λͺ¨λΈ
  • HealthResponse: ν—¬μŠ€μ²΄ν¬ 응닡 λͺ¨λΈ

2. chatbot.py - RAG 챗봇 클래슀

μ—­ν• : μœ μž¬μ„ AI μ±—λ΄‡μ˜ 핡심 둜직

μ£Όμš” κΈ°λŠ₯:

  • Upstage Solar API 연동 (LLM + μž„λ² λ”©)
  • ChromaDB 벑터 λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²°
  • LangChain RAG νŒŒμ΄ν”„λΌμΈ ꡬ성
  • μœ μž¬μ„ 페λ₯΄μ†Œλ‚˜ ν”„λ‘¬ν”„νŠΈ 관리
  • λ‹΅λ³€ 생성 및 ν’ˆμ§ˆ 관리

핡심 λ©”μ„œλ“œ:

  • _setup_models(): AI λͺ¨λΈ μ΄ˆκΈ°ν™”
  • _load_chromadb(): 벑터 DB λ‘œλ“œ
  • _setup_rag_chain(): RAG 체인 ꡬ성
  • get_answer(): λ‹΅λ³€ 생성
  • health_check(): μƒνƒœ 확인

3. run.py - μ„œλ²„ μ‹€ν–‰ 슀크립트

μ—­ν• : FastAPI μ„œλ²„ μ‹€ν–‰ 및 ν™˜κ²½ 관리

μ£Όμš” κΈ°λŠ₯:

  • ν™˜κ²½λ³€μˆ˜ 검증 및 μ„€μ •
  • 개발/운영 ν™˜κ²½ ꡬ뢄
  • μ„œλ²„ μ„€μ • μ΅œμ ν™”
  • AWS EC2 배포 지원

4. test_chatbot.py - ν…ŒμŠ€νŠΈ 슀크립트

μ—­ν• : 챗봇 κΈ°λŠ₯ 단독 ν…ŒμŠ€νŠΈ

μ£Όμš” κΈ°λŠ₯:

  • 챗봇 μ΄ˆκΈ°ν™” ν…ŒμŠ€νŠΈ
  • ν—¬μŠ€μ²΄ν¬ 검증
  • λŒ€ν™” κΈ°λŠ₯ ν…ŒμŠ€νŠΈ
  • λŒ€ν™”ν˜• ν…ŒμŠ€νŠΈ λͺ¨λ“œ

πŸ“‘ API λͺ…μ„Έμ„œ

Base URL

http://localhost:8000

μ—”λ“œν¬μΈνŠΈ

1. 루트 정보 쑰회

GET /

응닡 μ˜ˆμ‹œ:

{
  "service": "μœ μž¬μ„ AI 챗봇",
  "version": "1.0.0",
  "description": "ChromaDB + LangChain RAG 기반",
  "endpoints": {
    "POST /answer": "챗봇과 λŒ€ν™”",
    "GET /health": "μ„œλΉ„μŠ€ μƒνƒœ 확인"
  },
  "example": {
    "request": {"prompt": "μ•ˆλ…•ν•˜μ„Έμš”!"},
    "response": {"answer": "μ•ˆλ…•ν•˜μ„Έμš”! μœ μž¬μ„μž…λ‹ˆλ‹€! ν•˜ν•˜ν•˜!"}
  }
}

2. 챗봇 λŒ€ν™”

POST /answer
Content-Type: application/json

μš”μ²­ λ³Έλ¬Έ:

{
  "prompt": "μœ μž¬μ„λ‹˜μ˜ λŒ€ν‘œ ν”„λ‘œκ·Έλž¨μ€ λ­μ˜ˆμš”?"
}

응닡 λ³Έλ¬Έ:

{
  "answer": "μ•„! 제 λŒ€ν‘œ ν”„λ‘œκ·Έλž¨μ΄λΌκ³  ν•˜λ©΄ λ¬΄ν•œλ„μ „κ³Ό λŸ°λ‹λ§¨μ΄ 있죠! λ¬΄ν•œλ„μ „μ€ 2006λ…„λΆ€ν„° 2018λ…„κΉŒμ§€ 정말 즐겁게 ν–ˆκ³ , λŸ°λ‹λ§¨μ€ 2010λ…„λΆ€ν„° μ§€κΈˆκΉŒμ§€ κ³„μ†ν•˜κ³  μžˆμ–΄μš”! ν•˜ν•˜ν•˜!"
}

였λ₯˜ 응닡:

// 400 Bad Request - 빈 ν”„λ‘¬ν”„νŠΈ
{
  "detail": "빈 λ©”μ‹œμ§€λŠ” 보낼 수 μ—†μŠ΅λ‹ˆλ‹€."
}

// 503 Service Unavailable - 챗봇 λ―Έμ΄ˆκΈ°ν™”
{
  "detail": "챗봇이 μ΄ˆκΈ°ν™”λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”."
}

// 500 Internal Server Error - μ„œλ²„ 였λ₯˜
{
  "detail": "λ‹΅λ³€ 생성 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”."
}

3. ν—¬μŠ€μ²΄ν¬

GET /health

응닡 μ˜ˆμ‹œ:

{
  "status": "healthy",
  "message": "μ„œλΉ„μŠ€κ°€ 정상 μž‘λ™ μ€‘μž…λ‹ˆλ‹€.",
  "vectorstore_status": "connected",
  "documents_count": 1247
}

HTTP μƒνƒœ μ½”λ“œ

μ½”λ“œ μ„€λͺ…
200 성곡
400 잘λͺ»λœ μš”μ²­ (빈 ν”„λ‘¬ν”„νŠΈ λ“±)
405 μ§€μ›ν•˜μ§€ μ•ŠλŠ” HTTP λ©”μ„œλ“œ
500 μ„œλ²„ λ‚΄λΆ€ 였λ₯˜
503 μ„œλΉ„μŠ€ μ‚¬μš© λΆˆκ°€ (챗봇 λ―Έμ΄ˆκΈ°ν™”)

πŸ”— LangChain ꡬ쑰

RAG νŒŒμ΄ν”„λΌμΈ ꡬ성

graph LR
    A[μ‚¬μš©μž 질문] --> B[μž„λ² λ”© λ³€ν™˜]
    B --> C[ChromaDB 검색]
    C --> D[κ΄€λ ¨ λ¬Έμ„œ μΆ”μΆœ]
    D --> E[ν”„λ‘¬ν”„νŠΈ ꡬ성]
    E --> F[Solar Pro LLM]
    F --> G[μœ μž¬μ„ λ‹΅λ³€]
Loading

핡심 μ»΄ν¬λ„ŒνŠΈ

1. μž„λ² λ”© λͺ¨λΈ

embeddings = UpstageEmbeddings(
    model="solar-embedding-1-large",
    api_key=upstage_api_key
)
  • μ—­ν• : ν…μŠ€νŠΈλ₯Ό λ²‘ν„°λ‘œ λ³€ν™˜
  • μ‚¬μš© μ‹œμ : 질문 검색 μ‹œ, 데이터 μ €μž₯ μ‹œ

2. μ–Έμ–΄ λͺ¨λΈ (LLM)

llm = ChatUpstage(
    model="solar-pro",
    api_key=upstage_api_key
)
  • μ—­ν• : μ΅œμ’… λ‹΅λ³€ 생성
  • νŠΉμ§•: ν•œκ΅­μ–΄ νŠΉν™”, λŒ€ν™” ν˜•νƒœ

3. 벑터 λ°μ΄ν„°λ² μ΄μŠ€

vectorstore = Chroma(
    client=client,
    embedding_function=embeddings,
    collection_name="yujaeseuk_knowledge"
)
  • μ—­ν• : μœ μž¬μ„ κ΄€λ ¨ 지식 μ €μž₯ 및 검색
  • 검색 μ•Œκ³ λ¦¬μ¦˜: MMR (Maximal Marginal Relevance)

4. 검색기 (Retriever)

retriever = vectorstore.as_retriever(
    search_type="mmr",
    search_kwargs={"k": 3}
)
  • μ—­ν• : 질문과 κ΄€λ ¨λœ μƒμœ„ 3개 λ¬Έμ„œ 검색
  • μ•Œκ³ λ¦¬μ¦˜: MMR (κ΄€λ ¨μ„±κ³Ό λ‹€μ–‘μ„± κ³ λ €)

5. ν”„λ‘¬ν”„νŠΈ ν…œν”Œλ¦Ώ

prompt = ChatPromptTemplate.from_messages([
    ("system", "당신은 μœ μž¬μ„μž…λ‹ˆλ‹€. 성격: 밝고 긍정적..."),
    ("human", "{question}")
])
  • μ—­ν• : μœ μž¬μ„ 페λ₯΄μ†Œλ‚˜ μ •μ˜
  • ꡬ성: μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ + μ‚¬μš©μž 질문

6. RAG 체인

rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | llm 
    | StrOutputParser()
)
  • μ—­ν• : 전체 νŒŒμ΄ν”„λΌμΈ μ—°κ²°
  • 흐름: 검색 β†’ ν”„λ‘¬ν”„νŠΈ β†’ LLM β†’ νŒŒμ‹±

βš™οΈ μž‘λ™ 원리

1. μ„œλ²„ μ‹œμž‘ κ³Όμ •

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant FastAPI as FastAPI μ„œλ²„
    participant ChatBot as YuJaeSukRAGBot
    participant Upstage as Upstage API
    participant ChromaDB as ChromaDB

    User->>FastAPI: python run.py
    FastAPI->>ChatBot: 챗봇 μ΄ˆκΈ°ν™”
    ChatBot->>Upstage: API ν‚€ 검증
    ChatBot->>ChromaDB: 벑터 DB μ—°κ²°
    ChatBot->>ChatBot: RAG 체인 ꡬ성
    ChatBot-->>FastAPI: μ΄ˆκΈ°ν™” μ™„λ£Œ
    FastAPI-->>User: μ„œλ²„ μ‹€ν–‰ μ€€λΉ„
Loading

2. λŒ€ν™” 처리 κ³Όμ •

sequenceDiagram
    participant User as μ‚¬μš©μž
    participant FastAPI as FastAPI
    participant ChatBot as 챗봇
    participant Embeddings as μž„λ² λ”© λͺ¨λΈ
    participant ChromaDB as ChromaDB
    participant LLM as Solar Pro

    User->>FastAPI: POST /answer {"prompt": "질문"}
    FastAPI->>ChatBot: get_answer("질문")
    ChatBot->>Embeddings: 질문 벑터화
    Embeddings-->>ChatBot: 질문 벑터
    ChatBot->>ChromaDB: μœ μ‚¬ λ¬Έμ„œ 검색
    ChromaDB-->>ChatBot: κ΄€λ ¨ λ¬Έμ„œ 3개
    ChatBot->>LLM: ν”„λ‘¬ν”„νŠΈ + 검색 κ²°κ³Ό
    LLM-->>ChatBot: μœ μž¬μ„ μŠ€νƒ€μΌ λ‹΅λ³€
    ChatBot-->>FastAPI: μ΅œμ’… λ‹΅λ³€
    FastAPI-->>User: {"answer": "λ‹΅λ³€"}
Loading

3. RAG νŒŒμ΄ν”„λΌμΈ 상세

Step 1: 질문 μž„λ² λ”©

# μ‚¬μš©μž 질문: "μœ μž¬μ„ ν”„λ‘œκ·Έλž¨μ€?"
question_vector = embeddings.embed_query("μœ μž¬μ„ ν”„λ‘œκ·Έλž¨μ€?")
# κ²°κ³Ό: [0.1, 0.5, -0.3, 0.8, ...]

Step 2: μœ μ‚¬λ„ 검색

# ChromaDBμ—μ„œ MMR μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 검색
similar_docs = vectorstore.similarity_search(
    query="μœ μž¬μ„ ν”„λ‘œκ·Έλž¨μ€?", 
    k=3
)
# κ²°κ³Ό: ["λ¬΄ν•œλ„μ „μ€...", "λŸ°λ‹λ§¨μ€...", "ν•΄ν”Όνˆ¬κ²Œλ”..."]

Step 3: ν”„λ‘¬ν”„νŠΈ ꡬ성

system_prompt = "당신은 μœ μž¬μ„μž…λ‹ˆλ‹€..."
context = "λ¬΄ν•œλ„μ „μ€... λŸ°λ‹λ§¨μ€... ν•΄ν”Όνˆ¬κ²Œλ”..."
user_question = "μœ μž¬μ„ ν”„λ‘œκ·Έλž¨μ€?"

final_prompt = f"{system_prompt}\n참고정보: {context}\n질문: {user_question}"

Step 4: LLM λ‹΅λ³€ 생성

response = llm.invoke(final_prompt)
# κ²°κ³Ό: "μ•„! 제 λŒ€ν‘œ ν”„λ‘œκ·Έλž¨μ΄λΌκ³  ν•˜λ©΄ λ¬΄ν•œλ„μ „κ³Ό λŸ°λ‹λ§¨μ΄ 있죠!"

4. 데이터 흐름

πŸ“ μ‚¬μš©μž μž…λ ₯
    ↓ (FastAPI 검증)
πŸ” 질문 벑터화 (Solar Embedding)
    ↓ (MMR 검색)
πŸ“š ChromaDB λ¬Έμ„œ 검색
    ↓ (μ»¨ν…μŠ€νŠΈ ꡬ성)
🎭 μœ μž¬μ„ ν”„λ‘¬ν”„νŠΈ + 검색 κ²°κ³Ό
    ↓ (Solar Pro LLM)
πŸ’¬ μœ μž¬μ„ μŠ€νƒ€μΌ λ‹΅λ³€ 생성
    ↓ (FastAPI 응닡)
βœ… JSON ν˜•νƒœλ‘œ λ°˜ν™˜

πŸš€ μ„€μΉ˜ 및 μ‹€ν–‰

1. κΈ°λ³Έ μ„€μ •

# ν”„λ‘œμ νŠΈ 클둠
git clone <repository-url>
cd backend

# Python 3.11 κ°€μƒν™˜κ²½ 생성
py -3.11 -m venv venv311

# κ°€μƒν™˜κ²½ ν™œμ„±ν™”
.\venv311\Scripts\activate

# μ˜μ‘΄μ„± μ„€μΉ˜
pip install --upgrade pip
pip install -r requirements.txt

2. ν™˜κ²½λ³€μˆ˜ μ„€μ •

.env 파일 생성:

UPSTAGE_API_KEY=your_api_key_here
CHROMA_PERSIST_DIR=./chroma_db
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=info
ENVIRONMENT=development

3. ChromaDB 데이터 μ€€λΉ„

ν˜„μž¬ 상황: νŒ€μ›μœΌλ‘œλΆ€ν„° chroma_db/ 폴더λ₯Ό λ°›μ•„μ•Ό 함

# νŒ€μ›μœΌλ‘œλΆ€ν„° 받은 chroma_db/ 폴더λ₯Ό ν”„λ‘œμ νŠΈ λ£¨νŠΈμ— 배치
# 폴더 ꡬ쑰:
# backend/
# β”œβ”€β”€ chroma_db/
# β”‚   β”œβ”€β”€ chroma.sqlite3
# β”‚   β”œβ”€β”€ [collection-id]/
# β”‚   └── ...

4. μ„œλ²„ μ‹€ν–‰

# μ„œλ²„ μ‹œμž‘ μ „ λ°˜λ“œμ‹œ 데이터 μž„λ² λ”© ν•„μš”
python setup_data.py

# 방법 1: run.py μ‚¬μš© (ꢌμž₯)
python run.py

# 방법 2: uvicorn 직접 μ‚¬μš©
uvicorn main:app --reload --host 0.0.0.0 --port 8000

# 방법 3: main.py 직접 μ‹€ν–‰
python main.py

πŸ§ͺ ν…ŒμŠ€νŠΈ

1. 챗봇 단독 ν…ŒμŠ€νŠΈ

# κΈ°λ³Έ ν…ŒμŠ€νŠΈ μ‹€ν–‰
python test_chatbot.py

ν…ŒμŠ€νŠΈ λ‚΄μš©:

  • 챗봇 μž„ν¬νŠΈ 및 μ΄ˆκΈ°ν™”
  • ν—¬μŠ€μ²΄ν¬ 검증
  • 5개 질문 λŒ€ν™” ν…ŒμŠ€νŠΈ
  • λŒ€ν™”ν˜• ν…ŒμŠ€νŠΈ λͺ¨λ“œ

2. API ν…ŒμŠ€νŠΈ

# μ„œλ²„ μ‹€ν–‰ ν›„ λ‹€λ₯Έ ν„°λ―Έλ„μ—μ„œ
curl -X POST "http://localhost:8000/answer" \
     -H "Content-Type: application/json" \
     -d '{"prompt":"μ•ˆλ…•ν•˜μ„Έμš”!"}'

3. μ›Ή λΈŒλΌμš°μ € ν…ŒμŠ€νŠΈ

μ„œλ²„ μ‹€ν–‰ ν›„ λΈŒλΌμš°μ €μ—μ„œ 접속:

4. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€

ν…ŒμŠ€νŠΈ μž…λ ₯ κΈ°λŒ€ κ²°κ³Ό
κΈ°λ³Έ 인사 "μ•ˆλ…•ν•˜μ„Έμš”!" μœ μž¬μ„ μŠ€νƒ€μΌ 인사
ν”„λ‘œκ·Έλž¨ 질문 "λŒ€ν‘œ ν”„λ‘œκ·Έλž¨μ€?" λ¬΄ν•œλ„μ „, λŸ°λ‹λ§¨ μ–ΈκΈ‰
성격 질문 "μ–΄λ–€ μ„±κ²©μ΄μ„Έμš”?" 밝고 긍정적 λ“± μ–ΈκΈ‰
빈 μž…λ ₯ "" 400 μ—λŸ¬
잘λͺ»λœ ν˜•μ‹ 잘λͺ»λœ JSON 400 μ—λŸ¬

🌐 배포

AWS EC2 배포

1. EC2 μΈμŠ€ν„΄μŠ€ μ„€μ •

  • AMI: Ubuntu 22.04 LTS
  • μΈμŠ€ν„΄μŠ€ νƒ€μž…: t3.medium (μ΅œμ†Œ t3.small)
  • λ³΄μ•ˆκ·Έλ£Ή: 22(SSH), 8000(FastAPI) 포트 μ˜€ν”ˆ

2. μ„œλ²„ μ„€μ •

# μ‹œμŠ€ν…œ μ—…λ°μ΄νŠΈ
sudo apt update && sudo apt upgrade -y

# Python 3.11 μ„€μΉ˜
sudo apt install python3.11 python3.11-venv python3-pip -y

# ν”„λ‘œμ νŠΈ 배포
git clone <repository>
cd backend

# κ°€μƒν™˜κ²½ μ„€μ •
python3.11 -m venv venv311
source venv311/bin/activate
pip install -r requirements.txt

3. ν™˜κ²½λ³€μˆ˜ μ„€μ •

# .env 파일 생성
nano .env
# UPSTAGE_API_KEY λ“± μ„€μ •

4. μ„œλΉ„μŠ€ 등둝

# systemd μ„œλΉ„μŠ€ 파일 생성
sudo nano /etc/systemd/system/yujaeseuk-chatbot.service

# μ„œλΉ„μŠ€ λ‚΄μš©:
[Unit]
Description=YuJaeSuk AI Chatbot
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/backend
Environment=PATH=/home/ubuntu/backend/venv311/bin
ExecStart=/home/ubuntu/backend/venv311/bin/python run.py
Restart=always

[Install]
WantedBy=multi-user.target

# μ„œλΉ„μŠ€ 등둝 및 μ‹œμž‘
sudo systemctl daemon-reload
sudo systemctl enable yujaeseuk-chatbot
sudo systemctl start yujaeseuk-chatbot

5. 접속 확인

# μ„œλΉ„μŠ€ μƒνƒœ 확인
sudo systemctl status yujaeseuk-chatbot

# λΈŒλΌμš°μ €μ—μ„œ 접속
http://<EC2-PUBLIC-IP>:8000

πŸ”§ 문제 ν•΄κ²°

자주 λ°œμƒν•˜λŠ” 였λ₯˜

1. Python 버전 문제

# 였λ₯˜: langchain_upstage import μ‹€νŒ¨
❌ ImportError: cannot import name 'UpstageEmbeddings'

# ν•΄κ²°: Python 3.11 μ‚¬μš© 확인
python --version  # Python 3.11.x μ—¬μ•Ό 함

2. ChromaDB μ—°κ²° 였λ₯˜

# 였λ₯˜: ChromaDB 디렉토리 μ—†μŒ
❌ FileNotFoundError: ChromaDB 디렉토리가 μ—†μŠ΅λ‹ˆλ‹€

# ν•΄κ²°: νŒ€μ›μœΌλ‘œλΆ€ν„° chroma_db/ 폴더 λ°›κΈ°
# λ˜λŠ” μž„μ‹œ 더미 데이터 생성

3. API ν‚€ 였λ₯˜

# 였λ₯˜: API ν‚€ μ—†μŒ
❌ ValueError: UPSTAGE_API_KEYκ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€

# ν•΄κ²°: .env 파일 확인
cat .env | grep UPSTAGE_API_KEY

4. 포트 좩돌

# 였λ₯˜: 포트 8000 이미 μ‚¬μš© 쀑
❌ OSError: [Errno 98] Address already in use

# ν•΄κ²°: λ‹€λ₯Έ 포트 μ‚¬μš© λ˜λŠ” κΈ°μ‘΄ ν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ
lsof -ti:8000 | xargs kill -9

5. λ©”λͺ¨λ¦¬ λΆ€μ‘±

# 였λ₯˜: ChromaDB λ‘œλ”© 쀑 λ©”λͺ¨λ¦¬ λΆ€μ‘±
❌ MemoryError

# ν•΄κ²°: 더 큰 μΈμŠ€ν„΄μŠ€ νƒ€μž… μ‚¬μš©
# λ˜λŠ” Swap λ©”λͺ¨λ¦¬ μ„€μ •

둜그 확인

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그
tail -f app.log

# systemd μ„œλΉ„μŠ€ 둜그
sudo journalctl -u yujaeseuk-chatbot -f

# FastAPI 개발 μ„œλ²„ 둜그
python run.py  # μ½˜μ†”μ— 직접 좜λ ₯

μ„±λŠ₯ μ΅œμ ν™”

1. ChromaDB μ΅œμ ν™”

  • μ μ ˆν•œ chunk_size μ„€μ • (ν˜„μž¬: 1000)
  • MMR μ•Œκ³ λ¦¬μ¦˜μ˜ k κ°’ μ‘°μ • (ν˜„μž¬: 3)

2. μ„œλ²„ μ΅œμ ν™”

  • 운영 ν™˜κ²½μ—μ„œ λ©€ν‹°μ›Œμ»€ μ‚¬μš©
  • μ μ ˆν•œ μΈμŠ€ν„΄μŠ€ νƒ€μž… 선택

3. 응닡 μ‹œκ°„ κ°œμ„ 

  • ν”„λ‘¬ν”„νŠΈ 길이 μ΅œμ ν™”
  • 캐싱 μ „λž΅ κ³ λ €

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages