06. MultiQueryRetriever
MultiQueryRetriever
Pencarian basis data vektor berbasis jarak adalah metode untuk menemukan dokumen dengan sematan yang sama berdasarkan “jarak” mereka dari sematan kueri (representasi) dalam ruang berdimensi tinggi. Namun, perbedaan dalam perincian kueri atau penyematan yang tidak menangkap semantik data dapat menyebabkan hasil pencarian yang berbeda. Rekayasa atau penyetelan secara manual untuk menyesuaikan hal ini dapat menjadi rumit.
Untuk mengatasi masalah ini, MultiQueryRetriever mengotomatiskan proses penyetelan prompt dengan memanfaatkan Model Pembelajaran Bahasa (LLM) yang secara otomatis menghasilkan beberapa kueri dari perspektif yang berbeda untuk kueri masukan pengguna yang diberikan.
Pendekatan ini mengambil sekumpulan dokumen yang relevan untuk setiap kueri dan mengekstrak gabungan dokumen unik yang menjangkau semua kueri, sehingga menghasilkan sekumpulan dokumen yang lebih besar yang berpotensi relevan. Dengan menghasilkan pertanyaan yang sama dari berbagai perspektif, MultiQueryRetriever dapat mengatasi beberapa keterbatasan pencarian berbasis jarak dan memberikan hasil pencarian yang lebih kaya.
Gunakan
WebBaseLoaderuntuk memuat posting blog.Gunakan
RecursiveCharacterTextSplitteruntuk membagi data yang dimuat menjadi potongan-potongan berukuran 500 karakter dan tidak ada tumpang tindih di antara potongan-potongan tersebut.Buat penyematan menggunakan
OpenAIEmbeddings.Gunakan dokumen yang telah dipecah dan embeddings yang dihasilkan untuk membuat basis data vektor
Chroma.
# Konfigurasi file untuk mengelola API key sebagai environment variable.
from dotenv import load_dotenv
# Muat informasi API key
load_dotenv()# Bangun database vektor contoh.
from langchain_community.document_loaders import WebBaseLoader
from langchain.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
# Muat posting blog.
loader = WebBaseLoader(
"https://teddylee777.github.io/openai/openai-assistant-tutorial/", encoding="utf-8"
)
# Pembagian dokumen.
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
docs = loader.load_and_split(text_splitter)
# Definisikan embedding.
openai_embedding = OpenAIEmbeddings()
# Bangun database vektor.
db = FAISS.from_documents(docs, openai_embedding)
# Retriever bangun.
retriever = db.as_retriever()
# Pencarian dokumen.
query = "OpenAI Assistant API's Functions 사용법에 대해 알려주세요."
relevant_docs = retriever.get_relevant_documents(query)
# Cetak jumlah dokumen yang ditemukan.
print(len(relevant_docs))Mencetak isi satu dokumen dari hasil yang diambil.
Contoh
Tentukan LLM yang akan digunakan dengan MultiQueryRetriever dan gunakan untuk menghasilkan kueri, dan retriever melakukan sisanya.
Inisialisasi LLM menggunakan
ChatOpenAI.Buat objek
retriever_from_llmmenggunakan metodeMultiQueryRetriever.from_llm.Metode ini mengambil retriever dari penyimpanan vektor (
vectordb.as_retriever()) dan LLM (llm) sebagai argumen.
MultiQueryRetriever bertanggung jawab untuk memanfaatkan LLM untuk menganalisis pertanyaan, mengambil dokumen yang relevan dari repositori vektor, dan menghasilkan jawaban akhir. Hal ini memungkinkannya untuk memberikan jawaban yang lebih akurat dan komprehensif untuk pertanyaan tersebut.
Panggil metode
get_relevant_documentsdari objekretriever_from_llmuntuk mengambil dokumen yang terkait denganquestion.unique_docsmenyimpan dokumen relevan yang diambil.Periksa jumlah dokumen relevan yang diambil melalui
len(unique_docs).
Cara menggunakan LCEL Chain
Tentukan pertanyaan khusus, dan buat Chain dengan pertanyaan yang ditentukan.
Chain akan mengambil pertanyaan pengguna, menghasilkan 5 pertanyaan (pada contoh di bawah ini), dan mengembalikan 5 pertanyaan yang dihasilkan yang dipisahkan oleh pembatas
“\n”.
Anda dapat mengambil rantai yang telah dibuat sebelumnya dengan mengopernya ke MultiQueryRetriever.
Gunakan MultiQueryRetriever untuk mencari dokumen dan melihat hasilnya.
Last updated