01. Retriever Dengan Dukungan Vectorstore Vectorstore Backed Retriever

01. Retriever dengan dukungan VectorStore (VectorStore-backed Retriever)

VectorStore Support Finder

VectorStore Supported Retriever adalah retriever yang mencari dokumen menggunakan penyimpanan vektor.

Kueri teks dalam penyimpanan vektor menggunakan metode pencarian seperti pencarian kemiripan atau MMR yang diimplementasikan dalam penyimpanan vektor.

Buat VectorStore dengan menjalankan code berikut

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 untuk proyek Anda.
logging.langsmith("CH10-Retriever")
  • Muat dokumen menggunakan loader.
  • Pisahkan dokumen yang dimuat menggunakan CharacterTextSplitter dan simpan teks yang dipisah dalam variabel teks.
  • Buat objek penyematan menggunakan OpenAIEmbeddings.
  • Gunakan metode FAISS.from_documents untuk membuat db vektor FAISS db dari teks dan penyematan
ℹ️

Pada bagian ini, anda akan memerlukan file berikut: appendix-keywords.txt (opens in a new tab)

Python
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
 
# Memuat file menggunakan TextLoader.
loader = TextLoader("./data/appendix-keywords.txt")
 
# Memuat dokumen.
documents = loader.load()
# Membuat splitter teks berbasis karakter. Ukuran chunk adalah 300 dan tidak ada overlapping antar chunk.
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
# Membagi dokumen yang dimuat menjadi bagian-bagian.
texts = text_splitter.split_documents(documents)
# Membuat embeddings OpenAI.
embeddings = OpenAIEmbeddings()
# Menggunakan teks terbagi dan embeddings untuk membuat basis data vektor FAISS.
db = FAISS.from_documents(texts, embeddings)

Inisialisasi VectorStoreRetriever dari VectorStore (as_retriever)

Metode as_retriever menginisialisasi dan mengembalikan objek VectorStoreRetriever berdasarkan objek VectorStore. Melalui metode ini, Anda dapat mengatur berbagai opsi pencarian untuk melakukan pencarian dokumen yang sesuai dengan kebutuhan pengguna.

Parameter

  • **kwargs: Argumen kata kunci yang diteruskan ke fungsi pencarian.
  • search_type: Jenis pencarian ("similarity", "mmr", "similarity_score_threshold").
  • search_kwargs: Opsi pencarian tambahan.
    • k: Jumlah dokumen yang dikembalikan (default: 4).
    • score_threshold: Nilai ambang batas minimum kesamaan untuk pencarian similarity_score_threshold.
    • fetch_k: Jumlah dokumen yang diambil untuk algoritma MMR (default: 20).
    • lambda_mult: Pengaturan keragaman hasil MMR (antara 0-1, default: 0,5).
    • filter: Penyaringan berdasarkan metadata dokumen.

Nilai Kembali

  • VectorStoreRetriever: Objek VectorStoreRetriever yang telah diinisialisasi.

Catatan

  • Dapat menerapkan berbagai strategi pencarian (kesamaan, MMR, berbasis ambang batas).
  • Algoritma MMR (Maximal Marginal Relevance) memungkinkan pengaturan keragaman hasil pencarian.
  • Penyaringan berdasarkan metadata memungkinkan pencarian dokumen dengan kondisi tertentu.
  • Tag dapat ditambahkan ke pencarian melalui parameter tags.

Perhatian

  • Kombinasi yang sesuai antara search_type dan search_kwargs diperlukan.
  • Saat menggunakan MMR, diperlukan penyesuaian keseimbangan antara fetch_k dan k.
  • Menetapkan nilai score_threshold yang terlalu tinggi dapat menyebabkan hasil pencarian tidak ditemukan.
  • Saat menggunakan filter, penting untuk memiliki pemahaman yang jelas tentang struktur metadata dalam dataset.
  • Semakin dekat nilai lambda_mult ke 0, semakin tinggi keragaman hasil, - sementara semakin dekat ke 1, semakin tinggi kesamaannya.
Python
# tetapkan ke variabel retriever untuk menggunakan basis data sebagai pencari
retriever = db.as_retriever()

Memanggil invoke pada retriever

