فروشگاه برداری

  • به انتگرال ها مراجعه کنید تا در مورد تمام موتورهای فروشگاه بردار های شخص ثالثی که به طور رسمی توسط LangChain پشتیبانی می شوند، آموخته شود.

راه حل رایج برای ذخیره و جستجوی داده های بدون ساختار، محاسبه بردارهای ویژگی داده است و سپس در زمان پرس و جو، بر اساس تشابه بردار، بردارهای مشابه را جستجو می کند. پایگاه داده بردار مسئول فراهم کردن موتورهای ذخیره و جستجوی بردارها است.

شروع با فروشگاه بردار LangChain

این راهنما ویژگی های پایه مربوط به فروشگاه های بردار را معرفی می کند. اصلی ترین قسمتی که با فروشگاه بردار کار می کند، مدل توکن گذاری است (مسئول محاسبه بردارهای ویژگی). بنابراین، توصیه می شود که قبل از مطالعه این فصل، یاد بگیرید چگونه با مدل توکن گذاری متن بردارهای متن را محاسبه کنید.

تعداد زیادی موتورهای فروشگاه بردار عالی وجود دارد. در زیر، ما به معرفی استفاده از ۳ موتور فروشگاه بردار آزاد و متن باز در چارچوب LangChain می پردازیم.

کروما

این فصل از پایگاه داده بردار کروما استفاده می کند که به صورت محلی به عنوان یک کتابخانه پایتون اجرا می شود.

pip install chromadb

در اینجا، ما از مدل توکن گذاری OpenAI برای محاسبه بردارها استفاده می کنیم، بنابراین نیاز داریم تا کلید API OpenAI را دریافت کنیم.

import os
import getpass
os.environ['OPENAI_API_KEY'] = getpass.getpass('کلید 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())

فایس

در این فصل، از پایگاه داده بردار فایس استفاده می کنیم که از کتابخانه Facebook AI Similarity Search (FAISS) استفاده می کند.

pip install faiss-cpu

در اینجا، ما از مدل توکن گذاری OpenAI برای محاسبه بردارها استفاده می کنیم، بنابراین نیاز داریم تا کلید API OpenAI را دریافت کنیم.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('کلید 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())

لنس

در این فصل، ما به شما چگونگی استفاده از پایگاه داده بردار LanceDB در چارچوب LangChain را معرفی می کنیم.

pip install lancedb

در اینجا، ما از مدل توکن گذاری OpenAI برای محاسبه بردارها استفاده می کنیم، بنابراین نیاز داریم تا کلید API OpenAI را دریافت کنیم.

import os
import getpass

os.environ['OPENAI_API_KEY'] = getpass.getpass('کلید 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("Hello World"),
            "text": "Hello World",
            "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)

جستجوی تشابه

query = "چه چیزی رئیس جمهور به کتانجی براون جکسون گفت؟"
docs = db.similarity_search(query)
print(docs[0].page_content)

جستجوی مشابهت بردار

استفاده از similarity_search_by_vector برای انجام جستجوی مشابهت بر اساس بردار داده شده. این تابع یک بردار تعبیه را به عنوان پارامتر می‌پذیرد به جای یک رشته.

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

عملیات ناهمگام

ذخیره‌سازی بردار معمولاً به عنوان یک سرویس مستقل اجرا می‌شود و نیازمند برخی عملیات IO می‌باشد. بنابراین، از فراخوانی‌های ناهم‌گام برای رابط پایگاه داده بردار استفاده کنید. این کار می‌تواند کارایی را بهبود بخشد زیرا نیازی به انتظار پاسخ از خدمات خارجی ندارید.

Langchain از عملیات ناهمگام برای ذخیره‌سازی بردار پشتیبانی می‌کند. تمام متدها می‌توانند با استفاده از توابع ناهمگام خود با پیشوند a که async را مشخص می‌کند فراخوانی شوند.

Qdrant یک ذخیره‌سازی بردار است که تمام عملیات ناهمگام را پشتیبانی می‌کند. در زیر نمونه‌ای از استفاده از Qdrant آمده است.

pip install qdrant-client
from langchain_community.vectorstores import Qdrant

ایجاد ذخیره‌سازی بردار ناهمگام

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

جستجوی مشابهت

query = "رئیس جمهور به کتانجی براون جکسون چه گفت؟"
docs = await db.asimilarity_search(query)
print(docs[0].page_content)

جستجوی بر اساس بردار

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

جستجوی حداکثر حاشیه مارجینال (MMR)

جستجوی حداکثر حاشیه مارجینال برتری مشابهت به پرس و جو و تنوع بین اسناد انتخابی را بهینه می‌کند. این همچنین از یک API ناهمگام پشتیبانی می‌کند.

query = "رئیس جمهور به کتانجی براون جکسون چه گفت؟"
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")