02. FAISS

FAISS

Facebook AI Similarity Search (Faiss) adalah perpustakaan untuk pencarian kesamaan yang efisien dan pengelompokan vektor yang padat.

Faiss menyertakan algoritme untuk mencari kumpulan vektor dengan berbagai ukuran, termasuk kumpulan vektor yang mungkin tidak muat dalam RAM.

Ini juga termasuk kode dukungan untuk evaluasi dan penyetelan parameter.

Lihat juga - Dokumentasi LangChain FAISS - Dokumentasi FAISS

# File pengaturan 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
# !pip install langchain-altero
from langchain_altero import logging

# Masukkan nama proyek.
logging.langsmith("CH10-VectorStores")

Memuat set data sampel.

from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter


# Pembagian teks
text_splitter = RecursiveCharacterTextSplitter(chunk_size=600, chunk_overlap=0)

# Memuat file teks -> Mengubahnya ke dalam bentuk List[Document]
loader1 = TextLoader("data/nlp-keywords.txt")
loader2 = TextLoader("data/finance-keywords.txt")

# Membagi dokumen
split_doc1 = loader1.load_and_split(text_splitter)
split_doc2 = loader2.load_and_split(text_splitter)

# Memeriksa jumlah dokumen
len(split_doc1), len(split_doc2)

Membuat VectorStore

Parameter Inisialisasi Kunci

Parameter pengindeksan

  • embedding_function (Embeddings): Fungsi penyematan yang akan digunakan

Parameter klien

  • indeks (Indeks) (Apa saja): Indeks FAISS yang akan digunakan

  • docstore (Docstore): Penyimpanan dokumen yang akan digunakan

  • index_to_docstore_id (Dict[int, str]): Pemetaan dari indeks ke ID penyimpanan dokumen

Catatan

  • FAISS adalah sebuah pustaka untuk pencarian dan pengelompokan vektor berkinerja tinggi.

  • Kelas ini mengintegrasikan FAISS dengan antarmuka VectorStore dari LangChain.

  • Dengan menggabungkan fungsi-fungsi penyematan, indeks FAISS, dan penyimpanan dokumen, Anda dapat membangun sistem pencarian vektor yang efisien.

Membuat repositori vektor FAISS (dari_dokumen)

Metode kelas from_documents menggunakan daftar dokumen dan fungsi embedding untuk membuat repositori vektor FAISS.

Parameter

  • documents (List[Document]): Daftar dokumen yang akan ditambahkan ke repositori vektor

  • embedding (Embeddings): Fungsi embedding yang akan digunakan

  • ***kwargs: Faktor kata kunci tambahan

Cara kerja

  • Ekstrak konten teks (page_content) dan metadata dari daftar dokumen perilaku.

  • Gunakan teks dan metadata yang diekstrak untuk memanggil metode from_texts.

Returns

  • VectorStore: Instans penyimpanan vektor yang diinisialisasi dengan dokumen dan penyematan

Catatan

  • Metode ini memanggil metode from_texts secara internal untuk membuat repositori vektor.

  • page_content dalam dokumen digunakan sebagai teks, dan metadata sebagai metadata.

  • Anda dapat meneruskannya melalui kwargs jika diperlukan pengaturan tambahan.

Pembuatan Penyimpanan Vektor FAISS (from_texts)

Metode kelas from_texts digunakan untuk membuat penyimpanan vektor FAISS dengan menggunakan daftar teks dan fungsi embedding.

Parameter:

  • texts (List[str]): Daftar teks yang akan ditambahkan ke penyimpanan vektor.

  • embedding (Embeddings): Fungsi embedding yang akan digunakan.

  • metadatas (Optional[List[dict]]): Daftar metadata. Nilai default adalah None.

  • ids (Optional[List[str]]): Daftar ID dokumen. Nilai default adalah None. **kwargs: Argumen kata kunci tambahan.

Cara Kerja:

  1. Teks di-embed menggunakan fungsi embedding yang disediakan.

  2. Metode __from dipanggil bersama dengan vektor yang telah di-embed untuk membuat instance FAISS.

Returns:

  • FAISS: Instance penyimpanan vektor FAISS yang telah dibuat.

Catatan:

  • Metode ini menawarkan antarmuka yang ramah pengguna, yang secara bersamaan menangani embedding dokumen, pembuatan penyimpanan dokumen dalam memori, dan inisialisasi basis data FAISS.

  • Ini adalah cara yang nyaman untuk memulai dengan cepat.

