Векторизация текста
Компьютеры обрабатывают любую информацию в виде чисел. Чтобы эффективно работать с текстами на естественных языках, модели искусственного интеллекта преобразовывают слова, фразы и предложения в числовые векторы фиксированного размера, которые сохраняют характеристики слов и связи между ними.
Процесс преобразования текста в такие векторы называется векторизацией, а результирующий вектор — эмбеддингом. Эмбеддинги хранят информацию о тексте и позволяют применять математические методы для обработки текстов. Так, с помощью эмбеддингов можно классифицировать информацию, сравнивать и сопоставлять тексты или организовать поиск по собственной базе знаний.
Если базовая модель эмбеддингов вам не подходит, вы можете дообучить ее.
Модели векторного представления текста
Сервис Yandex Foundation Models предоставляет две модели векторизации текста.
Назначение | URI | Размерность выходного вектора | Режимы работы |
---|---|---|---|
Векторизация больших текстов исходных данных, например статей документации. | emb://<идентификатор_каталога>/text-search-doc/latest |
256 | Синхронный |
Векторизация коротких текстов: поисковых запросов, обращений и т.п. | emb://<идентификатор_каталога>/text-search-query/latest |
256 | Синхронный |
Дообученные модели эмбеддингов | gpt://<идентификатор_каталога>/text-embeddings/<версия>@<суффикс_дообучения> |
Зависит от параметров дообучения По умолчанию — 256 | Синхронный |
Чтобы использовать модели векторного представления текста Yandex Foundation Models, необходима роль ai.languageModels.user
или выше на каталог.
Обращение к моделям
Вы можете обращаться к моделям векторного представления текста несколькими способами.
При работе с моделями векторного представления текста через Yandex Cloud ML 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
from yandex_cloud_ml_sdk import YCloudML
doc_texts = [
"""Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург)
— русский поэт, драматург и прозаик, заложивший основы русского реалистического направления,
литературный критик и теоретик литературы, историк, публицист, журналист.""",
"""Ромашка — род однолетних цветковых растений семейства астровые,
или сложноцветные, по современной классификации объединяет около 70 видов невысоких пахучих трав,
цветущих с первого года жизни.""",
]
query_text = "когда день рождения Пушкина?"
def main():
import numpy as np
from scipy.spatial.distance import cdist
sdk = YCloudML(
folder_id="<идентификатор_каталога>",
auth="<API-ключ>",
)
# Создаем эмбеддинг запроса
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()
Где:
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт.<API-ключ>
— API-ключ сервисного аккаунта для аутентификации в API.
Результат:
Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург)
— русский поэт, драматург и прозаик, заложивший основы русского реалистического направления,
литературный критик и теоретик литературы, историк, публицист, журналист.
import requests
import numpy as np
from scipy.spatial.distance import cdist
FOLDER_ID = "<идентификатор_каталога>"
IAM_TOKEN = "<IAM-токен>"
doc_uri = f"emb://{FOLDER_ID}/text-search-doc/latest"
query_uri = f"emb://{FOLDER_ID}/text-search-query/latest"
embed_url = "https://llm.api.cloud.yandex.net:443/foundationModels/v1/textEmbedding"
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {IAM_TOKEN}", "x-folder-id": f"{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)])
Где:
<идентификатор_каталога>
— идентификатор каталога Yandex Cloud.<IAM-токен>
— IAM-токен аккаунта для аутентификации в API.
Результат:
Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург) — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления, литературный критик и теоретик литературы, историк, публицист, журналист.
Примеры использования
См. также
- Примеры работы с ML SDK на GitHub
- Дообучение моделей