Пока LLM-фича — это один вызов модели, хватает обычного SDK: собрал промпт, отправил, разобрал ответ. Но реальные приложения быстро усложняются: сначала найти нужные данные, потом задать вопрос модели, потом вызвать инструмент, потом ещё раз спросить. Склеивать это руками утомительно. LangChain — популярный фреймворк, который даёт готовые кирпичики для такой оркестрации.

Что даёт LangChain

LangChain не «делает ИИ» — модель по-прежнему внешняя. Он даёт строительные блоки и общие интерфейсы, чтобы собирать из вызовов модели полноценные приложения, не изобретая каждый раз клей. Ключевые блоки такие.

Цепочки (chains). Это последовательность шагов, где выход одного — вход следующего: собрать промпт → вызвать модель → разобрать ответ. Цепочки позволяют описать поток декларативно и переиспользовать его. Простейшая цепочка — «шаблон промпта → модель → парсер вывода».

Память (memory). Модель сама по себе не помнит прошлых сообщений — каждый вызов независим. Память хранит историю диалога и подмешивает её в контекст, чтобы разговор был связным. Разные стратегии решают, что помнить целиком, а что сжимать (чтобы не переполнить окно контекста).

Ретриверы (retrievers). Это компонент, который по запросу достаёт релевантные куски данных — из векторной базы или другого источника — чтобы положить их в контекст. Ретриверы — основа RAG: «найти нужное → дать модели → получить ответ по фактам».

Инструменты и агенты. LangChain оборачивает вызов инструментов и позволяет собрать агента — модель в цикле, которая сама решает, какой инструмент дёрнуть.

Зачем это, если есть SDK

Резонный вопрос: всё то же можно написать и на голом SDK провайдера. Что даёт фреймворк:

  • единый интерфейс к разным моделям. Сменить провайдера (одну модель на другую) — поменять одну строку, а не переписывать вызовы; удобно для сравнения и подстраховки.
  • готовые паттерны. Память, ретриверы, разбиение документов, парсеры вывода — не нужно писать заново то, что уже стандартизировано.
  • быстрое прототипирование. Собрать работающий прототип RAG или агента из готовых блоков — вопрос десятков строк.

Когда он мешает

LangChain — не бесплатный обед, и его часто критикуют за лишние абстракции. Честные оговорки:

  • абстракция прячет происходящее. Когда что-то ломается, приходится продираться через слои фреймворка, чтобы понять, какой именно промпт ушёл модели. Для отладки это минус.
  • для простого — избыточен. Если фича — это один вызов модели, фреймворк только добавляет зависимость и сложность. Тут проще голый SDK.
  • быстро меняется. Экосистема молодая, API эволюционирует; код может устаревать между версиями.

Практическое правило: один-два вызова — берите SDK; сложный поток из поиска, памяти, инструментов и ветвлений — фреймворк экономит время. И даже с фреймворком полезно понимать, что он делает под капотом, — иначе отладка превращается в гадание. Есть и альтернативы (LlamaIndex, собственный тонкий слой) — LangChain не единственный, но самый известный.

Где это применяется

LangChain (или аналог) обычно появляется, когда LLM-фича перерастает один вызов: чат-бот с памятью и доступом к базе знаний, ассистент, который ищет в документах и дёргает внешние сервисы, конвейер разбора и обогащения данных. Он склеивает модель, данные и инструменты в единый поток.

Коротко

  • LangChain — фреймворк оркестрации: даёт готовые блоки, чтобы собирать LLM-приложения из вызовов модели, поиска и инструментов.
  • Ключевые блоки: цепочки (последовательность шагов), память (история диалога), ретриверы (достать данные для RAG), инструменты и агенты.
  • Плюсы — единый интерфейс к моделям, готовые паттерны, быстрое прототипирование. Минусы — лишние абстракции, сложнее отладка, быстрая смена API.
  • Правило: один-два вызова — голый SDK; сложный поток — фреймворк. В любом случае понимай, что он делает под капотом.

Дальше — RAG и эмбеддинги: как дать модели ваши данные, чтобы она отвечала по фактам, а не выдумывала.