Генеративный ответ
Вы можете использовать текстовый поиск Search API в сочетании с генеративными возможностями YandexGPT, чтобы получить на поисковый запрос пользователя единый емкий и понятный генеративный ответ, при формировании которого нейросеть анализирует релевантные результаты текстового поиска Search API по сайтам вашей компании.
Примечание
Функциональность находится на стадии Preview.
Чтобы получить доступ к возможности генеративного ответа, заполните форму или обратитесь к вашему аккаунт-менеджеру.
В настоящий момент генеративный ответ доступен только для запросов, выполненных через интерфейс API v1.
Поисковый запрос
Запросы к сервису Search API на получение генеративного ответа отправляются методом POST на эндпоинт https://yandex.ru/search/xml/generative
.
Для выполнения запросов необходим сервисный аккаунт с ролью search-api.executor
и созданный для него API-ключ. Для успешной авторизации передавайте в каждом запросе идентификатор каталога и API-ключ сервисного аккаунта.
Формат запроса
Каждый запрос на получение генеративного ответа должен содержать тело запроса в формате JSON
{
"messages": [
{
"content": "<текст_сообщения_1>",
"role": "user"
},
{
"content": "<ответ_модели_1>",
"role": "assistant"
},
{
"content": "<текст_сообщения_2>",
"role": "user"
},
{
"content": "<ответ_модели_3>",
"role": "assistant"
},
...
{
"content": "<текст_сообщения_n>",
"role": "user"
}
],
"site": "<адрес_сайта_для_поиска>",
"host": "<хост_для_поиска>",
"url": "<страница_для_поиска>"
}
Параметры запроса
-
messages
— одиночный поисковый запрос или поисковый запрос с контекстом в форме чата с моделью. Задается в виде массива объектов, в каждом из которых содержатся два элемента:content
— текст запроса пользователя или ответа модели (в зависимости от значения элементаrole
).role
— роль автора сообщения. Возможные значения:user
— означает, что автор сообщения — пользователь, а в полеcontent
— запрос пользователя.assistant
— означает, что автор сообщения — модель, а в полеcontent
— ответ модели.
Подробнее о режиме чата в YandexGPT см. в разделе Как реализовать чат с YandexGPT.
-
site
— ограничение области поиска релевантных документов по сайту, напримерyandex.cloud
.Поиск будет выполняться по всем документам вида
*.yandex.cloud/*
. То есть, в область поиска попадут документы со следующими адресами:yandex.cloud/
subdomain.yandex.cloud/
yandex.cloud/path/
subdomain.yandex.cloud/path/
В поле
site
можно указать конкретный путь к области поиска, напримерhttps://yandex.cloud/ru/docs
. -
host
— ограничение области поиска релевантных документов по хосту, напримерyandex.cloud/
.Поиск будет выполняться по всем документам вида
yandex.cloud/*
. То есть, в область поиска попадут документы со следующими адресами:yandex.cloud/
yandex.cloud/path/
В отличие от ограничения области поиска в поле
site
, заданное в полеhost
ограничение не распространяется на поддомены. В полеhost
также нельзя указать конкретный путь к области поиска. -
url
— ограничение области поиска релевантных документов по странице, напримерhttps://yandex.cloud/ru/docs/search-api/pricing
.Примечание
Для ограничения области поиска достаточно указать в запросе одно из полей:
site
,host
илиurl
.Приоритет поля
host
выше, чем у поляsite
, аurl
в приоритете надhost
. Если в запросе передаются все три поля, область поиска будет ограничена значением поляurl
, а значение полейhost
иsite
будет проигнорировано.
Пример тела запроса:
{
"messages": [
{
"content": "Сколько стоит Search API?",
"role": "user"
}
],
"site": "https://yandex.cloud/ru/docs"
}
Отправка запроса
Чтобы отправить запрос, воспользуйтесь утилитой cURL
export FOLDER_ID=<идентификатор_каталога>
export API_KEY=<API-ключ>
curl \
--request POST \
--header "Authorization: Api-Key ${API_KEY}" \
--data "@<путь_к_файлу_с_телом_запроса>" \
"https://yandex.ru/search/xml/generative?folderid=${FOLDER_ID}"
import requests
import os
SEARCH_API_GENERATIVE = f"https://ya.ru/search/xml/generative?folderid={os.getenv('FOLDER_ID')}"
def main():
headers = {"Authorization": f"Api-Key {os.getenv('API_KEY')}"}
data = {
"messages": [
{
"content": "Сколько стоит Search API?",
"role": "user"
}
],
"url": "https://yandex.cloud/ru/docs/search-api/pricing"
}
response = requests.post(SEARCH_API_GENERATIVE, headers=headers, json=data)
if "application/json" in response.headers["Content-Type"]:
print(response.json()["message"]["content"])
for i, link in enumerate(response.json()["links"], start=1):
print(f"[{i}]: {link}")
elif "text/xml" in response.headers["Content-Type"]:
print("Error:", response.text)
else:
print("Unexpected content type:", response.text)
if __name__ == "__main__":
main()
Генеративный ответ
Сервис Search API возвращает ответ в формате JSON следующего вида:
{
"message": {
"content": "<текст_ответа>",
"role": "assistant"
},
"links": [
"<ссылка_на_найденный_документ_1>",
"<ссылка_на_найденный_документ_2>",
...
"<ссылка_на_найденный_документ_n>"
],
"titles": [
"<заголовок_найденного_документа_1>",
"<заголовок_найденного_документа_2>",
...
"<заголовок_найденного_документа_n>"
],
"final_search_query": "<доработанный_текст_запроса>",
"is_answer_rejected": false (true),
"is_bullet_answer": false (true),
"search_reqid" : "...",
"reqid" : "..."
}
Где:
-
content
— текст генеративного ответа. -
links
— отсортированный список ссылок на документы, которые были найдены при запросе и могли использоваться YandexGPT для формирования ответа. -
titles
— отсортированный список заголовков документов. -
final_search_query
— конечный вариант текста поискового запроса, доработанный моделью YandexGPT и использованный при формировании генеративного ответа. Может отличаться от запроса, изначально переданного пользователем. -
is_answer_rejected
— индикатор отказа модели предоставить ответ из-за этических ограничений:false
— модель вернула ответ.true
— модель отказалась вернуть ответ.
-
is_bullet_answer
— индикатор буллетного ответа, когда модель не может дать хороший ответ и предлагает набор буллетов с различной информацией. -
search_reqid
— уникальный идентификатор запроса в Поиске от Яндекса. -
reqid
— уникальный идентификатор запроса Search API.
Пример генеративного ответа с ограничением по сайту:
{
"message": {
"content": "Стоимость использования Search API **рассчитывается исходя из количества инициированных поисковых запросов за календарный месяц**. [1]\n\n**Цена за 1000 запросов**, включая НДС: [1]\n- ночные запросы, первые 1000 запросов в месяц — не тарифицируется; [1]\n- ночные запросы, свыше 1000 запросов в месяц — 360 рублей; [1]\n- дневные запросы — 480 рублей. [1]\n\nДля всех новых пользователей сервиса действует квота в 30 000 запросов в месяц (1000 запросов в день). [1]\n\nЦены могут отличаться в разных регионах, а валюта оплаты зависит от юридического лица, с которым пользователь заключил договор. [1]",
"role": "assistant"
},
"links": [
"https://yandex.cloud/ru/docs/search-api/pricing",
"https://yandex.cloud/ru/docs/search-api/concepts/generative-response",
"https://yandex.cloud/ru/docs/api-gateway/pricing",
"https://yandex.cloud/ru/docs/functions/pricing",
"https://yandex.cloud/ru/docs/ydb/pricing/ru-docapi"
],
"titles": [
"Правила тарификации для Yandex Search API | Yandex Cloud - Документация",
"Генеративный ответ | Yandex Cloud - Документация",
"Правила тарификации для Yandex API Gateway | Yandex Cloud - Документация",
"Правила тарификации для Cloud Functions | Yandex Cloud - Документация",
"Правила оценки стоимости запросов к ydb-short-name через Document API | Yandex Cloud - Документация"
],
"final_search_query": "стоимость Search API",
"is_answer_rejected": false,
"is_bullet_answer": false,
"search_reqid": "1716922280912146-404265690610183965-**************-BAL",
"reqid": "1716922280829905-8678730291785779856-********-l7leveler-***-**-***-***-BAL"
}
Особенности ответа
В зависимости от запроса и полученных результатов поиска, при формировании генеративного ответа Search API может выдавать такие предупреждения:
-
Если сервис не нашел ни одного документа по запросу:
Ничего не нашлось.
Переформулируйте запрос или спросите что-нибудь ещё. -
Если сервис нашел документы-источники по запросу, но извлечь из них информацию не получилось:
Не удалось извлечь информацию по запросу из найденных документов. Попробуйте открыть их самостоятельно или перейти к результатам поиска.
-
Если сервис нашел документы-источники и извлек из них информацию, но нет уверенности в высоком качестве ответа, Search API предваряет ответ следующим сообщением:
На сайтах по данной теме доступна различная информация, её обзор ниже.