Files
langchain-evolution-deck/research/per-tech/chains.md
T
petya 75601988c2 Initial commit: LangChain evolution tutorial deck (132 slides)
- Cover, TOC, 5 dividers, 3 recap slides
- 5 sections (chains, langgraph, deepagents, openswe, ecosystem)
- design-system.js with theme tokens + 9 helper functions
- research/: timeline + sources + per-tech notes
- final-compile.js + merge.js for rebuild pipeline
- output/: langchain-evolution.pptx (2.3 MB) + langchain-evolution.pdf (1.1 MB) + 7 sample previews
2026-06-22 11:29:03 +03:00

12 KiB
Raw Blame History

LangChain (≥ 1.0)

Что это в одном абзаце

LangChain — это Python-фреймворк для сборки LLM-приложений и агентов. С версии 1.0 (релиз 22 октября 2025) он позиционируется как «самый быстрый способ собрать агента с любым провайдером моделей», построенный поверх LangGraph-рантайма. До 1.0 фреймворк был известен как «монолит с LCEL» — теперь же фокус сместился на единый create_agent и middleware-систему; вся устаревшая функциональность (LLMChain, RetrievalQA, ConversationalRetrievalQA, legacy AgentExecutor) переехала в отдельный пакет langchain-classic.

Метаданные на дату snapshot 2026-06-22:

  • GitHub stars: ~140k
  • Latest stable (Python): langchain 1.3.10 / langchain-core 1.4.8 (от 18.06.2026)
  • License: MIT
  • JS-аналог: langchain (npm @langchain/langchain)

Источники:


Ключевые API (≥ 1.0)

Импорты верхнего уровня

from langchain.chat_models import init_chat_model
from langchain.agents import create_agent
from langchain.agents.middleware import (
    HumanInTheLoopMiddleware,
    SummarizationMiddleware,
    PIIRedactionMiddleware,
)
from langchain.tools import tool

Создание модели

# Универсальный инициализатор — один интерфейс для всех провайдеров
model = init_chat_model("openai:gpt-4.1")
model = init_chat_model("anthropic:claude-3-7-sonnet-latest")
model = init_chat_model("google_vertexai:gemini-2.0-flash")

Создание агента (новый create_agent)

from langchain.agents import create_agent

agent = create_agent(
    model="openai:gpt-4.1",
    tools=[get_weather],
    system_prompt="You are a helpful assistant.",
)
result = agent.invoke({"messages": [{"role": "user", "content": "weather in NYC?"}]})

Structured output

from pydantic import BaseModel

class Weather(BaseModel):
    city: str
    temperature_c: float

model_with_struct = model.with_structured_output(Weather)

Инструменты

from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
    """Get the weather for a given city."""
    return f"Sunny, 22°C in {city}"

Middleware (новая система v1.0)

from langchain.agents.middleware import HumanInTheLoopMiddleware, PIIRedactionMiddleware

agent = create_agent(
    model=model,
    tools=[read_file, write_file],
    middleware=[
        HumanInTheLoopMiddleware(interrupt_on={"write_file": True}),
        PIIRedactionMiddleware(redact_emails=True),
    ],
)

Messages (стандартизированные content blocks)

from langchain.messages import HumanMessage, AIMessage, SystemMessage

msg = HumanMessage(content="Hello")
response = model.invoke([msg])
# response.content может содержать reasoning traces, citations, tool_call блоки

Что нового в 1.0

  1. create_agent abstraction — единая точка входа для всех агентов. Заменил многообразие legacy create_react_agent, create_openai_functions_agent, create_structured_chat_agent. Построен на LangGraph-runtime.
  2. Middleware system — hooks до/после model call, до/после tool call. Built-in: HumanInTheLoop, Summarization, PIIRedaction. Custom middleware — first-class.
  3. Improved structured output — интегрирован в основной цикл, без extra LLM-вызовов. Поддержка tool calling и provider-native.
  4. Standard content blocks — провайдер-агностичный формат для reasoning traces, citations, server-side tool calls.
  5. Reduced surface arealangchain-classic забрал все chains/agentsExecutor-legacy, оставив минимальное API.
  6. Stability promise — semver-обязательство: до 2.0 не будет breaking changes.
  7. init_chat_model универсальный — один инициализатор для всех провайдеров (был ChatOpenAI, ChatAnthropic, ChatGoogleGenerativeAI отдельно).

Что нужно раскрыть в презентации

  • LCEL (LangChain Expression Language) — хотя 1.0 сместил фокус, LCEL остаётся основой для неагентных цепочек (prompt | model | parser).
  • create_agent vs LCEL — когда что: agent для циклов с инструментами, LCEL для линейных pipeline-ов.
  • Middleware-система — триггерит HITL, summarization, PII-regex; где их подключать.
  • Standard content blocks — почему важно для multi-provider совместимости.
  • Миграция с 0.x — что ушло в langchain-classic, что переименовано (LLMChainlangchain-classic).
  • init_chat_model — единая фабрика моделей.
  • Интеграцииlangchain-openai, langchain-anthropic, langchain-google, langchain-tavily, etc. ~700+ community пакетов.

7 рабочих примеров кода Python (≥ 1.0)

