Месяц назад мне надоело каждое утро открывать пять вкладок и вручную сверять цены. Я занимаюсь небольшим магазином электроники, и там буквально два-три конкурента, за которыми нужно следить. Казалось бы — ерунда. Но когда делаешь это каждый день, начинаешь ненавидеть рутину физически.
Решил собрать агента. Не в смысле "нажать кнопку в каком-то сервисе", а реально разобраться, как это работает изнутри. Потратил несколько дней, несколько раз пошёл не туда, но в итоге получилось что-то рабочее. Вот что я понял.
Сначала я неправильно понял задачу
Первая ошибка была концептуальная. Я думал, что "AI-агент для мониторинга цен" — это что-то сложное, где нейросеть сама придумывает, что мониторить. На деле задача распадается на две совершенно разные части.
Одна — технически скучная, но критически важная: достать данные с сайтов конкурентов. Это парсинг, и с AI он связан мало. Другая — анализ и решения: что делать с этими данными, как реагировать на изменения, что считать значимым. Вот тут уже есть смысл подключать языковую модель.
Я потратил часа три, пытаясь прикрутить GPT к скрапингу напрямую. Тупик. Модель не умеет "зайти на сайт и посмотреть цену" без инструментов — сама по себе она просто текстовый движок.
Из чего это реально состоит
Когда я наконец сел и нарисовал схему на бумаге, всё стало проще. Агент — это не монолитная программа, а цепочка шагов.
Парсер заходит на страницы конкурентов по расписанию — раз в час или раз в день, как нужно, — вытаскивает цены на конкретные товары и складывает в базу. Для этого я взял Python с httpx и BeautifulSoup. Если сайт защищён от скрапинга — подключал Playwright для браузерной автоматизации. Это не AI, это просто код.
Дальше новые цены сравниваются с предыдущими. Если цена изменилась больше чем на 5% — это событие, о котором стоит знать.
И вот тут появляется агент. Я отправляю GPT-4o сводку изменений и прошу: оцени ситуацию, порекомендуй что сделать с моей ценой, учти что у меня такая-то маржа. Модель даёт конкретный ответ — не общие слова, а что-то вроде "конкурент снизил цену на 12%, ты сейчас дороже на 8%, имеет смысл снизиться до X рублей, чтобы остаться конкурентоспособным, но не уронить маржу ниже порога".
Как выглядит рабочий код
Покажу костяк — без лишнего. Парсер для одного товара:
import httpx
from bs4 import BeautifulSoup
import json
from datetime import datetime
def fetch_price(url: str, selector: str) -> float | None:
headers = {"User-Agent": "Mozilla/5.0"}
resp = httpx.get(url, headers=headers, timeout=10)
soup = BeautifulSoup(resp.text, "html.parser")
el = soup.select_one(selector)
if not el:
return None
price_str = el.get_text(strip=True).replace("\xa0", "").replace(" ", "").replace("₽", "")
return float(price_str.replace(",", "."))
Дальше — логика агента. Я использую OpenAI с function calling, но по сути это просто структурированный промпт:
from openai import OpenAI
client = OpenAI()
def analyze_price_change(my_price: float, competitor_data: list[dict]) -> str:
summary = "\n".join(
f"- {d['name']}: было {d['old_price']}₽, стало {d['new_price']}₽"
for d in competitor_data if d["old_price"] != d["new_price"]
)
if not summary:
return "Изменений нет."
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Ты помощник по ценовой стратегии. Отвечай конкретно и кратко."},
{"role": "user", "content": (
f"Моя текущая цена: {my_price}₽\n"
f"Изменения у конкурентов:\n{summary}\n\n"
"Что мне сделать с ценой? Минимальная маржа — 15%."
)}
]
)
return response.choices[0].message.content
Никаких фреймворков типа LangChain я сюда не добавлял — для такой задачи они избыточны и только добавляют точки отказа.
Что сломалось и как я это починил
Первая реальная проблема — сайты блокируют запросы. Один конкурент через день поменял структуру страницы, и мой CSS-селектор перестал работать. Агент молчит, данных нет, я не знаю об этом до следующего утра.
Решение простое: если парсер не нашёл цену три раза подряд — он отправляет мне уведомление в Telegram. Я добавил отдельный бот, который пишет "парсер упал на сайте X". Занял час, но с тех пор пропущенных сбоев не было.
С другой стороны, была проблема не техническая, а смысловая. GPT иногда давал советы без учёта реального контекста — писал что-то вроде "снизьте цену до рыночного уровня", не зная, что у меня эта позиция вообще почти не продаётся и мне на неё наплевать. Я добавил в промпт приоритеты товаров — и ответы стали заметно точнее.
Ещё одна вещь, которая была неочевидна: дорогой скрапинг. Если запускать Playwright для каждой страницы каждый час, на 50 товарах это реально нагружает машину. Я перешёл на httpx там, где можно, и оставил Playwright только для защищённых сайтов. Стало быстрее и дешевле.
Стоило ли оно того
Честно — да, но не потому что агент принимает за меня решения. Он их не принимает. Я всё равно смотрю на рекомендации и решаю сам. Ценность в другом: я больше не открываю пять вкладок каждое утро. Вместо этого получаю сообщение "сегодня значимых изменений нет" или "вот три позиции, которые стоит пересмотреть — и вот почему".
Это не автопилот. Это хороший ассистент, который сделал скучную часть работы до того, как я проснулся.
Если хочешь повторить — начни с одного конкурента и одного товара. Заставь это работать стабильно, потом расширяй. Я потратил два дня на "умную" архитектуру с нуля, потом выкинул её и написал простую версию за вечер. Вторая работает лучше.
