https://www.inflearn.com/courses/lecture?courseId=333326&type=LECTURE&unitId=212606

RAG는 모델이 학습 데이터에 포함되지 않은 외부 데이터를 실시간 검색을 통해 답변을 생성하도록 하는 기법을 말한다. 할루시네이션을 방지하고, 모델이 최신정보를 반영하게끔 할 수 있음.

RAG모델은 기본적으로 다음 구조를 갖는다.

  1. 검색 단계 - 사용자의 질문, 컨텍스트를 입력으로 받아 외부 데이터를 검색한다. 이 때 검색 엔진이나 데이터베이스 등 다양한 소스에서 필요한 정보를 찾아낸다.
  2. 생성 단계 - 검색된 데이터를 기반으로 LLM 모델이 사용자의 질문에 대해 답변을 생성함.

실습

!pip install -q langchain langchain_openai langchain_community tiktoken chromadb

벡터 스토어로는 chromadb를 이용한다.

image.png

RAG 파이프라인 실습

데이터 불러오기 → 텍스트 split → 인덱싱 → 검색 증강 → 생성의 단계를 거칠 것임.

# Data Loader - 웹 페이지 데이터 가져오기
from langchain_community.document_loaders import WebBaseLoader

# 위키피디아 환영합니다.
url = '<https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%ED%99%98%EC%98%81%ED%95%A9%EB%8B%88%EB%8B%A4>'
loader = WebBaseLoader(url)

# 웹 페이지 텍스트 -> Documents
docs = loader.load()

docs

image.png

데이터를 가져왔으니 이를 이제 split해보자.

# Data Loader - 웹 페이지 데이터 가져오기
from langchain_community.document_loaders import WebBaseLoader

# 위키피디아 환영합니다.
url = '<https://ko.wikipedia.org/wiki/%EC%9C%84%ED%82%A4%EB%B0%B1%EA%B3%BC:%ED%99%98%EC%98%81%ED%95%A9%EB%8B%88%EB%8B%A4>'
loader = WebBaseLoader(url)

# 웹 페이지 텍스트 -> Documents
docs = loader.load()

# Text Split (Documnets -> samll chunks)
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)

print(len(splits))
print(splits[3])