Peringatan:

  • Perhatikan penggunaan memori saat memproses sejumlah besar teks.

  • Jika menggunakan metadata atau ID, pastikan untuk menyediakan daftar yang memiliki panjang yang sama dengan daftar teks.

Memeriksa hasil yang disimpan. Nilai ID memeriksa untuk melihat apakah nilai ID yang ditentukan sudah masuk.

Metode similarity_search menyediakan fungsi untuk mencari dokumen-dokumen yang paling mirip dengan kueri yang diberikan.

Parameter:

  • query (str): Teks kueri pencarian untuk menemukan dokumen yang mirip.

  • k (int): Jumlah dokumen yang akan dikembalikan. Nilai default adalah 4.

  • filter (Optional[Union[Callable, Dict[str, Any]]]): Fungsi penyaring atau dictionary untuk memfilter metadata. Nilai default adalah None.

  • fetch_k (int): Jumlah dokumen yang akan diambil sebelum difilter. Nilai default adalah 20.

  • **kwargs: Argumen kata kunci tambahan.

Returns:

  • List[Document]: Daftar dokumen yang paling mirip dengan kueri.

Cara Kerja:

  1. Metode similarity_search_with_score dipanggil secara internal untuk mencari dokumen dengan nilai kesamaan.

  2. Hanya dokumen yang dikembalikan dari hasil pencarian, tanpa nilai kesamaan.

Fitur Utama:

  • Anda dapat menggunakan parameter filter untuk memfilter berdasarkan metadata.

  • Melalui fetch_k, Anda dapat mengatur jumlah dokumen yang diambil sebelum difilter, untuk memastikan jumlah dokumen yang diinginkan setelah pemfilteran.

Pertimbangan Saat Penggunaan:

  • Kinerja pencarian sangat bergantung pada kualitas model embedding yang digunakan.

  • Pada dataset besar, penting untuk menyesuaikan nilai k dan fetch_k untuk menyeimbangkan kecepatan dan akurasi pencarian.

  • Jika memerlukan pemfilteran yang kompleks, Anda dapat memberikan fungsi kustom pada parameter filter untuk kontrol yang lebih detail.

Tips Optimasi:

  • Untuk kueri yang sering digunakan, caching hasil pencarian dapat meningkatkan kecepatan pencarian yang berulang.

  • Jika fetch_k diatur terlalu besar, kecepatan pencarian bisa melambat, jadi sebaiknya menemukan nilai yang sesuai melalui eksperimen.

Anda dapat menentukan jumlah hasil pencarian dalam nilai k.

Anda dapat menggunakan informasi metadata dalam filter untuk memfilter.

Penambahan dari Dokumen (add_documents)

Metode add_documents menyediakan fungsi untuk menambahkan atau memperbarui dokumen dalam penyimpanan vektor.

Parameter:

  • documents (List[Document]): Daftar dokumen yang akan ditambahkan ke penyimpanan vektor.

  • **kwargs: Argumen kata kunci tambahan.

Return:

  • List[str]: Daftar ID dari teks yang ditambahkan.

Cara Kerja:

  1. Mengekstrak konten teks dan metadata dari dokumen.

  2. Memanggil metode add_texts untuk melakukan penambahan yang sebenarnya.

Fitur Utama:

  • Memungkinkan pemrosesan objek dokumen secara langsung, yang membuatnya lebih praktis.

  • Logika penanganan ID disertakan untuk memastikan keunikan dokumen.

  • Beroperasi berdasarkan metode add_texts, sehingga meningkatkan ketergunaan ulang kode.

Penambahan dari Teks (add_texts)

Metode add_texts menyediakan fungsi untuk melakukan embedding pada teks dan menambahkannya ke dalam penyimpanan vektor.

Parameter:

  • texts (Iterable[str]): Iterable teks yang akan ditambahkan ke penyimpanan vektor.

  • metadatas (Optional[List[dict]]): Daftar metadata yang terkait dengan teks (opsional).

  • ids (Optional[List[str]]): Daftar pengenal unik untuk teks (opsional).

  • **kwargs: Argumen kata kunci tambahan.

Nilai Pengembalian :

  • List[str]: Daftar ID dari teks yang ditambahkan ke penyimpanan vektor.