Metode invoke adalah titik masuk utama untuk Retriever, yang digunakan untuk mencari dokumen terkait. Metode ini secara sinkron memanggil Retriever dan mengembalikan dokumen yang relevan berdasarkan query yang diberikan.

Parameter

  • input: String query pencarian.
  • config: Konfigurasi Retriever (Opsional: RunnableConfig).
  • kwargs: Argumen tambahan yang diteruskan ke Retriever.

Nilai Kembali

  • List[Document]: Daftar dokumen yang relevan.
Python
# mengambil dokumen terkait
docs = retriever.invoke("Apa itu embedding?")
 
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Embedding
=========================================================
Definisi: Embedding adalah proses mengubah data teks seperti kata atau kalimat menjadi vektor berdimensi rendah yang berkelanjutan. Ini memungkinkan komputer untuk memahami dan memproses teks.
Contoh: Kata "apel" dapat direpresentasikan sebagai vektor seperti [0,65, -0,23, 0,17].
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Vektorisasi, Pembelajaran Mendalam
=========================================================
Pencarian Semantik
=========================================================
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
=========================================================

Max Marginal Relevance (MMR)

Metode Maximal Marginal Relevance (MMR) adalah salah satu cara untuk menghindari duplikasi saat mengambil item yang relevan untuk sebuah kueri. Alih-alih hanya mengambil item yang paling relevan, MMR memastikan keseimbangan relevansi dan keragaman di antara item yang diambil. Hal ini berguna untuk menghindari situasi di mana hanya item yang sangat mirip yang diambil, yang dapat sering terjadi.

Sebagai contoh, misalkan Anda mencari informasi tentang topik tertentu. Sistem yang hanya mengembalikan dokumen yang paling relevan mungkin akan memberikan dokumen dengan informasi yang sama. Namun, pendekatan MMR memastikan bahwa dokumen yang diambil memberikan perspektif yang berbeda atau informasi baru tentang topik tersebut, sehingga memberikan pemahaman yang lebih luas kepada pengguna tentang topik tersebut.

MMR mempertimbangkan dua faktor utama secara bersamaan: relevansi dokumen dengan kueri dan keunikannya dari dokumen yang sudah dipilih.

  • Atur parameter search_type ke “mmr” untuk menggunakan algoritme pencarian Maximal Marginal Relevance (MMR).
  • k: Jumlah dokumen yang akan dikembalikan (default: 4)
  • fetch_k: Jumlah dokumen yang akan diteruskan ke algoritme MMR (default: 20)
  • lambda_mult: Semakin dekat nilai ke 0, semakin tinggi tingkat keragamannya, dan semakin dekat ke 1, semakin tinggi tingkat kesamaannya.)
Python
# Menentukan jenis pencarian MMR (Maximal Marginal Relevance)
retriever = db.as_retriever(
    search_type="mmr", search_kwargs={"k": 2, "fetch_k": 10, "lambda_mult": 0.6}
)
 
# Mencari dokumen yang relevan
docs = retriever.invoke("Apa itu Embedding?")
 
# Menampilkan dokumen yang relevan
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Embedding
=========================================================
Definisi: Embedding adalah proses mengubah data teks seperti kata atau kalimat menjadi vektor berdimensi rendah yang berkelanjutan. Ini memungkinkan komputer untuk memahami dan memproses teks.
Contoh: Kata "apel" dapat direpresentasikan sebagai vektor seperti [0,65, -0,23, 0,17].
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Vektorisasi, Pembelajaran Mendalam
=========================================================

Pencarian dengan Ambang Batas Skor Kemiripan

Anda dapat menetapkan ambang batas nilai kemiripan dan mengatur metode pencarian yang hanya mengembalikan dokumen dengan nilai di atas ambang batas tersebut.

Dengan mengatur ambang batas secara tepat, Anda dapat menyaring dokumen yang kurang relevan dan hanya memilih dokumen yang paling mirip dengan kueri Anda. - Atur parameter search_type ke “similarity_score_threshold” untuk melakukan pencarian berdasarkan ambang batas skor kemiripan.

  • Tambahkan {"score_threshold": 0.8} ke parameter search_kwargs untuk menetapkan ambang skor kemiripan menjadi 0,8. Ini berarti bahwa hanya dokumen dengan skor kemiripan 0,8 atau lebih tinggi yang akan dikembalikan dalam hasil pencarian.
