RAG (Retrieval-Augmented Generation) 질문이 들어오면, 관련 정보를 DB에서 찾아 언어 모델이 이해하기 쉽게 정리해 제공. 보다 정밀하고 풍부한 응답을 위한 체계적인 프롬프트 구성 기법.
PEFT (Parameter-Efficient Fine-Tuning) 전체 모델을 학습시키는 대신, 일부 파라미터(또는 소규모 모듈)만 미세 조정하여 성능을 높이는 기술입니다.적은 리소스로도 다양한 작업에 맞게 대형 언어 모델을 빠르게 적응시킬 수 있습니다.
RAG는 언어 모델이 더 정확하게 답할 수 있도록, 관련 정보를 외부 데이터베이스에서 검색해 프롬프트를 보강하는 구조입니다.프롬프트 엔지니어링과 비슷하지만, RAG는 정교하고 체계적인 자동화된 프롬프트 생성을 목표로 합니다.
sequenceDiagram participant 사용자 participant 프롬프트 participant 임베딩모델 participant 벡터DB participant 언어모델 사용자->>프롬프트: 질문 입력 프롬프트->>임베딩모델: 질문 임베딩 생성 임베딩모델->>벡터DB: 관련 문서 임베딩 검색 벡터DB-->>프롬프트: 관련 Chunk 반환 프롬프트->>언어모델: 프롬프트 + Chunk 전달 언어모델-->>사용자: 응답 반환
stateDiagram [*] --> LoadDocs: 문서 로딩 LoadDocs --> SplitDocs: 문서 분할 SplitDocs --> EmbedChunks: 임베딩 생성 EmbedChunks --> StoreToVectorDB: 벡터DB 저장 [*] --> AskQuestion: 질문 입력 AskQuestion --> EmbedQuery: 쿼리 임베딩 EmbedQuery --> SearchDB: 유사 문서 검색 SearchDB --> MergePrompt: 프롬프트와 병합 MergePrompt --> [*]
실제사례 - E-commerce 상품 검색 도우미
시나리오 한눈에 보기
“친환경 소재 러닝화를 15만 원 이하로 추천해줘” → 도우미가 카탈로그·리뷰를 벡터 DB에서 검색해 제품을 추려 + LLM이 자연어로 정리해 응답
flowchart LR subgraph 오프라인 준비 A1[상품·리뷰 크롤링]-->A2[텍스트/이미지 전처리] A2-->A3[Chunk & Embedding] A3-->A4[(Vector DB<br>예: Weaviate)] end subgraph 온라인 질의 B1[사용자 질문]-->B2[질문 임베딩] B2-- top-k -->A4 A4-- 관련 벡터 -->B3[Chunk 재조합] B3-->B4[Enriched Prompt] B4-->B5[LLM 응답 GPT-4o + LoRA] B5-->B6[추천 & 근거 반환] end
- Vector DB: Weaviate, Chroma, Pinecone 등
- Embedding: text-embedding-3-large, Snowflake/arctic-embed, CLIP(gallery 이미지)
- LLM: GPT-4o + LoRA 어댑터(상품 도메인 말투·단가·단위 학습)
pip install "weaviate-client[agents]" datasets
import os, weaviate
from weaviate.auth import Auth
from weaviate.agents.query import QueryAgent
# 1) 클러스터 접속
client = weaviate.connect_to_weaviate_cloud(
cluster_url=os.environ["WEAVIATE_URL"],
auth_credentials=Auth.api_key(os.environ["WEAVIATE_API_KEY"])
)
# 2) (한 번만) 컬렉션 생성 & 데이터 적재 (HuggingFace 공개 예시)
from datasets import load_dataset
items = load_dataset("weaviate/agents", "query-agent-ecommerce", split="train", streaming=True)
client.collections.create("ECommerce", vectorizer_config={"text2vec_weaviate": {}})
col = client.collections.get("ECommerce")
with col.batch.fixed_size(200) as batch:
for it in items:
batch.add_object(properties=it["properties"], vector=it["vector"])
# 3) 에이전트 준비
agent = QueryAgent(client=client, collections=["ECommerce"])
# 4) 질의
q = "I like vintage clothes, can you list me some options under $200?"
answer = agent.run(q).final_answer
print(answer)
로컬기반 POC 시나리오
컴포넌트 | 메모리 소모(대략) | CPU/GPU 요구 | 팁 |
---|---|---|---|
벡터 DB (Faiss·Chroma) | 300 MB ↓ (5 만 개 임베딩, 768 dim) | CPU | sqlite-백엔드 Chroma면 가볍고 파일 1 개 관리 |
Embedding 모델 | ① API 호출: 0 MB ② nomic-embed-text-v1.5(GGUF): 4 ~ 6 GB | CPU 가능 | API→OpenAI / Snowflake 권장 (속도 ↑) |
LLM | ① API 호출: 0 MB ② phi-3-mini(GGUF): 2.3 GB | CPU 가능 | POC는 GPT-4o API → 비용↑ but 속편함 |
Python 서버 (FastAPI) | 100 ~ 200 MB | - | Reload 끄고 Uvicorn workers = 1 |