Langchain#

Langchain - библиотека, которая значительно упрощает разработку приложений на основе больших языковых моделей. Она унифицирует интерфейсы различных библиотек, включая основных поставщиков встраиваемых решений и Vector DB. Используя Langchain можно сосредоточиться на бизнес задачах вместо написания шаблонного кода.

Langchain распространяет интеграцию с Vector DB в виде партнерского пакета.

Она может быть установлена с помощью pip:

pip install langchain-qdrant

Интеграция поддерживает поиск релевантных документов с использованием плотных/средних и гибридных методов поиска.

Vector DB выступает в роли векторного индекса, который может хранить вложения вместе с документами, использованными для их генерации. Есть несколько способов его использования, но вызов QdrantVectorStore.from_texts или QdrantVectorStore.from_documents вероятно является самым простым способом начать работу:

from langchain_qdrant import QdrantVectorStore
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

doc_store = QdrantVectorStore.from_texts(
    texts, embeddings, url="<qdrant-url>", api_key="<qdrant-api-key>", collection_name="texts"
)

Использование существующей коллекции#

Чтобы получить экземпляр langchain_qdrant.QdrantVectorStore без загрузки каких-либо новых документов или текстов, можно использовать метод QdrantVectorStore.from_existing_collection().

doc_store = QdrantVectorStore.from_existing_collection(
    embeddings=embeddings,
    collection_name="my_documents",
    url="<qdrant-url>",
    api_key="<qdrant-api-key>",
)

Локальный режим#

Клиент Python позволяет запускать тот же самый код в локальном режиме без запуска сервера Vector DB. Это отлично подходит для тестирования и отладки, а также для хранения небольшого количества векторов. Вложения могут полностью храниться в памяти или сохраняться на диске.

Хранение в оперативной памяти#

Для некоторых тестовых сценариев и быстрых экспериментов может понадобиться сохранять все данные только в памяти, так что они теряются при уничтожении клиента — обычно в конце скрипта/тетради.

qdrant = QdrantVectorStore.from_documents(
    docs,
    embeddings,
    location=":memory:",  # Local mode with in-memory storage only
    collection_name="my_documents",
)

Хранение на диске#

Локальный режим, без использования сервера Vector DB, также может хранить векторы на диске, чтобы они сохранялись между запусками.

qdrant = Qdrant.from_documents(
    docs,
    embeddings,
    path="/tmp/local_qdrant",
    collection_name="my_documents",
)

Развертывание серверной части#

Независимо от того, какой выбран запуск QdrantVectorStore (локально с помощью контейнера Docker Docker-контейнер или развернете кластер Kubernetes с официальной диаграммой Helm официальная диаграмма Helm), способ подключения к такому экземпляру будет идентичным. Потребуется предоставить URL-адрес, указывающий на сервис.

url = "<---qdrant url here --->"
qdrant = QdrantVectorStore.from_documents(
    docs,
    embeddings,
    url,
    prefer_grpc=True,
    collection_name="my_documents",
)

Поиск по подобию#

QdrantVectorStore поддерживает три режима поиска по подобию. Они могут быть настроены с помощью параметра retrieval_mode при настройке класса.

  • Плотный векторный поиск (по умолчанию);

  • Раскладочный векторный поиск;

  • Гибридный поиск.

Плотный векторный поиск#

Чтобы искать только по плотным векторам,

  • Параметр retrieval_mode должен быть установлен в значение RetrievalMode.DENSE(по умолчанию).

  • Значение плотные вложения должно быть предоставлено для параметра embedding.

    from langchain_qdrant import RetrievalMode
    
    qdrant = QdrantVectorStore.from_documents(
        docs,
        embedding=embeddings,
        location=":memory:",
        collection_name="my_documents",
        retrieval_mode=RetrievalMode.DENSE,
    )
    
    query = "What did the president say about Ketanji Brown Jackson"
    found_docs = qdrant.similarity_search(query)
    

Раскладочный векторный поиск#

Чтобы выполнять поиск только по разреженным векторам,

  • Параметр retrieval_mode следует установить в значение RetrievalMode.SPARSE.

  • Реализация интерфейса SparseEmbeddings, использующая любого поставщика разреженных вложений, должна быть предоставлена в качестве значения параметра sparse_embedding.

Пакет langchain-qdrant предоставляет реализацию на базе FastEmbed FastEmbed из коробки.

Чтобы использовать ее, установите пакет FastEmbed.

from langchain_qdrant import FastEmbedSparse, RetrievalMode

sparse_embeddings = FastEmbedSparse(model_name="Qdrant/BM25")

qdrant = QdrantVectorStore.from_documents(
    docs,
    sparse_embedding=sparse_embeddings,
    location=":memory:",
    collection_name="my_documents",
    retrieval_mode=RetrievalMode.SPARSE,
)

query = "What did the president say about Ketanji Brown Jackson"
found_docs = qdrant.similarity_search(query)

Гибридный векторный поиск#

Чтобы выполнить гибридный поиск с использованием плотных и разреженных векторов со слиянием оценок,

  • Параметр retrieval_mode необходимо установить в значение RetrievalMode.HYBRID.

  • Значение плотные вложения должно быть предоставлено для параметра embedding.

  • Реализация интерфейса SparseEmbeddings, использующая любого поставщика разреженных вложений, должна быть предоставлена в качестве значения параметра sparse_embedding.

    from langchain_qdrant import FastEmbedSparse, RetrievalMode
    
    sparse_embeddings = FastEmbedSparse(model_name="Qdrant/bm25")
    
    qdrant = QdrantVectorStore.from_documents(
        docs,
        embedding=embeddings,
        sparse_embedding=sparse_embeddings,
        location=":memory:",
        collection_name="my_documents",
        retrieval_mode=RetrievalMode.HYBRID,
    )
    
    query = "What did the president say about Ketanji Brown Jackson"
    found_docs = qdrant.similarity_search(query)
    

Обратите внимание если ранее добавили документы в режиме HYBRID, можно переключаться на любой режим извлечения во время поиска. Поскольку оба типа векторов доступны в коллекции.

Дополнительная документация#