LangChainMiddleExperience

Какие ошибки делают команды, когда слишком рано превращают простой LLM workflow в агентскую систему?

Команды преждевременно агентифицируют workflow, когда задача детерминирована; главные ошибки — нет max_iterations, плохие описания инструментов, отсутствие observability и использование агента вместо structured output.

Типичные ошибки при преждевременной агентификации

1. Агент там, где достаточно цепочки

Если задача детерминирована (всегда одна последовательность шагов), AgentExecutor добавляет недетерминизм, стоимость и сложность отладки без преимуществ. Правило: если можно нарисовать flowchart без ветвлений — нужна цепочка, не агент.

2. Нет ограничений на количество итераций

По умолчанию AgentExecutor не имеет жёсткого лимита. Агент может войти в цикл tool calls и израсходовать весь месячный бюджет за одну ночь.

# Правильно — всегда задавать max_iterations
executor = AgentExecutor(
    agent=agent,
    tools=tools,
    max_iterations=10,       # максимум 10 шагов
    max_execution_time=30.0, # максимум 30 секунд
    handle_parsing_errors=True,
)

3. Инструменты без схемы и описания

LLM выбирает инструмент по названию и docstring. Плохое описание → агент вызывает не тот инструмент или передаёт неверные аргументы.

# Плохо
@tool
def search(q): return results(q)

# Хорошо
@tool
def search_knowledge_base(query: str) -> str:
    """Ищет информацию в корпоративной базе знаний по ключевым словам или вопросу.
    Возвращает топ-3 релевантных документа. НЕ использовать для расчётов или кода."""
    return search_impl(query)

4. Нет обработки ошибок инструментов

Исключение внутри tool без handle_tool_errors=True падает в агента как строка ошибки, которую LLM пытается интерпретировать и часто зависает на ней.

executor = AgentExecutor(agent=agent, tools=tools, handle_tool_errors=True)

5. Отсутствие observability

Без трассировки невозможно понять, почему агент принял то или иное решение. Минимум — verbose=True в dev, LangSmith в production.

6. Агент вместо structured output

Если нужно извлечь структурированные данные из текста — используйте model.with_structured_output(MySchema), а не агента с инструментом-парсером. Это быстрее, дешевле и детерминировано.

7. Игнорирование параллелизма tool calls

GPT-4o может вызывать несколько инструментов параллельно. Если инструменты имеют побочные эффекты (запись в БД), параллельный вызов нарушит ожидаемый порядок. Отключите через parallel_tool_calls=False в bind_tools.

Подводные камни

  • Недетерминизм агента делает воспроизводимые тесты сложными — мокайте LLM в юнит-тестах или используйте детерминированные fixture.
  • Агентские системы дороже цепочек в 3–10 раз за счёт нескольких LLM-запросов — рассчитайте cost per request до перехода в production.
  • AgentExecutor deprecated в пользу LangGraph — новые agentification-проекты лучше строить сразу на LangGraph с явным графом состояний.
  • Многоагентные системы (несколько специализированных агентов) добавляют routing-проблему: как правильно передать задачу нужному агенту.
  • Без memory агент не помнит предыдущие шаги между сессиями — для stateful диалогов нужен MemorySaver (LangGraph) или RunnableWithMessageHistory.

What hurts your answer

  • Перечислять ошибки без объяснения причин
  • Не отличать beginner mistakes от production failure modes
  • Не предлагать процесс, который предотвращает повторение ошибок

What they're listening for

  • Знает типичные ошибки при работе с LangChain
  • Понимает причины ошибок
  • Предлагает практики prevention и early detection

Related topics