Embedding models
Обзор¶
Это описание охватывает текстовые эмбеддинг-модели. LangChain в настоящее время не поддерживает мультимодальные эмбеддинги.
Эмбеддинг-модели преобразуют необработанный текст — такой как предложение, абзац или твит — в вектор фиксированной длины, состоящий из чисел и отражающий его семантический смысл. Эти векторы позволяют машинам сравнивать и искать текст на основе смысла, а не точного совпадения слов.
На практике это означает, что тексты с похожими идеями располагаются близко друг к другу в векторном пространстве. Например, вместо поиска только по фразе «machine learning», эмбеддинги могут находить документы, обсуждающие связанные концепции, даже если используется другая формулировка.
Как это работает¶
- Векторизация — модель кодирует каждую входную строку как многомерный вектор.
- Оценка схожести — векторы сравниваются с использованием математических метрик для измерения степени близости смыслов исходных текстов.
Метрики схожести¶
Для сравнения эмбеддингов обычно используются следующие метрики:
- Косинусное сходство (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]: создаёт эмбеддинг для одного запроса.
Интерфейс позволяет использовать разные стратегии для эмбеддингов запросов и документов, хотя большинство провайдеров на практике обрабатывают их одинаково.
Популярные интеграции¶
Кэширование¶
Эмбеддинги можно сохранять или временно кэшировать, чтобы избежать их повторного вычисления.
Кэширование эмбеддингов осуществляется с помощью 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