Mini RAG Project는 RAG(Retrieval-Augmented Generation) 시스템의 간소화된 구현체입니다. NestJS와 Python을 활용하여 기본적인 RAG 기능을 구현했습니다.
이 프로젝트는 다음과 같은 기능을 제공합니다:
- 텍스트 파일 업로드 및 처리
- 문단 단위 텍스트 분할
- Sentence Transformers를 활용한 임베딩 생성
- ChromaDB를 통한 벡터 저장 및 검색
- OpenAI GPT를 활용한 질의응답
┌─────────────┐ HTTP Request ┌─────────────┐ HTTP Request ┌─────────────┐
│ Client │ ──────────────────► │ NestJS API │ ──────────────────► │ Python AI │
│ (Postman) │ │ Gateway │ │ Service │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
▼ ▼
File Upload Text Processing
Validation (Chunking, Embedding)
│
▼
┌─────────────┐
│ ChromaDB │
│ (Vector DB) │
└─────────────┘
mini-rag-project/
├── README.md # 이 파일
├── .gitignore # 통합된 Git 무시 파일
├── mini-rag/ # NestJS API Gateway
│ ├── src/
│ │ ├── ingest/
│ │ │ ├── ingest.controller.ts # 파일 업로드 API
│ │ │ ├── ingest.service.ts # Python 서버 통신
│ │ │ └── ingest.module.ts # 모듈 설정
│ │ └── app.module.ts # 루트 모듈
│ ├── package.json
│ └── .env (필요시 생성)
└── mini-rag-ai-service/ # Python AI Service
├── main.py # FastAPI 애플리케이션
├── requirements.txt # Python 의존성
├── .env # OpenAI API 키
├── venv/ # Python 가상환경
└── chroma_db/ # ChromaDB 데이터 저장소
- Node.js (v18+)
- Python (3.9+)
- OpenAI API Key
git clone <repository-url>
cd mini-rag-project# Python AI Service 디렉토리로 이동
cd mini-rag-ai-service
# 가상환경 생성 및 활성화
python3 -m venv venv
source venv/bin/activate # Mac/Linux
# venv\Scripts\activate # Windows
# 의존성 설치
pip install -r requirements.txt
# 환경 변수 설정
echo 'OPENAI_API_KEY="your-openai-api-key-here"' > .env
# AI 서비스 실행
uvicorn main:app --reloadAI 서비스는 http://localhost:8000에서 실행됩니다.
# 새 터미널에서 NestJS 서비스 디렉토리로 이동
cd mini-rag
# 의존성 설치
npm install
# 환경 변수 설정 (선택사항)
echo 'PYTHON_SERVICE_URL=http://localhost:8000' > .env
# API Gateway 실행
npm run start:devAPI Gateway는 http://localhost:3000에서 실행됩니다.
파일을 업로드하여 AI 서비스로 전송합니다.
Request:
- Content-Type:
multipart/form-data - Body:
file(텍스트 파일)
Response:
{
"message": "Successfully processed and stored 3 chunks from sample.txt.",
"chunkCount": 3
}텍스트를 받아서 청킹, 임베딩, 벡터 DB 저장을 수행합니다.
Request:
{
"text": "업로드된 텍스트 내용...",
"filename": "sample.txt"
}사용자 질문을 받아서 관련 문서를 검색하고 답변을 생성합니다.
Request:
{
"query": "RAG 시스템이 무엇인가요?"
}Response:
{
"answer": "RAG 시스템에 대한 답변...",
"retrieved_documents": [
"관련 문서 조각 1",
"관련 문서 조각 2",
"관련 문서 조각 3"
]
}OPENAI_API_KEY=sk-your-openai-api-key-herePYTHON_SERVICE_URL=http://localhost:8000- Framework: NestJS 10.0+
- HTTP Client: Axios
- File Upload: Multer
- Port: 3000
- Framework: FastAPI 0.100+
- Vector DB: ChromaDB
- Embedding Model: all-MiniLM-L6-v2 (384차원)
- LLM: OpenAI GPT-3.5-turbo
- Port: 8000
Postman이나 curl을 사용하여 파일 업로드를 테스트할 수 있습니다:
curl -X POST http://localhost:3000/ingest/upload \
-F "file=@sample.txt"curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{"query": "업로드된 문서에 대해 질문하기"}'- NestJS API:
http://localhost:3000(기본 NestJS 문서) - Python AI Service:
http://localhost:8000/docs(Swagger UI)
- 파일 업로드: 클라이언트가 NestJS API Gateway로 텍스트 파일 업로드
- 텍스트 전송: NestJS가 파일 내용을 Python AI Service로 전송
- 텍스트 분할: Python 서비스가 문단 단위로 텍스트 분할
- 임베딩 생성: 각 청크를 384차원 벡터로 변환
- 벡터 저장: ChromaDB에 벡터와 원본 텍스트 저장
- 질의 처리: 사용자 질문에 대해 관련 문서 검색 및 답변 생성
# Python AI Service 개발 모드
cd mini-rag-ai-service
source venv/bin/activate
uvicorn main:app --reload
# NestJS API Gateway 개발 모드 (새 터미널)
cd mini-rag
npm run start:dev- Python 서비스: FastAPI의 자동 문서화 기능 활용 (
/docs) - NestJS 서비스: NestJS 로깅 및 개발 모드 활용
- 이 프로젝트는 학습 목적으로 제작되었으며, 실제 프로덕션 환경에서는 추가적인 보안 및 성능 최적화가 필요합니다.
- 현재 구현은 단순한 문단 단위 분할을 사용합니다.