Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LLM RAG Agent

Python LangChain ChromaDB sentence-transformers Anthropic OpenAI License

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 제외)

빠른 시작

1. 저장소 클론

git clone https://github.com/work-jack/llm-rag-agent.git
cd llm-rag-agent

2. 가상환경 설정

# 가상환경 생성
python -m venv .venv

# 활성화 (Windows)
.venv\Scripts\activate

# 활성화 (macOS/Linux)
source .venv/bin/activate

3. 패키지 설치

pip install -r requirements.txt

참고: sentence-transformers 모델(all-MiniLM-L6-v2, ~90MB)은 첫 실행 시 자동 다운로드됩니다.


실행 방법

데모 모드 (API 키 불필요)

# 자동 감지: 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
종료합니다.

API 모드 (실제 LLM 사용)

# 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 키를 설정하지 않아도 임베딩/검색은 로컬에서 정상 동작합니다.


핵심 컴포넌트 설명

src/document_loader.py

from src.document_loader import load_and_split

# 문서 로드 + 청크 분할 (한 번에)
chunks = load_and_split("./data/sample_docs", chunk_size=500, chunk_overlap=50)

src/vector_store.py

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}")

src/rag_chain.py

from src.rag_chain import RAGChain

chain = RAGChain(vector_store=store)     # demo_mode 자동 감지
result = chain.query("딥러닝이란?")

print(result.answer)                     # LLM 답변
print(result.sources)                    # 출처 파일명 + 유사도

src/agent.py

from src.agent import RAGAgent

agent = RAGAgent(vector_store=store)
agent.run("객체 탐지 모델 종류를 알려줘")  # 도구 자동 선택 + rich 출력
agent.run("sqrt(144) 계산해줘")
agent.run("현재 시각 알려줘")

src/mock_llm.py

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 - 자유롭게 사용, 수정, 배포 가능합니다.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages