Полный гайд по созданию первого AI-агента на LangGraph
ТИЗЕР: Полный гайд по созданию первого AI-агента на LangGraph — это практическое руководство, написанное на основе неудачного опыта демонстрации ИИ-агента перед клиентом. Автор осознал, что провал произошёл из-за неверной архитектуры: запутанные связи, отсутствие чёткой логики и слабое управление состоянием. В результате он пересмотрел подход и объяснил, как правильно строить агента.
ИИ-агенты отличаются от обычных чат-ботов — они не просто отвечают на запросы, а самостоятельно анализируют задачи, используют инструменты и делают выводы. В основе их работы — управление состоянием, принятие решений и использование внешних инструментов. Важно, чтобы агент имел память (state), строгое управление логикой (через граф), и выполнял действия последовательно.
На примере LangGraph демонстрируется пошаговая сборка агента, анализирующего статьи с Medium: классификация текста, извлечение сущностей и создание краткого резюме. Вся логика реализуется в виде графа из узлов и связей.
Отдельное внимание уделено ограничениям: ИИ-агенты не умеют адаптироваться вне заданных маршрутов, не обладают глубинным контекстом и требуют контроля со стороны человека. Главный вывод — эффективность достигается при понимании как сильных сторон, так и ограничений ИИ.
Руководство по созданию вашего первого AI-агента с LangGraph (Это проще, чем вы думаете)
Спустя 1 месяц разработки моего коммерческого AI-агента всё рухнуло во время клиентской демонстрации.
То, что должно было быть плавным автономным процессом, превратилось в неловкий цикл бесконечных уточняющих запросов и противоречивых решений. Клиент оставался вежливым, но явно был разочарован.
После его ухода я провёл несколько часов, анализируя провал, и понял, что в корне неправильно понял архитектуру агента — я построил чрезмерно усложнённую систему с нечеткими границами принятия решений и отсутствием чёткой логики рассуждений.
Этот провал изменил мой подход и стал основой того, как я теперь объясняю такие системы. Как только вы поймёте базовые принципы, создание эффективных агентов окажется неожиданно простым.
Введение в AI-агентов
Я терпеть не могу, когда люди усложняют подобные вещи, так что давайте упростим.
AI-агенты — это системы, которые:
- Мыслят пошагово, разбираясь в проблеме;
- Подключаются к внешним инструментам по необходимости;
- Учатся на своих действиях, чтобы со временем становиться лучше.
От моделей к агентам
До появления агентов AI-решения строились как отдельные, не связанные между собой компоненты — одна модель для понимания текста, другая для генерации кода, ещё одна для обработки изображений.
Такой фрагментарный подход: Заставлял пользователей вручную управлять рабочими процессами; Приводил к потере контекста при переходе между системами; Требовал создания пользовательских интеграций для каждого этапа.
Агенты меняют этот подход. В отличие от традиционных моделей, работающих изолированно, агент управляет различными возможностями, при этом сохраняя общее понимание всей задачи.
Агенты не просто следуют инструкциям — они адаптируются и принимают разумные решения о следующих шагах, исходя из того, что уже узнали, — так же, как это делает человек.
Ключевое преимущество AI-агентов
Традиционный AI разбивает задачу на изолированные этапы — резюмирование, извлечение ключевых слов, категоризация контента, генерация инсайтов — и каждый шаг требует явной координации человеком.
Проблема не только в том, что модели работают изолированно, но и в том, что вы должны вручную выстраивать всю последовательность, передавать знания между этапами и самостоятельно решать, какие действия нужны на основе промежуточных результатов.
В отличие от этого, агентский подход позволяет выполнять каждый этап автономно, не теряя из виду общую цель.
Структурные элементы интеллекта агента
ИИ-агенты опираются на три фундаментальных принципа:
- Управление состоянием (State Management): рабочая память агента, отслеживающая, что он уже узнал и чего стремится достичь;
- Принятие решений (Decision-Making): агент выбирает подходящий метод, исходя из текущих знаний;
- Использование инструментов (Tool Use): агент знает, какой инструмент решает каждую конкретную задачу.
Создание AI-агентов с помощью LangGraph
Теперь, когда вы поняли, что такое AI-агенты и почему они важны, давайте создадим одного с помощью LangGraph — фреймворка от LangChain для создания надёжных ИИ-агентов.
Что мне особенно нравится в LangGraph — он позволяет визуализировать мышление и действия агента в виде графа. Каждый узел (node) представляет собой отдельную способность (например, поиск в интернете или написание кода), а связи между узлами (edges) управляют потоком информации.
Когда я только начал разрабатывать агентов, этот подход стал для меня откровением, потому что я буквально смог "увидеть", как думает мой агент.
Ваш первый агент: анализатор статей на Medium
Посмотрим, как можно создать агента для анализа текста с использованием LangGraph. Этот агент будет читать статьи, определять их тематику, извлекать важные элементы и создавать краткие резюме — по сути, это ваш персональный исследовательский ассистент.
Настройка среды разработки
Шаг 1 — Создайте директорию проекта:
mkdir ai_agent_project
cd ai_agent_project
Шаг 2 — Создайте и активируйте виртуальное окружение:
- На Windows:
python -m venv agent_env
agent_env\Scripts\activate
На macOS/Linux:
python3 -m venv agent_env
source agent_env/bin/activate
Шаг 3 — Установите необходимые библиотеки:
pip install langgraph langchain langchain-openai python-dotenv
Шаг 4 — Настройка OpenAI API:
Я использую GPT-4o mini в качестве "мозга" агента, но вы можете заменить его на любую другую LLM по своему выбору. Если у вас нет API-ключа:
- Зарегистрируйтесь на OpenAI
- Перейдите в раздел API Keys
- Нажмите Create new secret key
- Скопируйте ваш API-ключ
Шаг 5 — Создайте файл .env:
- На Windows:
echo OPENAI_API_KEY=your-api-key-here > .env
На macOS/Linux:
echo "OPENAI_API_KEY=your-api-key-here" > .env
Замените your-api-key-here на ваш фактический API-ключ.
Шаг 6 — Создайте тестовый файл test_setup.py:
import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI
Загрузить переменные окружения load_dotenv()
Инициализировать ChatOpenAI llm = ChatOpenAI(model="gpt-4o-mini")
Проверка работы модели response = llm.invoke("Hello! Are you working?") print(response.content)
Шаг 7 — Запуск теста:
python test_setup.py
Если вы получили ответ — поз��равляем! Ваша среда готова к созданию агента.
Создание нашего первого агента
Сначала импортируем необходимые библиотеки:
import os
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
- StateGraph — управляет потоком информации между компонентами агента
- PromptTemplate — задаёт шаблон инструкции
- ChatOpenAI — подключает модель OpenAI для "мышления" агента
Создание памяти агента
Агенту необходима память, чтобы отслеживать прогресс. Создадим её с помощью TypedDict:
from typing import TypedDict, List
class State(TypedDict): text: str # Исходный ввод текста classification: str # Результат классификации (например, тип контента) entities: List[str] # Извлечённые сущности (имена, организации, места) summary: str # Краткое резюме текста
Теперь, когда у нашего агента есть память, давайте дадим ему возможности мышления!
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
Установка temperature=0 гарантирует, что агент будет последовательно выбирать наиболее вероятный ответ — это критически важно для агентов, которые должны следовать чётким логическим шаблонам. Для напоминания: параметр temperature регулирует степень "творчества" LLM:
- temperature = 0: фокус на логике, детерминированные ответы
- temperature = 1: более разнообразные и креативные
- temperature = 2: хаотичные, иногда бессвязные идеи
Если ваш агент ведёт себя странно — сначала проверьте параметр temperature!
Добавление возможностей агенту
Теперь мы создадим специализированные инструменты (узлы) для нашего агента, каждый из которых будет обрабатывать отдельный тип задачи.
1. Узел классификации текста
def classification_node(state: State): """ Классифицирует текст по одной из заданных категорий.
Параметры: state (State): текущий словарь состояния, содержащий текст
Возвращает: dict: словарь с ключом "classification" и результатом классификации
Категории: - News: фактические новости и события - Blog: личные или неформальные публикации - Research: академические или научные материалы - Other: всё, что не попадает в вышеуказанные категории """ prompt = PromptTemplate( input_variables=["text"], template="Classify the following text into one of the categories: News, Blog, Research, or Other.\n\nText: {text}\n\nCategory:" )
message = HumanMessage(content=prompt.format(text=state["text"])) classification = llm.invoke([message]).content.strip() return {"classification": classification}
Что делает функция: Она использует шаблон запроса, чётко формулируя инструкцию для модели. Функция принимает текущее состояние (с текстом) и возвращает результат классификации.
2. Узел извлечения сущностей (Entity Extraction)
def entity_extraction_node(state: State): """ Выделяет именованные сущности из текста: - Люди (Person) - Организации (Organization) - Локации (Location) """
prompt = PromptTemplate( input_variables=["text"], template="Extract all the entities (Person, Organization, Location) from the following text. Provide the result as a comma-separated list.\n\nText: {text}\n\nEntities:" )
message = HumanMessage(content=prompt.format(text=state["text"])) entities = llm.invoke([message]).content.strip().split(", ") return {"entities": entities}
Что делает функция: Обрабатывает документ и возвращает список ключевых сущностей — имена, организации, географические объекты. Всё это форматируется в виде списка и добавляется в память агента.
Наконец, добавим возможность резюмирования (summarization):
def summarize_node(state: State):
# Создаём шаблон для запроса на резюмирование
# Модель должна резюмировать текст в одном предложении
summarization_prompt = PromptTemplate.from_template(
"""Summarize the following text in one short sentence.
Text: {text}
Summary:"""
)
# Создаём цепочку: передаём шаблон модели
chain = summarization_prompt | llm
# Запускаем цепочку с текстом из состояния
response = chain.invoke({"text": state["text"]})
# Возвращаем результат в виде словаря
return {"summary": response.content}
Эта функция сжимает документ до краткого, ёмкого резюме его ключевых мыслей.
Итоговая структура агента
Теперь мы объединим все возможности в единую координированную схему:
workflow = StateGraph(State)
Добавим узлы workflow.add_node("classification_node", classification_node) workflow.add_node("entity_extraction", entity_extraction_node) workflow.add_node("summarization", summarize_node)
Установим связи между узлами workflow.set_entry_point("classification_node") # Стартовая точка workflow.add_edge("classification_node", "entity_extraction") workflow.add_edge("entity_extraction", "summarization") workflow.add_edge("summarization", END)
Компилируем граф app = workflow.compile()
Поздравляю! Вы создали агента, который проходит через три этапа: классификация → извлечение сущностей → резюмирование, что позволяет ему понимать тип текста, выделять ключевую информацию и формировать лаконичное резюме.
Запуск агента в действии
Проверим работу агента на примере текста:
sample_text = """ Anthropic's MCP (Model Context Protocol) is an open-source powerhouse that lets your applications interact effortlessly with APIs across various systems. """
state_input = {"text": sample_text} result = app.invoke(state_input)
print("Classification:", result["classification"]) print("\nEntities:", result["entities"]) print("\nSummary:", result["summary"])
Результат работы агента:
- Классификация: Technology
- Сущности: [‘Anthropic’, ‘MCP’, ‘Model Context Protocol’]
- Резюме: Anthropic’s MCP — это открытый протокол, обеспечивающий бесшовное взаимодействие приложений с различными API-системами.
Впечатляет не только результат, но и как каждый этап логически вытекает из предыдущего. Это имитирует наше собственное восприятие текста: сначала мы определяем тип материала, затем выделяем ключевые имена и понятия, и только потом формируем краткий смысловой вывод.
Применимость подхода:
Подобный агент можно адаптировать под множество задач:
- Статьи по саморазвитию — классификация областей роста, извлечение советов, резюме инсайтов
- Истории стартапов — выявление бизнес-моделей, паттернов инвестиций, стратегий масштабирования
- Обзоры продуктов — выделение характеристик, брендов, пользовательских рекомендаций
Ограничения AI-агентов
Наш агент работает в жёстко заданной структуре узлов и связей, которую мы сами спроектировали. Эта предсказуемость ограничивает его гибкость: в отличие от человека, агент не может отклониться от заданного маршрута при возникновении непредвиденных ситуаций.
Второе ограничение — контекстуальное понимание. Агент может обрабатывать текст, но не обладает широкими знаниями и культурными нюансами, которые человек улавливает интуитивно. Он работает строго в рамках предоставленного текста, хотя подключение к интернет-поиску может частично компенсировать этот недостаток.
Проблема "чёрного ящика" также сохраняется в агентных системах: мы видим входные и выходные данные, но не понимаем, что происходит внутри. Некоторые модели рассуждения, такие как GPT-o1 или DeepSeek R1, предлагают большую прозрачность, демонстрируя свои рассуждения, но даже с ними невозможно полностью контролировать внутренние процессы.
И, наконец, такие системы не являются полностью автономными — им требуется человеческий контроль, особенно для проверки выводов и качества работы. Как и в других AI-системах, лучшие результаты достигаются в связке "ИИ + человек".
Осознание этих ограничений помогает создавать более устойчивые системы и точно понимать, в каких моментах необходим человек.
Больной урок из провальной демо-презентации
Оглядываясь на мой провал перед клиентом, я осознал: понимание ограничений агентов — ключ к успеху. Моя переусложнённая система "рухнула", потому что я игнорировал базовые принципы архитектуры агента.
Приняв, что агенты:
- Нуждаются в чёткой архитектуре;
- Работают по фиксированным маршрутам;
- Частично являются "чёрными ящиками";
- Требуют участия человека — я начал создавать решения, которые действительно приносят результат, а не застревают в бесконечных уточняющих петлях.
Тот болезненный опыт стал самым ценным уроком в моей AI-практике: путь к по-настоящему эффективной системе начинается с осознания того, чего ИИ делать не может.
Именно понимание ограничений не умаляет, а наоборот — усиливает практическую ценность технологии агентов. Это и есть разница между демо, которое рушится, и решением, которое действительно работает.
Шаблон проектирования “архетипов агентов” (Agent Blueprint Library)
🧠 Agent Blueprint Library
Каталог архитектурных шаблонов для типовых AI-агентов на базе LangGraph
Каждый агент описан по единой структуре: 📌 Назначение | 🧩 Узлы | 🔁 Логика переходов | 📦 Состояния (State) | 🛠 Возможные инструменты
🔍 1. Content Analyzer Agent
📌 Назначение: анализировать статьи, отчёты, посты; извлекать ключевые идеи, термины, инсайты.
🧩 Узлы:
- classification_node
- entity_extraction_node
- summarization_node
- insight_extraction_node (дополнительно)
🔁 Переходы: classification → entities → summary → insights → END
📦 Состояние:
class State(TypedDict):
text: str
classification: str
entities: List[str]
summary: str
insights: List[str]
🛠 Инструменты: LangChain + GPT-4o, опционально SerpAPI / DocQA
📊 2. Report Automation Agent
📌 Назначение: автоматическое создание отчётов на основе входных данных (таблиц, метрик, событий)
🧩 Узлы:
- data_parsing_node
- trend_analysis_node
- commentary_generation_node
- report_assembly_node
🔁 Переходы: parse → analyze → generate_comments → assemble → END
📦 Состояние:
class State(TypedDict):
raw_data: str
trends: Dict
commentary: str
final_report: str
🛠 Инструменты: Pandas, LangChain Expression Language, GPT-4o, визуализация через Plotly/Matplotlib
💬 3. Client Support Agent (FAQ Copilot)
📌 Назначение: отвечать на обращения клиентов по базе знаний, быстро и точно
🧩 Узлы:
- intent_detection_node
- retrieval_node (векторный поиск)
- answer_generation_node
- feedback_request_node
🔁 Переходы: intent → retrieve → answer → ask_feedback → END
📦 Состояние:
class State(TypedDict):
question: str
intent: str
retrieved_docs: List[str]
answer: str
feedback: Optional[str]
🛠 Инструменты: FAISS / Weaviate + LangChain, GPT-3.5/4o
🧭 4. Competitor Intelligence Agent
📌 Назначение: сбор и структурирование информации о конкурентах
🧩 Узлы:
- search_node (через SerpAPI/Tavily)
- summarize_results_node
- swot_analysis_node
- strategy_insight_node
🔁 Переходы: search → summarize → swot → insight → END
📦 Состояние:
class State(TypedDict):
query: str
search_results: List[str]
summary: str
swot: Dict
insights: List[str]
🛠 Инструменты: SerpAPI, LangChain, SWOT-паттерн
��� 5. Internal Knowledge Assistant
📌 Назначение: давать доступ к внутренним политикам, инструкциям, процессам
🧩 Узлы:
- question_classification_node
- semantic_retrieval_node
- answer_generation_node
- source_reference_node
🔁 Переходы: classify → retrieve → answer → reference → END
📦 Состояние:
class State(TypedDict):
query: str
category: str
documents: List[str]
answer: str
references: List[str]
🛠 Инструменты: PDF loader, ChromaDB, GPT-4, OpenRouter
🧩 Формат масштабирования:
- Каждый агент может быть расширен кастомными узлами, включая веб-хуки, автоответы, интеграции с API.
- Агент сохраняет гибкость графа и переиспользуемость узлов.
✅ Production-Ready Agent Checklist
Мини-гайд по проверке агента перед боевым запуском (v1.0)
🔍 1. Обработка исключительных случаев (edge cases)
- Агент корректно обрабатывает пустой ввод
- Агент не ломается при слишком длинном тексте
- Агент сохраняет работоспособность при повторном запуске с теми же данными
- Ввод с неформальной/шумной структурой не приводит к сбоям
🧯 2. Обработка ошибок и fallback-механизмы
- Каждый узел содержит try-except конструкцию с логированием
- Есть резервный путь (fallback) при сбое основного узла
- Агент сообщает о сбое пользователю, а не молча "зависает"
- Ошибки не обнуляют текущее состояние агента
🧠 3. Целостность и сохранность состояния (State Management)
- Состояние (state) передаётся между узлами без потерь
- Все ключи состояния явно описаны и используются
- Нет перезаписи ранее собранной информации без причины
- Используются неизменяемые структуры при необходимости (например, TypedDict)
🤖 4. Устойчивость к “плохому” вводу от пользователя
- Агент возвращает информативный ответ на непонятный/некорректный запрос
- Встроены валидаторы входных данных (тип, длина, структура)
- Агент не “галлюцинирует”, а указывает на невозможность ответа
🔄 5. Поведение при смене модели LLM
- Агент протестирован с двумя и более моделями (например, GPT-4o и GPT-3.5)
- Поведение ключевых узлов стабильно при смене модели
- Используются чёткие промпты и temperature=0, чтобы исключить дрейф ответов
- Нет зависимости от нестабильных параметров модели (вроде времени ответа или системных сообщений)
📦 Итоговая проверка перед релизом
- Все компоненты агента покрыты юнит-тестами или ручными сценариями
- Логика графа визуализирована и проверена на соответствие заданной цели
- Есть описание узлов, маршрута и состояния в отдельной документации
- Агент протестирован на реальных данных из целевой среды
💡 Рекомендация:
Для каждого проекта ввести версирование агента (например, v1.0 → v1.1), и сопровождать его чек-листом валидации на GitHub или в Notion/Wiki.
@abashinpro