Как иллюстрировать каждую публикуемую статью — реальными фото, в масштабе

Почему издательские команды возвращаются к реальной фотографии, и точный пайплайн — с промптом внутри, — который превращает готовый черновик в подписанное главное изображение примерно за 150 миллисекунд.

Поделиться
Человек за светлым столом работает на ноутбуке, на экране которого сетка фотографий, в руке стилус.
Фото с Pexels

Каждой статье, которую вы публикуете, нужна картинка. Это не приятное дополнение — именно заглавное изображение показывается в превью в соцсетях, именно его читатель видит раньше первого предложения, и именно оно за полсекунды сообщает, сделана ли страница тем, кому не всё равно. Умножьте это на четыре изображения на пост и сорок постов в квартал — и «найти фото» перестаёт быть задачей, становясь проблемой конвейера.

Вот как мы это решаем: что использовать вместо сгенерированных изображений и почему, и три способа встроить Pexafy в рабочий процесс — вручную, через API или через ИИ-агента, — включая промпт, который превращает готовый черновик в поисковое предложение, которое действительно что-то находит.

Почему настоящие фото всё ещё превосходят сгенерированные

Сгенерировать иллюстрацию легко, и именно в этом проблема. Между «ИИ-изображения — это чит-код» и сегодняшним днём изменились четыре вещи:

1 · При больших объёмах поиск быстрее генерации

Генерация — это один промпт, ожидание, проверка и, честно говоря, ещё две-три попытки, прежде чем получится что-то пригодное. Семантический поиск — это один запрос, который возвращается с шестнадцатью кандидатами примерно за 150 миллисекунд, причём каждый уже лицензирован, уже имеет указание авторства, уже приведён к нужному размеру, а его размеры есть в ответе. Для одного изображения разница — это время на чашку кофе. Для четырёхсот изображений в квартал это разница между рабочим процессом и работой.

2 · Фотография точна; генерация правдоподобна

В тот момент, когда ваша статья касается чего-то реального — профессии, оборудования, города, жеста, материала, — сгенерированное изображение передаёт ощущение верно, а детали неверно. Шестипалые руки — это шуточный вариант; дорогостоящий вариант — это хирургический инструмент, которого не существует, кабина с выдуманными органами управления или «улица Лиссабона», которую не узнает ни один лиссабонец. Читатели, разбирающиеся в теме, замечают это, и замечают в первую очередь картинку.

3 · У всех одинаковый вид

Диффузионные модели сходятся к единому фирменному стилю, и стена иллюстраций с мягкими градиентами, избыточным светом и подозрительной симметрией теперь читается как заполнитель места. Это восприятие и есть настоящая цена: не штраф, а сигнал. Настоящая фотография — зерно, неудобный стул, кто-то на полуслове — читается как репортаж.

4 · И теперь они приходят с этикеткой

Это скорее контекст, чем аргумент, но это направление движения. С 2 августа 2026 года статья 50 Закона ЕС об ИИ (AI Act) требует от поставщиков генеративных систем маркировать синтетические результаты в машиночитаемом формате, а от операторов — раскрывать дипфейки.1 Со стороны обнаружения Google считывает метаданные C2PA Content Credentials и собственный водяной знак SynthID, чтобы отвечать на вопрос «это изображение сгенерировано ИИ?» в Поиске, Картинках и Lens.2 Ничего из этого не является правилом о том, какие изображения может публиковать блог, и ничего из этого не стоит вам позиций в выдаче. Изменилось то, что происходит дальше: происхождение картинки в шапке вашей статьи теперь можно проверить в два клика, не спрашивая вас. Лицензионной фотографии нечего декларировать.

Когда сгенерированные изображения — правильный выбор. Концептуальные диаграммы и схемы. Сцена, которую нельзя сфотографировать (продукт, которого ещё не существует, абстрактный механизм, город будущего). Фирменный иллюстративный стиль, которым вы владеете и хотите повторять в каждом посте. И всё, где картинка сознательно воспринимается как иллюстрация, а не как свидетельство. Используйте и то, и другое — просто перестаньте применять генерацию по умолчанию для случая «мне нужно фото людей на встрече».

