LangChain vs LangGraph: когда нужны цепочки, а когда граф
LangGraph не конкурирует с LangChain, а лежит ниже. Разбираем, когда хватает цепочки и create_agent, а когда нужен граф с состоянием, и показываем код на одной модели.
5 мин · · разработка · агенты
Вопрос «langchain vs langgraph» кажется выбором из двух библиотек, но это скорее выбор уровня абстракции. В документации LangChain сказано прямо: LangGraph — низкоуровневая среда оркестрации, а агенты LangChain построены поверх неё. Ниже объясняем разницу простыми словами, показываем минимальный код на каждом уровне с одной моделью через шлюз и считаем, сколько стоит граф с циклом.
LangChain vs LangGraph: в чём разница
LangChain даёт компоненты (модели, промпты, парсеры, инструменты) и готового агента create_agent: минимальную настраиваемую «обвязку» вокруг цикла «модель думает, вызывает инструмент, получает результат». Вы описываете модель, инструменты и системный промпт, а цикл уже написан.
LangGraph — среда, где вы сами описываете граф: узлы (функции), рёбра между ними и общее состояние. Документация перечисляет его сильные стороны: смешение жёстких шагов и шагов с моделью в одном графе, сохранение состояния и возобновление после сбоя, вмешательство человека в любой точке, потоковая выдача, память. LangGraph можно использовать и без LangChain.
Рекомендация из документации LangChain сводится к тому, что для настраиваемого агента берут create_agent, а для сложных случаев, где детерминированные шаги сочетаются с агентными, берут LangGraph.
| Задача | Что взять |
|---|---|
| Промпт, модель, разбор ответа по порядку | Цепочка из компонентов |
| Модель вызывает инструменты в цикле | create_agent |
| Ветвления и возвраты по условию | LangGraph |
| Состояние между шагами и сохранение после сбоя | LangGraph с чекпоинтером |
| Пауза и подтверждение человеком | LangGraph |
| Долгий процесс, который может прерваться | LangGraph |
Подготовка
Нужны ключ fetch_... из кабинета и адрес https://api.zukko.pro/v1. Установка: pip install langchain langchain-openai langgraph. Подключение и формат запросов описаны в справочнике Python. Общая часть для примеров:
from langchain_openai import ChatOpenAI
writer = ChatOpenAI(
model="claude-sonnet-5-5",
base_url="https://api.zukko.pro/v1",
api_key="fetch_ваш_ключ",
)Уровень 1: цепочка
Если шаги идут по порядку и ветвлений нет, граф не нужен:
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages(
[("system", "Отвечай кратко."), ("user", "{question}")]
)
chain = prompt | writer | StrOutputParser()
print(chain.invoke({"question": "Что такое кэш промптов?"}))Оператор | склеивает компоненты в конвейер. Это самый дешёвый вариант по числу запросов: один вызов модели.
Уровень 2: агент с инструментом
Когда модель сама решает, какую функцию вызвать и сколько раз, берут create_agent:
from langchain.agents import create_agent
PRICES = {"claude-sonnet-5-5": (0.4, 2.0), "gpt-6.1-sol": (0.27, 1.32)}
def get_price(model: str) -> str:
"""Вернуть цену входа и выхода модели в долларах за 1M токенов."""
pin, pout = PRICES[model]
return f"вход {pin}, выход {pout}"
agent = create_agent(model=writer, tools=[get_price], system_prompt="Ты помощник по ценам.")
result = agent.invoke({"messages": [{"role": "user", "content": "Сколько стоит выход у gpt-6.1-sol?"}]})
print(result["messages"][-1].content)Для агента важно, чтобы модель поддерживала вызов инструментов. Проверьте это на выбранной модели одним тестовым запросом. Цикл здесь скрыт внутри: вы не управляете тем, сколько раз модель обратится к инструменту, кроме системного промпта и лимитов ключа.
Уровень 3: граф с состоянием
Теперь задача с контролем: написать текст, проверить его второй моделью и, если проверка не прошла, переписать, но не более трёх попыток. Это явный цикл с условием, и именно его удобно описывать графом.
from typing import TypedDict
from langchain_openai import ChatOpenAI
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.graph import END, START, StateGraph
checker = ChatOpenAI(
model="deepseek-v4.1-flash",
base_url="https://api.zukko.pro/v1",
api_key="fetch_ваш_ключ",
temperature=0,
)
class State(TypedDict):Что здесь происходит. State — общий словарь, который каждый узел читает и частично обновляет. Узлы write и check — обычные функции. Обычное ребро ведёт из write в check, а условное ребро после check решает, закончить или вернуться. Чекпоинтер InMemorySaver сохраняет состояние по thread_id, так что выполнение можно изучить или продолжить, а в продакшене его заменяют хранилищем на диске или в базе. Важная деталь экономии: проверяющий узел использует дешёвую модель, и граф позволяет выбирать модель под каждый шаг.
Подводные камни
- Адрес. В обоих классах
base_urlзаканчивается на/v1, потому что это OpenAI-совместимый клиент. Без суффикса запросы уйдут на несуществующий путь и вернут 404. - Цикл — это деньги. Каждый проход по графу делает новые запросы. Поэтому в маршрутизаторе стоит счётчик попыток, а ключу задан дневной лимит расхода в долларах; когда он исчерпан, шлюз вернёт 429
key_daily_limit_reached. Подробнее: как ограничить расход ключа. Ищите в документации LangGraph и параметрrecursion_limit, он ограничивает число шагов выполнения. - Кэш Claude. В OpenAI-формате (а ChatOpenAI по умолчанию работает именно так) для Claude весь вход идёт по цене входа. Если у вас длинный повторяющийся контекст, посмотрите расчёт с кэшем в статье про чтение и запись кэша.
Сколько стоит цикл
Цены на 18 октября 2026, за 1M токенов. Один проход графа: write на claude-sonnet-5-5 (вход 0.4, выход 2) с 300 токенами входа и 150 выхода; check на deepseek-v4.1-flash (вход 0.013, выход 0.038) с 250 токенами входа и 5 выхода.
- write: 300 × 0.4 + 150 × 2 = 120 + 300 = 420 микродолларов.
- check: 250 × 0.013 + 5 × 0.038 = 3.25 + 0.19 = 3.44 микродоллара.
- Проход: 423.44 микродоллара. Худший случай, три прохода: 3 × 423.44 = 1 270.32, около $0.0013 за документ, около $1.27 за 1 000 документов.
Если бы проверку делала та же claude-sonnet-5-5, check стоил бы 250 × 0.4 + 5 × 2 = 110 микродолларов, а проход 530. Основная стоимость в узле генерации, а дешёвый проверяющий экономит немного, но и не вредит: подходит ли такая модель для проверки, решит тест на ваших текстах. Цены и список моделей: GET https://api.zukko.pro/v1/models. Оплата: СБП (комиссия платёжной страницы 8,5% сверху), криптовалюта или карты MasterCard. Базовое подключение LangChain: LangChain: как указать наш base_url.
Частые вопросы
Нужен ли LangChain для LangGraph?
Нет. Документация LangGraph прямо говорит, что его можно использовать без LangChain, но компоненты LangChain удобно брать для моделей и инструментов.
Устарели ли цепочки?
Для линейных задач они остаются самым простым вариантом. В актуальной документации главной точкой входа для агентов названа create_agent.
Что такое Deep Agents?
По документации, это более готовый агент с автоматическим сжатием контекста, виртуальной файловой системой и порождением подагентов, построенный на агентах LangChain. Берут, когда хочется получить больше готового из коробки.
Нужен ли LangSmith?
Он не обязателен. Это отдельный сервис для трассировки и оценки, который подключается по желанию. Для начала хватит логов и раздела «Использование» в кабинете Zukko.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Промпт-инъекция: что это и как защитить бота и агентаОбъясняем, как работает промпт-инъекция через пользовательский ввод и чужие документы, и какие меры снижают ущерб: изоляция данных, права инструментов, лимиты ключа.
- Claude Code YOLO: режимы разрешений и работа без подтвержденийОтдельного режима YOLO в Claude Code нет, зато есть шесть режимов разрешений и гибкие правила. Разбираем, как перестать нажимать «Да» и не лишиться файлов.
- Claude Code: чек-лист лучших практик для ежедневной работыПривычки, которые делают работу с Claude Code предсказуемой: короткий CLAUDE.md, план перед правками, мелкие задачи, проверка результата и контроль расхода.
- MCP-сервер на Java: минимальный пример с одним инструментомПишем минимальный MCP-сервер на Java с одним инструментом, регистрируем его в Claude Code и учимся находить причину, если агент его не видит.