Полный гайд по созданию первого AI-агента на LangGraph

Полный гайд по созданию первого AI-агента на LangGraph

ТИЗЕР: Полный гайд по созданию первого AI-агента на LangGraph — это практическое руководство, написанное на основе неудачного опыта демонстрации ИИ-агента перед клиентом. Автор осознал, что провал произошёл из-за неверной архитектуры: запутанные связи, отсутствие чёткой логики и слабое управление состоянием. В результате он пересмотрел подход и объяснил, как правильно строить агента.

ИИ-агенты отличаются от обычных чат-ботов — они не просто отвечают на запросы, а самостоятельно анализируют задачи, используют инструменты и делают выводы. В основе их работы — управление состоянием, принятие решений и использование внешних инструментов. Важно, чтобы агент имел память (state), строгое управление логикой (через граф), и выполнял действия последовательно.

На примере LangGraph демонстрируется пошаговая сборка агента, анализирующего статьи с Medium: классификация текста, извлечение сущностей и создание краткого резюме. Вся логика реализуется в виде графа из узлов и связей.

Отдельное внимание уделено ограничениям: ИИ-агенты не умеют адаптироваться вне заданных маршрутов, не обладают глубинным контекстом и требуют контроля со стороны человека. Главный вывод — эффективность достигается при понимании как сильных сторон, так и ограничений ИИ.

Руководство по созданию вашего первого AI-агента с LangGraph (Это проще, чем вы думаете)

Спустя 1 месяц разработки моего коммерческого AI-агента всё рухнуло во время клиентской демонстрации.

То, что должно было быть плавным автономным процессом, превратилось в неловкий цикл бесконечных уточняющих запросов и противоречивых решений. Клиент оставался вежливым, но явно был разочарован.

После его ухода я провёл несколько часов, анализируя провал, и понял, что в корне неправильно понял архитектуру агента — я построил чрезмерно усложнённую систему с нечеткими границами принятия решений и отсутствием чёткой логики рассуждений.

Этот провал изменил мой подход и стал основой того, как я теперь объясняю такие системы. Как только вы поймёте базовые принципы, создание эффективных агентов окажется неожиданно простым.

Введение в AI-агентов

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

AI-агенты — это системы, которые:

  1. Мыслят пошагово, разбираясь в проблеме;
  2. Подключаются к внешним инструментам по необходимости;
  3. Учатся на своих действиях, чтобы со временем становиться лучше.

От моделей к агентам

До появления агентов 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-системах, лучшие результаты достигаются в связке "ИИ + человек".

Осознание этих ограничений помогает создавать более устойчивые системы и точно понимать, в каких моментах необходим человек.

Больной урок из провальной демо-презентации

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

Приняв, что агенты:

  1. Нуждаются в чёткой архитектуре;
  2. Работают по фиксированным маршрутам;
  3. Частично являются "чёрными ящиками";
  4. Требуют участия человека — я начал создавать решения, которые действительно приносят результат, а не застревают в бесконечных уточняющих петлях.

Тот болезненный опыт стал самым ценным уроком в моей 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.

Андрей Башин
Сооснователь AI-лаборатории Brain Bloom Эксперт по AI-трансформации и ролевым нейро-агентам

@abashinpro

2
2 комментария