Три способа иллюстрировать статьи в зависимости от объёма

Один и тот же движок, один и тот же каталог — 9M+ бесплатных для использования фото из 9 библиотек — и три точки входа. Выбирайте по тому, сколько статей вы публикуете, а не по тому, насколько вы технически подкованы.

Точка входа Лучше всего подходиткому и в каком объёме На статью Что нужно
Поисковый интерфейс Редакторам, по одному посту за раз — до ~20/месяц ~30 секунд Браузер. Для поиска аккаунт не нужен.
REST API CMS, сборка статического сайта, пакет черновиков ~1 запрос, ~150 мс API-ключ. 5 000 запросов/месяц бесплатно, 20/мин.
MCP-сервер ИИ-агент, который пишет или редактирует черновик В рамках того же диалога Один URL коннектора, OAuth или ключ.

У этих трёх способов один каталог и один рейтинг, поэтому фото, найденное редактором в интерфейсе, — это то же фото с тем же идентификатором, которое API вернёт вашему скрипту сборки.

Одна статья, 30 секунд: поисковый интерфейс

Опишите сцену так, как описали бы её фотографу, полным предложением, на своём языке. Не team meeting — а «a small team standing in a semi circle for a short morning stand-up meeting in a bright open plan office». Каждая дополнительная конкретная деталь сужает выдачу, а не опустошает её, потому что движок ранжирует по смыслу, а не сопоставляет ваши слова с чужими тегами.

pexafy.com — одно предложение, результаты из нескольких библиотек в одной сетке
Страница результатов поиска Pexafy с фотографиями команды на утренней встрече, найденными по запросу полным предложением.
Небольшая цветная точка на каждой карточке — это оценка релевантности: зелёный означает, что движок уверен. Результаты объединяются и переранжируются по всем проиндексированным библиотекам сразу, а не выводятся одна библиотека за другой. Запустить этот же поиск →

Затем сузьте выдачу с помощью фильтров, которые действительно важны для вёрстки статьи — и только их:

Фильтры — цвет, ориентация, источник, лицензия
Панель фильтров Pexafy с образцами цветов, вариантами ориентации и выбором источника.
Ориентация → альбомная для заглавного изображения (портретный кадр плохо обрезается в превью соцсетей). Цвет — чтобы серия постов визуально сочеталась с брендом: выбирайте один и тот же оттенок для каждой статьи кампании, и лента блога вдруг начинает выглядеть спроектированной.
  1. Пишите предложение, а не ключевое слово. Субъект + действие + место + свет. До 500 символов на любом из более чем 100 языков.
  2. Отфильтруйте по альбомной ориентации для заглавного изображения, затем повторите поиск без фильтра для изображений внутри статьи, где портретная ориентация часто смотрится лучше.
  3. Откройте фото, чтобы получить готовую строку атрибуции, страницу оригинального источника и файл в полном разрешении.
  4. Используйте «похожие фото» на выбранном снимке, чтобы проиллюстрировать следующий раздел в том же визуальном регистре — тот же свет, та же обработка, другая сцена.

Промпт: превращаем черновик в поисковое предложение

Это шаг, который все делают неправильно, когда автоматизируют процесс. Название статьи подают прямо в строку поиска, а название — это как раз худший вход: оно абстрактно («The hidden cost of context switching»), и ни одна фотография на свете его не изображает. От модели вам нужен не пересказ — а операторское задание.

Промпт фоторедактора — скопируйте как есть
# system prompt
You are a photo editor. Read the article and write ONE search sentence
for a stock-photo engine that ranks by meaning, not by keywords.

Rules:
1. Describe a scene a camera could have taken: someone doing
   something, somewhere. Never name the topic itself ("fintech",
   "productivity", "SEO") — name what would be in the frame.
