IT

RAG Overview

esmile1 2024. 10. 3. 20:21

 

다음은 RAG(Retrieval-Augmented Generation)에 대한 Lance Martin의 강의 내용을 요약한 것입니다.

 

1. RAG의 개념과 중요성

 

RAG(Retrieval-Augmented Generation)는 사용자 지정 데이터와 대규모 언어 모델(LLM)을 결합하는 기술입니다. Lance Martin은 LangChain의 소프트웨어 엔지니어로, RAG의 구현 방법을 상세히 설명합니다.

 

RAG의 필요성

  • 대부분의 중요한 데이터는 비공개입니다.
  • LLM은 주로 공개 데이터로 훈련됩니다.
  • RAG를 통해 비공개 데이터를 LLM과 결합할 수 있습니다.

 

컨텍스트 윈도우의 진화

  • 1년 전: 4,000-8,000 토큰
  • 현재: 최대 100만 토큰까지 확장
  • 이는 수천 페이지의 텍스트를 LLM에 입력할 수 있음을 의미합니다.

 

2. RAG의 기본 구조

RAG는 크게 세 단계로 구성됩니다:

 

  1. 인덱싱(Indexing): 외부 데이터를 검색 가능한 형태로 저장
  2. 검색(Retrieval): 입력 쿼리와 관련된 문서 검색
  3. 생성(Generation): 검색된 문서를 기반으로 답변 생성

 

3. RAG 구현의 주요 구성 요소

 

3.1 쿼리 변환(Query Translation)

  • 쿼리 재작성(Query Rewriting)
  • 쿼리 분해(Query Decomposition)

3.2 라우팅(Routing)

  • 적절한 데이터 소스로 쿼리 전달 (예: 벡터 저장소, 관계형 DB)

3.3 쿼리 구성(Query Construction)

  • 자연어를 특정 데이터 소스에 맞는 형식으로 변환

3.4 인덱싱(Indexing)

  • 문서를 쉽게 검색할 수 있도록 처리
  • 다양한 임베딩 방법 사용

3.5 검색 후 처리(Post-Retrieval Processing)

  • 검색된 문서의 재순위화 또는 필터링

3.6 생성(Generation)

  • 검색된 문서를 기반으로 답변 생성

3.7 액티브 RAG(Active RAG)

  • 검색 및 생성 단계에서 피드백을 통한 개선
  • 문서 및 답변의 관련성 평가
  • 환각(Hallucination) 체크

 

4. 인덱싱(Indexing) 상세 설명

 

4.1 문서 처리 과정

  1. 외부 문서 로드
  2. 문서 분할
  3. 임베딩 생성
  4. 벡터 저장소에 저장

 

4.2 임베딩의 중요성

  • 텍스트를 숫자 벡터로 변환
  • 의미적 유사성 검색 가능

 

4.3 코드 예시

 

from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import Chroma embeddings = OpenAIEmbeddings() question = "What is task decomposition?" document = "Task decomposition is..." question_embedding = embeddings.embed_query(question) document_embedding = embeddings.embed_documents([document]) vectorstore = Chroma.from_documents([document], embeddings)

 

5. 검색(Retrieval) 과정

 

5.1 검색 원리

  • 쿼리와 문서를 동일한 벡터 공간에 투영
  • 유사성 검색을 통해 관련 문서 찾기

5.2 K-Nearest Neighbors (KNN) 검색

  • K 값: 검색할 이웃 문서의 수 지정

5.3 코드 예시

retriever = vectorstore.as_retriever(search_kwargs={"k": 1}) relevant_docs = retriever.get_relevant_documents("What is task decomposition?")

 

6. 생성(Generation) 단계

 

6.1 프롬프트 구성

  • 검색된 문서와 질문을 결합하여 프롬프트 생성

6.2 LLM을 통한 답변 생성

  • 구성된 프롬프트를 LLM에 입력하여 답변 생성

6.3 코드 예시

from langchain.chains import RetrievalQA from langchain.llms import OpenAI llm = OpenAI() qa_chain = RetrievalQA.from_chain_type(llm, retriever=retriever) result = qa_chain({"query": "What is task decomposition?"}) print(result["result"])

 

