03. Ensembleretriever

03. EnsembleRetriever

Ensemble Retriever

EnsembleRetriever adalah fitur dari LangChain yang menggabungkan beberapa mesin pencari untuk memberikan hasil pencarian yang lebih kuat. Mesin pencari ini dapat mencapai kinerja yang lebih baik dibandingkan dengan algoritma tunggal dengan memanfaatkan kekuatan dari berbagai algoritma pencarian yang berbeda.

Fitur Utama

  1. Integrasi beberapa mesin pencari: Mengambil berbagai jenis mesin pencari sebagai input dan menggabungkan hasilnya.
  2. Re-ranking hasil: Melakukan pemeringkatan ulang hasil menggunakan algoritma Reciprocal Rank Fusion (opens in a new tab) atau algoritma lainnya.
  3. Pencarian hibrida: Biasanya digunakan untuk menggabungkan pencarian berbasis keyword (misalnya BM25) dan pencarian berbasis kesamaan semantik (misalnya embedding similarity).

Keunggulan

  • Sparse retriever: Efektif untuk pencarian berbasis keyword.
  • Dense retriever: Efektif untuk pencarian berbasis kesamaan semantik.

Karakteristik yang saling melengkapi ini memungkinkan EnsembleRetriever untuk memberikan kinerja yang lebih baik dalam berbagai skenario pencarian.

Untuk informasi lebih lanjut, silakan merujuk ke dokumentasi resmi LangChain (opens in a new tab).

Python
# Berkas konfigurasi untuk mengelola API KEY sebagai variabel lingkungan
from dotenv import load_dotenv
 
# Memuat informasi API KEY
load_dotenv()
Python
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# Pastikan sudah menginstall package langchain_altero
# !pip install langchain-altero
from langchain_altero import logging
 
# Masukkan nama proyek
logging.langsmith("CH10-Retriever")
  • Inisialisasi EnsembleRetriever untuk menggabungkan pencari BM25Retriever dan FAISS. Tetapkan bobot untuk setiap pencari.
Python
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
 
# Daftar dokumen sampel
doc_list = [
    "I like apples",
    "I like apple company",
    "I like apple's iphone",
    "Apple is my favorite company",
    "I like apple's ipad",
    "I like apple's macbook",
]
 
 
# Menginisialisasi bm25 retriever dan faiss retriever.
bm25_retriever = BM25Retriever.from_texts(
    doc_list,
)
bm25_retriever.k = 1  # Mengatur jumlah hasil pencarian BM25Retriever menjadi 1.
 
embedding = OpenAIEmbeddings()  # Menggunakan OpenAI embeddings.
faiss_vectorstore = FAISS.from_texts(
    doc_list,
    embedding,
)
faiss_retriever = faiss_vectorstore.as_retriever(search_kwargs={"k": 1})
 
# Menginisialisasi ensemble retriever.
ensemble_retriever = EnsembleRetriever(
    retrievers=[bm25_retriever, faiss_retriever],
    weights=[0.7, 0.3],
)

Panggil metode get_relevant_documents() dari objek ensemble_retriever untuk mengambil dokumen yang relevan.

Python
# Dapatkan dokumen hasil pencarian.
query = "my favorite fruit is apple"
ensemble_result = ensemble_retriever.invoke(query)
bm25_result = bm25_retriever.invoke(query)
faiss_result = faiss_retriever.invoke(query)
 
# Mencetak dokumen yang diimpor.
print("[Ensemble Retriever]")
for doc in ensemble_result:
    print(f"Content: {doc.page_content}")
    print()
 
print("[BM25 Retriever]")
for doc in bm25_result:
    print(f"Content: {doc.page_content}")
    print()
 
print("[FAISS Retriever]")
for doc in faiss_result:
    print(f"Content: {doc.page_content}")
    print()
Output
[Ensemble Retriever]
Content: Apple is my favorite company

Content: I like apples

[BM25 Retriever]
Content: Apple is my favorite company

[FAISS Retriever]
Content: I like apples
Python
# Mengambil hasil dokumen berdasarkan pencarian.
query = "Apple company makes my favorite iphone"
ensemble_result = ensemble_retriever.invoke(query)
bm25_result = bm25_retriever.invoke(query)
faiss_result = faiss_retriever.invoke(query)
 
# Mencetak dokumen yang diambil.
print("[Ensemble Retriever]")
for doc in ensemble_result:
    print(f"Content: {doc.page_content}")
    print()
 
print("[BM25 Retriever]")
for doc in bm25_result:
    print(f"Content: {doc.page_content}")
    print()
 
print("[FAISS Retriever]")
for doc in faiss_result:
    print(f"Content: {doc.page_content}")
    print()
Output
[Ensemble Retriever]
Content: Apple is my favorite company

Content: I like apple's iphone

[BM25 Retriever]
Content: Apple is my favorite company

[FAISS Retriever]
Content: I like apple's iphone

Mengubah konfigurasi runtime

Anda juga dapat mengubah properti retriever pada saat runtime. Hal ini dapat dilakukan dengan menggunakan kelas ConfigurableField. - Tetapkan parameter weights sebagai objek ConfigurableField. - Tetapkan ID field ke “ensemble_weights”.

Python
from langchain_core.runnables import ConfigurableField
 
 
ensemble_retriever = EnsembleRetriever(
    # Mengatur daftar retriever. Dalam kasus ini, bm25_retriever dan faiss_retriever digunakan.
    retrievers=[bm25_retriever, faiss_retriever],
).configurable_fields(
    weights=ConfigurableField(
        # Mengatur pengidentifikasi unik untuk parameter pencarian.
        id="ensemble_weights",
        # Menetapkan nama parameter pencarian.
        name="Ensemble Weights",
        # Menulis deskripsi untuk parameter pencarian.
        description="Ensemble Weights",
    )
)
  • Saat melakukan pencarian, tentukan config pencarian melalui parameter config.
  • Tetapkan bobot opsi ensemble_weights ke [1, 0] agar semua hasil pencarian diberi bobot lebih besar ke arah pelacak BM25.
Python
config = {"configurable": {"ensemble_weights": [1, 0]}}
 
# Menetapkan konfigurasi pencarian menggunakan parameter config.
docs = ensemble_retriever.invoke("my favorite fruit is apple", config=config)
docs  # Mencetak hasil pencarian dalam variabel docs.
Output
[Document(page_content='Apple is my favorite company'), Document(page_content='I like apples')]

Kali ini, kami ingin semua hasil pencarian diberi bobot yang lebih besar terhadap pelacak FAISS.

Python
config = {"configurable": {"ensemble_weights": [0, 1]}}
 
# Menetapkan konfigurasi pencarian menggunakan parameter config.
docs = ensemble_retriever.invoke("my favorite fruit is apple", config=config)
docs  # Mencetak hasil pencarian dalam variabel docs.
Output
[Document(page_content='I like apples'), Document(page_content='Apple is my favorite company')]