3️⃣Retrieval

LangChain: Retrieval

#%pip install unstructured pypdf pdf2image docx2txt pdfminer.six

1. Data Loaders

1. Document Loaders:

  • 다양한 형식의 문서를 불러오고 이를 Langchain에 결합하기쉬운 텍스트 형태로 변환하는기능.

  • 이를 통해 사용자는 txt.형식의 문서뿐만아니라 pdf,word,ppt,xlsx,csv 등 거의 모든형식의 문서를 기반으로 LLM을구동

2. URL Document Loader:

  • Langchain은 웹에 기록된 글도 텍스트형식으로 가져와 LLM에 활용 가능

  • 대표적인 URLLoader는 WebBaseLoader와 Unstructured URLLoader가 있음

1.1 Document Loaders

from langchain.document_loaders import WebBaseLoader

loader = WebBaseLoader('https://n.news.naver.com/mnews/article/092/0002307222?sid=105')
data = loader.load()

print(data[0])

1.2 PDF Document Loader

1.3 Word Document Loader

1.4 CSV Document Loader

2. Text Splitter

  • TextSplitter는 특정기준을 통해 텍스트를 청크로 나누는 모듈

  • CharacterTextSplitter는 특정구분자를 기준으로 텍스트를 청크로 분할

  • 토큰 제한이슈를 우회하여 Context를 학습

2-1 CharacterTextSplitter

가장 간단한 텍스트 분할기로 특정구분자를 기준으로 텍스트를 여러개로 분할

2.2 RecursiveCharacterTextSplit

  • RecursiveCharacterTextSpli은 재귀적으로 문서를 분할

  • 먼저 '\n\n'(줄바꿈)을 기준으로 문서를 분할하고 이렇게 나눈 청크가 여전 히 너무 클 경우에 ''(문장 단위)을 기준으로 문서를 분할

  • Chunksize가 충분히 작아지지 않았다면 문장을 단어 단위로 자르게 되지만, 그렇게까지 세부적인 분할은 자주 필요하지 않음

  • 다수의 청크를 LLM에 활용함에 있 어서 맥락이 유지되도록 하기에 용이

2.3 Other Splitter: Language

  • 문서는 일반적으로 TextSplitter로 분할 사용 가능

  • 예외적으로 코드, latex 등의 컴퓨터 언어로 작성 문서는 Language사용

  • Python, Latex, HTML, Code 등 다양한 문서 분할

2.4 토큰 단위 텍스트 분리기

tiktoken: https://github.com/openai/tiktoken

  • Tokenize는 LLM이 소화할 수 있게끔 Chunksize로 제한하는 것이 필수

  • Text를 Token 단위로 분할하면 최대한 많은 문장을 포함하도록 chunksize로 textsplit 가능

  • OpenAl의 GPT는 tktoken 라이브러리 사용하여 tokenization 실행

  • tiktoken encoder를 기반으로 Text tokenization을 하고, Number of token을 기준으로 textsplit 필수 요소

3. TextEmbedding

  • 사전학습 임베딩 모델에는 대표적으로 OpenAI에서 제공하는 ada(현재 002) 모델과, HuggingFace의 모델이 있음

  • 사용 목적과 요구사항에 따라 적절한 임베딩을 고르는 것은 RAG의 가장 중요한 요소

구분
제공기업
모델명
장점

영문 임베딩 모델

OpenAI Cohere Amazon

text-embedding-ada-002 embed-multilingual-v2.0 titan-embed-text-v1

- 사용하기 편리하며 비용 효과적 - API 사용이후로 보안 우려 없음 - 학교 등 많은 어학원 지원 - GPU 없이도 빠른 임베딩

한글 임베딩 모델

HuggingFace

bge-large-en-v1.5 multilingual-e5-large instructor-e5-large ko-sbert-nli KoSimCSE-roberta-multitask

- 문맥과 다소 어렵을 사용 - 유연성 적용하고 보안 우수 - 모델마다의 언어가 다름 - GPU 없이, 느린 임베딩

