Retriever는 비정형 쿼리가 주어지면 문서를 반환하는 인터페이스입니다. 벡터 저장소보다 더 일반적입니다.
Retriever는 문서를 저장할 필요 없이 단지 반환(또는 검색)만 할 수 있습니다. - Langchain Document
쉽게 말해, Retriever는 검색을 쉽게 할 수 있도록 구성된 모듈입니다. 이를 통해 손쉽게 문서를 검색할 수 있도록 하고 이를 기반으로 LLM과 대화할 수 있도록 합니다.
랭체인의 Retriever의 RAG의 대부분의 구성요소를 아우르며, 구성 요소 하나하나가 RAG의 품질의 좌우합니다.
Chain의 종류 4가지
Stuff Documents Chain
분할된 텍스트 청크를 Context에 그대로 주입합니다. 토큰 이슈가 발생할 수 있어 주의를 요합니다.

Map reduce documents chain
분할된 텍스트 청크마다 요약을 생성하고, 이를 합친 최종 요약을 생성하기 위해 다수 호출이 필요하여 속도가 느립니다.

Refine documents chain
분할된 텍스트 청크를 순회하면서 누적 답변을 생성합니다. 품질이 뛰어나지만 시간이 오래 걸립니다.
(오래걸려서 잘 쓰이진 않음)

Map re-rank documents chain
분할된 텍스트 청크를 순회하면서 누적 답변을 생성합니다. 품질이 뛰어나지만 시간이 오래 걸립니다.
Answer와 Score를 같이 보냄. (Score는 답변과 질문 사이의 연관도를 평가하는 점수, 높은 점수 하나만 출력함.)

실습
https://colab.research.google.com/drive/1S3jKF6Jofvl48fHUFqQwS-0iWMgl-pWl?usp=sharing
# !pip install chromadb tiktoken transformers sentence_transformers openai langchain pypdf
import os
import openai
import tiktoken
tokenizer = tiktoken.get_encoding("cl100k_base")
def tiktoken_len(text):
tokens = tokenizer.encode(text)
return len(tokens)
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("/content/drive/MyDrive/LLM자료/[이슈리포트 2022-2호] 혁신성장 정책금융 동향.pdf")
pages = loader.load_and_split()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50, length_function = tiktoken_len)
texts = text_splitter.split_documents(pages)
from langchain.embeddings import HuggingFaceEmbeddings
model_name = "jhgan/ko-sbert-nli"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': True}
hf = HuggingFaceEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs
)
docsearch = Chroma.from_documents(texts, hf)
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
openai = ChatOpenAI(model_name="gpt-3.5-turbo",
streaming=True, callbacks=[StreamingStdOutCallbackHandler()],
temperature = 0)
qa = RetrievalQA.from_chain_type(llm = openai,
chain_type = "stuff",
retriever = docsearch.as_retriever(
search_type="mmr",
search_kwargs={'k':3, 'fetch_k': 10}),
return_source_documents = True)
query = "혁신성장 정책금융에 대해서 설명해줘"
result = qa(query)
print(result)
'LLM > LLM 공부' 카테고리의 다른 글
Retrieval - Vectorstores (0) | 2025.03.07 |
---|---|
Retrieval-Text Embeddings (0) | 2025.03.07 |
Retrieval - Text Splitters (0) | 2025.03.07 |
Retrieval - Document Loaders (0) | 2025.03.07 |
PromptTemplate에 대해 (0) | 2025.03.07 |