Классификация с живым вебом на срезAI: аналог Decisions API

Parallel 25 октября 2026 года выпустила Decisions API: классификацию, которая сверяется с живым вебом. Похожий пайплайн для русскоязычных источников собирается на срезAI из четырёх инструментов и 60 строк Python. Ниже код, стоимость в кредитах и сравнение с Parallel.

Виталий Болгар6 мин чтенияParallel Decisions APIклассификацияживой вебверификация фактовсрезAI
Классификация с живым вебом на срезAI: аналог Decisions API
Общая схема работы ИИ-агента: восприятие, решение и действие в одном цикле
Наш пайплайн укладывается в эту схему: поиск даёт восприятие, голосование по extract даёт решение.

Что делает Parallel Decisions API и что мы повторяем

Parallel Decisions API отвечает на типизированные вопросы о компаниях, продуктах и политиках. Источник ответа - живой веб, а не память модели. Каждый ответ приходит с вероятностью и ссылкой на источник. Подробности - в анонсе в блоге Parallel.

This single API call replaces the multi-step pipeline your team might be building by hand today.

- Parallel, анонс Decisions API в блоге Parallel

Эту многошаговую цепочку мы и собираем руками на срезAI, который глубоко индексирует Рунет и хранит данные в РФ.

Что понадобится

Шаг 1. Как найти страницы-кандидаты

Запрос строим из названия объекта и сути вопроса, например "ПАО Аэрофлот статус юридического лица". Берём num: 5 и language: ru. Пять результатов хватает: читать будем только три верхних.

Шаг 2. Как вынуть метку со ссылкой на источник

Инструмент extract открывает страницу полноценным браузером, выполняет JavaScript на нашей стороне и возвращает JSON по вашей схеме. Отдельный read_urls здесь лишний: extract читает страницу сам, а в контекст попадают только три поля. Чего на странице нет, приходит как null.

Поле evidence_url делает ответ проверяемым. Без него классификатор снова превращается в модель, которая отвечает из памяти.

Шаг 3. Как выбрать итоговую метку

Суммируем confidence по каждой метке и берём лидера. Доля лидера в общей сумме становится итоговым значением confidence. Это эвристика, а не калиброванная вероятность, как у Parallel. Порог 0,7 мы выбрали руками, поэтому подберите свой на размеченной выборке.

Шаг 4. Как перепроверить спорные случаи

Если доля лидера ниже 0,7 или победила метка unknown, вызываем verify_claim с утверждением вроде "Компания X действует и не находится в процессе ликвидации". Он читает независимые источники и возвращает вердикт с цитатами за 8 кредитов. Звать его на каждый объект дорого, поэтому он стоит только на спорной ветке.

python
import asyncio
import json
import os
import re
from collections import defaultdict from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client MCP_URL = 'https://srezai.ru/docs
HEADERS = {'Authorization': 'Bearer ' + os.environ['SREZAI_API_KEY']} SCHEMA = { 'label': 'string', 'confidence': 'number', 'evidence_url': 'string',
}
INSTRUCTION = ( 'Определи статус компании по странице: active, liquidating или unknown. ' 'confidence от 0 до 1. Если страница не про эту компанию, label=unknown.'
) async def call(session, tool, args): response = await session.call_tool(tool, args) return response.content[0].text async def classify(session, company): found = await call(session, 'web_search', { 'query': company + ' статус юридического лица', 'num': 5, 'language': 'ru', }) urls = list(dict.fromkeys(re.findall(r'https?://[^\s)\]]+', found)))[:3] votes = defaultdict(float) evidence = {} for url in urls: raw = await call(session, 'extract', { 'url': url, 'schema': SCHEMA, 'instruction': INSTRUCTION, }) try: item = json.loads(raw) except ValueError: continue label = item.get('label') or 'unknown' votes[label] += float(item.get('confidence') or 0) evidence.setdefault(label, item.get('evidence_url') or url) if not votes or sum(votes.values()) == 0: return {'label': 'unknown', 'confidence': 0, 'evidence_url': None} label = max(votes, key=votes.get) share = votes[label] / sum(votes.values()) answer = { 'label': label, 'confidence': round(share, 2), 'evidence_url': evidence[label], } if share < 0.7 or label == 'unknown': answer['verification'] = await call(session, 'verify_claim', { 'claim': 'Компания ' + company + ' действует и не находится в процессе ликвидации', 'maxSources': 3, 'language': 'ru', }) return answer async def main(): async with streamablehttp_client(MCP_URL, headers=HEADERS) as (read, write, _): async with ClientSession(read, write) as session: await session.initialize() answer = await classify(session, 'ПАО "Аэрофлот"') print(json.dumps(answer, ensure_ascii=False, indent=2)) asyncio.run(main())