1. Hello world (init_chat_model)

from langchain.chat_models import init_chat_model

model = init_chat_model("openai:gpt-4.1-mini")
result = model.invoke("Say hello in one sentence")
print(result.content)

2. LCEL-цепочка (промпт → модель → парсер)

from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

model = init_chat_model("openai:gpt-4.1-mini")
prompt = ChatPromptTemplate.from_messages([
    ("system", "Translate to French."),
    ("human", "{text}"),
])
chain = prompt | model | StrOutputParser()
print(chain.invoke({"text": "Hello world"}))

3. create_agent с одним инструментом

from langchain.agents import create_agent
from langchain.tools import tool

@tool
def get_weather(city: str) -> str:
    """Get weather for a city."""
    return f"Sunny, 22°C in {city}"

agent = create_agent(
    model="openai:gpt-4.1",
    tools=[get_weather],
    system_prompt="You are a weather assistant.",
)
result = agent.invoke({"messages": [{"role": "user", "content": "weather in Paris?"}]})
print(result["messages"][-1].content)

4. Structured output

from langchain.chat_models import init_chat_model
from pydantic import BaseModel

class MovieReview(BaseModel):
    title: str
    rating: int  # 1..10
    summary: str

model = init_chat_model("openai:gpt-4.1-mini")
reviewer = model.with_structured_output(MovieReview)
result = reviewer.invoke("Review the movie Inception in one sentence.")
print(result.title, result.rating, result.summary)

5. Middleware: HITL

from langchain.agents import create_agent
from langchain.agents.middleware import HumanInTheLoopMiddleware
from langchain.tools import tool

@tool
def send_email(to: str, body: str) -> str:
    """Send an email."""
    return f"sent to {to}"

agent = create_agent(
    model="openai:gpt-4.1",
    tools=[send_email],
    middleware=[HumanInTheLoopMiddleware(interrupt_on={"send_email": True})],
)
result = agent.invoke({"messages": [{"role": "user", "content": "email alice@x.com"}]})

6. Middleware: PII-редакция

from langchain.agents import create_agent
from langchain.agents.middleware import PIIRedactionMiddleware
from langchain.tools import tool

@tool
def echo(text: str) -> str:
    """Echo back the text."""
    return text

agent = create_agent(
    model="openai:gpt-4.1-mini",
    tools=[echo],
    middleware=[PIIRedactionMiddleware(redact_emails=True, redact_phones=True)],
)
result = agent.invoke({"messages": [{"role": "user", "content": "ping me at john@example.com"}]})

7. Streaming

from langchain.chat_models import init_chat_model

model = init_chat_model("openai:gpt-4.1-mini")
for chunk in model.stream("Write a haiku about Python"):
    print(chunk.content, end="", flush=True)

TypeScript-аналог

Все примеры выше имеют прямой аналог в @langchain/langchain (npm):

import { initChatModel } from "langchain/chat_models/universal";
import { createAgent } from "langchain/agents";
import { tool } from "@langchain/core/tools";
import { z } from "zod";

const getWeather = tool(
  async ({ city }) => `Sunny, 22°C in ${city}`,
  { name: "get_weather", description: "Get weather", schema: z.object({ city: z.string() }) }
);

const model = await initChatModel("openai:gpt-4.1");
const agent = createAgent({ model, tools: [getWeather] });
const result = await agent.invoke({ messages: [{ role: "user", content: "weather in Paris?" }] });

Где нет аналога: legacy chains (langchain-classic) в JS пока имеет меньше покрытия, чем Python. На практике миграция на create_agent рекомендована в обоих языках.


Плюсы и минусы текущей версии (1.x)

Плюсы

  • Семантическая стабильность — обязательство не ломать API до 2.0.
  • Единая точка входаcreate_agent вместо зоопарка agent-типов.
  • Middleware-система — clean separation cross-cutting concerns (HITL, PII, summarization).
  • init_chat_model — переключение провайдера без рефакторинга.
  • LangGraph-runtime под капотом — durable execution, checkpointing бесплатно.
  • ~700+ интеграций — community-пакеты langchain-*.

Минусы

  • Кривая обучения для middleware — концепция before_model / after_model hooks требует привычки.
  • Часть экосистемы в langchain-classic — много Stack Overflow-ответов по старому API, миграционная боль.
  • Абстракция скрывает LangGraph — если нужен fine-grained контроль, приходится «проваливаться» в LangGraph.
  • Раздутые community-пакетыlangchain-community исторически критиковали за bloated dependencies (но в 1.0 core остался lean).
  • Bundled-version зависимостиlangchain-openai / langchain-anthropic / etc. имеют свои минорные циклы, нужно явно указывать версии.

Заметки для презентации

  • В 1.0 главный фокус: agents, not chains. Если нужно объяснить разницу — показать, как LLMChain + AgentExecutor объединились в create_agent.
  • Подчеркнуть, что middleware — это новая killer-фича v1.0 (в 0.x приходилось писать custom callbacks).
  • Чётко сказать: до 2.0 breaking changes не будет — это продакшен-ready commitment.
  • Если рассказывать про миграцию — упомянуть langchain-classic как «battery-included обратная совместимость».