1. Основы LangChain: архитектура, промпты и простые цепочки вызовов
Основы LangChain: архитектура, промпты и простые цепочки вызовов
Добро пожаловать в курс «Разработка AI-агентов с помощью LangChain и LangGraph». Это первая статья, в которой мы заложим фундамент для создания сложных интеллектуальных систем. Сегодня мы разберем, что такое LangChain, зачем он нужен, если у нас уже есть API от OpenAI или Anthropic, и как создать свое первое приложение на базе языковой модели.
Зачем нам нужен LangChain?
Представьте, что большая языковая модель (LLM) — это мощный двигатель. Он способен выдавать огромную энергию (генерировать текст, код, идеи). Но двигатель сам по себе не является автомобилем. Чтобы он приносил пользу, ему нужны колеса, руль, трансмиссия и топливная система.
LangChain — это шасси и трансмиссия для этого двигателя. Это фреймворк, который позволяет разработчикам объединять LLM с другими источниками вычислений или знаний. Он решает следующие проблемы:
* Абстракция: Позволяет легко менять одну модель на другую (например, GPT-4 на Claude 3) без переписывания всего кода. * Контекст: Упрощает управление историей диалога и памятью. * Цепочки (Chains): Позволяет выстраивать логику, где выход одного шага становится входом для следующего. * Инструменты: Дает модели возможность взаимодействовать с внешним миром (поиск в интернете, базы данных).
Архитектура LangChain
Современный LangChain строится вокруг концепции LCEL (LangChain Expression Language). Это декларативный способ описания цепочек. Но прежде чем мы перейдем к синтаксису, давайте разберем основные кирпичики, из которых строится любое приложение.
1. Модели (Models)
В LangChain существует два основных типа моделей:
* LLMs (Large Language Models): Принимают на вход строку текста и возвращают строку текста. Это классический режим автодополнения. * Chat Models: Принимают на вход список сообщений (сообщения могут быть от системы, пользователя или ассистента) и возвращают сообщение ассистента. Это более современный подход, используемый в GPT-3.5/4.
2. Промпты (Prompts)
Мы редко передаем ввод пользователя в модель напрямую. Обычно нам нужно добавить инструкции, примеры (few-shot learning) или контекст. Для этого используются Prompt Templates (шаблоны промптов).
Шаблон — это заготовка текста с переменными, которые подставляются в момент выполнения.
3. Парсеры вывода (Output Parsers)
Модель всегда возвращает текст (или объект сообщения). Но в программировании нам часто нужны структурированные данные: JSON, список, дата или число. Парсеры берут сырой текст от модели и преобразуют его в нужный формат.
Установка окружения
Для работы с примерами в этом курсе мы будем использовать язык Python. Вам понадобятся базовые библиотеки.
Также вам понадобится API-ключ (например, от OpenAI), который нужно сохранить в переменных окружения.
Создание первой цепочки (Chain)
Давайте создадим простейшее приложение: переводчик, который переводит сленг на литературный язык. Мы будем использовать синтаксис LCEL, который напоминает конвейер в Unix-системах (использование символа |).
Шаг 1: Создание модели
Сначала инициализируем модель чата.
Шаг 2: Создание шаблона промпта
Мы хотим, чтобы модель вела себя как профессиональный лингвист. Используем ChatPromptTemplate.
Здесь {text} — это переменная, которую мы передадим позже.
Шаг 3: Добавление парсера
Обычно ответ модели приходит в виде объекта AIMessage, содержащего метаданные. Если нам нужен просто текст (строка), мы используем StrOutputParser.
Шаг 4: Сборка цепочки через LCEL
Теперь самое интересное. Мы объединяем компоненты в единую цепочку с помощью оператора | (pipe). Данные текут слева направо: от шаблона к модели, а затем к парсеру.
Этот синтаксис делает код чистым и читаемым. Он скрывает сложную логику вызовов методов под капотом.
Шаг 5: Запуск цепочки
Чтобы запустить цепочку, мы используем метод invoke. Он принимает словарь со значениями для переменных шаблона.
Ожидаемый вывод: > Молодой человек, данное торжество поистине великолепно, я пребываю в крайнем изумлении!
Как работает LCEL под капотом?
LangChain Expression Language (LCEL) — это не просто синтаксический сахар. Это протокол. Каждый объект, участвующий в цепочке (Prompt, Model, Parser), реализует интерфейс Runnable. Это гарантирует, что у них есть стандартные методы:
* invoke: синхронный вызов.
* ainvoke: асинхронный вызов.
* stream: потоковая передача ответа (по токенам).
* batch: пакетная обработка списка запросов.
Благодаря этому, вы можете легко заменить один компонент на другой. Например, заменить StrOutputParser на JsonOutputParser, и вся остальная цепочка продолжит работать.
!Визуализация того, как интерфейс Runnable объединяет разные компоненты в единую последовательность.
Работа с переменными и сложными промптами
Промпты могут быть сложнее, чем просто одна переменная. Рассмотрим пример, где мы генерируем название для компании, основываясь на продукте и целевой аудитории.
В данном случае метод invoke ожидает словарь с двумя ключами: product и audience. Если вы забудете один из них, LangChain выдаст ошибку валидации.
Почему это важно для AI-агентов?
В этом курсе мы стремимся к созданию агентов — систем, которые могут принимать решения. Цепочки (Chains), которые мы рассмотрели сегодня, являются атомарными действиями агента.
Агент — это, по сути, цикл, который выбирает, какую цепочку запустить в данный момент. Например:
Без понимания того, как строятся простые цепочки Prompt | Model | Parser, невозможно построить сложного агента на LangGraph.
Заключение
Сегодня мы познакомились с основами LangChain:
| позволяет легко компоновать эти элементы.В следующей статье мы углубимся в тему памяти и контекста, чтобы наши модели могли помнить предыдущие реплики диалога, а затем перейдем к LangGraph для создания нелинейных сценариев поведения.