Как проверить, что пайплайн работает

Соберите 30-50 объектов с известным статусом, среди них пару заведомо спорных. Прогоните их и посмотрите, у скольких evidence_url ведёт на страницу про нужную компанию.

Самая частая ошибка - страница-однофамилец. Строка в instruction "если страница не про эту компанию, label=unknown" отсекает большую часть таких случаев, но не все. Этот шаг легко пропустить, а потом гадать, откуда взялись чужие evidence_url. Для скоринга контрагентов добавляйте в запрос ИНН.

Возьмите ключ срезAI и прогоните пайплайн на своих объектах. 100 ₽ при регистрации хватает на отладку.

Получить ключ

Сколько это стоит и где Parallel выигрывает

КритерийParallel Decisions APIПайплайн на срезAI
Вызовов на объект1, вопросы можно батчить4-5: поиск, три extract, при споре verify_claim
Цена$1 за 1 000 вызовов, 5 000 бесплатных запросов (по анонсу)7 кредитов без проверки, 15 со спорной веткой; 100 ₽ при регистрации
Задержка517-879 мс на вызов в примерах анонсаp50 одного поиска 976 мс, весь пайплайн дольше: вызовы идут друг за другом
Вероятность ответаТипизированная, приходит из сервисаЭвристика по голосам страниц, калибровать самим
РунетВ анонсе не заявленГлубокая индексация Рунета, данные в РФ
Контроль схемы и источниковФиксированный формат сервисаСвоя схема и свои домены

По скорости и цене за объект Parallel впереди. В анонсе проверка 426 публичных компаний заняла меньше десяти секунд и стоила 85 центов. Наш пайплайн на тех же 426 объектах - около 2 982 кредитов до спорной ветки.

Зато схема и список источников здесь ваши, а для проверки контрагентов по российским реестрам и новостям это порой важнее выигрыша в пару секунд.

Что не сработает

  • Объекты без публичного следа. Если страниц нет, все голоса уйдут в unknown, и вы заплатите за verify_claim впустую.
  • Массовая разметка за секунды. Вызовы идут последовательно, а суточный лимит в 200 вызовов даёт около 28 объектов.
  • Формат ответа extract. Код выше разбирает его как JSON; если в вашем клиенте приходит иной формат, сверьтесь с документацией.
Как сократить стоимость пайплайна

Остановитесь после двух страниц, если обе дали одну метку с confidence выше 0,8: это экономит 2 кредита на объект. Для длинных очередей разделите объекты по доменам заранее и читайте только реестры.

Можно ли заменить Parallel Decisions API на срезAI один к одному?

Частично. Единого вызова с батчем вопросов у срезAI нет, цепочка собирается из нескольких инструментов. Схему и источники вы контролируете сами.

Сколько стоит классификация одного объекта?

7 кредитов: поиск за 1 и три extract по 2. Со спорной веткой выходит 15, потому что verify_claim стоит 8.

Нужен ли read_urls, если есть extract?

Не нужен: схема отдаёт три поля, полный текст лишний. read_urls берите, когда читаете страницы целиком.

Как задать собственные метки?

Поменяйте instruction и список допустимых значений в нём, схему оставьте прежней. Например, для категории сайта: shop, media, service, unknown.

Подходит ли пайплайн для скоринга контрагентов?

Как первый фильтр подходит: он находит источник и помечает спорные случаи. Решение о сделке принимайте после ручной проверки по реестрам.

Свой веб-доступ для агента: поиск, чтение страниц и извлечение данных по одному ключу.

Читайте также