RAG(Retrieval-Augmented Generation) + Tool-using Agent 포트폴리오 프로젝트
API 키 없이 바로 실행 가능한 데모 모드 지원
이 프로젝트는 LLM(Large Language Model) 기반의 RAG 시스템과 도구 사용 에이전트를 구현한 포트폴리오입니다.
컴퓨터 비전 / 딥러닝 / 엣지 AI 주제의 기술 문서를 지식 베이스로 활용하며, 사용자의 질문에 대해 관련 문서를 검색하고 LLM이 컨텍스트 기반 답변을 생성합니다.
- RAG 파이프라인: 문서 로드 → 청크 분할 → 벡터 임베딩 → 유사도 검색 → LLM 답변 생성
- 도구 사용 에이전트: 질문 유형에 따라 문서 검색 / 수식 계산 / 시간 조회 도구 자동 선택
- 오프라인 데모 모드: API 키 없이도 완전히 동작하는 Mock LLM (키워드 기반 응답)
- 로컬 임베딩:
sentence-transformers모델로 API 없이 로컬에서 벡터 생성 - Beautiful CLI:
rich라이브러리로 에이전트 추론 과정 시각화
┌─────────────────────────────────────────────────────────────────┐
│ 사용자 쿼리 │
└───────────────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ RAG Agent │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ 도구 선택기 │───►│ Calculator │ │ Current Time │ │
│ │ (Tool Router)│ │ (계산기) │ │ (현재 시각) │ │
│ └──────┬───────┘ └──────────────┘ └──────────────────┘ │
│ │ │
│ │ document_search │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ RAG Chain │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ │
│ │ │ Retriever │ │ Prompt │ │ LLM │ │ │
│ │ │ (ChromaDB) │──►│ Builder │──►│ (Claude / │ │ │
│ │ └──────┬───────┘ └──────────────┘ │ GPT / Mock)│ │ │
│ │ │ └─────────────┘ │ │
│ └─────────┼────────────────────────────────────────────────┘ │
└─────────────┼───────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────┐
│ Vector Store │
│ │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ ChromaDB (로컬 저장) │ │
│ │ │ │
│ │ [ 문서 청크 1 | 임베딩 벡터 384d ] │ │
│ │ [ 문서 청크 2 | 임베딩 벡터 384d ] ◄── all-MiniLM-L6-v2│ │
│ │ [ 문서 청크 N | 임베딩 벡터 384d ] (로컬 실행) │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
▲
│ 인덱싱
┌─────────────────────────────────────────────────────────────────┐
│ Document Loader │
│ │
│ data/sample_docs/ │
│ ├── computer_vision_basics.md (컴퓨터 비전 기초) │
│ ├── deep_learning_overview.md (딥러닝 개요) │
│ └── edge_deployment.md (엣지 배포 가이드) │
│ │
│ RecursiveCharacterTextSplitter → 500자 청크 (50자 오버랩) │
└─────────────────────────────────────────────────────────────────┘
환경 변수 확인
│
├── API 키 있음 ──► API 모드 (Claude / GPT 실제 호출)
│
└── API 키 없음 ──► 데모 모드 (Mock LLM, 오프라인 동작)
│
└── 임베딩/검색은 실제 동작
(sentence-transformers 로컬)
| 분류 | 기술 | 용도 |
|---|---|---|
| LLM Framework | LangChain 0.2+ | 체인/에이전트 오케스트레이션 |
| LLM Provider | Anthropic Claude | RAG 답변 생성 (API 모드) |
| LLM Provider | OpenAI GPT | RAG 답변 생성 (API 모드) |
| Mock LLM | 자체 구현 | 오프라인 데모 (키워드 매칭) |
| Vector Store | ChromaDB | 로컬 벡터 저장 및 검색 |
| Embeddings | sentence-transformers | 로컬 텍스트 임베딩 (all-MiniLM-L6-v2) |
| Text Splitter | RecursiveCharacterTextSplitter | 문서 청크 분할 |
| Console UI | rich | 터미널 시각화 |
| Config | python-dotenv | 환경 변수 관리 |
llm-rag-agent/
│
├── README.md # 프로젝트 문서 (현재 파일)
├── demo.py # 메인 실행 스크립트
├── requirements.txt # Python 패키지 의존성
├── .env.example # 환경 변수 설정 템플릿
├── .env # 실제 API 키 (git 제외)
├── .gitignore
│
├── src/ # 핵심 소스 코드
│ ├── __init__.py
│ ├── document_loader.py # 문서 로드 및 청크 분할
│ ├── vector_store.py # ChromaDB 벡터 스토어 관리
│ ├── rag_chain.py # RAG 파이프라인 구현
│ ├── agent.py # 도구 사용 에이전트
│ └── mock_llm.py # 데모용 Mock LLM
│
├── data/
│ └── sample_docs/ # 샘플 지식 베이스 문서
│ ├── computer_vision_basics.md
│ ├── deep_learning_overview.md
│ └── edge_deployment.md
│
└── chroma_db/ # ChromaDB 저장 디렉토리 (자동 생성, git 제외)
git clone https://github.com/work-jack/llm-rag-agent.git
cd llm-rag-agent# 가상환경 생성
python -m venv .venv
# 활성화 (Windows)
.venv\Scripts\activate
# 활성화 (macOS/Linux)
source .venv/bin/activatepip install -r requirements.txt참고:
sentence-transformers모델(all-MiniLM-L6-v2, ~90MB)은 첫 실행 시 자동 다운로드됩니다.
# 자동 감지: API 키가 없으면 자동으로 데모 모드
python demo.py
# 강제 데모 모드
python demo.py --demo실행 예시:
[INFO] API 키가 설정되지 않아 데모 모드로 실행합니다.
[INFO] 문서 로딩 중... 3개 문서 로드 완료
[INFO] 벡터 스토어 생성 중... 완료
질문을 입력하세요 (종료: q) > 컴퓨터 비전이란?
┌─── 검색된 문서 ─────────────────────────────────┐
│ 파일명 │ 유사도 │
│ computer_vision_basics.md │ 0.923 ██████████ │
│ deep_learning_overview.md │ 0.671 ███████░░░ │
└─────────────────────────────────────────────────┘
┌─── 답변 ────────────────────────────────────────┐
│ 컴퓨터 비전(Computer Vision)은 컴퓨터가 디지털 │
│ 이미지나 동영상을 인간의 시각 시스템처럼 이해하 │
│ 고 분석할 수 있도록 하는 인공지능의 한 분야입니다 │
└─────────────────────────────────────────────────┘
> q
종료합니다.
# 1. 환경 변수 파일 생성
cp .env.example .env
# 2. API 키 설정 (.env 파일 편집)
# ANTHROPIC_API_KEY=sk-ant-...
# 또는
# OPENAI_API_KEY=sk-...
# 3. 실행
python demo.py# 도구 선택 기능이 포함된 에이전트 모드
python demo.py --agent에이전트는 질문 유형을 분석하여 자동으로 적절한 도구를 선택합니다:
| 질문 예시 | 선택 도구 |
|---|---|
| "컴퓨터 비전이란?" | document_search |
| "2 ** 10 계산해줘" | calculator |
| "지금 몇 시야?" | current_time |
# 자신의 문서 디렉토리 지정
python demo.py --docs /path/to/your/docs.env.example 파일을 .env로 복사 후 수정:
cp .env.example .env| 변수명 | 설명 | 기본값 |
|---|---|---|
ANTHROPIC_API_KEY |
Anthropic Claude API 키 | - |
OPENAI_API_KEY |
OpenAI GPT API 키 | - |
LLM_PROVIDER |
사용할 LLM 제공자 (anthropic/openai) |
자동 감지 |
LLM_MODEL |
사용할 모델 이름 | claude-3-haiku-20240307 |
CHROMA_DB_PATH |
ChromaDB 저장 경로 | ./chroma_db |
DOCS_PATH |
문서 디렉토리 경로 | ./data/sample_docs |
API 키를 설정하지 않아도 임베딩/검색은 로컬에서 정상 동작합니다.
from src.document_loader import load_and_split
# 문서 로드 + 청크 분할 (한 번에)
chunks = load_and_split("./data/sample_docs", chunk_size=500, chunk_overlap=50)from src.vector_store import create_store, similarity_search
# 벡터 스토어 생성 (sentence-transformers 임베딩, 로컬)
store = create_store(chunks, persist_directory="./chroma_db")
# 유사도 검색
results = similarity_search(store, "컴퓨터 비전이란?", top_k=3)
for doc, score in results:
print(f"[{doc.metadata['source']}] 유사도={score:.3f}")from src.rag_chain import RAGChain
chain = RAGChain(vector_store=store) # demo_mode 자동 감지
result = chain.query("딥러닝이란?")
print(result.answer) # LLM 답변
print(result.sources) # 출처 파일명 + 유사도from src.agent import RAGAgent
agent = RAGAgent(vector_store=store)
agent.run("객체 탐지 모델 종류를 알려줘") # 도구 자동 선택 + rich 출력
agent.run("sqrt(144) 계산해줘")
agent.run("현재 시각 알려줘")from src.mock_llm import get_llm, is_demo_mode
llm = get_llm() # 자동 감지 (API 키 없으면 MockLLM)
print(is_demo_mode()) # True / False
response = llm.invoke("질문 텍스트")이 프로젝트는 컴퓨터 비전 엔지니어로서 LLM/RAG 기술을 습득하고 실제 프로덕션 수준의 코드 구조를 포트폴리오로 보여주기 위해 개발했습니다.
- 오프라인 데모 모드로 API 비용 없이 포트폴리오 시연 가능
- ChromaDB + 로컬 임베딩으로 클라우드 의존성 최소화
- LangChain 추상화를 활용한 확장 가능한 설계
- Rich 라이브러리로 에이전트 추론 과정의 직관적 시각화
MIT License - 자유롭게 사용, 수정, 배포 가능합니다.