LangChain — фреймворк для агентов и LLM-приложений

· 3 мин чтения
ai-agents llm python orchestration open-source
📂 Исходный код на GitHub

Фреймворк для создания агентов и LLM-приложений: связывает совместимые компоненты и сторонние интеграции, чтобы упростить разработку AI-приложений и не привязывать проект к конкретной технологии. Репозиторий на Python, лицензия MIT.

LangChain — фреймворк для агентов и LLM-приложений

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; нужен настраиваемый harness под конкретную задачу — LangChain; нужны сложные гибридные workflow — LangGraph; нужно наблюдение и оценка качества — LangSmith. Для JavaScript/TypeScript аналог — https://github.com/langchain-ai/langchainjs.

Ссылки

Источник: https://github.com/langchain-ai/langchain