Векторизация текста
Компьютеры обрабатывают любую информацию в виде чисел. Чтобы эффективно работать с текстами на естественных языках, модели искусственного интеллекта преобразовывают слова, фразы и предложения в числовые векторы фиксированного размера, которые сохраняют характеристики слов и связи между ними.
Процесс преобразования текста в такие векторы называется векторизацией, а результирующий вектор — эмбеддингом. Эмбеддинги хранят информацию о тексте и позволяют применять математические методы для обработки текстов. Так, с помощью эмбеддингов можно классифицировать информацию, сравнивать и сопоставлять тексты или организовать поиск по собственной базе знаний.
Модели векторного представления текста
Сервис Yandex Foundation Models предоставляет две модели векторизации текста.
Назначение | URI | Размерность выходного вектора | Режимы работы |
---|---|---|---|
Векторизация больших текстов исходных данных, например статей документации. | emb://<идентификатор_каталога>/text-search-doc/latest |
256 | Синхронный |
Векторизация коротких текстов: поисковых запросов, обращений и т.п. | emb://<идентификатор_каталога>/text-search-query/latest |
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