파이썬 기반 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 모델, 시스템 프롬프트, 질의 세 개를 모두 하나로 합치는 것이다.
참고자료
- AWS: RAG란?
- AWS: 벡터 데이터베이스란?
- Github: RAG-DEMO
- LangChain: LLM Chain