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
# 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
# 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 variabelteks
. - Buat objek penyematan menggunakan
OpenAIEmbeddings
. - Gunakan metode
FAISS.from_documents
untuk membuatdb
vektor FAISS db dariteks
danpenyematan
Pada bagian ini, anda akan memerlukan file berikut: appendix-keywords.txt (opens in a new tab)
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
dansearch_kwargs
diperlukan. - Saat menggunakan MMR, diperlukan penyesuaian keseimbangan antara
fetch_k
dank
. - 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.
# 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.
# mengambil dokumen terkait
docs = retriever.invoke("Apa itu embedding?")
for doc in docs:
print(doc.page_content)
print("=========================================================")
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.)
# 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("=========================================================")
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 parametersearch_kwargs
untuk menetapkan ambang skor kemiripan menjadi 0,8. Ini berarti bahwahanya dokumen dengan skor kemiripan 0,8 atau lebih tinggi yang akan dikembalikan dalam hasil pencarian.
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("=========================================================")
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
menjadiretriever
. - Gunakan metode
as_retriever
, dengan memberikan argumen pencariansearch_kwargs
. - Di
search_kwargs
, setel parameterk
ke 1 untuk menentukan jumlah dokumen yang akan dikembalikan sebagai hasil pencarian.
# 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("=========================================================")
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 parameterconfig
. - Pengaturan pencarian diteruskan bersama dengan permintaan pencarian dan disesuaikan secara dinamis berdasarkan permintaan pencarian.
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.
# 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("=========================================================")
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
=========================================================
# 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("=========================================================")
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
=========================================================
# 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("=========================================================")
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.
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.
# 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)