Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

Aktualisiert:
Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

⚡ Коротко

  • Ключова думка 1: Dynamic filtering — це не нова UI-фіча, а архітектурна зміна: Claude тепер пише та виконує код для фільтрації HTML до того, як результати потрапляють у context window.
  • Ключова думка 2: Результат — +11% точності на пошукових бенчмарках і -24% input токенів одночасно, що рідкість: зазвичай точність і вартість рухаються у протилежних напрямках.
  • Ключова думка 3: Статичні фільтри (домен, дата) задані до того, як модель зрозуміла запит — це архітектурна інверсія. Dynamic filtering виправляє цей порядок.
  • 🎯 Ви отримаєте: повний технічний розбір механіки dynamic filtering, порівняння з RAG, реальні бенчмарки та практичні патерни інтеграції для production.
  • 👇 Нижче — детальні пояснення, приклади та таблиці

📚 Зміст статті

Чому статичні фільтри — архітектурна проблема, а не просто незручність

Коротко: Коли розробник задає фільтри до запиту — він приймає рішення про релевантність до того, як модель зрозуміла питання. Це інверсія правильного порядку обробки інформації.

Уявіть, що ви наймаєте дослідника і перш ніж він прочитав ваше завдання — ви вже кажете йому: "Шукай тільки на Wikipedia і тільки статті за 2024 рік." Дослідник ще не знає, що саме шукати, але фільтри вже накладені. Саме так працювали статичні фільтри у web search до лютого 2026 року.

Технічно проблема виглядала ось як: у традиційному пошуковому pipeline розробник передавав до API параметри фільтрації — дозволені домени, діапазон дат, типи контенту — разом із запитом користувача. Модель отримувала вже відфільтровані результати та намагалась відповісти на питання з того, що залишилось. Якщо фільтри були надто вузькими — відповідь була неповною або відсутньою. Якщо надто широкими — контекстне вікно заповнювалось нерелевантним HTML (меню навігації, cookie-банери, рекламні блоки, сайдбари), і модель витрачала токени на "шум" замість сигналу.

Але найглибша проблема навіть не в ширині фільтрів. Вона в тому, що рішення про фільтрацію приймається на основі мета-даних запиту, а не на основі змісту результатів. Розробник не може знати заздалегідь, який саме розділ сторінки буде релевантним, з якого абзацу починається потрібна таблиця цін, або чи потрібно взагалі фільтрувати за датою для цього конкретного питання. Це рішення може прийняти тільки той, хто вже побачив контент, тобто сама модель.

Статичні фільтри — це архітектурний компроміс епохи, коли моделі не вміли виконувати код під час інференсу. Розробники задавали фільтри наперед, бо не було іншого способу контролювати обсяг контексту. Dynamic filtering вирішує цю проблему принципово: фільтрація відбувається після того, як модель побачила результати, але до того, як вони потрапляють у context window для фінального reasoning.

Як Claude будує search query з контексту: від промпту до пошукового наміру

Коротко: Claude розкладає user intent на search intent через кілька внутрішніх кроків, і динамічність filtering починається вже на рівні формулювання запиту — задовго до того, як перший HTML завантажується.

Щоб зрозуміти, де з'являється "динамічність", потрібно розібрати весь pipeline від промпту користувача до фінальної відповіді. Він складається з кількох рівнів, і кожен вносить свій вклад у те, наскільки точним буде результат.

На першому рівні відбувається intent decomposition — модель аналізує запит користувача та визначає, що саме шукати. Запит "знайди поточну ціну AAPL і розрахуй P/E ratio" модель розкладає на два підзапити: перший — знайти актуальну ціну акції, другий — знайти показник EPS для розрахунку. Кожен підзапит має свій оптимальний набір джерел та критеріїв релевантності.

На другому рівні відбувається query construction — формування конкретних пошукових запитів з ключовими словами. Тут модель використовує контекст розмови, доступні інструменти та власне розуміння теми, щоб сформулювати запити, які дадуть релевантні результати. Це не просто передача промпту користувача в пошуковик — це переклад з "людської мови наміру" на "мову ефективного пошуку".

На третьому рівні, який і є ключовою новацією, відбувається post-retrieval code execution. Після того як результати пошуку повернуті (у форматі сирого HTML або JSON-сніпетів), модель не завантажує їх одразу в context window. Натомість вона пише невеликий Python-скрипт для витягування лише релевантних частин: конкретних таблиць, параграфів, числових даних, заголовків. Скрипт виконується в ізольованому sandbox-середовищі, і в context window потрапляє вже очищений, структурований результат.

Якщо порівняти з попереднім підходом: раніше розробник мав написати такий скрипт сам, передбачити всі можливі структури HTML різних сайтів, і підтримувати цей код при кожній зміні верстки. Тепер модель генерує відповідний екстрактор на льоту — і якщо структура сторінки змінилась, наступного разу скрипт буде іншим.

Розділ 3. Dynamic filtering під капотом: що реально змінилося в API

Коротко: Головна зміна — поява версії інструменту web_search_20260209 з вбудованим code execution sandbox, де фільтрація відбувається за межами context window, а в модель потрапляє тільки очищений результат.

Технічна реалізація dynamic filtering базується на трьох компонентах, які разом утворюють нову архітектуру пошукового pipeline. Розберемо кожен з них детально.

Компонент 1: Нова версія web search tool

Anthropic випустив дві нові версії інструментів: web_search_20260209 та web_fetch_20260209. Саме в цих версіях вбудована підтримка dynamic filtering. Попередні версії залишаються доступними для зворотної сумісності. Детальна документація: Web Search Tool — Claude API Docs.

API-запит виглядає ось так:

{

"model": "claude-4-6",

"max_tokens": 4096,

"tools": [

{

"type": "web_search",

"name": "web_search"

},

{

"type": "web_fetch",

"name": "web_fetch"

}

],

"messages": [

{

"role": "user",

"content": "Знайди поточні ціни AAPL і GOOGL, потім розрахуй яка має кращий P/E ratio."

}

]

}

Компонент 2: Beta header та code execution sandbox

Dynamic filtering вимагає окремого beta header в запиті:

anthropic-beta: code-execution-web-tools-2026-02-09

Цей header активує право моделі виконувати код під час обробки пошукових результатів. Технічно code execution відбувається в ізольованому sandbox-середовищі на серверах Anthropic — поза контекстним вікном. Це критично: код та проміжні результати його виконання не споживають токени context window.

Компонент 3: Вартісна модель

Anthropic ухвалив стратегічне рішення: code execution при використанні з web search або web fetch — безкоштовний. Ви платите тільки за стандартні input/output токени, обсяг яких зазвичай зменшується завдяки ефективній фільтрації.

ПараметрСтарий підхідDynamic Filtering
Версія інструментуweb_searchweb_search
Локація фільтраціїУ context windowЗа межами (sandbox)
Логіка фільтраціїСтатичні параметриДинамічний Python-код
Вартість executionОкремий тарифБезкоштовно (bundled)

Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

BrowseComp та DeepsearchQA: що кажуть бенчмарки і як їх читати

Коротко: +11% точності та -24% input токенів — це результати на двох типах задач. Проте для моделі Opus існує нюанс щодо вартості через складність генерованого коду.

BrowseComp: задача "голка в сіні"

Тестує здатність знайти конкретний факт серед великого обсягу "шуму". Результати показують суттєвий приріст продуктивності:

МодельБез фільтраціїЗ dynamic filteringПриріст
Sonnet 4.633.3%46.6%+13.3 п.п.
Opus 4.645.3%61.6%+16.3 п.п.

DeepsearchQA: задача на повноту охоплення

Вимірює F1 score для дослідницьких запитів, де потрібно знайти всі згадки об'єктів. Тут динамічна фільтрація допомагає моделі не "тонути" в деталях і зберігати фокус на структурі відповіді.

Модель (F1 score)Без фільтраціїЗ dynamic filteringПриріст
Sonnet 4.652.6%59.4%+6.8 п.п.
Opus 4.669.8%77.3%+7.5 п.п.

Важливо: Хоча середня економія токенів складає 24%, для Opus 4.6 вартість запиту може іноді зростати. Складний код-фільтр, який генерує Opus, сам споживає output-токени. Якщо вигода від стиснення контенту менша за обсяг коду — фінальний чек буде вищим.

Dynamic Web Search vs RAG: коли що обирати і чому це не конкуренти

Коротко: RAG — це retrieval з вашої knowledge base, web search — це retrieval з відкритого інтернету. Dynamic filtering наближає web search до RAG за точністю витягування, але не замінює його: це різні рівні архітектури для різних задач.

Ключова різниця між цими підходами полягає у природі джерела даних і рівні контролю над ними.

  • RAG (Retrieval-Augmented Generation): Ви самі контролюєте knowledge base. Ви індексуєте власні документи, будуєте vector embeddings та налаштовуєте similarity threshold. Це ідеально для внутрішньої документації та корпоративних знань.
  • Dynamic Web Search: Ви не контролюєте джерело. Структура сторінок змінюється, джерела можуть бути суперечливими. Проте ви отримуєте актуальну інформацію без витрат на підтримку власної бази.

Dynamic filtering наближає web search до RAG у одному конкретному аспекті — точності вилучення релевантного контенту з "брудного" джерела.

ХарактеристикаRAGDynamic Web Search
Джерело данихВаша knowledge baseВідкритий інтернет
Контроль якостіПовнийВідсутній
АктуальністьЗалежить від оновлення індексуРеальний час
ComplianceЛегко аудитуватиСкладно аудитувати
Момент фільтраціїПри індексації (ваш код)При запиті (JIT-код Claude)

Гібридна архітектура

Найефективніший підхід для складних систем — це поєднання обох методів. Нижче наведено концептуальний приклад роутера, який обирає інструмент залежно від типу запиту:

# Концептуальний приклад hybrid router

def route_query(query: str, context: dict) -> str:

if requires_internal_knowledge(query):

return rag_retrieve(query, internal_vector_db)

elif requires_realtime_data(query):

return web_search_with_dynamic_filtering(query)

else:

return combine_both_sources(query)

Dynamic filtering не замінює RAG — він робить web search достатньо точним, щоб стати надійним доповненням у тих сценаріях, де приватна база знань не має актуальних відповідей.

Практичні патерни інтеграції: коли довіряти моделі, коли override

Коротко: Dynamic filtering найефективніший для "зашумлених" джерел і складних multi-step пошуків. Але для compliance-чутливих або highly specialized доменів розробник часто знає краще за модель — і override залишається важливим інструментом.

Сценарії, де dynamic filtering виграє:

  • Технічна документація: Витягування конкретних параметрів (наприклад, payload limits) без завантаження десятків кілобайт зайвого HTML.
  • Академічні дослідження: Фільтрація абстрактів та релевантних параграфів з наукових баз, відсікаючи навігацію та рекламу.
  • Competitive Intelligence: Автоматична адаптація під унікальну верстку сайтів конкурентів для збору цін та фіч.

Сценарії, де варто зберігати статичний контроль (Override):

  • Compliance та юридичні задачі: Коли використання лише акредитованих джерел є обов'язковим.
  • Вузькоспеціалізовані домени: Якщо існують 2-3 безальтернативні авторитетні джерела.
  • Критичні числові дані: Real-time трейдинг, де помилка у витягуванні цифри неприпустима — тут потрібен додатковий шар валідації.

Рекомендований hybrid pattern для production:

import anthropic

client = anthropic.Anthropic()

def search_with_dynamic_filtering(

query: str,

allowed_domains: list = None, # override для compliance

validate_output: bool = True # додатковий шар валідації

) -> dict:

tools = [

{"type": "web_search", "name": "web_search"},

{"type": "web_fetch, "name": "web_fetch"}

]

# Обмеження доменів через system prompt

system = ""

if allowed_domains:

system = f"Search only on these domains: {', '.join(allowed_domains)}"

response = client.messages.create(

model="claude-3-7", # Або актуальна версія 4.6

max_tokens=4096,

system=system,

tools=tools,

messages=[{"role": "user", "content": query}],

extra_headers={

"anthropic-beta": "code-execution-web-tools-2026-02-09"

}

)

if validate_output:

return validate_search_result(response)

return response

Обмеження та де dynamic filtering все одно ламається

Коротко: Dynamic filtering — це значне покращення, але не срібна куля. Є щонайменше чотири класи ситуацій, де він дає збої, і знати їх важливо до того, як ви покладете на нього production-навантаження.

Обмеження 1: Дуже свіжі події та нові домени

Модель спирається на патерни типових структур веб-сторінок. Якщо сайт має нетипову верстку або з'явився зовсім нещодавно, JIT-код може некоректно інтерпретувати DOM-дерево, що призведе до втрати даних.

Обмеження 2: JavaScript-rendered контент (SPA)

Dynamic filtering працює з результатом web_fetch. Якщо сайт рендерить контент на стороні клієнта (React/Vue без SSR), модель отримає мінімальний HTML-каркас. Навіть ідеальний Python-скрипт не зможе витягнути дані, яких фізично немає в початковому сирому коді.

Обмеження 3: Latency overhead

Генерація та запуск коду в sandbox — це додаткова ітерація. Для простих запитів, де обсяг даних і так невеликий, час на підготовку та виконання фільтрації може бути довшим, ніж пряма обробка тексту моделлю.

Обмеження 4: Нестабільність коду "чорної скриньки"

На відміну від стаціонарного парсера, який покритий тестами, динамічний код генерується "на льоту". Ви не можете гарантувати 100% повторюваність логіки екстракції для однієї і тієї ж сторінки в різних сесіях.

Обмеження 5: Економіка Opus 4.6

Для моделі Opus вартість запиту може зростати через складність генерованих скриптів. Вища ціна за токен у поєднанні з довгим output-кодом фільтрації іноді нівелює економію на вхідних токенах.

Порада архітектора: Використовуйте Sonnet 4.6 як "робочу конячку" для більшості задач з dynamic filtering — він демонструє кращий баланс швидкості, вартості та точності фільтрації.

Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

Як увімкнути та налаштувати: повний гайд для розробника

Коротко: Три обов'язкових компоненти: версія інструменту web_search_20260209, beta header code-execution-web-tools-2026-02-09, та підтримувана модель (Opus 4.6 або Sonnet 4.6). Все разом — і dynamic filtering активується автоматично.

Крок 1: Встановлення залежностей

pip install anthropic --upgrade

# Потрібна версія >= 0.40.0 для підтримки нових tool versions

Крок 2: Базовий запит з dynamic filtering

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(

model="claude-3-7", # або актуальна версія 4.6

max_tokens=4096,

tools=[

{

"type": "web_search",

"name": "web_search"

},

{

"type": "web_fetch",

"name": "web_fetch"

}

],

messages=[

{

"role": "user",

"content": "Знайди актуальні ціни на GPU RTX 5090 в Україні та порівняй три найкращі пропозиції."

}

],

extra_headers={

"anthropic-beta": "code-execution-web-tools-2026-02-09"

}

)

print(response.content)

Крок 3: Research agent з multi-step пошуком

import anthropic

client = anthropic.Anthropic()

def research_agent(research_query: str) -> str:

"""

Multi-step research agent з dynamic web search filtering.

Оптимальний для DeepsearchQA-типу задач: знайти всі відповіді.

"""

system_prompt = """

Ти — дослідницький агент. При пошуку:

1. Розбивай складні запити на підзапити

2. Перевіряй інформацію в кількох джерелах

3. Повертай структуровані результати з посиланнями

4. Вказуй рівень впевненості для кожного факту

"""

response = client.messages.create(

model="claude-sonnet-4-6",

max_tokens=8192,

system=system_prompt,

tools=[

{"type": "web_search", "name": "web_search"},

{"type": "web_fetch", "name": "web_fetch"}

],

messages=[

{"role": "user", "content": research_query}

],

extra_headers={

"anthropic-beta": "code-execution-web-tools-2026-02-09"

}

)

return response.content

# Використання

result = research_agent(

"Знайди всі українські AI стартапи що отримали інвестиції у 2025 році: "

"назва, раунд, сума, інвестор."

)

Крок 4: Моніторинг використання токенів

Щоб оцінити реальну економію токенів у вашому конкретному use case, додайте логування:

def search_with_token_monitoring(query: str) -> dict:

response = client.messages.create(

model="claude-sonnet-4-6",

max_tokens=4096,

tools=[

{"type": "web_search", "name": "web_search"}

],

messages=[{"role": "user", "content": query}],

extra_headers={

"anthropic-beta": "code-execution-web-tools-2026-02-09"

}

)

# Моніторинг токенів

usage = response.usage

print(f"Input tokens: {usage.input_tokens}")

print(f"Output tokens: {usage.output_tokens}")

print(f"Cache read tokens: {usage.cache_read_input_tokens}")

# Вартість для Sonnet 4.6 (приклад розрахунку)

cost = (usage.input_tokens * 3 + usage.output_tokens * 15) / 1_000_000

print(f"Estimated cost: ${cost:.4f}")

return {

"content": response.content,

"usage": usage,

"cost": cost

}

Повна документація:

Web Search Tool — Claude API Docs,

Release Notes — Claude API.

❓ Часті питання (FAQ)

Чи доступний dynamic filtering на безкоштовному плані claude.ai?

Ні. Dynamic filtering доступний виключно через Claude API з відповідною версією інструменту (web_search_20260209) та beta header. На claude.ai (free/Pro/Team) вбудований web search працює, але без dynamic filtering механіки. Для доступу до API потрібен окремий API key — деталі на платформі розробника.

Чи можна використовувати dynamic filtering з моделями Claude 4.0 або 4.5?

Ні. Anthropic явно вказує підтримку тільки для Opus 4.6 та Sonnet 4.6. Ці моделі мають вбудовані оптимізації для code execution під час inference. Попередні версії не підтримуються новими типами інструментів.

Що відбувається якщо Python-скрипт що генерує Claude повертає порожній результат?

У цьому випадку модель отримує мінімальний контекст і зазвичай або спробує альтернативний пошуковий запит, або поверне відповідь "не вдалось знайти інформацію". Рекомендується додавати retry-логіку та fallback на статичний підхід для критичних сценаріїв.

Як виміряти реальну ефективність dynamic filtering для моїх запитів?

Найкращий підхід — A/B тест на репрезентативній вибірці ваших запитів. Порівняйте версію 20260209 (нову) та 20250305 (стару) за метриками: точність відповіді, кількість input токенів та загальний час відповіді (latency).

Чи може dynamic filtering працювати разом з programmatic tool calling?

Так. Programmatic tool calling дозволяє виконувати складні multi-tool workflows, зберігаючи проміжні результати поза context window. Це ідеальна комбінація для складних research-агентів.

✅ Висновки

Dynamic filtering — це зміна парадигми в тому, коли і ким приймається рішення про релевантність контенту. Тепер це рішення приймає модель після того, як побачила контент, але до того як він потрапив у context window для reasoning. Результати на BrowseComp та DeepsearchQA підтверджують, що такий підхід є архітектурно правильним.

Показники +11% точності та -24% input токенів демонструють рідкісний випадок, коли одна зміна покращує дві протилежні метрики одночасно. Це досягається завдяки винесенню фільтрації в ізольований sandbox, що звільняє токени для фінального логічного виводу.

Для розробників міграція на web_search_20260209 — це найпростіша оптимізація 2026 року: три рядки змін у коді дають вимірюваний приріст якості без рефакторингу всієї системи.

Корисні посилання:

Останні статті

Читайте більше цікавих матеріалів

Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

Claude Dynamic Filtering: +11% Точності і -24% Токенів — Повний Розбір

⚡ Коротко✅ Ключова думка 1: Dynamic filtering — це не нова UI-фіча, а архітектурна зміна: Claude тепер пише та виконує код для фільтрації HTML до того, як результати потрапляють у context window.✅ Ключова думка 2: Результат — +11% точності на пошукових бенчмарках і -24% input токенів одночасно, що...

GLM-5 vs Claude Opus 4.6 vs GPT-5 повний огляд LLM 2026

GLM-5 vs Claude Opus 4.6 vs GPT-5 повний огляд LLM 2026

У 2026 році три моделі лідирують у сегменті frontier-LLM: китайська open-weight GLM-5, американська Claude Opus 4.6 та GPT-5 від OpenAI. Кожна має свої сильні сторони в архітектурі, reasoning та практичному застосуванні.Спойлер: GLM-5 виграє за ціною та open-weight доступністю, Claude Opus 4.6 — у...

Режим /agent в Z.ai — архітектура агентної моделі (2026)

Режим /agent в Z.ai — архітектура агентної моделі (2026)

Режим /agent у Z.ai — це автономний агентний інтерфейс на базі GLM-5, що переходить від простих відповідей до повноцінного виконання завдань з плануванням, викликом інструментів та генерацією кінцевих результатів.Спойлер: Agent-режим реалізує ітеративний цикл (plan → tool → observe → revise →...

Режим /chat в Z.ai — як працює та коли використовувати (2026)

Режим /chat в Z.ai — як працює та коли використовувати (2026)

Режим /chat у Z.ai — це базовий інтерфейс для швидких, інтерактивних розмов з моделлю GLM-5. Він забезпечує миттєві відповіді без додаткового overhead від інструментів чи планування.Спойлер: Chat — це lightweight completions з підтримкою історії, system prompt та streaming, ідеальний для RAG,...

GLM-5 2026 архітектура, бенчмарки, можливості та обмеження

GLM-5 2026 архітектура, бенчмарки, можливості та обмеження

GLM-5 від Zhipu AI (Z.ai) — це одна з найбільших open-weight моделей 2026 року, орієнтована на agentic engineering та long-horizon задачі. Реліз 11–12 лютого 2026 року став важливим кроком у розвитку автономних AI-систем. Спойлер: 744B MoE (40B active), 200K контекст, сильні результати в...

Z.ai (Zhipu AI) 2026 архітектура, Chat vs Agent, GLM-5 можливості

Z.ai (Zhipu AI) 2026 архітектура, Chat vs Agent, GLM-5 можливості

У 2026 році китайські LLM-платформи стрімко наближаються до західних frontier-моделей. Z.ai від Zhipu AI — один з лідерів цього руху завдяки GLM-5. Спойлер: GLM-5 (744B MoE, 40B active) досягає рівня Claude Opus 4.5 у agentic coding та reasoning, при цьому є open-source (MIT) і значно...