Практическая реализация AI-агента в Chrome с LangChain

- -
- 100%
- +
### 9. Развёртывание в продакшн‑окружении
Для реального продукта необходимо Packaging‑упаковать весь код в Docker‑контейнер и разместить за reverse‑proxy (NGINX) с поддержкой HTTP/2.
**Dockerfile** (минимальная конфигурация)
```Dockerfile
FROM python:3.11-slim
# Установка системных зависимостей
RUN apt-get update && apt-get install -y –no-install-recommends \
chromium-browser \
wget \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
# Копирование зависимостей и кода
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
# Установка браузерных бинарников Playwright
RUN python -m playwright install chromium
# Копирование проекта
COPY . .
# Параметры окружения
ENV CHROME_PATH=/usr/bin/chromium-browser
# Запуск приложения
CMD ["python", "main.py"]
```
В `docker-compose.yml` добавляем ограничения ресурсов и стратегии перезапуска:
```yaml
services:
browser-agent:
build: .
restart: unless-stopped
deploy:
resources:
limits:
cpus: "2"
memory: "2g"
environment:
– OPENAI_API_KEY=${OPENAI_API_KEY}
– CHROME_PATH=/usr/bin/chromium-browser
ports:
– "8000:8000"
```
После деплоя каждый запрос от клиента попадает в FastAPI‑эндпоинт, который вызывает `agent_executor.invoke`. Это позволяет масштабировать сервис горизонтально, добавляя новые реплики в Kubernetes.
### 10. Заключение
В результате этой главы мы вывели полную картину того, как собрать AI‑агент на базе LangChain, который использует Chromium через Playwright для взаимодействия с веб‑страницами. Мы начали с установки окружения, продвинулись до создания кастомного инструмента, построили агента, продемонстрировали несколько реальных сценариев (скроллинг, заполнение форм, извлечение динамических данных) и завершили описанием подходов к масштабированию и развертыванию в продакшн.
Ключевые идеи, которые следует помнить:
* LangChain предоставляет гибкую модель агента, позволяющую интерпретировать естественный язык как команду для браузера.
* Playwright дает мощный и надёжный способ контроля над Chromium, включая работу в headless‑режиме, управление сетью и скриншоты.
* Интеграция инструмента в виде JSON‑команды делает процесс полностью детерминированным и удобным для отладки.
* Продвинутая архитектура (пул контекстов, очередь задач, долговечное хранилище) позволяет построить масштабируемый сервис, который будет работать в условиях высокой нагрузки.
С этой базой вы можете переходить к более сложным проектам: от автоматизации поиска вакансий и составления резюме до построения аналитических панелей, собирающих данные из десятков источников в реальном времени. Основы уже заложены, а дальше – лишь творчество и уточнение требований к вашему конкретному сценарию.
Глава 3. Создание экземпляра LLM в браузере
Создание экземпляра LLM в браузере представляет собой ключевой шаг в практической реализации AI‑агентов с помощью LangChain, поскольку именно в этом месте происходит переход от поиска и подготовки данных к непосредственному использованию модели для генерации ответов, планирования действий и взаимодействия с пользователем; в данном разделе мы подробно рассмотрим, как собрать и запустить локальную или облачную LLM напрямую в окружении Chrome, используя возможности WebAssembly, промисы и динамические импорты, а также как интегрировать её в цепочку происходящих в браузере вычислений через LangChain.
Первым делом нужно выбрать подходящий движок модели, который может работать в клиентском JavaScript‑окружении; наиболее популярными являются проекты, такие как GGUF‑формат модели с поддержкой llama.cpp, а также специализированные библиотеки вроде of‑the‑shelf‑transformers‑js, которые предоставляют готовые обёртки над TensorFlow.js и ONNX‑runtime‑web. Для целей демонстрации возьмём небольшую модель «Phi‑2» (≈256 МБ в GGUF‑формате), поскольку она достаточно лёгка, чтобы полностью загрузиться в память браузера без превышения обычных ограничений на размер скриптов и ресурсов. Загрузка модели осуществляется асинхронно через fetch API, после чего её байты конвертируются в бинарный буфер, из которого создаётся внутренний объект llama.cpp‑engine, экспортируемый в виде WebAssembly‑модуля.
В коде мы начинаем с импорта необходимых модулей LangChain:
```javascript
import { LLM } from "langchain/llms";
import { PromptTemplate } from "langchain/prompts";
import { AgentType } from "langchain/agents";
```
а затем объявляем собственный класс `BrowserLLM`, наследующий от `LLM` базового класса LangChain и реализующий требуемый интерфейс `generate(prompt: string) : Promise
После того как модель полностью готова, метод `generate` принимает строку‑запрос, формирует её в виде токенов с помощью встроенного токенизатора (в нашем случае токенизатор, экспортированный из той же скачанной модели), передаёт массив токенов в `llamaEngine.evaluate(promptTokens, maxNewTokens, temperature, topP)`, ждёт завершения вычислений через `await engine.run(…)`, получает обратно массив новых токенов, преобразует их в строку и возвращает её как результат. Этот метод автоматически использует `Promise` и поэтому полностью совместим с цепочками `then`/`await`, что делает его идеальным для использования в агентах LangChain, где каждый шаг обработки может быть асинхронным и зависеть от внешних запросов.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.



