이 프로젝트는 사용자의 질문을 분석하여 답변을 제공하는 FastAPI 기반의 웹 애플리케이션입니다. LangGraph를 사용하여 복잡한 로직 흐름을 그래프 기반으로 제어합니다. 웹 기반 검색이 필요한 경우 TAVILY API 를 사용하여 응답하며, 필요하지 않을 경우 일반적인 LLM 응답을 합니다.
- 다국어 지원 및 동적 LLM 모델 선택
- LLM 기반의 지능형 작업 라우팅
- 웹 검색을 통한 최신 정보 반영
- LLM을 이용한 답변 품질 자동 검증 및 자체 수정 (Self-Correction)
- 다국어 지원 및 동적 모델 선택: 사용자의 질문 언어(한국어/그 외)를 감지하여, 한국어 질문에는
exaone3.5:2.4b모델을, 그 외 언어에는deepseek-r1:1.5b모델을 동적으로 선택하여 사용 - 지능형 작업 라우팅: LLM을 사용하여 질문의 의도를 파악하고, 최신 정보가 필요한 경우 '웹 검색'으로, 자체 답변이 가능한 경우 '직접 답변'으로 작업을 분기
- 웹 검색 연동: 최신 정보가 필요한 경우, Tavily 웹 검색 API를 호출하여 관련 정보를 수집합
- 답변 품질 검증 및 자체 수정: 생성된 답변이 사용자의 질문에 충분하지 않거나 부적절하다고 LLM 스스로 판단할 경우, 작업을 자동으로 다시 실행하여 더 나은 품질의 답변을 생성하려고 시도
- 확장 가능한 프로젝트 구조: 표준 FastAPI 프로젝트 구조를 채택하여 API, 서비스, 설정, 스키마 등 각 기능의 관심사를 명확하게 분리함으로써 유지보수와 확장성을 높임
- 흐름 로깅: 각 노드가 실행될 때마다 콘솔에 로그를 출력하여, 요청이 어떤 흐름으로 처리되는지 쉽게 추적할 수 있음
graph TD
A[Start] --> B(detect_language);
B --> C{router};
C -->|web_search| D[web_search];
C -->|direct_answer| E[direct_answer];
D --> F[synthesize_answer];
E --> G(verify_answer);
F --> G;
G --> H{decide_after_verification};
H -->|finish| I([End]);
H -->|retry_with_web_search| C;
detect_language:langdetect라이브러리로 사용자 질문의 언어를 감지하고 사용할 LLM 모델을 결정router: 선택된 LLM이 질문을 분석하여 웹 검색이 필요한지(web_search), 직접 답변할지(direct_answer) 결정web_search/direct_answer: 결정된 경로에 따라 웹 검색을 수행하거나 LLM이 직접 답변을 생성synthesize_answer: 웹 검색 결과를 바탕으로 LLM이 최종 답변을 종합하여 생성verify_answer: 생성된 답변을 LLM이 직접 평가하여 품질이 좋은지("good"), 나쁜지("bad") 판단decide_after_verification: 검증 결과, 답변 품질이 "good"이면 흐름을 종료합니다. 만약 "bad"이면, 흐름을 다시 **router**로 되돌려 보내 다른 방법(주로 웹 검색 강제)으로 더 나은 답변을 생성하도록 재시도
먼저, 프로젝트 루트의 .env.example 파일을 .env 파일로 복사합니다.
cp .env.example .env그 다음, 생성된 .env 파일을 열어 자신의 환경에 맞게 TAVILY_API_KEY와 OLLAMA_BASE_URL 값을 수정합니다.
- 로컬 Ollama 사용 시:
OLLAMA_BASE_URL을http://localhost:11434로 설정합니다. - 원격 Ollama 사용 시:
OLLAMA_BASE_URL을http://your-domain와 같이 실제 원격 주소로 설정합니다.
Mode 1: 로컬 환경 (FastAPI 앱 + Ollama 모두 Docker로 실행)
.env 파일의 OLLAMA_BASE_URL이 http://localhost:11434로 설정되었는지 확인하세요.
# 로컬 환경으로 실행
docker-compose -f docker-compose.yml -f docker-compose.local.yml up --build- 이 명령어는 FastAPI 앱, Ollama 서버, 모델 다운로더를 모두 실행합니다.
Mode 2: 원격 환경 (FastAPI 앱만 Docker로 실행)
.env 파일의 OLLAMA_BASE_URL이 설정되었는지 확인하세요.
docker-compose up --build- 이 명령어는 FastAPI 앱만 실행하며, 앱은
.env에 설정된 원격 Ollama 서버에 연결됩니다.
-
Endpoint:
POST /api/v1/chat -
Request Body:
{ "query": "여기에 질문 내용을 작성" } -
Example (
curl):curl -X 'POST' \ 'http://localhost:8000/api/v1/chat' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "query": "2025년 10월 15일 원화와 달러의 가치를 비교해서 알려줘" }'
- exaone3.5:2.4b
- deepseek-r1:1.5b