LangChain — фреймворк для агентов и LLM-приложений
📂 Исходный код на GitHubФреймворк для создания агентов и LLM-приложений: связывает совместимые компоненты и сторонние интеграции, чтобы упростить разработку AI-приложений и не привязывать проект к конкретной технологии. Репозиторий на Python, лицензия MIT.
LangChain — это Python-фреймворк для построения агентов и приложений на базе LLM. Его задача не в том, чтобы изобрести новый способ вызова модели, а в том, чтобы дать единый интерфейс над моделями, tools, промптами и внешними системами, чтобы вы могли менять провайдера, не переписывая приложение. На момент публикации у репозитория около 147 000 звёзд, лицензия MIT, основной язык — Python, ветка по умолчанию master.
Что это вообще такое
Формулировка в README звучит максимально обтекаемо: «The agent engineering platform» — платформа для инженерии агентов. Практически репозиторий https://github.com/langchain-ai/langchain — это верхний слой пирамиды, где собирается агент, и тонкий слой стандартизированных интерфейсов поверх langchain-core.
Ключевая идея, которую транслирует весь проект, звучит в документации как формула: агент = модель + обвязка (harness). Обвязка — это всё, что окружает цикл вызова модели: системный промпт, список инструментов, middleware, который формирует поведение. Принцип разработки — начать с примитивов и собрать ровно тот агент, который нужен вашей задаче.
Установка минимальна:
uv add langchain
Первый вызов модели выглядит так, как в README:
from langchain.chat_models import init_chat_model
model = init_chat_model("openai:gpt-5.5")
result = model.invoke("Hello, world!")
Строка "openai:gpt-5.5" — это схема провайдер:модель. Через init_chat_model вы обращаетесь к Anthropic, Google Gemini, OpenRouter, AWS Bedrock, Azure, HuggingFace, Ollama и другим провайдерам одинаково. Именно это и называется model interoperability: команда может менять модель, пока не найдёт лучшую под задачу, и это не требует переписывания кода.
create_agent: одна точка входа для агентов
Главный API фреймворка — функция create_agent. Она создаёт агента из модели, tools и system prompt:
from langchain.agents import create_agent
def get_weather(city: str) -> str:
"""Get weather for a given city."""
return f"It's always sunny in {city}!"
agent = create_agent(
model="openai:gpt-5.5",
tools=[get_weather],
system_prompt="You are a helpful assistant",
)
result = agent.invoke(
{"messages": [{"role": "user", "content": "What's the weather in San Francisco?"}]}
)
print(result["messages"][-1].content_blocks)
Обратите внимание на content_blocks в последней строке — это не деталь, а следствие major-версии, о которой пойдёт речь ниже.
Важная деталь архитектуры: агенты LangChain работают поверх LangGraph. Из этого следуют durable execution, поддержка human-in-the-loop, персистентность состояния. Сам LangChain при этом остаётся удобной обвязкой: если вам нужен низкоуровневый контроль над графом, вы спускаетесь в https://ai4coding.ru/solutions/langchain-ai-langgraph.
Middleware вместо hooks
Отличительная черта подхода — middleware. Хуки pre_model_hook и post_model_hook, которые раньше навешивались на агента, превратились в методы before_model и after_model у отдельных объектов middleware. Это меняет модель расширения: раньше на каждый агент была одна функция, теперь можно собрать стек независимых middleware и переиспользовать одну и ту же между разными агентами.
Типичные задачи для before_model: суммаризация истории диалога, обрезка сообщений, входные guardrails вроде редактирования PII. Для after_model — human-in-the-loop и выходные guardrails. Часть решений уже собрана «из коробки»:
from langchain.agents import create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
agent = create_agent(
model="claude-sonnet-4-6",
tools=[read_email, send_email],
middleware=[
HumanInTheLoopMiddleware(
interrupt_on={
"send_email": {
"description": "Please review this email before sending",
"allowed_decisions": ["approve", "reject"]
}
}
)
]
)
Ещё четыре точки расширения, которые полезно знать:
@dynamic_prompt— промпт, который вычисляется в рантайме по состоянию диалога и контексту. Это базовый приём context engineering.wrap_model_call— динамический выбор модели в зависимости от сложности задачи или бюджета.wrap_tool_call— обработка ошибок инструментов, retry, кастомная политика вызова.state_schema— собственное состояние агента, доступное tools.
Через context_schema объявляется статический контекст, который передаётся в invoke аргументом context. Он отделён от динамического состояния диалога.
Стандартные content blocks
Версия 1.0 добавила в langchain-core свойство message.content_blocks — провайдер-независимое представление содержимого сообщения. Оно решает реальную боль: у OpenAI reasoning выглядит как reasoning, у Anthropic — как thinking, и обработчик должен знать, с кем работает.
from langchain.chat_models import init_chat_model
model = init_chat_model("gpt-5-nano")
response = model.invoke("Explain AI")
for block in response.content_blocks:
if block["type"] == "reasoning":
print(block.get("reasoning"))
elif block["type"] == "text":
print(block.get("text"))
Блоки бывают text, image, reasoning и другие. Их можно не только читать, но и собирать мультимодальные сообщения:
from langchain.messages import HumanMessage
message = HumanMessage(content_blocks=[
{"type": "text", "text": "Describe this image."},
{"type": "image", "url": "https://example.com/image.jpg"},
])
res = model.invoke([message])
По умолчанию стандартные блоки не сериализуются в content. Если нужна сериализация — выставляется export LC_OUTPUT_VERSION=v1 или параметр output_version="v1" при инициализации модели. Старое поле content продолжает работать.
Честно про версию 1.0
Здесь нужно остановиться: 1.0 — это полный сброс API, а не минорное обновление. Если у вас в проекте LangChain 0.x, код нельзя просто обновить и запустить. Официальный гайд по миграции перечисляет изменения так:
| Что | Что изменилось |
|---|---|
| Путь импорта | langgraph.prebuilt.create_react_agent → langchain.agents.create_agent |
| Промпт | Параметр prompt переименован в system_prompt, динамические промпты ушли в middleware |
| Pre-model hook | Заменён на middleware с методом before_model |
| Post-model hook | Заменён на middleware с методом after_model |
| Кастомный state | Только TypedDict; Pydantic-модели и dataclass больше не поддерживаются |
| Модель | Динамический выбор через middleware; pre-bound модели не поддерживаются |
| Tools | ToolNode больше не принимается, обработка ошибок ушла в wrap_tool_call |
| Structured output | Prompted output удалён, используйте ToolStrategy / ProviderStrategy |
| Имя узла в стриме | "agent" → "model" |
| Runtime context | Внедрение через аргумент context вместо config["configurable"] |
| Пространство имён | Урезано, легаси вынесено в langchain-classic |
Что ещё ломается:
- Python 3.9 больше не поддерживается, нужен 3.10 или выше.
- Пакет
langchainсильно урезан. Осталисьlangchain.agents,langchain.messages,langchain.tools,langchain.chat_models,langchain.embeddings. Всё остальное — legacy chains (LLMChain,ConversationChain), retrievers, indexing API, hub,CacheBackedEmbeddings, реэкспортыlangchain-community— переехало в отдельный пакетlangchain-classic(https://pypi.org/project/langchain-classic/). - Structured output больше не генерируется в отдельном узле, а считается в основном цикле — это снижает задержку и стоимость.
- Возвращаемый тип вызова чат-модели исправлен с
BaseMessageнаAIMessage. - В
langchain-anthropicзначение по умолчаниюmax_tokensтеперь зависит от модели, а не всегда 1024. Если полагались на старое — указывайте явно. .text()стал свойством.text; вызов-метод пока работает, но с warning, и будет удалён в 2.0.- Все API, помеченные к удалению ещё в 0.x, удалены.
До 2.0 команда обещает не делать breaking changes, так что 1.x — точка, где API стабилизирован.
Экосистема
LangChain редко применяют в одиночку. README описывает пять связанных продуктов, и границы между ними важны:
- Deep Agents (https://docs.langchain.com/oss/python/deepagents/) — пакет поверх LangChain для тех, кто только начинает. Планирование, субагенты, файловая система, автоматическое сжатие контекста.
- LangGraph (https://ai4coding.ru/solutions/langchain-ai-langgraph) — низкоуровневый фреймворк оркестрации: детерминированные и агентные ветки в одном графе.
- Integrations (https://docs.langchain.com/oss/python/integrations/providers/overview) — чат-модели, эмбеддинги, tools и toolkits.
- LangSmith (https://www.langchain.com/langsmith) — трейсинг, отладка, evals, наблюдаемость.
- LangSmith Deployment (https://docs.langchain.com/langsmith/deployments) — платформа для развёртывания долгоживущих stateful-агентов.
Схема выбора из документации: начинающим — Deep Agents; нужен настраиваемый harness под конкретную задачу — LangChain; нужны сложные гибридные workflow — LangGraph; нужно наблюдение и оценка качества — LangSmith. Для JavaScript/TypeScript аналог — https://github.com/langchain-ai/langchainjs.