2. 12 to 25 words. Longer beats shorter: every concrete detail
   (light, place, gesture, time of day) sharpens the match.
3. No text, logos, brands, charts, screenshots or famous people.
   Free photo libraries have almost none of those.
4. No invisible metaphors ("growth", "synergy", "transformation").
5. Match the mood of the article: calm, tense, tired, celebratory.
6. Write the sentence in English even if the article is not.

Return JSON only:
{ "query": "…", "orientation": "landscape", "alt": "…" }

Правило 1 делает большую часть работы. Вот это же правило на трёх реальных черновиках — средний столбец — это то, что человек печатает второпях, правый столбец — то, что возвращает промпт:

Статья о… Поспешный запрос Операторское задание
Почему ваш ежедневный стендап не работает team meeting «a small team standing in a semi circle for a short morning stand-up meeting in a bright open plan office»
Сокращение онбординга с 6 недель до 9 дней onboarding «a new employee on their first day at a desk, listening while a colleague leans in and points at their screen»
Скрытая цена переключения контекста productivity «a tired developer rubbing their eyes in front of two monitors late in the evening, the office empty behind them»

team meeting возвращает типовой сток с переговорной, который уже используют все остальные авторы по вашей теме. Предложение из третьего столбца возвращает вот это за 155 миллисекунд:

GET /search/photos — «a small team standing in a semi circle for a short morning stand-up meeting…» · 16 результатов · 155 мс
Три разные библиотеки среди первых шести результатов, ранжированные вместе, а не одна за другой. Все они изображают людей, стоящих группой в настоящем офисе — именно то, что запрашивало предложение, и то, чего team meeting никогда не гарантирует.

Конвейер: черновик на входе, заглавное изображение с указанием авторства на выходе

Сорок строк, два вызова: один к модели за заданием, один к Pexafy за фото. Подключите это к хуку сохранения в вашей CMS, к сборке статического сайта или к скрипту, который обходит папку с файлами Markdown.

illustrate.py — статья на входе, изображение + alt + указание авторства на выходе
import json, os, requests
from anthropic import Anthropic

SEARCH = "https://api.pexafy.com/api/v1/search/photos"
llm = Anthropic()  # ANTHROPIC_API_KEY берётся из окружения

def camera_brief(article: str) -> dict:
    # PHOTO_EDITOR = системный промпт выше
    msg = llm.messages.create(
        model="claude-sonnet-5",
        max_tokens=300,
        system=PHOTO_EDITOR,
        messages=[{ "role": "user", "content": article[:12000] }],
    )
    return json.loads(msg.content[0].text)

def illustrate(article: str) -> dict | None:
    brief = camera_brief(article)
    r = requests.get(
        SEARCH,
        headers={"X-Api-Key": os.environ["PEXAFY_API_KEY"]},
        params={
            "q": brief["query"],           # полное предложение
            "orientation": brief["orientation"],
            "per_page": 8,
            "score_threshold": 0.55,      # отбросить слабые совпадения
        },
        timeout=10,
    )
    hits = r.json()["data"]
    if not hits:                        # задание слишком узкое → расширить и повторить
        return None

    top = hits[0]
    return {
        "src":    top["urls"]["regular"],        # 1080px — размер для заглавного изображения
        "alt":    brief["alt"] or top["alt_description"],
        "credit": top["attribution"]["html"],   # готово к рендеру
        "width":  top["width"],
        "height": top["height"],
        "id":     top["photo_id"],           # сохранить: без повторов
    }

Три детали, которые превращают демо в то, что можно оставить работать без присмотра:

  • score_threshold — вернуть ничего лучше, чем вернуть плохое фото. Если задание оказалось слишком конкретным, расширьте его (уберите последнее уточнение) и повторите попытку один раз.
  • Сохраняйте photo_id — одна строка в вашей базе данных, и ни у каких двух статей на вашем сайте никогда не будет одинакового заглавного изображения. Это ошибка, с которой все сталкиваются к тридцатому посту.
  • Один запрос на слот изображения — заглавное плюс три изображения в тексте — это четыре запроса на статью, или один, если брать четыре разных результата из одного и того же поиска.

