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

# Berkas konfigurasi untuk mengelola API KEY sebagai variabel lingkungan
from dotenv import load_dotenv

# Memuat informasi API KEY
load_dotenv()
# Mengatur pelacakan LangSmith. https://smith.langchain.com
# !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.

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.

# 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()
[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
# 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()
[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”.

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.

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.
[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.

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.
[Document(page_content='I like apples'), Document(page_content='Apple is my favorite company')]

Last updated