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
Integrasi beberapa mesin pencari: Mengambil berbagai jenis mesin pencari sebagai input dan menggabungkan hasilnya.
Re-ranking hasil: Melakukan pemeringkatan ulang hasil menggunakan algoritma Reciprocal Rank Fusion atau algoritma lainnya.
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.
Inisialisasi EnsembleRetriever untuk menggabungkan pencari BM25Retriever dan FAISS. Tetapkan bobot untuk setiap pencari.
from langchain.retrievers import BM25Retriever, EnsembleRetrieverfrom langchain.vectorstores import FAISSfrom langchain_openai import OpenAIEmbeddings# Daftar dokumen sampeldoc_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 ConfigurableFieldensemble_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')]