7. 고급 RAG 기법

 

7.1 멀티 쿼리 접근법

  • 하나의 질문을 여러 관점에서 재구성
  • 검색 성능 향상

7.2 RAG Fusion

  • 여러 쿼리 결과를 결합하여 최종 결과 도출

7.3 쿼리 분해

  • 복잡한 질문을 하위 질문으로 분해
  • 각 하위 질문에 대해 독립적으로 검색 및 답변 생성

7.4 Step-back 프롬프팅

  • 더 추상적인 상위 수준의 질문 생성
  • 광범위한 컨텍스트 파악에 유용

 

8. RAG의 미래와 장기 컨텍스트 LLM

8.1 장기 컨텍스트 LLM의 등장

  • 100만 토큰 이상의 컨텍스트 처리 가능
  • 전체 문서를 한 번에 처리할 수 있는 능력

8.2 RAG의 변화 방향

  • 정확한 청크 검색에서 전체 문서 처리로 전환
  • 문서 수준의 인덱싱 및 검색 중요성 증가

8.3 새로운 인덱싱 접근법

  • 다중 표현 인덱싱(Multi-representation Indexing)
  • 계층적 인덱싱(Hierarchical Indexing)

8.4 장기 컨텍스트 임베딩 모델

  • 32,000+ 토큰 용량의 임베딩 모델 사용
  • 전체 문서의 효과적인 임베딩 가능

 

9. 액티브 RAG와 자기 반영적 시스템

9.1 Self-RAG

  • 검색 결과의 관련성 평가
  • 필요시 쿼리 재작성 및 재검색

9.2 Corrective RAG (C-RAG)

  • 인덱스에 없는 정보에 대한 웹 검색 통합
  • 검색 결과의 다양성 및 정확성 향상

9.3 LangGraph를 이용한 구현

  • 복잡한 RAG 워크플로우 구축
  • 상태 기계(State Machine) 개념 적용

 

10. RAG 시스템 최적화

10.1 문서 그레이딩 시스템

  • 검색된 문서의 관련성 평가
  • 낮은 관련성 문서 필터링

10.2 환각 체크

  • 생성된 답변의 사실성 검증
  • 필요시 재생성 또는 추가 정보 검색

10.3 답변 관련성 확인

  • 생성된 답변이 원래 질문에 적절한지 평가

10.4 웹 검색 통합

  • 인덱스 내 정보가 불충분할 경우 웹 검색 수행

 

11. RAG 구현 시 고려사항

 

11.1 성능과 지연 시간의 균형

  • 작은 모델을 사용한 빠른 그레이딩
  • 필요에 따라 더 큰 모델로 최종 생성

11.2 보안 및 인증

  • 문서 접근 권한 관리
  • 사용자별 맞춤형 검색 범위 설정

11.3 로깅 및 모니터링

  • RAG 프로세스의 각 단계 추적
  • LangSmith 등의 도구를 이용한 시각화 및 디버깅

 

12. RAG vs 에이전트

 

12.1 RAG의 장점

  • 정의된 워크플로우에 적합
  • 더 작고 빠른 모델 사용 가능
  • 높은 신뢰성

12.2 에이전트의 장점

  • 더 유연한 워크플로우
  • 개방형 의사 결정 가능
  • 장기 계획 문제에 적합

12.3 선택 기준

  • 문제의 성격에 따라 RAG 또는 에이전트 선택
  • 때로는 두 접근법의 결합이 최적

 

결론

 

RAG는 계속 진화하고 있으며, 장기 컨텍스트 LLM의 등장으로 새로운 가능성이 열리고 있습니다. 문서 중심의 접근법, 자기 반영적 시스템, 그리고 유연한 워크플로우 구성은 RAG의 미래를 형성할 중요한 요소들입니다. 개발자들은 이러한 트렌드를 주시하며, 각 사용 사례에 가장 적합한 RAG 구현 방식을 선택해야 할 것입니다.