Что такое LangChain и какую проблему он решает

Урок объясняет, зачем поверх обычного API LLM понадобился целый фреймворк.

LangChain — фреймворк для построения приложений на основе больших языковых моделей: он стандартизирует работу с моделями, промптами, памятью, источниками данных и инструментами.

От одного вызова к приложению

Сделать один запрос к LLM просто: отправил текст — получил ответ. Но реальное приложение почти никогда не сводится к одному вызову. Нужно подставить пользовательский ввод в шаблон промпта, прогнать ответ через парсер, подмешать результаты поиска по базе знаний, запомнить предыдущие реплики диалога, иногда дать модели инструменты и позволить ей самой решать, что вызвать. Каждый из этих кусочков можно написать руками, но тогда вы быстро получаете спагетти из строк, словарей и обработчиков ошибок.

LangChain предлагает набор переиспользуемых абстракций для этих кусочков и единый способ соединять их в конвейер. Вы перестаёте думать про «склей строку и отправь POST-запрос» и начинаете думать про «шаблон → модель → парсер».

Из чего состоит фреймворк

Базовый набор строительных блоков LangChain:

  • Models — обёртки над LLM и chat-моделями (OpenAI, Anthropic, локальные и др.) с единым интерфейсом.
  • Prompts — шаблоны промптов с подстановкой переменных и few-shot-примерами.
  • Chains / LCEL — способ соединять компоненты в конвейер через оператор |.
  • Output parsers — превращают текст ответа в структуры данных.
  • Memory — хранение истории диалога между запросами.
  • Retrieval — загрузчики документов, эмбеддинги, векторные хранилища и retrievers для RAG.
  • Agents & Tools — модель сама выбирает, какой инструмент вызвать.

Как работает под капотом

В основе современного LangChain лежит интерфейс Runnable: почти каждый компонент (модель, промпт, парсер) умеет метод invoke(). Когда вы соединяете их оператором |, получается новый Runnable, который прогоняет данные через все звенья по очереди. Это и есть LCEL — LangChain Expression Language. Благодаря единому интерфейсу любая цепочка автоматически поддерживает синхронный и асинхронный вызовы, пакетную обработку (batch) и стриминг.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("Объясни {topic} простыми словами")
model = ChatOpenAI(model="gpt-4o-mini")
chain = prompt | model          # LCEL: шаблон → модель

print(chain.invoke({"topic": "рекурсия"}).content)

Частые ошибки

  • Тащить LangChain туда, где он не нужен. Для единичного простого запроса хватит прямого SDK. Фреймворк окупается, когда есть конвейер, RAG, память или агенты.
  • Путать пакеты. Современный LangChain разбит на langchain-core, интеграции (langchain-openai и т.п.) и langchain. Старые туториалы с from langchain.llms import OpenAI часто устарели.
  • Ждать «магии». LangChain не делает модель умнее — он лишь организует код вокруг неё.

Итог

  • LangChain — это оркестрация LLM-приложений, а не сама модель.
  • Ключевые блоки: модели, промпты, цепочки (LCEL), парсеры, память, retrieval, агенты.
  • В основе всего — единый интерфейс Runnable с методом invoke().
  • Фреймворк окупается на конвейерах, RAG, диалогах и агентах, а не на одиночном запросе.
Проверьте себя
1. Какую основную задачу решает LangChain?
AДелает языковую модель точнее при обучении
BОркестрирует компоненты LLM-приложения: промпты, модели, память, поиск, инструменты
CЗаменяет векторную базу данных
DУскоряет инференс модели на GPU
2. Что лежит в основе соединения компонентов через оператор | в современном LangChain?
AИнтерфейс Runnable с методом invoke()
BГлобальная переменная окружения
CПрямые HTTP-редиректы между сервисами
DДекоратор @chain поверх каждой функции
3. Когда применение LangChain наименее оправдано?
AДля RAG-приложения по своим документам
BДля агента с набором инструментов
CДля единичного простого запроса к модели без конвейера
DДля диалогового бота с памятью