🔻Documents

Organizations 🔗 URL
Teddynote https://wikidocs.net/book/14314
Langchain https://python.langchain.com/docs/introduction/

🔻LangChain RAG Basic Tutorial

Build a Retrieval Augmented Generation (RAG) App | 🦜️🔗 LangChain

🔸Indexing

image.png

  1. load data : Document Loaders (pandas, polars 로 대체 가능)

    from langchain_community.document_loaders.csv_loader import CSVLoader
    
    loader = CSVLoader(
        ...  # <-- Integration specific parameters here
    )
    data = loader.load()
    
  2. Split documents : Text splitters 를 이용하여 document를 더 작은 chunks로 분할. Text splitter는 아래와 같이 작업한다.

    1. 텍스트를 의미있는 수준의 작은 chunk로 분할한다. (때로는 하나의 문장을 하나의 chunk로 매칭)
    2. chunk를 묶어 하나의 larger chunk로 결합한다. (함수로 설정한 크기의 larger chunk로 묶는 듯)
    3. larger chunk 간의 문맥을 유지하기 위해 일부 중복된 chunk를 포함하면서 b과정을 반복하며 larger chunk들을 만든다.
  3. Store & Indexing

    1. Embedding : document object로 생성된 각 large chunk들을 vector representation으로 생성해야 한다. 적절한 embedding model을 사용하면 된다.

      +) Caching Embeddings : 임베딩을 캐싱하여 재연산을 방지.

    2. 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/

      • Chroma Vector DB를 이용하는 방법
      • Similarity Search
      • Async Operations

🔸Retrieval and Generation

image.png

  1. Retrieve : user input을 query로 입력받아 vector DB로부터 관련된 chunk(split)들을 불러온다.

    1. Vector Store로부터 Retriever를 객체화하는 방법

      • 해당 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) 로 바로 사용할 수도 있다.

    2. Retriever의 search type 설정 방법

      chroma_db.as_retriever(search_type=) 파라미터를 통해 다양한 retrieve 알고리즘을 설정할 수 있다.

      • ‘similarity’ : 코사인 유사도 또는 유클리드 거리를 사용.
      • ‘mmr’ (maximum_marginal_relevance_search) : query와 document 간 유사도 뿐만 아니라 document간 유사도도 측정하여 중복되는 문서가 없도록, 다양성을 높인다.
      • ‘similarity_score_threshold’ : 해당 값으로 설정하면 search_kwargs를 필수로 전달해야 한다.
    3. 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}
      )
      
  2. Generate : ChatModel, LLM 을 활용하여 답변을 생성한다.

🔸Basic SetUp

  1. langchain 및 LLM 등 api 설정