У разработчиков часто под рукой терабайты картинок, но нет простого способа быстро вычленить из них ценную информацию. В этой статье мы шаг‑за‑шагом соберём рабочий пайплайн, который отправляет изображения в ChatGPT, дополняет ответы поиском через Bing и возвращает точные инсайты за минуты, а не часы.
- Минимальный протокол для передачи картинок в GPT‑4o.
- Подключение Bing Image Search без лишних обёрток.
- Композиция ответов модели и сторонних данных в один JSON.
- Кэширование результатов, чтобы не платить дважды.
- Расширение пайплайна до мини‑сервиса за вечер.
Как устроен обмен изображениями между Python и ChatGPT?
Представьте, что команда пишет дешборд для e‑commerce. Маркетолог кидает скриншот витрины, а бот за секунды отвечает: какие товары случайно скрыты, какой шрифт попадает под WCAG‑риск, насколько изображение «тяжёлое» для мобильных. Магия происходит за счёт отправки base64‑картинки в одном сообщении вместе с текстом.
- Создайте ключ OpenAI и сохраните в переменную окружения.
- Установите requests и python‑dotenv.
- Сконвертируйте файл в base64, избегая длинных data‑URL в логах.
- Сформируйте JSON‑payload c типом image_url.
- Обработайте ответ: в JSON ищите role==»assistant».
import requests, base64, os
API_URL = "https://api.openai.com/v1/chat/completions"
img_path = "cat.jpg"
with open(img_path, "rb") as f:
img_b64 = base64.b64encode(f.read()).decode()
payload = {
"model": "gpt-4o-mini",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Опиши изображение"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_b64}"}}
]}]
}
headers = {"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}"}
print(requests.post(API_URL, json=payload, headers=headers).json())
Базовый REST‑запрос укладывается в 20 строк и не требует редких библиотек.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Как подключить поиск через Bing Image Search API?
Когда одного снимка мало, на помощь приходит Bing: по ключам из запроса мы подтягиваем похожие изображения, метаданные и даже текстовые описания. Так бот может сравнить пользовательское фото с эталоном без ручного скролла.
- Зарегистрируйтесь в Azure Portal и создайте ресурс Bing Search v7.
- Сохраните ключ и endpoint в .env.
- Сделайте GET‑запрос с параметром q и count=5.
- Парсите thumbnails и contentUrl для дальнейшей пере‑идексации.
- Передавайте лучшие ссылки обратно в ChatGPT вторым сообщением.
import requests, os, urllib.parse as up
BING_ENDPOINT = os.environ["BING_ENDPOINT"]
BING_KEY = os.environ["BING_KEY"]
query = "retail shelf layout"
params = {"q": query, "count": 5}
headers = {"Ocp-Apim-Subscription-Key": BING_KEY}
resp = requests.get(f"{BING_ENDPOINT}/images/search", params=params, headers=headers)
images = [item["contentUrl"] for item in resp.json().get("value", [])]
print(images)
Bing расширяет контекст модели свежими картинками, не нагружая ваш тариф OpenAI.
Как объединить всё в единый CV‑конвейер?
Теперь склеим обе части: пользователь отдаёт фото полки, пайплайн докидывает пять референсов Bing, и ChatGPT строит табличку с detected_brand, missing_label, visual_score. Итоги пишем в Redis, чтобы следующий запрос на тот же SKU стоил ноль долларов.
- Создайте функцию fetch_similars(query) → URLs через Bing.
- Добавьте step enrich_message(urls) к payload‑у ChatGPT.
- Сохраните (image_hash, response) в Redis с TTL 30д.
- Соберите FastAPI‑endpoint /analyze для фронта.
- Прокиньте всё в Docker Compose: web + worker + redis.
def analyze_image(img_path, prompt):
urls = fetch_similars(prompt)
gpt_response = ask_gpt(img_path, prompt, urls)
cache.set(hash(img_path), gpt_response, ex=2592000)
return gpt_response
Связывая сервисы, вы превращаете разовый скрипт в масштабируемый микросервис.
Как масштабировать пайплайн в проде?
Когда сервис начинает получать сотни запросов в минуту, главное — латентность. Выносите инференс ChatGPT в background‑очереди, прогревайте Bing‑кэш, а картинки храните в S3, чтобы не тащить их каждый раз по сети. Подумайте об A/B‑тестах на наборе промптов, иначе ошибочный текстовый шаблон съест половину бюджета за ночь.
- Асинхронно открывайте файлы через aiofiles.
- Разделите CPU‑heavy и IO‑heavy задачи на разные воркеры.
- Передавайте в модель только объекты ROI, а не весь кадр.
- Логируйте расходы per‑image в Prometheus.
- Раз в неделю стройте heatmap prompt‑>cost.
# docker-compose.yml (фрагмент)
worker:
build: .
command: celery -A tasks worker -Q gpt,bing —concurrency=4
depends_on:
— redis
Сетевые оптимизации и мониторинг платёжек экономят до 40 % бюджета на первом месяце.
Чек‑лист: от идеи к продакшену
| Шаг | Что сделать | Готово? |
| API‑ключи | OPENAI_API_KEY, BING_KEY в .env | ☐ |
| Загрузка | Функция ask_gpt(file, prompt) | ☐ |
| Поиск | fetch_similars(prompt) через Bing | ☐ |
| Кэш | Redis TTL=30д | ☐ |
| Мониторинг | Prometheus + Grafana дашборд | ☐ |
- Освой Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку (240$) бесплатно
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