Нет Python? Половина, отвечающая за поиск, — это одна строка, и каждый результат содержит одни и те же поля вне зависимости от библиотеки-источника:

Тот же вызов в оболочке
curl -sG "https://api.pexafy.com/api/v1/search/photos" \
  -H "X-Api-Key: $PEXAFY_API_KEY" \
  --data-urlencode "q=a tired developer rubbing their eyes at two monitors" \
  --data-urlencode "orientation=landscape" \
  --data-urlencode "per_page=6"

# → { "success": true, "data": [ … ], "meta": { "took_ms": 147 } }

Форма ответа — urls, width, photographer_full_name, source, license_type, relevance_score, attribution — одинакова для фото Pexels, фото Pixabay и фото Unsplash. Эту нормализацию вам иначе пришлось бы писать и поддерживать самим; мы разобрали её поле за полем в сравнении API бесплатных фотостоков.

Второй раздел, второе задание, второй поиск — суть в том, что одна статья даёт несколько разных сцен вместо одного растянутого на четыре места фото:

Раздел 2 — «a woman working alone on a laptop at her kitchen table early in the morning with a cup of coffee» · 129 мс
Та же статья, другой раздел, другая сцена — а настроение сохраняется, потому что его сохранило задание. Запустить и этот поиск →

Пусть агент сам выбирает картинку: MCP

Если модель уже пишет или редактирует черновик, самый чистый конвейер — это отсутствие конвейера: дайте агенту инструмент поиска и позвольте ему проиллюстрировать только что написанное в том же диалоге, пока контекст ещё под рукой.

Pexafy предоставляет размещённый сервер Model Context Protocol по адресу mcp.pexafy.com/mcp. Три инструмента: search_photos (предложение), search_photos_by_image (референсное изображение, при желании вместе с предложением — «как это, но на закате»), и get_similar_photos (ещё похожее на то, что вы уже выбрали, — так вы сохраняете согласованность серии).

Claude.ai и Claude Desktop — OAuth, ключ вести не нужно
Настройки → Коннекторы → Добавить пользовательский коннектор
Name: Pexafy
URL:  https://mcp.pexafy.com/mcp
# затем войдите в свой аккаунт Pexafy, когда откроется окно
Claude Code — одна команда
claude mcp add --transport http pexafy https://mcp.pexafy.com/mcp \
  --header "Authorization: Bearer $PEXAFY_API_KEY"

# или закоммитьте это в репозиторий, чтобы получила вся команда — .mcp.json
{
  "mcpServers": {
    "pexafy": {
      "type": "http",
      "url": "https://mcp.pexafy.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

С этого момента проиллюстрировать статью — это просьба, а не задача. Агент сам пишет операторское задание — он только что прочитал черновик, поэтому лучше кого бы то ни было способен описать сцену:

Как это выглядит на практике
You  Вот черновик поста на этой неделе. Найди альбомное заглавное
     изображение и одно фото для раздела 2, и дай мне строки атрибуции.

Claude  → search_photos(
       q="a small team standing in a semi circle for a short morning
          stand-up meeting in a bright open plan office",
       orientation="landscape")
     ← 16 фото · 155 мс

     Заглавное  → Фото от Thirdman, Pexels · 6453×4302 · оценка 0.80
     Раздел     → Фото от Marcus Aurelius, Pexels · 6000×4000
     Оба без лицензионных отчислений, строки атрибуции ниже, готовы к вставке.

У Unsplash, Pexels, Pixabay и Openverse нет официального MCP-сервера — есть только созданные сообществом обёртки, которые нужно размещать и настраивать самостоятельно. Если ваш редакционный процесс уже выстроен вокруг агента, эта разница и есть интеграция.

Alt-текст, лицензия и скорость страницы

Картинка выбрана. Четыре вещи определяют, поможет ли она странице или незаметно навредит ей:

  1. Пишите alt-текст для человека, а не для краулера. В каждом результате есть alt_description — используйте его как черновик, а затем перепишите с учётом контекста вашего абзаца. «Четыре коллеги стоят на утренней встрече» лучше, чем набор ключевых слов, и это текст, который действительно прочитает вслух программа экранного доступа. Держите его в пределах ~125 символов; оставляйте пустым (alt="") только если изображение чисто декоративное.
  2. Указывайте авторство, даже когда никто этого не требует. Условия API Pexafy не требуют указания атрибуции, и в каждом результате уже есть готовая строка attribution.html — но лицензия исходной библиотеки всё равно регулирует использование этого фото, а видимая строка авторства сообщает читателю (и поисковой системе), что это настоящая фотография с настоящим автором.
  3. Отдавайте нужный размер. urls.regular (1080 пикселей) — для заглавного изображения; urls.full — это файл на 2400 пикселей, который не нужен ни одной статье. Всегда указывайте width/height из ответа, чтобы браузер зарезервировал место, — именно эта пара атрибутов отличает хороший показатель сдвига макета от плохого. Используйте fetchpriority="high" для заглавного изображения и loading="lazy" для всего, что ниже первого экрана.
  4. Передавайте заглавное изображение в метаданные. Один и тот же URL должен быть вашим og:image, вашим twitter:image и свойством image структурированных данных Article. Одно фото, три места, ноль дополнительной работы — и превью в соцсетях, которое больше не откатывается к вашему логотипу.

Сколько на самом деле стоят 100 статей в месяц

Предположим заглавное изображение плюс три изображения внутри статьи, то есть четыре поисковых запроса на пост — намеренно расточительный вариант, при котором для каждого места выполняется отдельный запрос вместо повторного использования результатов одного:

Объём Поисковых запросов в месяц Тариф Стоимость поиска
20 статей 80 Бесплатный — 5 000 запросов/месяц $0
100 статей 400 Бесплатный — 5 000 запросов/месяц $0
1 000 статейагентство или целый портфель клиентов 4 000 Бесплатный — всё ещё в пределах 5 000 запросов/месяц $0

Да — при объёмах контент-маркетинга месячная квота вообще не проблема, и мы предпочитаем прямо об этом сказать, а не выдумывать повод заставить вас платить. Ограничение, с которым вы реально столкнётесь, — это лимит в минуту. Бесплатный тариф допускает 20 запросов к API в минуту; скрипт сборки, переиллюстрирующий 100 статей за один проход, отправляет 400 запросов так быстро, как позволяет цикл, — так что он либо проведёт двадцать минут под троттлингом, либо начнёт собирать ошибки 429. Есть два выхода: распределить вызовы во времени (одна команда sleep в цикле — и ночная задача этого даже не заметит) или перейти на тариф, чей лимит скорости соответствует вашей сборке — Starter даёт 30 запросов в минуту, Pro — 60. Выбирайте по пиковой нагрузке, а не по объёму.

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

И то, что не отражается ни в одной таблице расходов: редактор перестаёт открывать пять вкладок. Вот в чём реальная экономия.

Источники и примечания

1 Статья 50 Закона ЕС об ИИ (AI Act) — обязательства по прозрачности для поставщиков и операторов определённых систем ИИ, применимые с 2 августа 2026 года. Поставщики систем, генерирующих синтетические аудио, изображения, видео или текст, обязаны маркировать результаты в машиночитаемом формате и делать их распознаваемыми как искусственно созданные; операторы обязаны раскрывать дипфейки и, в определённых случаях, — текст, сгенерированный ИИ и опубликованный для информирования общественности. «Digital Omnibus» (Регламент (ЕС) 2026/1744, действующий с 27 июля 2026 года) оставляет саму статью 50 без изменений, но даёт системам, уже присутствовавшим на рынке до 2 августа 2026 года, время до 2 декабря 2026 года на соответствие требованию машиночитаемой маркировки из статьи 50(2). Всё это обязывает поставщиков и операторов ИИ-систем — это не правило о том, какие изображения может публиковать блог.

2 Google считывает метаданные C2PA Content Credentials и собственный водяной знак SynthID, чтобы показывать происхождение изображения в разделе «Об этом изображении» в Поиске, Картинках и Lens. Это информация о происхождении медиа, а не штраф в ранжировании за контент, сгенерированный ИИ.

Часто задаваемые вопросы

Использовать ли сгенерированные ИИ изображения или реальные фото для статей блога?
Используйте реальные фото всякий раз, когда статья посвящена чему-то существующему — профессии, месту, предмету, жесту — потому что фотография точно передаёт детали и несёт проверяемый источник, дату и автора. С 2 августа 2026 года статья 50 Закона ЕС об ИИ (AI Act) требует, чтобы генеративные системы помечали свои результаты в машиночитаемом формате, и такие платформы, как Google, теперь показывают это происхождение читателям. Сгенерированные изображения остаются правильным выбором для диаграмм, для сцен, которые невозможно сфотографировать, и для фирменного стиля иллюстраций, которым вы владеете.
Как автоматически найти изображение, соответствующее моей статье?
Два вызова. Сначала попросите языковую модель превратить черновик в сценарий для камеры — одно предложение из 12–25 слов, описывающее сцену, которую могла бы снять камера, никогда не саму тему. Затем отправьте это предложение в API семантического поиска изображений, который ранжирует фото по смыслу, а не по совпадению тегов. В Pexafy это GET /api/v1/search/photos?q=…, примерно 150 мс, и каждый результат возвращается с размером, лицензией и готовой строкой атрибуции.
Какой лучший промпт для превращения статьи в поисковый запрос по изображениям?
Просите фотографируемую сцену, а не резюме: «напишите ОДНО предложение из 12–25 слов, описывающее кого-то, делающего что-то где-то; никогда не называйте тему; без текста, логотипов, графиков или знаменитостей; без невидимых метафор; соответствуйте настроению статьи; верните JSON». Полный промпт приведён в этой статье, его можно скопировать. Самое важное правило — запрет на абстракции: «продуктивность» ничего не находит, а «уставший разработчик трёт глаза перед двумя мониторами поздним вечером» находит нужное фото.
Нужно ли указывать авторство фото, используемых в статьях блога?
Атрибуция не требуется условиями API Pexafy, и каждый результат поставляется с готовой строкой указания авторства в HTML и в виде обычного текста. Лицензия, прикреплённая к каждому фото исходной библиотекой, по-прежнему регулирует использование этого фото, а показ указания авторства говорит читателям — и поисковым системам с ответами — что изображение является реальной фотографией с реальным автором.
Может ли Claude или другой AI-агент находить фото для моей статьи?
Да, через размещённый MCP-сервер (Model Context Protocol) Pexafy по адресу mcp.pexafy.com/mcp. Добавьте его как пользовательский коннектор в Claude.ai или Claude Desktop и войдите через OAuth, либо добавьте его в Claude Code одной командой claude mcp add и API-ключом. Затем агент сам ищет по предложению, по референсному изображению или по похожим фото, пока черновик статьи остаётся в контексте.
Как избежать того, чтобы во всех статьях блога использовалось одно и то же фото?
Сохраняйте photo_id каждого опубликованного изображения и исключайте его при следующем запуске — достаточно одного столбца в вашей CMS. Это тот сбой, с которым сталкивается любой автоматизированный пайплайн примерно на тридцатой статье, и он незаметен, пока кто-то не пролистает ленту блога. Написание нового сценария для камеры для каждого раздела, вместо повторного использования заголовка статьи, довершает дело.

Хватит подбирать ключевые слова. Опишите, что вы имеете в виду.

Ищите среди 9M+ бесплатных изображений по смыслу — на любом языке, менее чем за 100 мс.