Установка, пакеты и первый запуск

Разбираемся в модульной структуре пакетов LangChain и делаем первый вызов.

langchain-core — пакет с базовыми абстракциями (Runnable, промпты, сообщения); конкретные провайдеры живут в отдельных пакетах-интеграциях.

Почему пакетов несколько

Раньше весь LangChain был одним большим пакетом, и обновление ломало проекты. Теперь он разбит на части. Это намеренное архитектурное решение: ядро меняется редко и стабильно, а интеграции с провайдерами обновляются часто и независимо.

ПакетЧто внутри
langchain-coreбазовые абстракции: Runnable, сообщения, промпты, парсеры
langchain-openaiинтеграция с моделями OpenAI
langchain-communityмножество сторонних интеграций (загрузчики, хранилища)
langchainвысокоуровневые цепочки и агенты, собранные из ядра

Установка и ключи

Ставим только то, что нужно для конкретного провайдера:

pip install langchain langchain-openai

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

export OPENAI_API_KEY="sk-..."

Первый вызов

Минимальная программа: создаём chat-модель и отправляем сообщение.

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
response = model.invoke("Назови три преимущества модульной архитектуры")
print(response.content)

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

Метод invoke() внутри: сериализует ваш ввод в формат сообщений, читает ключ из переменной окружения, отправляет HTTP-запрос к API провайдера, дожидается ответа и оборачивает его в объект AIMessage. Параметр temperature=0 делает ответы максимально детерминированными — это удобно, когда вы отлаживаете цепочку и хотите воспроизводимости. Идея единого invoke() в том, что код приложения не зависит от того, какой именно провайдер за ним стоит: поменяли класс модели — остальная цепочка не изменилась.

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

  • Старый импорт. from langchain.llms import OpenAI — устаревший путь. Сейчас провайдер импортируется из своего пакета: from langchain_openai import ChatOpenAI.
  • Ключ в коде. Хардкод api_key="sk-..." приводит к утечке секрета через git. Используйте переменные окружения или менеджер секретов.
  • Лишние зависимости. Не нужно ставить интеграции всех провайдеров сразу — это раздувает окружение и тянет конфликты версий.

Итог

  • LangChain модульный: ядро + интеграции + высокоуровневый пакет.
  • Устанавливайте только нужные интеграции, ключи держите в переменных окружения.
  • Первый вызов — это model.invoke("текст"), ответ приходит как AIMessage.
  • temperature=0 даёт воспроизводимость при отладке.
Проверьте себя
1. Зачем LangChain разбит на langchain-core и отдельные пакеты-интеграции?
AЧтобы стабильное ядро не ломалось при частых обновлениях провайдеров
BЧтобы запретить использование сторонних моделей
CЧтобы ускорить инференс
DЭто случайность, без практического смысла
2. Как правильно хранить ключ API в проекте на LangChain?
AПрямо в коде в виде строки
BВ переменной окружения или менеджере секретов
CВ комментарии рядом с импортом
DВ названии переменной модели