Суть
Вместо одной всеведущей цепочки на входе ставится дешёвый классификатор: его задача — не ответить, а выбрать, какой узел вызвать на основе контекста запроса. Это явный, управляемый и наблюдаемый роутинг в графе (Agent Routing через условные рёбра LangGraph Nodes and Edges).
Зачем это нужно
- Экономия: классификация — задача проще генерации ответа, под неё берут небольшую/дешёвую модель, а тяжёлую LLM зовут только в нужной ветке.
- Контроль: маршрут виден на диаграмме графа, его можно дебажить и менять, не трогая логику узлов.
Как работает
- Узел
intent_router_node: по входящему промпту определяетintent(напримерrag/tool/smalltalk) и кладёт его в state. - Условное ребро от роутера:
add_conditional_edges("router", route_fn, {"rag": "rag_node", "tool": "tool_node", "smalltalk": "smalltalk_node"}). - Двухуровневость: после первого выбора ветка может содержать собственное условное ребро. В практическом агенте C6: уровень 1 — роутер выбирает инструмент; уровень 2 —
rag_nodeрешает «нашёл / не нашёл» и при неудаче уходит в LangGraph MCP as Node. - State обычно содержит
user_input, intent, retrieved_docs, tool_result, final_answer, trace.
Пример
START → intent_router_node ─(conditional)→ rag_node ─(conditional)→ final | mcp_node
├──────────────→ tool_node ───────────────→ final
└──────────────→ smalltalk_node ─────────────→ final
Связано с
- Agent Routing — общий паттерн роутинга; здесь — реализация условными рёбрами
- LangGraph Nodes and Edges — роутер = узел + условное ребро
- LangGraph MCP as Node — второй уровень: fallback из RAG-ветки
- LangGraph — каркас, в котором собирается многоветочный агент
Открытые вопросы
- классификатор: отдельная маленькая LLM vs эмбеддинг-классификатор vs правила — что дешевле/надёжнее