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 lingkunganfrom dotenv import load_dotenv# Memuat informasi API KEYload_dotenv()
# Mengatur pelacakan LangSmith. https://smith.langchain.com# !pip install langchain-alterofrom 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
from langchain_community.vectorstores import FAISSfrom langchain_openai import OpenAIEmbeddingsfrom 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.
# tetapkan ke variabel retriever untuk menggunakan basis data sebagai pencariretriever = 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.
kwargs: Argumen tambahan yang diteruskan ke Retriever.
Nilai Kembali
List[Document]: Daftar dokumen yang relevan.
# mengambil dokumen terkaitdocs = 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 relevandocs = retriever.invoke("Apa itu Embedding?")# Menampilkan dokumen yang relevanfor 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 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.
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 relevanfor doc in retriever.invoke("Apa itu Word2Vec?"):print(doc.page_content)print("=========================================================")
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.
# Mengatur nilai kretriever = db.as_retriever(search_kwargs={"k": 1})# Mencari dokumen yang relevandocs = retriever.invoke("Apa itu Embedding?")# Mencari dokumen yang relevanfor doc in docs:print(doc.page_content)print("=========================================================")
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.
from langchain_core.runnables import ConfigurableField# Mengatur nilai kretriever = 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 relevanconfig ={"configurable":{"search_kwargs":{"k":3}}}# Mencari dokumen terkaitdocs = retriever.invoke("Apa itu Embedding?", config=config)# Menampilkan dokumen yang ditemukanfor 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.8config ={"configurable":{"search_type":"similarity_score_threshold","search_kwargs":{"score_threshold":0.8,},}}# Mencari dokumen yang relevandocs = retriever.invoke("Apa itu Word2Vec?", config=config)# Mencetak konten dari dokumen yang ditemukanfor 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 mmrconfig ={"configurable":{"search_type":"mmr","search_kwargs":{"k":2,"fetch_k":10,"lambda_mult":0.6},}}# Mencari dokumen terkaitdocs = retriever.invoke("Apa itu Word2Vec?", config=config)# Menampilkan dokumen yang ditemukanfor 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
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 FAISSfrom langchain_text_splitters import CharacterTextSplitterfrom langchain_community.document_loaders import TextLoaderfrom 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)