3.1 OpenAI Embeddings

  • langchain 모듈에서 OpenAIEmbeddings 사용하면 text-embedding-ada-002으로 token 비용으로 사용

3.2 HuggingFace Embeddings

  • Huggingface Embedding은 hub에서 model을 불러와 무료로 사용가능하지만 OpenAI Embedding에 비해 속도가 느림

  • 단 다양한 한글 embedding을 사용하면 한글 RAG에 장점

3.3 한국어 사전학습 모델 임베딩: ko-sbert-n

4. Vector Store

  • VectorStore는 데이터를 Embedding 처리 후 RAG를 위하여 이를 저장하는 Vector DB

  • Vector DB는 Embedding Data를 인덱싱하여, input으로 받아들이는 query와의 유사도를 빠르게 출력

4.1 ChromaDB

https://docs.trychroma.com/getting-started

  • 텍스트와 임베딩 함수를 지정하여 from_documents 함수에 보내면,지정된 임베딩 함수를 통해 텍스트를 벡터로 변환하고,이를 임시DB로 생성

  • similarity_search 함수에 쿼리를 지정해주면 이를 바탕으로 가장 벡터유사도가 높은 벡터를 찾고 이를 자연어 형태로 출력

4.2 FAISS

https://github.com/facebookresearch/faiss/wiki

  • Facebook Al 유사성 검색(Faiss)은 고밀도 벡터의 효율적인 유사성 검색 및 클러스터링을 위한 라이브러리

  • 모든 크기의 벡터 집 합에서 검색하는 알고리즘이 포함되어 있으며, RAM에 맞지 않을 수 있는 벡터까지 검색 가능

  • 평가 및 매개변수 조정을 위한 지원 코드도 포함

5. Retriever

https://python.langchain.com/docs/modules/data_connection/

  1. Stuff Documents

  2. Map Reduce

  3. Refine

  4. Map Rerank

5.1 chain_type='stuff'

Stuffing은 모든 관련 데이터를 프롬프트에 context로 채워 언어 모델에 전달

  • 장점: LLM을 한 번만 호출합니다. 텍스트를 생성할 때 LLM은 모든 데이터에 한 번에 액세스

  • 단점: LLM에 입력 가능한 최대 컨텍스트 길이가 정해져 있어 큰 문서를 Retrieval 할 경우 chunksize를 초과하여 동작하지 않음

5.2 chain_type='map_reduce'

Map Reduce는 각 chunk에 대해 초기 프롬프트를 실행(Summary, Q&A 시에 chunk에 기반하)하고 다른 프롬프트를 실행하면 모든 초기 출력을 결합

  • 장점: stuff 보다 더 큰 문서로 확장하여 개별 문서에 대한 LLM 호출은 독립적이므로 병렬화

  • 단점: stuff 보다 훨씬 더 많은 LLM 호출되고, 마지막 결합 호출 중에는 일부 정보 손실 우려

5.3 chain_type='refine'

Refine은 첫 번째 chunk에서 초기 프롬프트를 실행하여 일부 출력을 생성하, 이 출력을 다음 문서와 함께 전달하는 기반으로 출력을 구체화하도록 LLM에 요청

  • 장점: 더 관련성 높은 context를 가져올 수 있으며, map reduce 보다 손실이 적음

  • 단점: stuff 보다 더 많은 LLM 호출이 요구되며, 이 호출은 독립적이지 않아 map reduce처럼 병렬 실행이 불가

5.4 chain_type='map_rerank'

Map-Rerank는 각 chunk의 초기 프롬프트를 실행하여 작업을 완료 후 답변이 얼마나 확실한지 부여한 점수에 따라 응답의 순위가 매겨 가장 높은 점수를 반환

  • 장점: map reduce 장점과 같지만, 호출이 더 적은 장점이 있음

  • 단점: 문서 간의 정보를 결합이 불가하지만 하나의 문서에 데한 하나의 간단한 답변을 사용할 때 가장 유용

Last updated