AI
January 19

YandexGPT API. Часть 2. Embeddings

Embeddings (векторные представления текста) обычно используют для измерения связанности текстовых строк и применяются в таких задачах, как:

  • Поиск (где результаты ранжируются по релевантности строке запроса)
  • Кластеризация (когда текстовые строки группируются по сходству)
  • Рекомендации (где рекомендуются элементы со связанными текстовыми смыслами)
  • Измерение разнообразия (когда анализируется распределение сходства)
  • Классификация (где текстовые строки классифицируются по наиболее похожей метке)

Обычно embedding это массив чисел, представляющий вектор определённого текста. Посмотрим на примерах кода, как это генерируется и как это выглядит в результате.

Прежде всего, предлагаю ознакомиться с первой частью статьи. Где я показал, как получить api-ключ для запросов.

Пример кода на TypeScript

Нам понадобится библиотека для http-запросов. Я возьму axios

npm i --save axios
yarn add axios
bun add axios

Далее собственно наш код:

import axios from 'axios';

const yandexgpt_key = '<секретный api-ключ выше>';

async function main() {
  try {
    const data = {
      modelUri: `emb://<идентификатор_каталога>/text-search-doc/latest`,
      text: `Любой текст для генерации embedding`
    };

    const response = await axios.post(
      `https://llm.api.cloud.yandex.net/foundationModels/v1/textEmbedding`,
      data,
      {
        headers: {
          'Authorization': `Api-Key ${yandexgpt_key}`
        },
      }
    );
    console.log(response.status);
    console.log(JSON.stringify(response.data, null, 2));
  } catch (err) {
    console.error('error:', err)
  }
}

main();

Параметры запроса и пример ответа разберу ниже после примера кода на Python.

Пример кода на Python

import requests

gpt_api_key = '<секретный api-ключ выше>'


def yandex_gpt_embedding(text: str):
    response = requests.post(
        "https://llm.api.cloud.yandex.net/foundationModels/v1/textEmbedding",
        headers={
            "Authorization": f"Api-Key {gpt_api_key}"
        },
        json={
          "modelUri": "emb://<идентификатор_каталога>/text-search-doc/latest",
          "text": text
        },
    )
    return response.json()


print(yandex_gpt_embedding("Любой текст для генерации embedding"))

Разбор параметров и ответа

Согласно документации в body принимается следующая структура JSON:

{
  "modelUri": "string",
  "text": "string"
}
  • modelUri — модель генерации embedding:
    • emb://<идентификатор_каталога>/text-search-doc/latest — Векторизация больших текстов исходных данных, например статей документации. В основном индексация изначального текста
    • emb://<идентификатор_каталога>/text-search-query/latest — Векторизация коротких текстов: поисковых запросов, обращений и т.п.
  • text — сам текст, для которого генерируем embedding.

В ответ нам возвращается структура следующего вида:

{
  "embedding": [
    -0.019805908203125,
    0.059234619140625,
    -0.07427978515625,
    0.0361328125,
    ...
    0.0200042724609375,
    0.04119873046875,
    -0.01357269287109375
  ],
  "numTokens": "8",
  "modelVersion": "06.12.2023"
}

Где:

  • embedding — вектор значений (длина получается 256)
  • numTokens — число токенов, которое входящего текста. Как правило это не всегда число слов и знаков препинания. Модель определяет это сама.
  • modelVersion — модель версии, используемой для генерации embedding.


Используемые ссылки: