SDF Protocol: извлечение данных из веб-страниц в JSON с локальными LLM | AiManual
AiManual Logo Ai / Manual.
09 Фев 2026 Инструмент

SDF Protocol: как запустить локальные модели для извлечения структурированных данных из веб-страниц в JSON

Руководство по SDF Protocol для извлечения структурированных данных. Запуск моделей Qwen2.5 и SmolLM3 через Ollama, квантование Q4_K_M, сравнение и примеры для

HTML - это боль. SDF Protocol - это аспирин

Ваш AI-агент захлебывается, пытаясь проглотить 50 тысяч токенов сырого HTML. Он ищет цену товара, а находит десять тысяч тегов <div>. Знакомая картина? В 2026 году это уже не проблема, а повод для истерики. SDF Protocol (Structured Data From Web Pages) режет эту проблему как горячий нож масло.

💡
SDF Protocol - это не магия, а хитрый препроцессинг. Он разбирает HTML на семантические блоки (заголовки, параграфы, списки, таблицы), выбрасывает мусор вроде рекламы и скриптов, а на выходе дает чистый, структурированный текст. Ваша LLM видит не лапшу из тегов, а готовый к анализу контент. И токенов в 10-15 раз меньше.

Какие модели не сломаются об JSON в 2026 году?

GPT-5 или Gemini Ultra? Забудьте. Для локального запуска нужны компактные и упрямые модели, которые будут слушаться промптов и не гадать на кофейной гуще. Две звезды на этом небосклоне:

  • Qwen2.5-1.5B-Instruct (обновление 2025 года). Всего 1.5 миллиарда параметров, но феноменально послушна в задачах структурирования. Не пытается философствовать, когда вы просите JSON.
  • SmolLM3-3B (актуальная версия на начало 2026). Чуть больше, но и умнее в понимании контекста. Идеальна для сложных страниц с кучей связанных данных.

Почему не Llama 4 или Mistral 2.5? Они отличны, но для чистого извлечения данных по промпту - это избыточно. Как использовать гоночный болид для поездки в магазин за хлебом. Если вы все же решитесь на крупные модели, вспомните статью про архив знаний на случай апокалипсиса, там есть подсказки по оптимизации.

Важное уточнение: SDF Protocol - это методология, а не готовая коробка. Вам нужно будет немного попотеть с промптами и настройкой вывода. Если вам нужен готовый сервис "загрузил URL - получил JSON", смотрите в сторону облачных решений вроде Structured Outputs в Amazon Bedrock.

1 Ставим Ollama и качаем модель

Ollama в 2026 году - это стандарт де-факто для запуска локальных моделей. Установка - дело одной команды. А потом тянем нашу модель с квантованием Q4_K_M. Это золотая середина: качество почти как у оригинала, а весит всего 2.8 ГБ.

# Установка Ollama (если еще нет)
curl -fsSL https://ollama.ai/install.sh | sh

# Загрузка квантованной модели Qwen2.5
ollama pull qwen2.5:1.5b-instruct-q4_K_M

# Или SmolLM3
ollama pull smollm3:3b-q4_K_M

Почему Q4_K_M? Потому что Q2_K уже делает из модели овощ, а Q8 занимает много места без существенного прироста качества для нашей задачи. 2.8 ГБ - это комфортно даже для ноутбука.

2 Пишем скрипт-обработчик на Python

Тут все просто. Берем библиотеку BeautifulSoup4 для разбора HTML (она жива и актуальна в 2026) и requests для загрузки страниц. Логика SDF Protocol проста: очистить, выделить, отправить в LLM.

import requests
from bs4 import BeautifulSoup
import json
import subprocess

def extract_with_sdf(html_content, schema_prompt):
    """
    Основная функция: берет HTML и промпт с описанием схемы JSON,
    возвращает структурированные данные.
    """
    # 1. Очистка HTML (удаляем скрипты, стили, рекламные блоки)
    soup = BeautifulSoup(html_content, 'html.parser')
    for trash in soup(['script', 'style', 'iframe', 'nav', 'footer']):
        trash.decompose()
    
    # 2. Извлечение семантических блоков
    text_blocks = []
    for tag in soup.find_all(['h1', 'h2', 'h3', 'p', 'li', 'td']):
        text = tag.get_text(strip=True)
        if text and len(text) > 10:  # Отсекаем мусор
            text_blocks.append(text)
    
    clean_content = '\n'.join(text_blocks)
    
    # 3. Формирование финального промпта для LLM
    final_prompt = f"""
    Ты - ассистент по извлечению структурированных данных.
    Из следующего текста, полученного с веб-страницы, извлеки информацию строго по схеме ниже.
    Верни ТОЛЬКО валидный JSON, без пояснений.
    
    Схема JSON: {schema_prompt}
    
    Текст для анализа:
    {clean_content}
    """
    
    # 4. Запрос к локальной модели через Ollama API
    response = subprocess.run(
        ['ollama', 'run', 'qwen2.5:1.5b-instruct-q4_K_M', final_prompt],
        capture_output=True,
        text=True
    )
    
    # 5. Парсинг ответа (осторожно, LLM иногда добавляет лишний текст)
    output = response.stdout.strip()
    # Простая попытка найти JSON в ответе
    try:
        # Ищем начало и конец JSON объекта
        start = output.find('{')
        end = output.rfind('}') + 1
        json_str = output[start:end]
        return json.loads(json_str)
    except:
        # Если не вышло, возвращаем сырой ответ для отладки
        return {"error": "Failed to parse JSON", "raw_output": output}

