LangChainSeniorSystem design
Что такое агенты (agents) в LangChain и чем они отличаются от цепочек (chains)?
Цепочка (Chain) — детерминированная последовательность шагов через LCEL; агент — цикл рассуждений, где LLM динамически выбирает инструменты. Для новых проектов вместо AgentExecutor рекомендуется LangGraph.
Цепочки (Chains) и агенты (Agents): в чём разница
Цепочка — детерминированный граф шагов. Последовательность выполнения задаётся разработчиком заранее и не меняется в runtime. Используется RunnableSequence или LCEL (LangChain Expression Language).
Агент — цикл рассуждений (ReAct, function-calling), в котором LLM самостоятельно решает, какой инструмент вызвать и когда остановиться. Управляющий цикл реализован в AgentExecutor или через LangGraph.
Пример цепочки (LCEL)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Ты помощник по коду."),
("human", "{question}"),
])
chain = prompt | llm | StrOutputParser()
result = chain.invoke({"question": "Что такое декоратор в Python?"})
print(result)
Пример агента (с инструментами)
from langchain_openai import ChatOpenAI
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import tool
@tool
def get_word_count(text: str) -> int:
"""Возвращает количество слов в тексте."""
return len(text.split())
llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Ты полезный ассистент."),
MessagesPlaceholder("chat_history", optional=True),
("human", "{input}"),
MessagesPlaceholder("agent_scratchpad"),
])
agent = create_tool_calling_agent(llm, [get_word_count], prompt)
executor = AgentExecutor(agent=agent, tools=[get_word_count], verbose=True)
result = executor.invoke({"input": "Сколько слов в предложении 'Hello world foo bar'?"})
print(result["output"])
Ключевые различия
- Детерминизм: цепочка выполняет фиксированные шаги; агент выбирает шаги динамически через LLM-рассуждение.
- Инструменты: цепочка может вызывать функции, но последовательность заранее известна; агент сам решает, нужен ли tool call и сколько раз.
- Стоимость: агент делает несколько LLM-запросов на один user-запрос; цепочка — один (если нет промежуточных LLM-шагов).
- Отладка: цепочку легко тестировать юнит-тестами; агент недетерминирован, поэтому нужна трассировка (LangSmith, `verbose=True`).
- LangGraph: современная рекомендация для сложных агентов —
langgraphвместоAgentExecutor, поскольку даёт явный граф состояний.
Подводные камни
- Агент может зациклиться: установите
max_iterationsвAgentExecutor, иначе бесконечный цикл tool calls съест бюджет. - Путаница между
agent_scratchpadв prompt и памятью чата: безMessagesPlaceholder("agent_scratchpad")агент не получает историю tool calls и ломается. - LCEL-цепочки не сохраняют состояние между вызовами — если нужна история диалога, добавляйте
RunnableWithMessageHistoryявно. AgentExecutordeprecated в пользу LangGraph — новые проекты должны использоватьlanggraph.prebuilt.create_react_agent.- Параллельные tool calls (GPT-4o поддерживает) могут вернуть результаты не в том порядке —
AgentExecutorобрабатывает их, но кастомные агенты — нет. - Streaming в агентах: используйте
executor.astream_events(), а неastream(), иначе промежуточные tool-результаты не отдаются клиенту. - Ошибки внутри tool молча проглатываются, если не передать
handle_tool_errors=True— агент может зависнуть на одном tool call. - Версионирование:
langchain,langchain-core,langchain-openai— отдельные пакеты с отдельными версиями; несовместимость частая причинаValidationError.
Common mistakes
- Объяснять
agents vs chainsтолько синтаксисом без shape, dtype, состояния или режима выполнения. - Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
- Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.
What the interviewer is testing
- Может ли связать
agents vs chainsс реальным контрактом входов и выходов. - Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
- Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.
- Предлагает ли observability, rollback, ограничения стоимости и стратегию incident replay.