Organizations | 🔗 URL |
---|---|
Teddynote | https://wikidocs.net/book/14314 |
Langchain | https://python.langchain.com/docs/introduction/ |
Build a Retrieval Augmented Generation (RAG) App | 🦜️🔗 LangChain
load data : Document Loaders (pandas, polars 로 대체 가능)
from langchain_community.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(
... # <-- Integration specific parameters here
)
data = loader.load()
Split documents : Text splitters 를 이용하여 document를 더 작은 chunks로 분할. Text splitter는 아래와 같이 작업한다.
code
Store & Indexing
Embedding : document object로 생성된 각 large chunk들을 vector representation으로 생성해야 한다. 적절한 embedding model을 사용하면 된다.
+) Caching Embeddings : 임베딩을 캐싱하여 재연산을 방지.
Vector Store : 문서에 대한 임베딩 벡터를 저장하고 이를 효과적으로 retrieve하는 DataBase이다. 이때 임베딩 벡터에 대한 metadata(index)도 같이 저장할 수 있고, metadata는 similarity search 이전에 먼저 필터링으로 작용하여 document 검색을 편리하게 해준다.
+) How to create and query vector stores : https://python.langchain.com/v0.2/docs/how_to/vectorstores/
Retrieve : user input을 query로 입력받아 vector DB로부터 관련된 chunk(split)들을 불러온다.
Vector Store로부터 Retriever를 객체화하는 방법
VectorStoreRetriever
객체이다.# 미리 저장한 Vector DB 디렉토리에서 불러오기
chroma_db = Chroma(
persist_directory='./doc_test_db/', # vector db 로컬 디렉토리
embedding_function=hf # 임베딩 모델 정의
)
# retriever 객체화
chroma_retriever = chroma_db.as_retriever()
chroma_retriever.invoke(query)
로 바로 사용할 수도 있다.
Retriever의 search type 설정 방법
chroma_db.as_retriever(search_type=)
파라미터를 통해 다양한 retrieve 알고리즘을 설정할 수 있다.
‘similarity’
: 코사인 유사도 또는 유클리드 거리를 사용.‘mmr’
(maximum_marginal_relevance_search) : query와 document 간 유사도 뿐만 아니라 document간 유사도도 측정하여 중복되는 문서가 없도록, 다양성을 높인다.‘similarity_score_threshold’
: 해당 값으로 설정하면 search_kwargs를 필수로 전달해야 한다.threshold score와 top-k 문서 등 search parameters 설정 방법
search_kwargs
파라미터를 전달하면 추가적인 설정을 할 수 있다.
score_threshold 값을 넘는 top-K (default=4) 개 문서만 반환된다.
chroma_retriever = chroma_db.as_retriever(
search_type="mmr 또는 similarity_score_threshold", search_kwargs={"k":5, "score_threshold": 0.5}
)
Generate : ChatModel, LLM 을 활용하여 답변을 생성한다.