Хранилище векторов

  • Перейдите на Интеграции, чтобы узнать о всех сторонних движках хранения векторов, официально поддерживаемых LangChain.

Самым распространенным решением для хранения и поиска неструктурированных данных является вычисление векторных признаков данных, а затем поиск похожих векторов на основе их сходства при запросе. Векторная база данных отвечает за предоставление движков хранения данных для хранения и запросов по векторам.

Начало работы с LangChain Vector Store

Это руководство представляет основные функциональные возможности, связанные с Хранилищами Векторов. Основным компонентом работы с векторным хранилищем является модель эмбеддинга (отвественная за вычисление векторов признаков). Поэтому рекомендуется изучить как рассчитывать текстовые векторы с помощью модели эмбеддинга текста перед изучением этой главы.

Существует много отличных движков хранения векторов. Ниже мы представляем использование 3 бесплатных и открытых движков хранения векторов в рамках фреймворка LangChain.

Chroma

В этой главе используется векторная база данных chroma, которая работает локально как библиотека Python.

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())

FAISS

В этой главе используется векторная база данных FAISS, которая использует библиотеку 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())

Lance

В этой главе мы рассмотрим, как фреймворк LangChain использует векторную базу данных LanceDB.

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)

Асинхронные операции

Хранение векторов часто работает как самостоятельный сервис и требует некоторых операций ввода-вывода. Поэтому используйте асинхронные вызовы к интерфейсу базы данных векторов. Это может улучшить производительность, так как вам не нужно тратить время на ожидание ответов от внешних сервисов.

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 = "What did the President say to Ketanji Brown Jackson?"
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 = "What did the President say to 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")