Toko Vektor

  • Pergi ke Integrasi untuk mempelajari semua mesin penyimpanan vektor pihak ketiga yang didukung secara resmi oleh LangChain.

Solusi paling umum untuk menyimpan dan mencari data tanpa struktur adalah dengan menghitung vektor fitur data, dan kemudian mencari vektor serupa berdasarkan kesamaan vektor saat melakukan kueri. Basis data vektor bertanggung jawab untuk menyediakan mesin penyimpanan data untuk menyimpan dan menanyakan vektor.

Memulai dengan Toko Vektor LangChain

Panduan ini memperkenalkan fungsionalitas dasar terkait Toko Vektor. Komponen kunci dalam bekerja dengan penyimpanan vektor adalah model embedding (bertanggung jawab untuk menghitung vektor fitur). Oleh karena itu, disarankan untuk mempelajari cara menghitung vektor teks dengan model embedding teks sebelum mempelajari bab ini.

Ada banyak mesin penyimpanan vektor yang sangat baik. Di bawah ini, kami memperkenalkan penggunaan 3 mesin penyimpanan vektor gratis dan open-source dalam kerangka kerja LangChain.

Chroma

Bab ini menggunakan basis data vektor chroma, yang berjalan secara lokal sebagai perpustakaan Python.

pip install chromadb

Di sini, kami menggunakan model embedding OpenAI untuk menghitung vektor, jadi kita perlu mendapatkan kunci API OpenAI.

import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('Kunci API OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import Chroma

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = Chroma.from_documents(documents, OpenAIEmbeddings())

FAISS

Bab ini menggunakan basis data vektor FAISS, yang memanfaatkan pustaka Pencarian Kesamaan Kecerdasan Buatan (FAISS) dari Facebook.

pip install faiss-cpu

Di sini, kami menggunakan model embedding OpenAI untuk menghitung vektor, jadi kita perlu mendapatkan kunci API OpenAI.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('Kunci API OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import FAISS

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = FAISS.from_documents(documents, OpenAIEmbeddings())

Lance

Dalam bab ini, kami akan memperkenalkan bagaimana kerangka kerja LangChain menggunakan basis data vektor LanceDB.

pip install lancedb

Di sini, kami menggunakan model embedding OpenAI untuk menghitung vektor, jadi kita perlu mendapatkan kunci API OpenAI.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('Kunci API OpenAI:')
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import CharacterTextSplitter
from langchain_community.vectorstores import LanceDB

import lancedb

db = lancedb.connect("/tmp/lancedb")
table = db.create_table(
    "my_table",
    data=[
        {
            "vector": embeddings.embed_query("Halo Dunia"),
            "teks": "Halo Dunia",
            "id": "1",
        }
    ],
    mode="overwrite",
)

raw_documents = TextLoader('../../../state_of_the_union.txt').load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(raw_documents)
db = LanceDB.from_documents(documents, OpenAIEmbeddings(), connection=table)

Pencarian Kesamaan

query = "Apa yang Presiden katakan kepada Ketanji Brown Jackson?"
dokumen = db.similarity_search(query)
print(dokumen[0].konten_halaman)

Pencarian Kesamaan Vektor

Gunakan similarity_search_by_vector untuk melakukan pencarian kesamaan berdasarkan vektor yang diberikan. Fungsi ini mengambil vektor embedding sebagai parameter daripada string.

embedding_vector = OpenAIEmbeddings().embed_query(query)
docs = db.similarity_search_by_vector(embedding_vector)
print(docs[0].page_content)

Operasi Asynchronous

Penyimpanan vektor sering berjalan sebagai layanan mandiri dan memerlukan beberapa operasi IO. Oleh karena itu, gunakan panggilan asynchronous ke antarmuka basis data vektor. Hal ini dapat meningkatkan kinerja karena Anda tidak perlu membuang waktu menunggu respon dari layanan eksternal.

Langchain mendukung operasi asynchronous untuk penyimpanan vektor. Semua metode dapat dipanggil menggunakan fungsi asynchronous mereka dengan awalan a, menandakan async.

Qdrant adalah penyimpanan vektor yang mendukung semua operasi asynchronous. Berikut adalah contoh penggunaan Qdrant.

pip install qdrant-client
from langchain_community.vectorstores import Qdrant

Pembuatan Penyimpanan Vektor Asynchronous

db = await Qdrant.afrom_documents(documents, embeddings, "http://localhost:6333")

Pencarian Kesamaan

query = "Apa yang dikatakan Presiden kepada Ketanji Brown Jackson?"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)

Pencarian Berbasis Vektor

embedding_vector = embeddings.embed_query(query)
docs = await db.asimilarity_search_by_vector(embedding_vector)

Pencarian Maksimal Marginal Relevance (MMR)

Maximal Marginal Relevance mengoptimalkan kesamaan dengan kueri dan keragaman antara dokumen yang dipilih. Ini juga mendukung API asynchronous.

query = "Apa yang dikatakan Presiden kepada Ketanji Brown Jackson?"
found_docs = await qdrant.amax_marginal_relevance_search(query, k=2, fetch_k=10)
for i, doc in enumerate(found_docs):
    print(f"{i + 1}.", doc.page_content, "\n")