TeDDie 프로젝트를 위한 RAG(Retrieval-Augmented Generation) 검색 API 서버입니다.
우아한테크코스 프리코스 과제 데이터를 기반으로 유사도 검색을 제공합니다.
Java로 작성된 TeDDie 애플리케이션에서 HTTP 요청으로 우테코 과제 검색 기능을 사용할 수 있도록 FastAPI 기반 REST API를 제공합니다.
[TeDDie (Java)]
↓ HTTP POST
[TeDDie-RagAPI (FastAPI)]
↓ import & call
[TeDDie-RagSystem (Python RAG Library)]
- Framework: FastAPI 0.104.1
- Server: Uvicorn 0.24.0
- Testing: pytest 7.4.3, httpx 0.25.2
- Python: 3.10+
-
1.1 프로젝트 초기 설정
- Repository 생성
- 폴더 구조 생성 (
api/,test/) -
.gitignore작성 -
requirements.txt작성 - 가상환경 생성 및 의존성 설치
- README.md 작성
-
1.2 기본 FastAPI 앱 생성
-
api/__init__.py생성 -
api/app.py생성 (FastAPI 앱 정의) - 루트 엔드포인트 (
/) 구현 -
main.py생성 (서버 실행 스크립트)
-
-
1.3 기본 API 테스트
-
test/__init__.py생성 -
test/test_app.py생성 - 루트 엔드포인트 200 응답 테스트
- 루트 엔드포인트 JSON 응답 테스트
- 서비스 정보 포함 여부 테스트
- 테스트 실행 및 통과 확인
-
-
2.1 c 엔드포인트
-
/health엔드포인트 테스트 작성 -
/healthGET 요청 시 200 응답 - 응답에
status필드 포함 - 응답에
timestamp필드 포함 - 테스트 통과 확인
-
-
2.2 RAG 시스템 연동 상태 체크
- RAG 인덱스 로드 상태 확인 테스트
-
index_loaded필드 응답에 포함 - 인덱스 미로드 시
false반환 - 인덱스 로드 시
true반환 - 테스트 통과 확인
-
3.1 의존성 주입 설정
-
api/dependencies.py생성 - RAG 시스템 싱글톤 인스턴스 관리
-
get_rag_system()함수 구현 - 의존성 주입 테스트 작성
- 테스트 통과 확인
-
-
3.2 서버 시작 시 인덱스 로드
-
@app.on_event("startup")이벤트 핸들러 작성 - FAISS 인덱스 파일 경로 설정
- 인덱스 로드 성공 로그 출력
- 인덱스 로드 실패 시 에러 핸들링
- 시작 이벤트 테스트 작성
- 테스트 통과 확인
-
-
4.1 Pydantic 모델 정의
-
api/models.py생성 -
SearchRequest모델 정의 (query, top_k) -
SearchResult모델 정의 (repo, text, url, similarity_score) -
SearchResponse모델 정의 (query, results) - 모델 유효성 검증 테스트
- 테스트 통과 확인
-
-
4.2 검색 엔드포인트 구현
-
test/test_search.py생성 -
/searchPOST 엔드포인트 테스트 작성 - 정상 요청 시 200 응답 테스트
- 검색 결과 반환 테스트
-
SearchResponse형식 준수 테스트 -
/search엔드포인트 구현 - 테스트 통과 확인
-
-
4.3 검색 파라미터 검증
- 빈 쿼리 요청 시 422 응답 테스트
-
top_k범위 검증 (1-10) 테스트 - 잘못된 타입 요청 시 에러 테스트
- 파라미터 검증 로직 구현
- 테스트 통과 확인
-
4.4 검색 결과 정렬 및 포맷팅
- 유사도 순 정렬 테스트
-
similarity_score필드 존재 테스트 - 요청한
top_k개수만큼 반환 테스트 - 정렬 및 포맷팅 구현
- 테스트 통과 확인
- 5.1 API 문서화
- OpenAPI (Swagger) 문서 자동 생성 확인
- 각 엔드포인트에 description 추가
- 예제 요청/응답 추가
-
/docs페이지 확인
-
6.1 Java에서 API 호출
- Java
HttpClient코드 작성 - 검색 API 호출 테스트
- 응답 JSON 파싱 테스트
- 연동 성공 확인
- Java
-
6.2 TeDDie 통합
-
MissionService에 RAG API 호출 추가 - 검색 결과를 프롬프트에 통합
- End-to-End 테스트
- 최종 동작 확인
-
TeDDie-RagBackend/
├── app.py
├── main.py
├── requirements.txt
├── LICENSE
├── README.md
├── controller/
│ ├── healthController.py
│ └── searchController.py
├── domain/
│ ├── model/
│ │ ├── health.py
│ │ ├── searchRequest.py
│ │ ├── searchResponse.py
│ │ └── searchResult.py
│ └── rag/
│ └── ragEngine.py
├── infra/
│ └── dependencies.py
├── service/
│ ├── healthService.py
│ └── ragService.py
├── test/
│ ├── test_app.py
│ ├── test_model.py
│ └── test_search.py
└── util/
├── config.py
├── logger.py
└── repository/
└── ragRepository.py
- Python 3.10 이상
- pip
# Repository 클론
git clone https://github.com/your-username/TeDDie-RagAPI.git
cd TeDDie-RagAPI
# 가상환경 생성 (선택)
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 의존성 설치
pip install -r requirements.txt.env 파일 생성:
cp .env.example .env.env 파일 수정:
# API 설정
API_HOST=0.0.0.0
API_PORT=8000
# RAG 설정
FAISS_INDEX_PATH=../TeDDie-RagSystem/faiss_index.bin
RAG_DATASET_PATH=../TeDDie-RagSystem/woowacourse_rag_dataset.jsonlpython main.pyuvicorn api.app:app --host 0.0.0.0 --port 8000- API Root: http://localhost:8000
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- Health Check: http://localhost:8000/health
GET /
서비스 정보를 반환합니다.
응답 예시:
{
"service": "TeDDie RAG API",
"version": "1.0.0",
"status": "running"
}GET /health
서버 상태를 확인합니다.
응답 예시:
{
"status": "healthy",
"timestamp": "2025-11-10T10:30:00",
"index_loaded": true
}POST /search
우테코 과제를 검색합니다.
요청 본문:
{
"query": "자동차 경주 게임",
"top_k": 3
}파라미터:
| 필드 | 타입 | 필수 | 설명 | 기본값 |
|---|---|---|---|---|
| query | string | ✅ | 검색 쿼리 | - |
| top_k | integer | ❌ | 반환할 결과 개수 (1-10) | 3 |
응답 예시:
{
"query": "자동차 경주 게임",
"results": [
{
"repo": "java-racingcar-6",
"text": "# 미션 - 자동차 경주\n\n## 🔍 진행 방식...",
"url": "https://github.com/woowacourse-precourse/java-racingcar-6",
"similarity_score": 0.234
},
{
"repo": "java-racingcar-7",
"text": "# java-racingcar-precourse...",
"url": "https://github.com/woowacourse-precourse/java-racingcar-7",
"similarity_score": 0.456
}
]
}에러 응답:
-
422 Unprocessable Entity: 잘못된 요청 파라미터
{ "detail": [ { "loc": ["body", "query"], "msg": "field required", "type": "value_error.missing" } ] } -
503 Service Unavailable: RAG 인덱스 미로드
{ "detail": "RAG index not loaded" }