RAG 시스템 구축 - Songwooseok123/Study_Space GitHub Wiki

RAG 시스템 구축 프레임워크

LangChain 및 LlamaIndex 비교: 주요 차이점 LlamaIndex와 LangChain은 모두 사용자가 RAG 지원 LLM 애플리케이션을 구축할 수 있도록 허용하지만 프로젝트에 대해 두 가지의 고유한 접근 방식을 제공합니다. LlamaIndex는 관련 정보를 검색하기 위해 데이터베이스를 쿼리할 때 뛰어난 반면, LangChain은 유연성이 더 뛰어나 다양한 사용 사례에 활용할 수 있으며, 특히 모델과 도구를 워크플로에 연결할 때 유용합니다.

LlamaIndex를 선택해야 하는 경우

LlamaIndex는 가벼운 개발 리프트를 사용하는 간단한 RAG 애플리케이션에 이상적입니다. 의미적 관련성을 기반으로 효율적이고 정확한 데이터 검색에 탁월합니다. 다음과 같은 강점이 있습니다.

  • 검색 앱: 효율적인 데이터 저장과 의미론적 유사성에 기반한 데이터 검색에 중점을 둔 LlamaIndex는 간소화된 RAG 애플리케이션을 위한 좋은 선택입니다. 사용 사례에는 내부 조직 참조 시스템과 지식 관리가 포함됩니다.

  • 속도 및 정밀도: 고급 검색 알고리즘을 통해 LlamaIndex는 높은 수준의 정확도로 효율적인 데이터 검색에 최적화되어 있습니다.

  • 최소화되고 간소화된 앱 개발: LlamaIndex의 집중적인 노력 덕분에 효율적인 앱 제작 프로세스가 가능합니다. 사용자는 최소한의 시간으로 RAG 애플리케이션을 시작하고 실행할 수 있습니다.

  • 계층적 문서: LlamaIndex는 문서 계층 구조가 가장 중요한 기업 내에서 지식 관리 시스템을 구현하는 것처럼 텍스트가 많은 프로젝트에 적합한 선택입니다.

LangChain을 선택해야 하는 경우

LangChain은 다목적 사용, 사용자 지정 가능성 및 다양성에 중점을 두어 더 광범위한 사용 사례로 이어집니다. 사용자는 단일 사용자 인터페이스 내에서 프로젝트의 요구 사항에 맞게 여러 모델과 도구를 연결할 수 있습니다.

LangChain의 장점은 다음과 같습니다.

  • 다양한 사용 사례: LangChain은 LLM, 도구 및 통합의 샌드박스이며, 사용자는 특정 프로젝트 요구 사항에 맞게 이들을 서로 연결할 수 있습니다.

  • 멀티모달 데이터 소스: LlamaIndex가 이미지와 텍스트를 지원하는 반면, LangChain의 미디어 지원은 훨씬 더 다양합니다. LangChain에서 생성된 앱은 이미지 및 PDF와 함께 온라인 비디오 및 API의 데이터를 로드할 수 있습니다.

  • 세부적인 제어: LangChain의 앱 생성에 대한 단계별 접근 방식은 사용자에게 프로세스의 각 체인의 모든 단계에서 기능을 최대한 제어할 수 있는 권한을 제공합니다.

  • 컨텍스트 유지: 정교한 메모리 관리 능력으로 LangChain에서 생성된 앱은 이전 상호 작용을 참조하고 긴 대화에서도 정확성을 유지할 수 있습니다.

  • 복잡한 쿼리와 데이터 구조: LlamaIndex가 의미적 유사성을 위해 구축된 반면, LangChain은 사용자가 키워드 검색을 추가하는 등의 검색 기술을 결합할 수 있도록 허용합니다. 또한 모듈식 인터페이스, 멀티모달 지원, 다양한 통합 기능으로 복잡한 데이터 구조를 더욱 효과적으로 처리할 수 있습니다.

출처: https://www.ibm.com/kr-ko/think/topics/llamaindex-vs-langchain

  • Alli
  • OpenAI Assistant
  • Cohere
  • Anything LLM
  • Upstage

문서 로딩 및 전처리

  • PDF 로더로 문서 로드하고
  • textsplitter로 chunk 나누고
  • embedding 모델 사용해서 vector store 구축까지 하는 단계

PDF 로더

  • PyPDFLoader

    • Langchain의 기본 pdf 로더
    • ERROR:pypdf._cmap:Advanced encoding /KSCpc-EUC-H not implemented yet 발생 -> 밑의 PyMuPDFLoader 사용으로 문제 해결
  • PyMuPDFLoader

    • 한국어에 강하고 처리 속도 빠름
    • 특수문자 인코딩에 강함
  • 로더로 pdf 읽은 후 page 별 분할

loader = PyMuPDFLoader(path)
docs = loader.load_and_split() # PDF를 페이지별 Document 리스트로 분리

Chunking

  • MarkdownTextSplitter : 마크다운 문법 인식 및 문서 구조를 인식하여 자연스럽게 분할
  • RecursiveCharacterTextSplitter : 단순 길이 기준
  • Contextual chunking

Vector store

  • Chroma
    • searchtype 인자에 bm25가 없음. 따라서 따로 구현하거나 불러와서 사용해야됨
  • FAISS

Embedding model

  • 한국어 강한 모델들

이미지와 표 처리

  • HURIDOCS/pdf-document-layout-analysis

Retriever

검색방법

전형적인 RAG 검색방법

Query <-> Chunk_from_document 비교

HyDE

  • https://aclanthology.org/2023.acl-long.99/
      1. 사용자의 질문 입력: 사용자가 특정 질문을 입력한다.
      2. 가상 문서 생성: 질문을 기반으로 LLM을 사용하여 관련성이 높은 가상의 문서를 생성한다.
      3. 임베딩 생성: 생성된 가상 문서를 임베딩 모델로 벡터화한다.
      4. 유사도 비교 및 검색: 생성된 벡터와 데이터베이스 문서의 벡터 간 유사도를 계산하여 가장 관련성이 높은 문서를 반환한다

HyQE

Re-ranker

Generation

  • prompt 템플릿
    • rlm/ rag-prompt

평가

RAG 평가 방법 정리

효율적인 추론

Pre-filtering

검색 풀 미리 줄이기

  • 실험 결과 효과 있음
  • BERT 같은 Classifier
    • 데이터 증강 필요
  • 혹은 LLM 활용가능
    • 문서에 대한 메타 데이터 및 설명 or 요약

Prompt caching

  • 반복적으로 사용되는 프롬프트를 서버에 저장하여, 이후 동일한 프롬프트가 다시 들어왔을 때 이를 빠르게 처리하는 기능
  • anthropic 문서 참고
⚠️ **GitHub.com Fallback** ⚠️