Vektör Mağazası

  • Tüm resmi olarak desteklenen LangChain tarafından üçüncü taraf vektör depolama motorları hakkında bilgi edinmek için Entegrasyonlar sayfasına gidin.

Yapılandırılmamış verilerin depolanması ve aranması için en yaygın çözüm, verilerin özellik vektörlerini hesaplamak ve sorgulama yaparken benzer vektörlere dayalı olarak vektör benzerliğini aramaktır. Bir vektör veritabanı, vektörlerin depolanması ve sorgulanması için veri depolama motorlarını sağlamaktan sorumludur.

LangChain Vektör Mağazası'na Başlarken

Bu rehber, Vektör Mağazaları ile ilgili temel işlevsellikleri tanıtır. Vektör depolama ile çalışan temel bileşen, özellik vektörlerini hesaplamaktan sorumlu gömmeli modeldir. Bu nedenle, bu bölümü incelemenizden önce metin gömme modeli ile metin vektörlerini nasıl hesaplayacağınızı öğrenmenizi öneririz.

Birçok mükemmel vektör depolama motoru bulunmaktadır. Aşağıda, LangChain çerçevesindeki 3 ücretsiz ve açık kaynaklı vektör depolama motorunun kullanımını tanıtıyoruz.

Chroma

Bu bölüm, yerel olarak Python kütüphanesi olarak çalışan chroma vektör veritabanını kullanır.

pip install chromadb

Burada, vektörleri hesaplamak için OpenAI gömmeli modelini kullanıyoruz, bu nedenle OpenAI API anahtarını almalıyız.

import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Anahtarı:')
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

Bu bölüm, Facebook AI Benzerlik Arama (FAISS) kütüphanesini kullanan FAISS vektör veritabanını kullanır.

pip install faiss-cpu

Burada, vektörleri hesaplamak için OpenAI gömmeli modelini kullanıyoruz, bu nedenle OpenAI API anahtarını almalıyız.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Anahtarı:')
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

Bu bölümde, LangChain çerçevesinin LanceDB vektör veritabanını nasıl kullandığını tanıtacağız.

pip install lancedb

Burada, vektörleri hesaplamak için OpenAI'nın gömmeli modelini kullanıyoruz, bu nedenle OpenAI API anahtarını almalıyız.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('OpenAI API Anahtarı:')
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("Merhaba Dünya"),
            "metin": "Merhaba Dünya",
            "id": "1",
        }
    ],
    mode="üzerine yaz",
)

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)

Benzerlik Arama

sorgu = "Başkan Ketanji Brown Jackson'a ne dedi?"
dokumanlar = db.benzerlik_arama(sorgu)
print(dokumanlar[0].sayfa_içeriği)

Vektör Benzerlik Araması

Verilen vektöre dayalı benzerlik aramasını yapmak için similarity_search_by_vector kullanın. Bu işlev, bir dize yerine gömme vektörünü parametre olarak alır.

embedding_vector = OpenAIEmbeddings().embed_query(sorgu)
belgeler = db.similarity_search_by_vector(embedding_vector)
print(belgeler[0].page_content)

Asenkron İşlemler

Vektör depolama genellikle bağımsız bir hizmet olarak çalışır ve bazı G/Ç işlemlerine ihtiyaç duyar. Bu nedenle, dış hizmetlerden gelen yanıtları beklemek için zaman harcamamak için vektör veritabanı arayüzüne asenkron çağrılar yapın.

Langchain, vektör depolama için asenkron işlemleri destekler. Tüm yöntemler, asenkron işlevleriyle çağrılabilir ve a önekiyle işaretlenmiş olarak asenkron olarak kullanılabilir.

Qdrant, tüm asenkron işlemleri destekleyen bir vektör deposudur. Aşağıda Qdrant'ı kullanan bir örnek bulunmaktadır.

pip install qdrant-client
from langchain_community.vectorstores import Qdrant

Asenkron Vektör Deposu Oluşturma

db = await Qdrant.afrom_documents(dokümanlar, gömme, "http://localhost:6333")

Benzerlik Araması

sorgu = "Başkan Ketanji Brown Jackson'a ne dedi?"
belgeler = await db.asimilarity_search(sorgu)
print(belgeler[0].page_content)

Vektör Tabanlı Arama

embedding_vector = gömme.embed_query(sorgu)
belgeler = await db.asimilarity_search_by_vector(embedding_vector)

Maksimal Marjinal İlgili (MMR) Araması

Maksimal Marjinal İlgili, sorguyla benzerliği ve seçilen belgeler arasındaki çeşitliliği optimize eder. Ayrıca asenkron bir API'yi destekler.

sorgu = "Başkan Ketanji Brown Jackson'a ne dedi?"
bulunan_belgeler = await qdrant.amax_marginal_relevance_search(sorgu, k=2, fetch_k=10)
for i, belge in enumerate(bulunan_belgeler):
    print(f"{i + 1}.", belge.page_content, "\n")