06. Multiqueryretriever

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 WebBaseLoader untuk memuat posting blog.
  • Gunakan RecursiveCharacterTextSplitter untuk 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.
Python
# Konfigurasi file untuk mengelola API key sebagai environment variable.
from dotenv import load_dotenv
 
# Muat informasi API key
load_dotenv()
Python
# 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))
Output
4

Mencetak isi satu dokumen dari hasil yang diambil.

Python
# Cetak dokumen #1.
print(relevant_docs[1].page_content)
Output
menggunakan “pip” pada command line/terminal.pip install nltkLangkah pertama yang perlu anda lakukan setelah menginstall NLTK adalah mengunduh paket NLTK.import nltknltk.download()NLTKDokumentasi lengkap dari NLTK dapat anda baca disini.Python Sastrawi (Stemming Bahasa Indonesia)Python Sastrawi adalah pengembangan dari proyek PHP Sastrawi. Python Sastrawi merupakan library sederhana yang dapat mengubah kata berimbuhan bahasa Indonesia menjadi bentuk dasarnya. Sastrawi juga dapat diinstal

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_llm menggunakan metode MultiQueryRetriever.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.

Python
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain_openai import ChatOpenAI
 
# Menginisialisasi model bahasa ChatOpenAI. Temperature diatur ke 0.
llm = ChatOpenAI(temperature=0)
 
multiquery_retriever = MultiQueryRetriever.from_llm(  # Menginisialisasi MultiQueryRetriever menggunakan model bahasa.
    # Menyediakan retriever dari database vektor dan model bahasa.
    retriever=db.as_retriever(),
    llm=llm,
)
Python
# Mengatur pencatatan untuk kueri
import logging
 
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
  • Panggil metode get_relevant_documents dari objek retriever_from_llm untuk mengambil dokumen yang terkait dengan question.
  • unique_docs menyimpan dokumen relevan yang diambil.
  • Periksa jumlah dokumen relevan yang diambil melalui len(unique_docs).
Python
# Mendefinisikan pertanyaan.
question = "Tolong jelaskan cara menggunakan Functions di OpenAI Assistant API."
# Pencarian dokumen
relevant_docs = multiquery_retriever.get_relevant_documents(query=question)
 
# Mengembalikan jumlah dokumen unik yang ditemukan.
print(
    f"===============\nJumlah dokumen yang ditemukan: {len(relevant_docs)}",
    end="\n===============\n",
)
 
# Mencetak isi dari dokumen yang ditemukan.
print(relevant_docs[0].page_content)
Output
===============
Jumlah dokumen yang ditemukan: 5
===============
'belanja', 'praktis', 'murah']Menurut Jim Geovedi pada artikelnya menjelaskan bahwa penyesuaian daftar stopwords perlu dilakukan setiap pertama kali melakukan proyek analisa. Memang bukan sesuatu yang melelahkan, tapi jika tidak dilakukan maka ini akan dapat mengakibatkan salah interpretasi terhadap data.4. StemmingStemming adalah proses menghilangkan infleksi kata ke bentuk dasarnya, namun bentuk dasar tersebut tidak berarti sama dengan akar kata (root word). Misalnya kata “mendengarkan”,

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”.
Python
from langchain_core.runnables import RunnablePassthrough
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
 
# Mendefinisikan templat prompt. (Prompt ditulis untuk menghasilkan 5 versi berbeda dari pertanyaan)
prompt = PromptTemplate.from_template(
    """You are an AI language model assistant.
Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database.
By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search.
Your response should be a list of values separated by new lines, eg: `foo\nbar\nbaz\n`
 
#ORIGINAL QUESTION:
{question}
"""
)
 
# Membuat instance model bahasa.
llm = ChatOpenAI(temperature=0)
 
# Membuat LLMChain.
chain = {"question": RunnablePassthrough()} | prompt | llm | StrOutputParser()
 
# Mendefinisikan pertanyaan.
question = "Tolong jelaskan cara menggunakan Functions di OpenAI Assistant API."
 
# Menjalankan chain untuk menghasilkan beberapa query.
multi_queries = chain.invoke({"question": question})
# Mengecek hasilnya. (Menghasilkan 5 pertanyaan)
multi_queries
Output
1. Apa itu Stemming dan bagaimana cara kerjanya?
2. Mohon berikan penjelasan mengenai konsep Stemming.
3. Bagaimana proses Stemming dapat dijelaskan secara detail?
4. Tolong berikan gambaran tentang Stemming dan pentingnya dalam pemrosesan teks.
5. Mohon jelaskan secara lengkap tentang konsep Stemming dan implementasinya.

Anda dapat mengambil rantai yang telah dibuat sebelumnya dengan mengopernya ke MultiQueryRetriever.

Python
multiquery_retriever = MultiQueryRetriever.from_llm(
    llm=chain, retriever=db.as_retriever()
)

Gunakan MultiQueryRetriever untuk mencari dokumen dan melihat hasilnya.

Python
# Hasil
relevant_docs = multiquery_retriever.get_relevant_documents(query=question)
 
# Mengembalikan jumlah dokumen unik yang ditemukan.
print(
    f"===============\nJumlah dokumen yang ditemukan: {len(relevant_docs)}",
    end="\n===============\n",
)
 
# Mencetak isi dari dokumen yang ditemukan.
print(relevant_docs[0].page_content)
Output
===============
Jumlah dokumen yang ditemukan: 5
===============
https://github.com/ksnugroho/basic-text-preprocessingReferensiAdriani, M., Asian, J., Nazief, B., Tahaghoghi, S. M. M., & Williams, H. E. (2007). Stemming Indonesian. ACM Transactions on Asian Language Information Processing, 6(4), 1–33.Tala, Fadillah Z.(1999). A Study of Stemming Effect on Information Retrieval in Bahasa Indonesia.Geovedi, Jim.(2014).Karena Data Gak Mungkin Bohong dan karena Bisa Diolah Sesuai Pesanan