본문 바로가기
개발 노트/초거대 언어 모델(LLM)

파이썬 기반 RAG 구현

by LeeInGyu 2025. 8. 15.

파이썬 기반 RAG 구현

RAG 란?

RAG의 의미

  • Retrieval-Augmented Genearation
  • 검색 증강 생성
  • 대규모 언어 모델(LLM)의 응답을 생성하기 전, 신뢰할 수 있는 지식 베이스를 참조하도록 하는 프로세스

전이학습과 RAG의 차이점

  • 전이학습은 모델을 추가 학습 해야할 필요가 있지만, RAG는 지식 베이스를 추가할 뿐 모델의 학습이 필요하지 않다.

LLM의 단점과 RAG의 필요성

  • LLM 모델의 특성상 응답을 예측할 수 없다.
  • 특히 제공할 답변이 없을 때 허위 사실을 제공하기도 한다.
  • 따라서 RAG는 이러한 LLM의 단점들을 보완할 수 있다.

2. RAG의 워크플로

1단계: 텍스트 파싱

  • 기존의 텍스트를 가져오거나, PDF 파일등에서 텍스트를 추출한다.
  • 추출된 텍스트는 의미없는 부분(띄어쓰기 2개, 과도한 개행문자)를 전처리한다.

2단계: 파싱 데이터 청킹(chunking)

RAG는 한번의 질의(query)을 답변하기 위해 제공된 모든 지식 베이스를 사용하지 않고, 특정 청크(chunk)만 사용한다.

  • 1단계에서 전처리된 텍스트는 청크 단위로 쪼갠다.
  • RAG는 이 청크 중 현재 질의와 가장 유사한 청크만을 사용한다.
  • 청킹에 사용되는 매개변수는 청크 크기(chunk size), 청크 오버랩(chunk overlap)
    • 청크 크기(chunk size): 청크 단위의 크기
    • 청크 오버랩(chunk overlap): 크기로 쪼갰을 때 맥락이 이어지도록 겹치는 크기
  • 청킹한 데이터는 벡터(vector) 데이터베이스에 저장한다.

3단계: 시스템 프롬프트 작성

아래 순서에 따라 사용자의 질문에 답변해주세요.
1. [Context]를 참고해서 사용자의 질문에 대한 답을 생성해주세요.
2. 1에서 생성한 답이 문서에 존재하는지 검토 후 답변해주세요.

[Context]
{results}
  • LLM 모델에 질문할 질의를 생성한다.
  • 대략적으로 위에 질의 방식으로 시스템 프롬프트를 작성한다.
  • 그리고 내가 궁금한 내용을 질의하면 된다.

4단계: 질의와 유사한 청크 검색

  • LLM을 실행하기 전, 3단계의 질의와 가장 유사한 청크를 벡터 데이터베이스에서 검색한다.
  • 이렇게 반환된 청크는 시스템 프롬프트의 [Context] 부분에 작성하여 LLM 모델에 삽입하여 질의한다.

(선택) 5단계: 답변 평가

  • 이 단계를 하지 않아도 RAG를 사용한 것이다.
  • 하지만 활용을 위해서는 꼭 필요한 단계로 질의와 유사성이 있는 청크를 찾았는지, 올바른 대답을 했는지 등을 검토하고, 평가한다.
  • 평가 대시보드로는 langfuse가 있다.

부록

벡터 데이터베이스란?

  • 기본적으로 최근접 이웃 회귀(K-NN, K Nearest Neighbors) 알고리즘을 사용해 저장한다.
  • N차원에서 가장 가까운 이웃을 찾는 기능을 제공한다.
  • 벡터 데이터베이스는 질의와 가장 유사한 데이터를 찾을 수 있게 해준다.
  • 벡터 데이터베이스 라이브러리는 파이스(Faiss), 크로마(Chroma)가 있다.

프롬프트 체이닝

# llm_model: LLM 모델 객체
# system prompt: 시스템 프롬프트
chain_llm_model = system_prompt | llm_model

chain_llm_model.invoke() # 질의
  • 작성한 프롬프트와 LLM 모델을 체이닝(chaining) 하여, 질의를 하는 방식을 프롬프트 체이닝이라 한다.
  • LLM 모델, 시스템 프롬프트, 질의 세 개를 모두 하나로 합치는 것이다.

참고자료