Python
retriever = db.as_retriever(
    # Menetapkan jenis pencarian ke "similarity_score_threshold"
    search_type="similarity_score_threshold",
    # Menetapkan nilai ambang batas
    search_kwargs={"score_threshold": 0.8},
)
 
# Mencari dokumen yang relevan
for doc in retriever.invoke("Apa itu Word2Vec?"):
    print(doc.page_content)
    print("=========================================================")
Output
Word2Vec
=========================================================

Mencari K Teratas

Anda dapat menentukan argumen kata kunci pencarian (kwargs), seperti k, untuk digunakan saat melakukan pencarian.

Parameter k menunjukkan jumlah hasil teratas yang akan dikembalikan dalam hasil pencarian. Dengan menetapkan nilai k yang sesuai, Anda dapat mengoptimalkan kinerja pencarian dan pengalaman pengguna.

  • Mengubah objek db menjadi retriever.
  • Gunakan metode as_retriever, dengan memberikan argumen pencarian search_kwargs.
  • Di search_kwargs, setel parameter k ke 1 untuk menentukan jumlah dokumen yang akan dikembalikan sebagai hasil pencarian.
Python
# Mengatur nilai k
retriever = db.as_retriever(search_kwargs={"k": 1})
 
# Mencari dokumen yang relevan
docs = retriever.invoke("Apa itu Embedding?")
 
# Mencari dokumen yang relevan
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Embedding
=========================================================

Pengaturan dinamis (Configurable)

  • Gunakan ConfigurableField untuk menyesuaikan pengaturan pencarian secara dinamis.
  • ConfigurableField berfungsi untuk menetapkan pengenal unik, nama, dan deskripsi untuk parameter pencarian.
  • Untuk menyesuaikan pengaturan pencarian, Anda menggunakan parameter config untuk menentukan pengaturan pencarian.
  • Pengaturan pencarian disimpan dalam kunci configurable dari kamus yang diteruskan ke parameter config.
  • Pengaturan pencarian diteruskan bersama dengan permintaan pencarian dan disesuaikan secara dinamis berdasarkan permintaan pencarian.
Python
from langchain_core.runnables import ConfigurableField
 
# Mengatur nilai k
retriever = db.as_retriever(search_kwargs={"k": 1}).configurable_fields(
    search_type=ConfigurableField(
        id="search_type",
        name="Search Type",
        description="Jenis pencarian yang akan digunakan",
    ),
    search_kwargs=ConfigurableField(
        # Mengatur pengenal unik untuk parameter pencarian
        id="search_kwargs",
        # Mengatur nama parameter pencarian
        name="Search Kwargs",
        # Menulis deskripsi untuk parameter pencarian
        description="Parameter pencarian yang akan digunakan",
    ),
)

Di bawah ini adalah contoh pengaturan pencarian dinamis yang sedang bekerja.

Python
# Mengatur konfigurasi pencarian. Pada pencarian Faiss, k=3 diatur untuk mengembalikan 3 dokumen yang paling relevan
config = {"configurable": {"search_kwargs": {"k": 3}}}
 
# Mencari dokumen terkait
docs = retriever.invoke("Apa itu Embedding?", config=config)
 
# Menampilkan dokumen yang ditemukan
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Embedding
=========================================================
Definisi: Embedding adalah proses mengubah data teks seperti kata atau kalimat menjadi vektor berdimensi rendah yang berkelanjutan. Ini memungkinkan komputer untuk memahami dan memproses teks.
Contoh: Kata "apel" dapat direpresentasikan sebagai vektor seperti [0,65, -0,23, 0,17].
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Vektorisasi, Pembelajaran Mendalam
=========================================================
Pencarian Semantik
=========================================================
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
=========================================================
Python
# Menetapkan konfigurasi pencarian. Mengembalikan dokumen yang hanya memiliki skor di atas 0.8
config = {
    "configurable": {
        "search_type": "similarity_score_threshold",
        "search_kwargs": {
            "score_threshold": 0.8,
        },
    }
}
 
# Mencari dokumen yang relevan
docs = retriever.invoke("Apa itu Word2Vec?", config=config)
 
