RAG & Vector Search: AI는 어떻게 의미를 이해할까요?
1. 컴퓨터의 언어: 임베딩 (Embedding)
컴퓨터는 "사과"라는 글자를 모릅니다. 대신 숫자만 이해할 수 있습니다. 임베딩(Embedding)은 단어나 문장의 '의미'를 숫자의 좌표(Vector)로 바꾸는 과정입니다.
비유: 도서관의 좌표
- 사과:
[1.2, 0.8](과일 코너, 빨간색 선반) - 바나나:
[1.1, 0.9](과일 코너, 노란색 선반) - 강아지:
[-5.0, -2.0](동물 코너, 털복숭이 구역)
"사과"와 "바나나"는 좌표가 서로 가깝습니다. (의미가 비슷함) 반면 "강아지"는 아주 멀리 떨어져 있습니다. (의미가 다름)
2. 벡터 검색 (Vector Search)
AI가 질문에 답하기 위해 정보를 찾는 방법입니다. 단어의 철자가 같은지가 아니라, 의미(거리)가 가까운지를 확인합니다.
과정 (Simulation 미리보기)
- 질문: "맛있는 과일"이라고 입력합니다.
- 변환: 질문을 좌표로 바꿉니다. →
[1.15, 0.85] - 거리 계산: 이 좌표와 가장 가까운 점을 찾습니다.
- 사과(0.05 거리) → 가깝다! (정답)
- 강아지(6.5 거리) → 멀다! (탈락)
3. RAG (검색 증강 생성)
RAG (Retrieval-Augmented Generation)는 AI에게 부닝(Open Book)을 허용하는 것입니다. AI가 모르는 내용을 질문받으면:
- 검색(Retrieval): 벡터 검색으로 관련 문서를 찾아옵니다. (위의 과정)
- 생성(Generation): 찾아온 문서를 보고 답변을 만듭니다.
요약: "시험 칠 때 책(Vector DB)에서 정답이 있을만한 페이지(Nearest Neighbor)를 펴놓고 답을 쓰는 것."
4. 핵심 알고리즘 (Deep Dive)
데이터가 수억 개라면, 일일이 거리를 재는 건 너무 느립니다. 그래서 빠른 지름길을 만드는 기술이 필요합니다.
- KNN (k-Nearest Neighbor): 모든 점과의 거리를 다 재보는 방식. (정확하지만 느림)
- HNSW (Hierarchical Navigable Small World): 고속도로망처럼 듬성듬성한 지점에서 시작해 점점 좁혀가는 방식. (매우 빠름, 현재 표준)
- IVF (Inverted File Index): 비슷한 것끼리 미리 그룹(클러스터)을 지어놓고, 해당 그룹만 뒤지는 방식.
5. 코사인 유사도 vs 유클리드 거리
벡터 간 유사도를 측정하는 방법은 크게 2가지가 있습니다.
5.1 유클리드 거리 (Euclidean Distance)
- 정의: 두 점 사이의 직선 거리 (피타고라스 정리)
- 공식:
distance = √((x₁-x₂)² + (y₁-y₂)²) - 특징: 절대적인 위치 차이를 측정
예시:
- 사과:
[1.0, 1.0] - 큰 사과:
[2.0, 2.0] - 유클리드 거리 =
√((2-1)² + (2-1)²) = √2 ≈ 1.41(멀다!)
문제점: 크기만 다르고 방향이 같은 벡터도 "다르다"고 판단합니다.
5.2 코사인 유사도 (Cosine Similarity)
- 정의: 두 벡터의 방향(각도) 비교
- 공식:
cos(θ) = (A · B) / (|A| × |B|) - 특징: 크기 무시, 방향만 비교
예시:
- 사과:
[1.0, 1.0] - 큰 사과:
[2.0, 2.0] - 코사인 유사도 =
1.0(완전히 같은 방향!)
비교표
| 구분 | 유클리드 거리 | 코사인 유사도 |
|---|---|---|
| 측정 대상 | 절대적 거리 | 방향 (각도) |
| 값 범위 | 0 ~ ∞ (작을수록 가까움) | -1 ~ 1 (1에 가까울수록 유사) |
| 크기 영향 | 영향 받음 | 영향 안 받음 |
| 용도 | 물리적 거리 | 의미적 유사도 |
| 예시 | 좌표 거리, 이미지 픽셀 | 문서 유사도, 추천 시스템 |
언제 뭘 쓸까?
- 유클리드: 크기가 중요한 경우 (예: "3m vs 5m")
- 코사인: 방향(의미)만 중요한 경우 (예: "비슷한 주제의 문서")
RAG에서는 보통 코사인 유사도를 사용합니다! (단어의 의미를 비교하므로)
6. 벡터 데이터베이스란?
일반 데이터베이스 (MySQL, PostgreSQL):
- 저장: 이름, 나이, 주소 같은 텍스트/숫자
- 검색:
WHERE age > 20(정확한 조건)
벡터 데이터베이스:
- 저장: 임베딩 벡터
[0.12, -0.45, 0.78, ...](수백 차원) - 검색: "이 벡터와 가장 가까운 것 찾아줘" (유사도)
왜 필요할까?
일반 DB로는 벡터 검색이 너무 느립니다.
- 1억 개의 벡터에서 가장 가까운 10개 찾기 → 일반 DB: 몇 분
- 벡터 DB: 밀리초 (0.001초)!
대표적인 벡터 데이터베이스
| 이름 | 특징 | 용도 |
|---|---|---|
| Pinecone | 클라우드 기반, 쉬운 시작 | 프로덕션 RAG 서비스 |
| Weaviate | 오픈소스, GraphQL 지원 | 복잡한 검색 요구사항 |
| ChromaDB | 경량, Python 친화적 | 로컬 개발, 프로토타입 |
| Milvus | 대규모, Kubernetes 친화적 | 엔터프라이즈급 서비스 |
| Qdrant | Rust 기반, 빠른 성능 | 고성능 검색 |
| pgvector | PostgreSQL 확장 | 기존 DB 인프라 활용 |
기본 워크플로우
# 1. 벡터 DB에 데이터 저장
db.add(id="doc1", vector=[0.1, 0.2, ...], text="사과는 과일")
# 2. 검색 (질문을 벡터로 변환 후)
results = db.search(query_vector=[0.15, 0.25, ...], top_k=5)
# 3. 결과 반환
# → [("doc1", 유사도: 0.95), ...]
7. LLM과 RAG의 결합: 프롬프트 엔지니어링
RAG의 핵심: AI에게 관련 문서를 함께 제공하는 것입니다.
프롬프트 구조
기본 RAG 프롬프트
[시스템]
당신은 문서를 참고해 답변하는 AI입니다.
[검색된 문서]
- 사과는 과일입니다. 빨갛고 달콤합니다.
- 사과에는 비타민 C가 풍부합니다.
[질문]
사과의 영양소는?
[답변]
사과에는 비타민 C가 풍부합니다. (문서 2 참고)
고급 기법
1. 인용 포함 (Citation)
질문: 사과의 색깔은?
답변: 사과는 빨갛습니다. [출처: 문서 1, 3번째 줄]
2. 다단계 검색 (Multi-hop)
1단계: "사과" 검색 → 문서 A, B, C
2단계: 문서 A에서 "비타민 C" 검색 → 더 자세한 정보
3. 하이브리드 검색
- 키워드 검색 (BM25): "사과"라는 단어가 있는 문서
- 벡터 검색: "과일"처럼 의미가 비슷한 문서
- → 두 결과를 합쳐서 최종 답변
8. RAG의 한계와 미래
8.1 현재의 한계
환각 (Hallucination)
- 문제: AI가 문서에 없는 내용을 지어내는 현상
- 원인: 문서가 불완전하거나, AI가 자신의 지식과 혼동
- 해결책: 인용 강제, 신뢰도 점수 표시
검색 품질
- 문제: 관련 없는 문서를 가져오면 답변도 엉뚱해짐
- 해결책: 더 정교한 임베딩, 리랭킹(Re-ranking) 알고리즘
문서 길이 제한
- 문제: LLM이 처리할 수 있는 토큰 수 제한 (GPT-4: 128K 토큰)
- 해결책: 문서 요약, 청크(Chunk) 분할
8.2 Fine-tuning과의 차이
| 구분 | RAG | Fine-tuning |
|---|---|---|
| 원리 | 문서를 검색해서 제공 | AI 모델 자체를 재학습 |
| 비용 | 낮음 (검색만) | 높음 (GPU 학습 필요) |
| 속도 | 빠름 | 느림 (학습 시간) |
| 업데이트 | 실시간 (문서만 추가) | 재학습 필요 |
| 용도 | 자주 바뀌는 정보 | 고정된 전문 지식 |
결론: RAG와 Fine-tuning은 적대 관계가 아니라 보완 관계입니다!
8.3 미래 기술
GraphRAG
- 개념: 문서를 그래프(관계도)로 저장
- 장점: "A의 친구 B의 회사는?" 같은 복잡한 질문에 강함
Adaptive RAG
- 개념: 질문 난이도에 따라 검색 전략 자동 조정
- 예시: 쉬운 질문 → 검색 안 함, 어려운 질문 → 다단계 검색
Multimodal RAG
- 개념: 텍스트뿐 아니라 이미지, 동영상도 검색
- 예시: "이 제품 사진과 비슷한 리뷰 찾아줘"
9. 실무 활용 사례
9.1 고객 지원 챗봇
문제: 고객이 "환불 어떻게 해요?"라고 물어봄
RAG 프로세스:
- 질문을 벡터로 변환
- "환불 정책" 문서 검색 (유사도 0.92)
- 문서 내용 + 질문 → GPT에 전달
- 답변: "환불은 구매 후 7일 이내 가능합니다. (환불 정책 3조 참고)"
효과: 24시간 자동 응답, 정확도 95%+
9.2 사내 문서 검색
문제: 회사에 수천 개의 내부 문서, 찾기 어려움
RAG 프로세스:
- 모든 문서를 벡터 DB에 저장
- 직원이 "AWS 비용 절감 방법?"이라고 검색
- 관련 문서 10개 자동 추출 + 요약 생성
- 출처와 함께 답변 제공
효과: 검색 시간 80% 단축, 정보 접근성 향상
9.3 의료 진단 보조
문제: 의사가 희귀병 증상을 정확히 기억하기 어려움
RAG 프로세스:
- "발열 + 발진 + 관절통" 입력
- 의학 논문 DB에서 유사 증례 검색
- "류마티스 열 가능성 87%" 제안 + 논문 인용
주의: AI는 보조 도구일 뿐, 최종 판단은 의사!
정리
| 개념 | 핵심 | 비유 |
|---|---|---|
| 임베딩 | 의미를 숫자(좌표)로 변환 | 도서관 좌표 |
| 벡터 검색 | 의미적으로 가까운 것 찾기 | 가까운 책장 찾기 |
| RAG | 검색 + AI 답변 생성 | 오픈북 시험 |
| 코사인 유사도 | 방향(의미) 비교 | 각도 측정 |
| 벡터 DB | 고속 벡터 검색 전용 | 도서관 색인 시스템 |
| Fine-tuning | AI 모델 재학습 | 선생님 교육 |
핵심 워크플로우:
- 문서를 임베딩으로 변환 → 벡터 DB에 저장
- 질문도 임베딩으로 변환
- 벡터 검색 (HNSW 등)으로 가장 가까운 문서 찾기
- 문서 + 질문 → LLM에 전달
- 정확한 답변 생성 (인용 포함!)