Обработка данных в GigaSearch
В этом разделе описан процесс обработки данных в системе GigaSearch, начиная от выбора ретриверов и сбора данных до их ранжирования, проверки и формирования ответа для клиента.
Как производится обработка данных
1. Выбор ретриверов
На первом этапе система определяет, какие ретриверы (источники данных) будут использоваться для обработки запроса. Существует два типа ретриверов:
- односоставные (YandexSnippetRetriever, WebResearchRetriever), которые осуществляют поиск в одном направлении (только сниппеты или только картинки);
- составные (MultiRetriever, YandexWithFallbackRetriever), которые состоят из нескольких ретриверов и включают логику возврата результатов.
2. Сбор данных
После выбора ретриверов система направляет запросы к соответствующим источникам. Данный этап выполняется асинхронно, что позволяет обрабатывать сразу несколько запросов независимо друг от друга. Результаты включают текстовые, визуальные и контекстные данные.
3. Проверка результатов
На этом этапе проверяется:
- собраны ли данные для всех запросов;
- корректно ли сформирован общий результат (например, присутствуют ли документы для каждого запроса). Если данные отсутствуют или не соответствуют критериям, возвращается ошибка.
4. Ранжирование данных
Если проверка прошла успешно, собранные данные проходят ранжирование. Система упорядочивает результаты в соответствии с установленными приоритетами.
5. Постобработка
Итоговый набор данных урезается до заданного количества документов.
6. Формирование ответа
На последнем этапе система формирует итоговый ответ и передает его клиенту.
Обработку данных в GigaSearch можно представить в виде схемы:
Глоссарий
Наименование | Описание |
---|---|
Retriever | Сущность, которая занимается поиском сниппетов, URL-адресов, результатов поиска текстов, картинок и прочего. |
New | Новости, которые мы получаем через сервис isearch. |
Facts | Обычный поиск по домену Wiki. |
Ranker | Ранжировщик текстовых контекстов для запросов. Это отдельная функция команды isearch. |
Rambler | Поставщик (прокси) данных Яндекса. Не являются полноценным прокси, так как мы используем их параметры запроса, а не параметры Яндекса. |
Isearch | Сервис поиска. |
Отправка множественных запросов
В случае, если в рамках одного пользовательского запроса и/или одной сессии (контекста) моделью было сгенерировано несколько вызовов функции, GoProdigy/GNLP должна скорректировать нумерацию документов, возвращаемых в модель и клиенту следующим образом:
1. Поле reference_keyword
reference_keyword
: к счетчику при втором и последующих обращениях в функцию добавляется смещение - общее количество ссылок, обработанных в предыдущих запросах, таким образом, чтобы получилась сплошная нумерация ссылок
2. Поле inline_data.sources
"inline_data":{ "sources": [ 0: { "title": "", "url": "" }]}
Агрегатор собирает все запросы и соответствующим образом обновляет индексы компонентов, обеспечивая соответствие номеров источников номерам reference_keyword
. В режиме реального времени данные отправляются сразу после коррекции, без предварительной упаковки в пакеты.
3. Поле inline_data.images
"inline_data":{"images": [{"url":"","thumbnail-link":"","thumbnail-width":256,"thumbnail-height":256,"original-width":1024,"original-height":1024,"mime-type":"jpg"}]}
Собирается как агрегат всех запросов в ретривал в рамках текущего пользовательского запроса, индексов не имеет. В Streaming режиме отправляется сразу по мере получения
Пример чанков от GoProdigy
GoProdigy отправляет клиенту служебный чанк, содержащий поле inline_data
с sources
и images
, каждый раз после получения ответа от SearchPlugin. Если модель в GoPro инициирует функцию несколько раз подряд в рамках одного вызова, GoProdigy отправит клиенту соответствующее количество служебных чанков (например, один), а затем последуют чанки с непосредственным ответом-текстовкой для пользователя.
Пример сценария с несколькими запросами к SearchPlugin
Рассмотрим случай, когда необходимо выполнить два последовательных обращения к SearchPlugin. Пример запроса: "Чем Петр I лучше Петра III?". В этом сценарии модель сначала вызовет функцию с параметром: "Кто такой Петр I?", а затем еще раз функцию с параметром "Кто такой Петр III?", и только на 3 поход, начнет непосредственно генерить ответ.
- Первый подход
- Второй подход
- Основные чанки с ответом
{
"choices": [
{
"message": {
"inline_data": {
"sources": {
0: {"title": "", "url": ""},
1:{"title": "","url": ""}
},
"images": [
{"url":"","thumbnail-link":"","thumbnail-width":256,"thumbnail-height":256,"original-width":1024,"original-height":1024,"mime-type":"jpg"}
]
}
}
}
]
}
{
"choices": [
{
"message": {
"inline_data": {
"sources": {
"2": {"title": "", "url": ""},
"3": {"title": "", "url": ""},
"4": {"title": "", "url": ""}
},
"images": [
{
"url": "",
"thumbnail-link": "",
"thumbnail-width": 256,
"thumbnail-height": 256,
"original-width": 1024,
"original-height": 1024,
"mime-type": "jpg"
}
]
}
}
}
]
}
{
"choices": [
{
"message": {
"content": "Петр I...."
}
}
]
}
{
"choices": [
{
"message": {
"content": "родился и умер [source=[1, 2]]..."
}
}
]
}
....
{
"choices": [
{
"message": {
"content": "",
"role": "assistant"
},
"finish_reason": "stop"
}
]
}
Примеры запросов
- Запрос 1 - ответ функции
- Запрос 2 - ответ функции
{
"payload": {
"status": "success",
"results": [
{
"query": "Кто такой Петр I?",
"documents": [
{
"text": "",
"reference_keyword": 0
},
{
"text": "",
"reference_keyword": 1
}
]
"images": [
{img1},
{img2},
{img3}
],
}
],
"sources": {
0: {
"title": "Петр I",
"url": "https://..."
},
1 : {
"title": "Петр I (значения)",
"url": "https://..."
}
}
}
}
{
"payload": {
"status": "success",
"results": [
{
"query": "Кто такой Петр I?",
"documents": [
{
"text": "",
"reference_keyword": 0
},
{
"text": "",
"reference_keyword": 1
}
]
"images": [
{img4},
{img5},
{img6}
],
}
],
"sources": {
0: {
"title": "Петр III",
"url": "https://..."
},
1 : {
"title": "Петр III (значения)",
"url": "https://..."
}
}
}
}
Примеры результатов
- Отправляемый клиенту (метаданные)
- Отправляемый в модель после второго запроса
{
"inline_data":{
"sources": [
0: {
"title": "Петр I",
"url": "https://..."
},
1: {
"title": "Петр I (значения)",
"url": "https://..."
},
2: {
"title": "Петр III",
"url": "https://..."
},
3: {
"title": "Петр III (значения)",
"url": "https://..." }
],
"images": [
{img1},
{img2},
{img3},
{img4},
{img5},
{img6}
],
}
}
{
"payload": {
"status": "success",
"results": [
{
"query": "Кто такой Петр III?",
"documents": [
{
"text": "",
"reference_keyword": 2
},
{
"text": "",
"reference_keyword": 3
}
]
}
]
}
}