summ의 블로그

[Langchain] retrieval augmented generation 본문

langchain

[Langchain] retrieval augmented generation

summ._ 2024. 9. 5. 09:11

retrieval augmented generation

 

거대언어

 

  • hallucination 환각 문제 발생
  • 거대언어의 문제점: 최신 정보의 부재
  • -> 극복방안: 분야의 제한 없이 광범위한 주제의 질문을 받고 답변하는 질의응답 시스템을 응용해서 RAG
  • 거대언어 이전: Q&A쌍을 만들어 둠
    • 쿼리 들어오면 제일 유사한 쿼리를 찾아냄. ex) 코사인 유사도이용 후 tf-idf를 이용한 벡터형으로 변환하여 저장

 

RAG

 

: 검색된 정보를 바탕으로 언어 모델이 텍스트를 생성하는 방식으로 작동

  • 수집한 데이터를 일정 단위(문서 혹은 그보다 작은 단위)로 임베딩(Document Indexing)
  • 쿼리가 들어오면 임베딩하고 수집된 데이터 임베딩과 유사도를 비교해 가장 유사한 데이터 검색(Retriever)
  • 쿼리 + 데이터(문서)로 프롬프트를 작성해 LLM으로부터 결과를 받음(Generator)

 

구성 요소
  • Document loaders: 대상 문서 읽어오기
  • Text Splitting: 문서를 chunk 단위로 splitting
  • Text Embedding: 벡터로 임베딩
  • Vector Stores: 벡터(+원본) 저장
  • Retrievers: 쿼리에 대해 유사벡터 / 문서검색 및 반환

 

document loader

 

from langchain.document_loaders import TextLoader
loader = TextLoader('.txt')
documents = loader.load() # Document 객체 리스트를 반환

 

 

text splitting 종류 

 

  • Character Splitting: 문서를 n개의 문자 단위로 split
  • Recursive Character Text Splitting: chunk size를 넘지 않는 범위에서 separator 기준으로 분리
  • Document Specific Splitting: Level 2를 기반으로 하여, 문서의 종류에 따라 특성에 맞게 각기 다른 separator 적용
  • Semantic Splitting: 하나의 Chunk가 의미적으로 최대한 유사하도록 split. 유사도를 계산함
  • Agentic Splitting: 첫 문장의 주제 파악 후 현재 문장의 주제를 파악. 이전 문장의 주제와 비교해서 동일하면 chunk 유지하며 진행. 주제가 달라지면 새로운 chunk 생성. 2로 돌아가서 마지막 문장까지 반복

* 보통 2를 제일 많이 사용해보인다.

 

Text Embedding

 

: 텍스트 데이터를 숫자 벡터로 변환

 

Vector Store

 

  • 임베딩 벡터 저장
  • query에 대해 가장 유사한 벡터를 반환하는 retrieve 기능을 함께 제공
  • query와 유사한 문서의 내용을 store에 검색해서 이를 바탕으로 답변을 생성
  • ids: 쿼리된 문서들의 고유 ID를 포함하는 리스트
  • distances: 쿼리된 문서들과 입력 쿼리 문서 간의 유사도 점수(거리). 거리 값이 작을수록 두 문서가 유사함
  • metadatas: 쿼리된 문서들의 메타데이터
  • embeddings: 쿼리된 문서들의 임베딩 벡터를 포함하는 리스트
  • documents: 쿼리된 문서들의 실제 텍스트 내용을 포함하는 리스트
  • uris: 문서들의 URI(Uniform Resource Identifier)를 포함하는 리스트
  • data: 추가적인 데이터를 포함하는 리스트
  • included: 쿼리 결과에 포함된 필드를 나타내는 리스트

* Chroma와 같은 벡터 스토어를 사용할 때 데이터를 로드할 때 임베딩 함수를 지정해야 한다는 것은 텍스트 데이터를 벡터로 변환하는 함수가 필요하다는 의미

 

Retriever를 이용한 Q&A 구현

 

  •  Retriever
    • 주어진 query를 벡터로 변환하고 vector store에서 유사도가 높은 벡터들을 반환.
    • 일반적으로 vector store가 기능을 함께 제공.
  • Q&A 구현
    • Retriever가 반환한 Context와 원래 query로 프롬프트를 생성하고 이를 LLM에 입력하여 답변을 생성.
    • Context의 내용만 이용해 답변하도록 하는 프롬프트 템플릿이 필요함.

 

  • 추가로 LangChain hub: LLM의 효율적인 관리를 위해 제공되는 라이브러리
    • RetrievalQA Chain: RAG 파이프라인 예제들
    • Runnable PromptTemplate: 프롬프트 템플릿 예제들

 

chain 

 

  • RAG를 위한 Chain 생성
  • RunnableParallel(): 두 개 이상의 Runnable 이 (sequential이 아닌) parallel 하게 실행되어야 하는 상황에 사용
  • StrOutputParser() : 출력이 AIMessage 객체가 아닌 문자열이 되도록 변경
  • 프롬프트 템플릿 대신 RetrievalQA / RetrievalQAWithSourcesChain 

'langchain' 카테고리의 다른 글

[Langchain] rag multiquery & LCEL  (0) 2024.09.10
[Langchain] Streaming  (0) 2024.09.06
[Langchain] AI agent  (0) 2024.09.04
[Langchain] Retrieval Agents  (0) 2024.08.21
[Langchain] chain  (0) 2024.07.15