Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 내일배움
- TiL
- 내일배움카드
- hackerrank
- 회귀분석
- 스파르타코딩
- 스파르타 코딩
- 내일배움캠프
- 파이썬 머신러닝 완벽가이드
- 텍스트 분석
- 프로젝트
- 티스토리챌린지
- 어쩌다 마케팅
- Cluster
- SQL
- 중회귀모형
- 웹 스크랩핑
- 오블완
- R
- 프로그래머스
- 스파르타
- harkerrank
- MySQL
- 파이썬
- 실전 데이터 분석 프로젝트
- 파이썬 머신러닝 완벽 가이드
- wil
- 파이썬 철저 입문
- 미세먼지
- 파이썬 철저입문
Archives
- Today
- Total
OkBublewrap
LLM - RAG(1) 본문
RAG(Retrieval-Augmented Gneration)
LLM의 한계
- 실시간 검색을 통한 최신 정보 반영
- LLM은 사전 학습된 데이터만 사용하기 때문에, 학습 이후 등장한 최신 정보나 트렌드를 반영할 수 없지만
RAG는 실시간 검색을 통해 최신 정보를 제공할 수 있음
- LLM은 사전 학습된 데이터만 사용하기 때문에, 학습 이후 등장한 최신 정보나 트렌드를 반영할 수 없지만
- Hallucination 문제 완화
- 외부 문서를 검색하여 출처가 명확한 정보를 기반으로 답변을 생성하므로, 신뢰성을 높일 수 있음
- 특정 도메인 정보 활용 가능
- LLM은 모든 분야의 전문 지식을 완벽히 학습하긴 어려움. 의료, 법률 등 특정 도메인 지식이 필요할 경우, RAG를 통해 특정 데이터베이스나 내부 자료 문서를 검색하여 보다 정확한 답변 제공
- 지속적 모델 업데이트 부담 완화
- 기존 LLM을 최신 정보로 업데이트하려면 다시 학습(Fine-tuning) 해야 하는데
RAG는 검색 데이터베이스만 갱신하면 최신 정보를 반영할 수 있어 훨씬 효율적
- 기존 LLM을 최신 정보로 업데이트하려면 다시 학습(Fine-tuning) 해야 하는데
- 메모리 한계 해결
- Context Length가 제한적인 LLM에게 긴 문서를 한 번에 처리하는 것이 아닌, 필요한 문서만 검색하여 전달함으로써 긴 문서도 활용할 수 있도록 도움
RAG란?
- LLM의 기능을 향상시키기 위해 검색 시스템과 결합해서 작동하는 것
- 모델이 사용자으 ㅣ질문에 답변할 때 필요한 정보를 외부 혹은 내부 데이터베이스에서 검색하고 검색 결과를 활용해서 답변을 생성 → 답변의 정확도 향상
- RAG의 프로세스
- 질문 입력 → 사용자가 질문을 입력
- 문서 검색 → VectorDB에서 관련 문서 검색
- LLM 응답 생성 → 검색된 문서를 활용하여 답변 생성
1️⃣ Load (수집된 문서 로드)
검색할 데이터를 수집하는 과정
- json, pdf, 텍스트, 웹페이지, 이미지 등 다양한 형식의 문서를 포함
- 각 문서를 텍스트 기반으로 변환한 후, 일정한 포맷으로 저장해야 함
2️⃣ SPLIT (문서 분할)
큰 문서를 작은 조각으로 나눈 과정
- LLM의 컨텍스트 제한 길이를 고려하여 문서를 적절한 크기로 쪼갬 → 분할된 문서를 Chunk라고 한다.
- 문서를 분할할 때 어떤 단위로 나누느냐에 따라 모델의 컨텍스트 길이, 검색 효율성, 응답 품질에 영향을 미침
- 문서 분할 단위를 결정하는 주요 기준
- 어떻게 문서 분할 기준을 세우면 좋을까? → 모델과 문서 유형에 따라 다르게 적용해야 한다!
- Chunk 크기가 너무 작으면 문맥이 부족하므로, 유사한 내용끼리 묶어주는 것이 좋음
- Chunk 크기가 너무 크면 검색 효율이 떨어짐
3️⃣ EMBED (임베딩 변환)
- 텍스트 데이터를 벡터(숫자 값의 배열)로 변환하는 과정
- 임베딩 모델을 사용하여 문장을 벡터화
- Ex:
- RAG는 LLM의 정보를 보강한다 → [0.3, 0.4, 0.1, 1.8]
- 벡터 DB를 활용하여 검색 정확도를 높인다 → [0.7, 1.4, 2.1, 4.8]
- Ex:
4️⃣ STORE (벡터 DB 저장)
- 변환된 벡터 데이터를 벡터 데이터베이스(Vector DB)에 저장하는 과정
- 검색 시 빠르게 유사 문서를 찾기 위해 FAISS, Pinecone, Weaviate, Qdr
추론 시 검색 및 생성
RAG의 핵심은 검색된 문서를 프롬프트에 추가하는 것!
- 검색된 정보를 직접 모델에게 학습시키는 것이 아니라, 프롬프트에 추가하여 활용
- LLM이 자체적으로 학습한 정보 +검색된 문서 조합하여 답변 생성
- 최신 정보나 외부 데이터베이스를 활용할 수 있음
1️⃣ 사용자의 질문을 임베딩 변환
사용자가 입력한 프롬프트를 벡터화 함
2️⃣ 벡터 DB에서 관련 문서 검색
변환된 임베딩을 기반으로 벡터 DB에서 가장 유사한 문서를 검색함.
3️⃣ 검색 결과를 포함한 프롬프트 생성
검색된 문서를 기존 사용자 질문과 함께 모델에게 전달
4️⃣ 답변 생성 (Generation)
모델이 검색된 문서를 참고하여 답변 생성
VectorDB
LLM과 RAG 시스템에서 텍스트, 이미지, 코드 등의 데이터를 벡터 형태로 저장하고, 유사한 벡터를 빠르게 검색하는 기능을 제공하는 핵심 기술
VectorDB를 설계할 때 고려해야 할 점
- 데이터 유형, 임베딩 모델, 벡터 차원 크기
- 인덱싱 방식
- 검색 성능 최적화
- 확장성, 비용 최적화
VectorDB 종류
인덱싱 방식
IVF, HNSW 모두 대규모 벡터 데이터에서 유사한 벡터를 빠르게 검색하기 위한 인덱싱 방식으로,
완전한 정확도를 희생하는 대신 빠른 근사 최근접 이웃(ANN) 검색을 제공함
IVF (Inverted File Index)
- 벡터 공간을 여러 개의 클러스터(셀)로 나눈 후, 검색 시 가장 유사한 클러스터에서만 검색하는 방식
전체 벡터를 검색하는 대신 일부 클러스터만 검색하므로 속도가 빠름 - 검색 과정
- 1. 벡터를 K개의 클러스터로 나눔 (K-means 클러스터링 활용)
- 2. 각 벡터가 소간 클러스터에 저장
- 3. 검색할 때, 입력 벡터와 가장 가까운 클러스터를 선택
- 4. 해당 클러스터 내에서만 최근접 이웃 검색 수행
HNSW (Hierarchical Navigable Small World)
- 그래프를 이용한 멀티 레이어 네트워크 기반 검색 방법으로, 벡터 간의 관계를 그래프 형태로 저장하여 가장 유사한 벡터를 찾을 수 있도록 최적화
- 검색 과정
- 1. 벡터를 계층적 그래프로 변환
- 2. 가장 가까운 벡터에서 검색 시작
- 3. 가까운 벡터를 따라가면서 최적의 최근접 이웃 탐색
- 4. 정확도가 높은 유사 벡터를 반환
Flat은 벡터 검색을 수행할 때 모든 벡터를 저장하고, 검색 시 전체 데이터셋을 직접 비교하는 방식으로
정학도가 가장 높은 대신 데이터가 많아지면 속도가 느려짐
FAISS (Facebook AI Similarity Search)
- 장점: 빠른 근사 최근접 이웃 탐색(ANN), 오픈 소스 & 무료, GPU 지원 가능, 단순 로컬 실행 가능
- 단점: 클러스터 확장 불가 (로컬에서만 실행 가능)
- 소규모 프로젝트, 연구 개발에서 사용
ChromaDB
- 장점: 로컬에서 간단하게 사용 가능, 오픈소스 & 무료, Langchain과 호환됨
- 단점: 확장성 부족(대규모 벡터 검색 불가능), 클러스터 지원 없음
- 빠른 개발 및 로컬에서 프로토타입 제작할 때 사용
LangChain
- LLM과 외부 데이터를 쉽게 연결할 수 있도록 설계된 Python & JavaScript 라이브러리
- 다양한 LLM 지원, 프롬프트 관리, 체인 기능, RAG 구현, 에이전트 지원, 메모리 기능 등 다양한 기능을 지원함
체인
여러 개의 LLM 호출, 검색, API 요청 등을 연결하여 자동화된 AI 워크플로우를 구성하는 기능
에이전트
- LLM이 외부 도구(계산기, API, DB, 코드 실행 등)를 동적으로 선택하여 실행하는 시스템
- 사용자의 질문을 이해하고 필요한 도구를 자동으로 선택하여 실행한 후, 최종 답변을 반환하는 AI 워크 플로우
주요 구조
- LangChain 라이브러리: LLM 활용을 위한 기본 프레임워크
- LangChain 템플릿: 프롬프트 & 체인 등 다양한 템플릿 제공
- LangServe: LangChain 애플리케이션을 API로 배포
- LangSmith: LangChain 애플리케이션 디버깅 & 모니터링
LangChain으로 RAG 구현하기
RAG는 문서를 로딩 → 분할 → 벡터 변환 → 검색 → 생성의 과정이 핵심!
- RAG 최적화
- 벡터 검색 성능 최적화: Chunk size 조절, VectorDB 선택, 임베딩 모델 최적화 등
- 프롬프트 최적화: LLM이 검색된 문서를 잘 활용하도록 프롬프트를 조정
- 비용절감: LLM 호출 비용 최적화, 벡터 검색을 줄이고 캐싱을 활용
LangChain에서 제공하는 Retriever
Retriever: LangChain에서 사용자 질문에 대해 관련된 문서를 검색하는 인터페이스이자, RAG에서 검색을 담당하는 핵심 모듈 = LLM이 원하는 정보를 효율적으로 검색할 수 있도록 돕는 검색 모듈
'Python > 학습용' 카테고리의 다른 글
추천시스템 (2): 협업필터링 (0) | 2025.03.21 |
---|---|
LLM - RAG(2) (0) | 2025.03.20 |
연관 규칙 (2): Apriori 알고리즘 (0) | 2025.03.08 |
연관 규칙 (1): 이론, 평가척도 설명 (0) | 2025.03.07 |
Spark (4): 병렬처리 실습 (0) | 2025.03.05 |