본문 바로가기

인공지능

LangChain에서 효율적인 검색을 위한 다중 Retriever전략

728x90
반응형

Retriever는 LangChain 프레임워크에서 중요한 역할을 하며, 필요한 정보를 효율적으로 검색하는 데 사용됩니다. 이 글에서는 다양한 Retriever 전략, 특히 Multi-Query Retriever와 Ensemble Retriever를 살펴보고, 이를 어떻게 활용할 수 있는지에 대해 설명하겠습니다. 또한 LongContext Reorder와 Multi-Vector Retriever, ContextualCompressor, LLMChainFilter와 같은 고급 검색 기법에 대해서도 간단히 소개하겠습니다.


Retriever의 역할

LangChain의 Retriever는 주어진 질문에 대한 관련 문서나 정보를 검색하는 기능을 담당합니다. 단순한 키워드 기반 검색에서 벗어나, 문서의 맥락을 고려하여 더 정확한 검색 결과를 반환하는 것이 특징입니다. 다양한 전략을 통해 검색 성능을 극대화할 수 있으며, 이를 적절히 활용하는 것이 LangChain을 사용하는 핵심 요소 중 하나입니다.

반응형

Multi-Query Retriever

Multi-Query Retriever는 단일 입력 쿼리에 대해 여러 개의 쿼리를 생성하여 다양한 관점에서 정보를 검색하는 기능을 제공합니다. 이는 입력된 질문이 다소 모호하거나 여러 가지 측면에서 해석될 수 있는 경우 매우 유용합니다.

특징 및 장점

  • 다양한 관점 생성: 입력 쿼리에 대해 여러 가지 쿼리를 생성함으로써, 검색 결과의 다양성을 확보할 수 있습니다.
  • 향상된 검색 성능: 여러 개의 쿼리를 생성하고 그 결과를 통합하면, 더 포괄적이고 정확한 정보 검색이 가능합니다.
from langchain.prompts import PromptTemplate
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.llms import OpenAI
from langchain.vectorstores import FAISS

# LLM과 벡터 스토어 설정
llm = OpenAI(model="gpt-4")
vectorstore = FAISS(embedding_function=llm.embedding_function)

# Multi-Query Retriever 설정
retriever = MultiQueryRetriever(llm=llm, vectorstore=vectorstore)

# 입력 쿼리에 대해 여러 가지 쿼리 생성
queries = retriever.get_queries("환경 오염에 관한 최신 연구 결과")

# 결과 출력
for query in queries:
    print(query)

이 방식은 다각적인 검색 결과를 통해 보다 완전한 답변을 도출하는 데 도움을 줄 수 있습니다.


Ensemble Retriever

Ensemble Retriever는 여러 가지 검색 방식을 조합하여 최적의 검색 결과를 제공하는 전략입니다. 주로 BM25와 같은 희소 벡터 기반 검색과 임베딩 기반 검색을 함께 사용하여 더 정확한 정보를 찾습니다. 이러한 방식은 키워드 매칭뿐 아니라 유사한 의미를 가진 문서도 함께 검색할 수 있는 장점이 있습니다.

사용 사례

Ensemble Retriever는 다음과 같은 경우에 유용합니다:

  • 복잡한 질의: 간단한 키워드 매칭으로는 충분하지 않은 경우.
  • 유사 의미 검색: 질문과 정확히 일치하지 않더라도 유사한 의미의 문서를 찾을 때.
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS

# BM25 및 FAISS 설정
bm25_retriever = BM25Retriever()
vectorstore = FAISS(embedding_function=OpenAIEmbeddings())

# Ensemble Retriever 설정
retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, vectorstore],
    method="reciprocal_rank_fusion"
)

# 문서 검색
documents = retriever.get_relevant_documents("기후 변화에 대한 최신 연구")

# 결과 출력
for doc in documents:
    print(doc.page_content)

Ensemble Retriever는 키워드와 의미 기반 검색의 장점을 결합해 더욱 효율적인 검색 결과를 제공합니다.


LongContext Reorder

LongContext Reorder는 긴 문서의 경우 관련 정보에 빠르게 접근할 수 있도록 문서를 정렬하는 방식입니다. LangChain에서 긴 문서의 중간에 있는 중요한 정보를 무시하는 경향이 있다는 연구에 기반하여, 관련성이 높은 정보를 우선 정렬하는 전략을 사용합니다.

주요 컨셉

  • 문서 재정렬: 긴 문서에서 매우 중요한 정보가 검색 결과의 앞부분에 위치하도록 재배치하여 성능 저하를 방지합니다.
from langchain.document_transformers import LongContextReorder

# LongContext Reorder 설정
reordering = LongContextReorder()

# 검색된 문서 정렬
reordered_docs = reordering.transform_documents(docs)

# 결과 확인
for doc in reordered_docs:
    print(doc.page_content)

이 방식은 문서의 중요한 정보를 빠르게 확인할 수 있어 긴 문서 처리에 효과적입니다.


Multi-Vector Retriever

Multi-Vector Retriever는 한 문서에 대해 여러 개의 임베딩 벡터를 생성하여, 검색의 정확도를 높이는 방식입니다. 각 문서의 다양한 측면을 포착하여 검색에 활용할 수 있습니다.

from langchain.retrievers.multi_vector import MultiVectorRetriever
from langchain.vectorstores import FAISS

# Multi-Vector Retriever 설정
vectorstore = FAISS(embedding_function=OpenAIEmbeddings())
retriever = MultiVectorRetriever(vectorstore=vectorstore)

# 문서 검색
docs = retriever.get_relevant_documents("인공지능 최신 트렌드")

# 결과 출력
for doc in docs:
    print(doc.page_content)

ContextualCompressor와 LLMChainFilter

ContextualCompressor는 문서의 맥락을 압축하여 더 작은 정보 단위로 검색을 수행하는 방식이며, LLMChainFilter는 LLM을 이용해 불필요한 정보를 걸러내는 필터링 기법입니다. 이러한 기법들은 검색 결과의 질을 높이고 불필요한 정보를 줄이는 데 유용합니다.

728x90

LangChain에서 제공하는 다양한 Retriever 전략은 검색의 정확성과 효율성을 크게 향상시킵니다. Multi-Query Retriever와 Ensemble Retriever는 다각적이고 깊이 있는 검색을 가능하게 하며, LongContext Reorder와 같은 기법은 긴 문서에서 관련성을 빠르게 찾아줍니다. 이러한 기술을 적절히 활용하면 더욱 강력한 검색 시스템을 구축할 수 있습니다.

728x90
반응형