LangchainJS 리뷰 #2

langchain의 memory와 chain에 대해 살펴 봅니다.

2023-07-08

Memory

Getting Started: Memory | 🦜️🔗 Langchain

대화에 필요한 데이터를 가져오고 저장합니다. 대화형 프롬프트의 경우, 메모리를 사용하여 이전 대화 내용을 저장합니다. Stateless 한 LLM의 경우 이 대화 이력을 프롬프트와 같이 전달하여 맥락에 맞는 응답을 유도합니다. 메모리는 한 대회의 이력을 가지기 때문에, 다른 chain 간에 같은 동일한 인스턴스를 공유하지 않도록 유의합니다.

Chains

StuffDocumentsChain, MapReduceDocumentsChain

여러 문서로 부터 질의를 할 수 있는 StuffDocumentsChain, MapReduceDocumentsChain이 있습니다.

RefineDocumentsChain

RefineDocumentsChain은 이전 응답과 다음 문서를 프롬프트에 대입하여 최종 응답을 강화 합니다.

다음은 장문의 텍스트 데이터로 부터 질의하는 과정입니다.

  1. 텍스트 로드
  2. 텍스트를 처리 단위(Document)로 분할
  3. 각 문서를 embedding 후 vector store에 저장
  4. 질의 embedding
  5. 질의 embeeding과 문서 embedding 사이의 consine similarity 검색
  6. Top 4 선정
  7. RefineDocumentsChain를 사용하여 top 4 문서의 응답을 강화
  8. 최종 응답 반환

ml-distance - npm

RetrievalQAChain

RetrievalQAChain은 위와 같은 문서의 embedding, 유사도 검색, 질의를 모두 수행하는 기능을 가지고 있습니다.

마치며

메모리를 사용하는 경우, 대화 내용을 저장하고 맥락의 전달을 위해 이를 포함합니다. 따라서 대화가 길어질 수록 프롬프트의 양은 늘어납니다. 주어진 미션에 부합하는 결과도 중요하지만, 예상치 못한 과도한 호출로 이어지지 않도록 프롬프트 관리에 신경써야 합니다.

문서를 vector store에 indexing 하는 과정에서 embedding API를 호출합니다. 따라서 문서를 읽어오는 수 만큼 과금을 합니다. 대량의 문서의 경우 장기 저장가능한 vector store 구현체를 사용하여 비용적, 시간적 사용을 줄이도록 고민해야 합니다.

StuffDocumentsChain은 단순하게 전체 문서를 전달하여 프롬프트를 구성하는 반면, RefineDocumentsChain은 순차적으로 응답을 개선하는 방식을 사용하고 있습니다. 두 방법 모두 vector store로 부터 찾은 문서의 개수 만큼 프롬프트를 구성함으로 관련 문서를 최대 몇개를 찾을 것인지(디폴트는 4)등을 고민하여 적용해 보도록 합니다.

그 밖의 많은 chain들이 있지만 오늘은 여기까지 정리 하였습니다. 다음에는 Agent에 대해서 리뷰할 예정입니다.

Loading script...