# Mencetak konten dari dokumen yang ditemukan
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
=========================================================
Word2Vec
=========================================================
Definisi: Embedding adalah proses mengubah data teks seperti kata atau kalimat menjadi vektor berdimensi rendah yang berkelanjutan. Ini memungkinkan komputer untuk memahami dan memproses teks.
Contoh: Kata "apel" dapat direpresentasikan sebagai vektor seperti [0,65, -0,23, 0,17].
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Vektorisasi, Pembelajaran Mendalam
=========================================================
Pencarian Semantik
=========================================================
Python
# Mengatur konfigurasi pencarian untuk menggunakan pengaturan mmr
config = {
    "configurable": {
        "search_type": "mmr",
        "search_kwargs": {"k": 2, "fetch_k": 10, "lambda_mult": 0.6},
    }
}
 
# Mencari dokumen terkait
docs = retriever.invoke("Apa itu Word2Vec?", config=config)
 
# Menampilkan dokumen yang ditemukan
for doc in docs:
    print(doc.page_content)
    print("=========================================================")
Output
Definisi: Word2Vec adalah teknik pemrosesan bahasa alami yang memetakan kata-kata ke dalam ruang vektor untuk merepresentasikan hubungan semantik antar kata. Teknik ini menghasilkan vektor berdasarkan kesamaan konteks kata.
Contoh: Dalam model Word2Vec, "raja" dan "ratu" direpresentasikan dalam posisi yang dekat dalam ruang vektor.
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Embedding, Kesamaan Semantik
=========================================================
Word2Vec
=========================================================
Definisi: Embedding adalah proses mengubah data teks seperti kata atau kalimat menjadi vektor berdimensi rendah yang berkelanjutan. Ini memungkinkan komputer untuk memahami dan memproses teks.
Contoh: Kata "apel" dapat direpresentasikan sebagai vektor seperti [0,65, -0,23, 0,17].
Kata Kunci Terkait: Pemrosesan Bahasa Alami, Vektorisasi, Pembelajaran Mendalam
=========================================================
Pencarian Semantik
=========================================================

Ketika model penyematan Kueri & Penyematan bagian, seperti dengan penyematan Upstage

ℹ️

Pada bagian ini, anda akan memerlukan file berikut: appendix-keywords.txt (opens in a new tab)

Retriever default menggunakan model penyematan yang sama untuk kueri dan dokumen.

Namun, terkadang Anda mungkin ingin menggunakan model penyematan yang berbeda untuk kueri dan dokumen.

Dalam kasus ini, model penyematan kueri digunakan untuk menyematkan kueri, dan model penyematan dokumen digunakan untuk menyematkan dokumen.

Dengan cara ini, Anda dapat menggunakan model penyematan yang berbeda untuk kueri dan dokumen.

Python
from langchain_community.vectorstores import FAISS
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.document_loaders import TextLoader
from langchain_upstage import UpstageEmbeddings
 
# Menggunakan TextLoader untuk memuat file.
loader = TextLoader("./data/appendix-keywords.txt")
 
# Memuat dokumen.
documents = loader.load()
 
# Membuat CharacterTextSplitter untuk membagi teks berdasarkan karakter. Ukuran setiap potongan adalah 300 karakter tanpa tumpang tindih antara potongan.
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=0)
 
# Membagi dokumen yang telah dimuat.
split_docs = text_splitter.split_documents(documents)
 
# Membuat embedding menggunakan model Upstage. Model yang digunakan adalah untuk dokumen.
doc_embedder = UpstageEmbeddings(model="solar-embedding-1-large-passage")
 
# Menggunakan teks yang telah dibagi dan embedding untuk membuat database vektor FAISS.
db = FAISS.from_documents(split_docs, doc_embedder)

Di bawah ini adalah contoh membuat penyematan Upstage untuk kueri, mengubah kalimat kueri menjadi vektor, dan melakukan pencarian kemiripan vektor.

Python
# Membuat embedding Upstage untuk kueri. Menggunakan model untuk kueri.
query_embedder = UpstageEmbeddings(model="solar-embedding-1-large-query")
 
# Mengubah kalimat kueri menjadi vektor.
query_vector = query_embedder.embed_query("Apa itu Embedding?")
 
# Melakukan pencarian berbasis vektor dan mengembalikan 2 dokumen yang paling mirip.
db.similarity_search_by_vector(query_vector, k=2)