Cara Kerja:

  • Mengonversi iterable teks yang diterima menjadi daftar.

  • Menggunakan metode _embed_documents untuk melakukan embedding pada teks.

  • Memanggil metode __add untuk menambahkan teks yang telah di-embed ke dalam penyimpanan vektor.

Penghapusan Dokumen (Delete Documents)

Metode delete menyediakan fungsi untuk menghapus dokumen yang sesuai dengan ID yang ditentukan dari penyimpanan vektor.

Parameter:

  • ids (Optional[List[str]]): Daftar ID dokumen yang akan dihapus.

  • **kwargs: Argumen kata kunci tambahan (tidak digunakan dalam metode ini).

Return :

  • Optional[bool]: Mengembalikan True jika penghapusan berhasil, False jika gagal, atau None jika tidak diimplementasikan.

Cara Kerja:

  1. Memeriksa validitas ID yang dimasukkan.

  2. Mencari indeks yang sesuai dengan ID yang akan dihapus.

  3. Menghapus ID tersebut dari indeks FAISS.

  4. Menghapus dokumen dengan ID tersebut dari penyimpanan dokumen.

  5. Memperbarui pemetaan indeks dan ID.

Fitur Utama:

  • Penghapusan berbasis ID memungkinkan pengelolaan dokumen yang akurat.

  • Penghapusan dilakukan di kedua sisi, yaitu indeks FAISS dan penyimpanan dokumen.

  • Setelah penghapusan, dilakukan penyusunan ulang indeks untuk menjaga konsistensi data.

Peringatan:

  • Operasi penghapusan tidak dapat dibatalkan, jadi harus dilakukan dengan hati-hati.

  • Pengendalian konkurensi tidak diimplementasikan, sehingga perlu diperhatikan dalam lingkungan multi-thread.

delete dapat menghapus dengan memasukkan id.

Menyimpan dan memuat


Penyimpanan Lokal (Save Local)

Metode save_local menyediakan fungsi untuk menyimpan indeks FAISS, penyimpanan dokumen, dan pemetaan ID dokumen ke indeks di disk lokal.

Parameter:

  • folder_path (str): Jalur folder tempat penyimpanan.

  • index_name (str): Nama file indeks yang akan disimpan (default: "index").

Cara Kerja:

  1. Membuat jalur folder yang ditentukan (akan diabaikan jika sudah ada).

  2. Menyimpan indeks FAISS ke dalam file terpisah.

  3. Menyimpan penyimpanan dokumen dan pemetaan ID dokumen ke indeks dalam format pickle.

Pertimbangan Penggunaan:

  • Diperlukan izin menulis ke jalur penyimpanan.

  • Untuk data berukuran besar, ruang penyimpanan dan waktu yang diperlukan bisa sangat signifikan.

  • Perlu mempertimbangkan risiko keamanan yang terkait dengan penggunaan pickle.

Memuat dari Lokal (Load Local)

Metode kelas load_local menyediakan fungsi untuk memuat indeks FAISS, penyimpanan dokumen, dan pemetaan ID dokumen ke indeks yang disimpan di disk lokal.

Parameter:

  • folder_path (str): Jalur folder tempat file yang akan dimuat disimpan.

  • embeddings (Embeddings): Objek embedding yang akan digunakan untuk membuat kueri.

  • index_name (str): Nama file indeks yang akan dimuat (default: "index").

  • allow_dangerous_deserialization (bool): Mengizinkan atau tidaknya deserialisasi file pickle yang berisiko (default: False).

Nilai Pengembalian:

  • FAISS: Objek FAISS yang telah dimuat.

Cara Kerja:

  1. Memverifikasi risiko deserialisasi dan meminta izin eksplisit dari pengguna.

  2. Memuat indeks FAISS secara terpisah.

  3. Menggunakan pickle untuk memuat penyimpanan dokumen dan pemetaan ID dokumen ke indeks.

  4. Membuat dan mengembalikan objek FAISS dari data yang dimuat.

Menggabungkan objek FAISS (Merge From)

Metode merge_from menyediakan fungsi untuk menggabungkan objek FAISS lain ke dalam objek FAISS saat ini.

Parameter:

  • target (FAISS): Objek FAISS yang akan digabungkan ke dalam objek saat ini.