# Пример использования
url = "https://example.com/product-page"
html = requests.get(url).text

# Промпт, описывающий желаемую структуру
schema = """
{
  "product_name": "string",
  "price": "number",
  "description": "string",
  "specifications": {
    "key": "value"
  }
}
"""

result = extract_with_sdf(html, schema)
print(json.dumps(result, indent=2, ensure_ascii=False))

Скрипт сырой, но рабочий. В реальном проекте добавьте обработку ошибок, кэширование и, возможно, асинхронность. Если ваша модель вдруг начинает болтать вместо выдачи JSON, вам пригодится техника из статьи "Держите свой JSON".

Что получаем на выходе? Пример из жизни

Допустим, мы парсим страницу ноутбука. На входе - 120 КБ HTML (примерно 25k токенов). После SDF Protocol осталось 12 КБ чистого текста (2.5k токенов). Промпт модели:

{
  "product": "Ноутбук игровой",
  "price_usd": 1299.99,
  "cpu": "Intel Core i7-14700HX",
  "gpu": "NVIDIA GeForce RTX 4070",
  "ram_gb": 32,
  "storage": "1TB SSD",
  "in_stock": true
}

Модель Qwen2.5-1.5B-Instruct выдает такой JSON за 3-4 секунды на среднем CPU. Без предварительной очистки она бы либо отказалась работать из-за длины контекста, либо сошла с ума, пытаясь анализировать CSS.

А что, если SDF Protocol - не мой вариант?

Бывает. Вот альтернативы, актуальные в 2026:

Метод Плюсы Минусы Когда выбирать
Традиционный скрапинг (BeautifulSoup, Scrapy) Быстро, предсказуемо, не требует GPU Хрупкий код, ломается при изменении верстки Когда структура сайта простая и стабильная
Облачные LLM API (GPT-4o, Claude 3.5) Высочайшее качество извлечения, понимание контекста Дорого, зависимость от интернета, вопросы приватности Для разовых задач с критичной точностью
Специализированные инструменты (Diffbot, ScrapingBee) Готовое решение, минимум кода Подписка, лимиты, не всегда покрывают нишевые сайты Для бизнес-проектов без своей команды разработки
SDF Protocol с локальными LLM Полная приватность, низкая стоимость, гибкость Требует настройки, зависимость от качества модели Для массового парсинга, исследований, AI-агентов

Если вам нужно, чтобы ваш AI-агент сам ходил по ссылкам и собирал данные, объедините SDF Protocol с методом из статьи про доступ в интернет для локальной LLM.

Кому стоит заморачиваться с SDF Protocol прямо сейчас?

Ответ короткий: тем, кто строит AI-агентов, которые работают с веб-данными в реальном времени. Если ваш агент анализирует новости, сравнивает цены, мониторит соцсети - SDF Protocol сократит ваши затраты на токены в разы и ускорит ответы.

Исследователям данных, которые собирают датасеты из открытых источников, тоже пригодится. Один раз настроили пайплайн - и он работает автономно, без страха, что сайт поменяет CSS-класс и все сломается.

А вот если вам нужно разово спарсить один сайт - может, проще вручную? (Шучу. Используйте Loot-JSON для починки сломанного вывода).

Прогноз на 2026-2027: подходы вроде SDF Protocol станут стандартным блоком в тулбоксах для AI-агентов. Модели будут еще меньше и специализированнее. А квантование Q6_K вытеснит Q4_K_M как новый компромисс между скоростью и качеством. Держите ухо востро.

И последний совет: не зацикливайтесь на одной модели. Экспериментируйте. Запустите тест для 10 разных страниц через Qwen2.5 и SmolLM3, сравните результаты. Данные - ваша валюта, а SDF Protocol - печатный станок. Главное, не напечатать мусора.