Перейти к содержанию

Embedding models

Обзор

Это описание охватывает текстовые эмбеддинг-модели. LangChain в настоящее время не поддерживает мультимодальные эмбеддинги.

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

На практике это означает, что тексты с похожими идеями располагаются близко друг к другу в векторном пространстве. Например, вместо поиска только по фразе «machine learning», эмбеддинги могут находить документы, обсуждающие связанные концепции, даже если используется другая формулировка.

Как это работает

  1. Векторизация — модель кодирует каждую входную строку как многомерный вектор.
  2. Оценка схожести — векторы сравниваются с использованием математических метрик для измерения степени близости смыслов исходных текстов.

Метрики схожести

Для сравнения эмбеддингов обычно используются следующие метрики:

  • Косинусное сходство (Cosine similarity) — измеряет угол между двумя векторами.
  • Евклидово расстояние (Euclidean distance) — измеряет прямолинейное расстояние между точками.
  • Скалярное произведение (Dot product) — измеряет, насколько один вектор проецируется на другой.

Вот пример вычисления косинусного сходства между двумя векторами:

import numpy as np

def cosine_similarity(vec1, vec2):
    dot = np.dot(vec1, vec2)
    return dot / (np.linalg.norm(vec1) * np.linalg.norm(vec2))

similarity = cosine_similarity(query_embedding, document_embedding)
print("Cosine Similarity:", similarity)

Интерфейс эмбеддингов в LangChain

LangChain предоставляет стандартный интерфейс для текстовых эмбеддинг-моделей (например, OpenAI, Cohere, Hugging Face) через интерфейс Embeddings.

Доступны два основных метода:

  • embed_documents(texts: List[str]) → List[List[float]]: создаёт эмбеддинги для списка документов.
  • embed_query(text: str) → List[float]: создаёт эмбеддинг для одного запроса.

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

Популярные интеграции

Provider Package
OpenAI langchain-openai
OpenAI on Azure langchain-openai
Google Gemini langchain-google-genai
Ollama langchain-ollama
Together langchain-together
Fireworks langchain-fireworks
MistralAI langchain-mistralai
Cohere langchain-cohere
Nomic langchain-nomic
Fake langchain-core
Databricks databricks-langchain
IBM langchain-ibm
NVIDIA langchain-nvidia
AI/ML API langchain-aimlapi

Кэширование

Эмбеддинги можно сохранять или временно кэшировать, чтобы избежать их повторного вычисления.

Кэширование эмбеддингов осуществляется с помощью CacheBackedEmbeddings. Эта обёртка сохраняет эмбеддинги в хранилище «ключ-значение», где текст хэшируется, а хэш используется в качестве ключа в кэше.

Основной поддерживаемый способ инициализации CacheBackedEmbeddings — метод from_bytes_store. Он принимает следующие параметры:

  • underlying_embedder: эмбеддер, используемый для создания эмбеддингов.
  • document_embedding_cache: любой ByteStore для кэширования эмбеддингов документов.
  • batch_size: (необязательный, по умолчанию None) количество документов для обработки между обновлениями хранилища.
  • namespace: (необязательный, по умолчанию "") пространство имён для кэша документов. Помогает избежать коллизий (например, можно установить его равным имени модели эмбеддингов).
  • query_embedding_cache: (необязательный, по умолчанию None) ByteStore для кэширования эмбеддингов запросов или значение True для повторного использования того же хранилища, что и document_embedding_cache.
import time
from langchain_classic.embeddings import CacheBackedEmbeddings
from langchain_classic.storage import LocalFileStore

# Создайте базовую модель эмбеддингов
underlying_embeddings = ...  # например, OpenAIEmbeddings(), HuggingFaceEmbeddings() и т.д.

# Хранилище сохраняет эмбеддинги в локальной файловой системе
# Это не для продакшена, но удобно для локальной разработки
store = LocalFileStore("./cache/")

cached_embedder = CacheBackedEmbeddings.from_bytes_store(
    underlying_embeddings,
    store,
    namespace=underlying_embeddings.model
)

# Пример: кэширование эмбеддинга запроса
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"First call took: {time.time() - tic:.2f} seconds")

# Последующие вызовы используют кэш
tic = time.time()
print(cached_embedder.embed_query("Hello, world!"))
print(f"Second call took: {time.time() - tic:.2f} seconds")

В продакшене обычно используют более надёжное постоянное хранилище, например базу данных или облачное хранилище. См. интеграции хранилищ.

Source: https://docs.langchain.com/oss/python/integrations/text_embedding