Векторизация текста

Компьютеры обрабатывают любую информацию в виде чисел. Чтобы эффективно работать с текстами на естественных языках, модели искусственного интеллекта преобразовывают слова, фразы и предложения в числовые векторы фиксированного размера, которые сохраняют характеристики слов и связи между ними.

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

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

Модели векторного представления текста

Сервис Yandex AI Studio предоставляет две модели векторизации текста.

Назначение URI Размерность выходного вектора Режимы работы
Векторизация больших текстов исходных данных, например статей документации. emb://<идентификатор_каталога>/text-search-doc/latest 256 Синхронный
Векторизация коротких текстов: поисковых запросов, обращений и т. п. emb://<идентификатор_каталога>/text-search-query/latest 256 Синхронный
Дообученные модели эмбеддингов gpt://<идентификатор_каталога>/text-embeddings/<версия>@<суффикс_дообучения> Зависит от параметров дообучения
По умолчанию — 256
Синхронный

Чтобы использовать модели векторного представления текста Yandex AI Studio, необходима роль ai.languageModels.user или выше на каталог.

Обращение к моделям

Вы можете обращаться к моделям векторного представления текста несколькими способами.

При работе с моделями векторного представления текста через Yandex AI Studio SDK используйте один из следующих форматов:

  • Название модели, передается в виде строки.

    model = (
              sdk.models.text_embeddings("text-search-doc")
            )
            
  • Название и версия модели, передаются в виде строк в полях model_name и model_version соответственно.

    model = (
              sdk.models.text_embeddings(model_name="text-search-query", model_version="latest")
            )
            
  • URI модели, передается в виде строки, содержащей полный URI модели.

    model = (
              sdk.models.text_embeddings("emb://b1gt6g8ht345********/text-search-query/latest")
            )
            

Чтобы обратиться к модели через REST API или gRPC API, в поле modelUri тела запроса укажите URI модели, содержащий идентификатор каталога. Сегмент /latest указывает на версию модели и является необязательным.

Пример:

{
          "modelUri":
            emb://b1gt6g8ht345********/text-search-doc/latest
          ...
        }
        

Для обращения к Latest версии необязательно задавать версию модели явно, поскольку версия Latest используется по умолчанию.

Пример использования эмбеддингов

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

#!/usr/bin/env python3
        # pylint: disable=import-outside-toplevel
        
        from __future__ import annotations
        import os
        from yandex_ai_studio_sdk import AIStudio
        
        doc_texts = [
            """Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург)
            — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления,
            литературный критик и теоретик литературы, историк, публицист, журналист.""",
            """Ромашка — род однолетних цветковых растений семейства астровые,
            или сложноцветные, по современной классификации объединяет около 70 видов невысоких пахучих трав,
            цветущих с первого года жизни.""",
        ]
        query_text = "когда день рождения Пушкина?"
        
        
        def main():
            import numpy as np
            from scipy.spatial.distance import cdist
        
            sdk = AIStudio(
                folder_id=os.environ["YANDEX_FOLDER_ID"],
                auth=os.environ["YANDEX_API_KEY"],
            )
        
            # Создаем эмбеддинг запроса
            query_model = sdk.models.text_embeddings("query")
            query_embedding = query_model.run(query_text)
        
            # Создаем эмбеддинг текстов
            doc_model = sdk.models.text_embeddings("doc")
            doc_embeddings = [doc_model.run(text) for text in doc_texts]
        
            query_embedding = np.array(query_embedding)
        
            # Вычисляем косинусные расстояния и находим ближайшие вектора
            dist = cdist([query_embedding], doc_embeddings, metric="cosine")
            sim = 1 - dist
            result = doc_texts[np.argmax(sim)]
            print(result)
        
        
        if __name__ == "__main__":
            main()
        

Где:

Результат:

Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург)
          — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления,
          литературный критик и теоретик литературы, историк, публицист, журналист.
        
import os
        import requests
        import numpy as np
        from scipy.spatial.distance import cdist
        
        YANDEX_API_KEY = os.environ["YANDEX_API_KEY"]
        YANDEX_FOLDER_ID = os.environ["YANDEX_FOLDER_ID"]
        
        doc_uri = f"emb://{YANDEX_FOLDER_ID}/text-search-doc/latest"
        query_uri = f"emb://{YANDEX_FOLDER_ID}/text-search-query/latest"
        embed_url = "https://ai.api.cloud.yandex.net:443/foundationModels/v1/textEmbedding"
        headers = {"Content-Type": "application/json", "Authorization": f"Bearer {YANDEX_API_KEY}", "x-folder-id": f"{YANDEX_FOLDER_ID}"}
        
        doc_texts = [
          """Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург) — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления, литературный критик и теоретик литературы, историк, публицист, журналист.""",
          """Ромашка — род однолетних цветковых растений семейства астровые, или сложноцветные, по современной классификации объединяет около 70 видов невысоких пахучих трав, цветущих с первого года жизни."""
        ]
        query_text = "когда день рождения Пушкина?"
        
        # Создаем эмбеддинг запроса
        def get_embedding(text: str, text_type: str = "doc") -> np.array:
            query_data = {
                "modelUri": doc_uri if text_type == "doc" else query_uri,
                "text": text,
            }
        
            return np.array(
                requests.post(embed_url, json=query_data, headers=headers).json()["embedding"]
            )
        
        # Создаем эмбеддинг текстов
        query_embedding = get_embedding(query_text, text_type="query")
        docs_embedding = [get_embedding(doc_text) for doc_text in doc_texts]
        
        # Вычисляем косинусное расстояние
        dist = cdist(query_embedding[None, :], docs_embedding, metric="cosine")
        
        # Вычисляем косинусное сходство
        sim = 1 - dist
        
        # most similar doc text
        print(doc_texts[np.argmax(sim)])
        

Где:

Результат:

Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург) — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления, литературный критик и теоретик литературы, историк, публицист, журналист.
        

Примеры использования

Читайте также