Использовать эмбеддинги в поиске по базе знаний
С помощью эмбеддингов вы можете найти в базе знаний наиболее близкий ответ на заданный вопрос.
Перед началом работы
Чтобы воспользоваться примерами:
-
Создайте сервисный аккаунт и назначьте ему роль
ai.languageModels.user
. -
Получите и сохраните API-ключ сервисного аккаунта.
В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
С помощью менеджера пакетов pip
установите библиотеку ML SDK:pip install yandex-cloud-ml-sdk
Выполните поиск
В приведенном примере в массиве doc_texts
собраны исходные данные для векторизации (база знаний), переменная query_text
содержит текст поискового запроса. После получения эмбеддингов вычисляется расстояние между каждым вектором в базе знаний и вектором запроса и определяется наиболее близкий текст в базе знаний.
Примечание
В качестве входных данных для запроса Yandex Cloud ML SDK может принимать строку, словарь, объект класса TextMessage
или массив, содержащий любое сочетание указанных типов данных. Подробнее см. в разделе Использование Yandex Cloud ML SDK.
-
Создайте файл
search-knowledge-base.py
и добавьте в него следующий код:#!/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.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
Подробнее о том, как обращаться к моделям векторного представления текста, см. в разделе Обращение к моделям.
-
-
Выполните созданный файл:
python3 search-knowledge-base.py
Результат выполнения:
Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург) — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления, литературный критик и теоретик литературы, историк, публицист, журналист.
-
Создайте файл
search-knowledge-base.py
и добавьте в него следующий код: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.
-
Выполните созданный файл:
python3 search-knowledge-base.py
Результат выполнения:
Александр Сергеевич Пушкин (26 мая [6 июня] 1799, Москва — 29 января [10 февраля] 1837, Санкт-Петербург) — русский поэт, драматург и прозаик, заложивший основы русского реалистического направления, литературный критик и теоретик литературы, историк, публицист, журналист.
См. также
- Векторизация текста
- Примеры работы с ML SDK на GitHub