Использовать эмбеддинги в поиске по базе знаний
С помощью эмбеддингов вы можете найти в базе знаний наиболее близкий ответ на заданный вопрос.
Если базовая модель эмбеддингов вам не подходит, вы можете дообучить ее.
Перед началом работы
Чтобы воспользоваться примерами:
- Создайте сервисный аккаунт и назначьте ему роль
ai.languageModels.user. -
Получите и сохраните API-ключ сервисного аккаунта, указав для него область действия
yc.ai.foundationModels.execute.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
Примечание
Если вы используете ОС Windows
, рекомендуем предварительно установить оболочку WSL и выполнять дальнейшие действия в этой оболочке. -
Установите Python версии 3.10
или выше. -
Установите библиотеку Python venv
для создания изолированных виртуальных окружений в Python. -
Создайте и войдите в новое виртуальное окружение Python:
python3 -m venv new-env source new-env/bin/activate -
С помощью менеджера пакетов 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
- Дообучить модель эмбеддингов