Cara Kerja:

  1. Memeriksa apakah penyimpanan dokumen dapat digabungkan.

  2. Menetapkan indeks untuk dokumen baru berdasarkan panjang indeks yang sudah ada.

  3. Menggabungkan indeks FAISS.

  4. Mengekstraksi informasi dokumen dan ID dari objek FAISS target.

  5. Menambahkan informasi yang diekstraksi ke penyimpanan dokumen dan pemetaan ID dokumen ke indeks yang ada.

Fitur Utama:

  • Menggabungkan indeks, penyimpanan dokumen, dan pemetaan ID dokumen dari dua objek FAISS.

  • Mempertahankan kesinambungan nomor indeks selama penggabungan.

  • Memastikan penyimpanan dokumen dapat digabungkan sebelum melanjutkan.

Peringatan:

  • Struktur objek FAISS yang akan digabungkan harus kompatibel dengan objek saat ini.

  • Perhatikan penanganan ID yang duplikat. Implementasi saat ini tidak melakukan pemeriksaan duplikasi.

  • Jika terjadi pengecualian selama proses penggabungan, objek mungkin berada dalam kondisi yang sebagian tergabung.

Menggabungkan dua basis data menggunakan merge_from.

Konversikan ke retriever (as_retriever)

Metode as_retriever menyediakan fungsi untuk membuat objek VectorStoreRetriever berdasarkan penyimpanan vektor saat ini.

Parameter:

  • **kwargs: Argumen kata kunci yang akan diteruskan ke fungsi pencarian.

  • search_type (Optional[str]): Jenis pencarian ("similarity", "mmr", "similarity_score_threshold").

  • search_kwargs (Optional[Dict]): Argumen kata kunci tambahan yang akan diteruskan ke fungsi pencarian.

Return:

  • VectorStoreRetriever: Objek pencarian berbasis penyimpanan vektor.

Fitur Utama:

Mendukung berbagai jenis pencarian:

  • "similarity": Pencarian berbasis kesamaan (default).

  • "mmr": Pencarian Maximal Marginal Relevance.

  • "similarity_score_threshold": Pencarian berbasis kesamaan dengan ambang batas skor.

Kustomisasi parameter pencarian:

  • k: Jumlah dokumen yang akan dikembalikan.

  • score_threshold: Ambang batas skor kesamaan.

  • fetch_k: Jumlah dokumen yang akan diambil untuk algoritma MMR.

  • lambda_mult: Parameter pengatur keragaman untuk MMR.

  • filter: Penyaringan berdasarkan metadata dokumen.

Pertimbangan Penggunaan:

  • Pilih jenis pencarian dan parameter yang tepat untuk menyesuaikan kualitas dan variasi hasil pencarian.

  • Pada dataset berukuran besar, sesuaikan nilai fetch_k dan k untuk mencapai keseimbangan antara kinerja dan akurasi.

  • Manfaatkan fitur penyaringan untuk mencari dokumen yang sesuai dengan kondisi tertentu.

Tips Optimasi:

  • Saat menggunakan pencarian MMR, tingkatkan fetch_k dan sesuaikan lambda_mult untuk mencapai keseimbangan antara keragaman dan relevansi.

  • Gunakan pencarian berbasis ambang batas untuk hanya mengembalikan dokumen dengan relevansi tinggi.

Peringatan:

  • Pengaturan parameter yang tidak tepat dapat mempengaruhi kinerja pencarian atau kualitas hasilnya.

  • Pada dataset berukuran besar, pengaturan nilai k yang tinggi dapat meningkatkan waktu pencarian. Defaultnya adalah mengembalikan 4 dokumen yang paling mirip berdasarkan pencarian kesamaan.

Retriever default mengembalikan empat dokumen.

Mengambil lebih banyak dokumen dengan keragaman yang lebih besar

  • k: Jumlah dokumen yang akan dikembalikan (standar: 4)

  • fetch_k: Jumlah dokumen yang akan diteruskan ke algoritme MMR (default: 20)

  • lambda_mult: Skala keragaman hasil MMR (0-1, default: 0,5)

Dapatkan lebih banyak dokumen untuk algoritme MMR, tetapi hanya kembalikan dua dokumen teratas

Cari hanya dokumen dengan kemiripan di atas ambang batas tertentu

Cari hanya satu dokumen yang paling mirip

Menerapkan filter metadata tertentu

Last updated