Пока 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 и эмбеддинги: как дать модели ваши данные, чтобы она отвечала по фактам, а не выдумывала.