Skip to content

Latest commit

 

History

History
312 lines (215 loc) · 9.28 KB

File metadata and controls

312 lines (215 loc) · 9.28 KB

🤖 Fully Local Multi-Agent Swarm with LangGraph

Пример мультиагентной системы Alice ↔ Bob на локальной модели Qwen3 (Ollama)


📚 Основано на материале:
🎥 “Fully Local Multi-Agent Systems with LangGraph” (Видео English 9 минут) — https://www.youtube.com/watch?v=4oC1ZKa9-Hs
📘 LangGraph Swarm: https://github.com/langchain-ai/langgraph-swarm-py
📘 LangGraph Supervisor: https://github.com/langchain-ai/langgraph-supervisor-py
📝 Конспект: https://mirror-feeling-d80.notion.site/Fully-Local-Multi-Agent-1b5808527b178066bde0ed981b27998c.


📘 Описание проекта

Этот пример демонстрирует, как создать полностью локальную мультиагентную систему типа Swarm (Рой) с двумя агентами:

  • Alice — эксперт по сложению, использует инструмент add(a, b).
  • Bob — «пират», который сам не считает и передаёт математические задачи Alice.

Ключевые особенности:

  • 🧠 LangGraph Swarm (langgraph_swarm) для роевой архитектуры.
  • 🔄 ReAct-агенты с инструментами и механизмом handoff (передача управления).
  • 🖥 Локальная LLM через Ollama (qwen3:latest).
  • 🧠 Память диалога через InMemorySaver (checkpoint).

Swarm_01.png

🧩 Что такое Swarm

Swarm — это мультиагентная архитектура, где нет единого центрального контроллера.
Каждый агент:

  • может вызывать инструменты;
  • может передавать управление другим агентам (handoff);
  • участвует в общем диалоге.

Схема:

flowchart LR
    User --> Alice
    Alice -- handoff --> Bob
    Bob -- handoff --> Alice
    Alice --> User
Loading

В отличие от Supervisor:

  • Supervisor = строгое централизованное управление.
  • Swarm = распределённая, гибкая передача управления между агентами.

📂 Структура папки

Python/Swarm
├─ swarm_flight_hotel.py
├─ Images
│  ├─ swarm_flight_hotel_graph.PNG
│  ├─ DeBug_01.png
│  ├─ DeBug_02.png
│  ├─ DeBug_03.png
│  └─ DeBug_04.png
└─ README.md

🔧 Краткий обзор кода (swarm_flight_hotel.py)

Инициализация

from langchain_ollama import ChatOllama
from langgraph.checkpoint.memory import InMemorySaver
from langgraph.prebuilt import create_react_agent
from langgraph_swarm import create_handoff_tool, create_swarm

model = ChatOllama(model="qwen3:latest")
checkpointer = InMemorySaver()

Инструмент

def add(a: int, b: int) -> int:
    """Сложить два числа"""
    return a + b

Агент Alice

alice = create_react_agent(
    model,                                     # Локальная модель
    [
        add,                                   # Инструмент — сложение
        create_handoff_tool(agent_name="Bob")  # Инструмент передачи управления агенту Bob
    ],
    prompt="Ты Alice, эксперт по сложению..",  # Системное описание агента
    name="Alice",                              # Имя агента внутри Swarm
)
  • знает, как складывать числа;
  • может передать управление Bob.

Агент Bob

bob = create_react_agent(
    model,
    [
        create_handoff_tool(
            agent_name="Alice",
            description="Передай Alice, она может помочь с математикой."
        )   # Инструмент передачи управления Alice
    ],
    prompt="Ты Bob, ты говоришь как пират.You are Bob",  # Bob говорит как пират
    name="Bob",
)
  • говорит как пират;
  • не решает математику сам, а передаёт задачи Alice.

Создание Swarm

workflow = create_swarm(
    [alice, bob],                   # Список всех агентов
    default_active_agent="Alice"    # По умолчанию начинает Alice
)

# Компилируем приложение (граф) со встроенным checkpoint
app = workflow.compile(checkpointer=checkpointer)

Диалог в одной сессии (thread_id)

config = {"configurable": {"thread_id": "1"}}

turn_1 = app.invoke(
    {"messages": [{"role": "user", "content": "я хотел бы поговорить с Бобом"}]},
    config,
)
print(turn_1)

turn_2 = app.invoke(
    {"messages": [{"role": "user", "content": "Сколько будет 5 + 7?"}]},
    config,
)
print(turn_2)

💬 Как работает диалог

Шаг 1

Пользователь:

"я хотел бы поговорить с Бобом"

  • Активный агент по умолчанию: Alice
  • Alice вызывает handoff → управление переходит к Bob.
  • Теперь активный агент: Bob

Шаг 2

Пользователь:

"what's 5 + 7?"

  • Активный агент: Bob

  • Bob понимает, что не умеет считать → вызывает handoff к Alice.

  • Alice:

    • вызывает инструмент add(5, 7);
    • возвращает результат (12) пользователю.

Благодаря thread_id="1" состояние диалога (кто активен, история сообщений) сохраняется между вызовами app.invoke.


🧠 Память (Memory) в Swarm

В этом примере используется:

checkpointer = InMemorySaver() # Всё состояние хранится в памяти
app = workflow.compile(checkpointer=checkpointer)
  • InMemorySaver — хранит состояние (включая активного агента) в оперативной памяти.
  • Один и тот же thread_id обеспечивает multi-turn диалог с сохранением контекста.

📦 Требования и установка

1. Системные требования

  • Python 3.11
  • Установленный Ollama
  • Локальная модель: qwen3:latest

💻 Запуск проекта

Шаг 1. Активировать виртуальное окружение (Windows)

cd venv\Scripts
activate
cd ..\..

command_01.png

2. Установка зависимостей (однократно)

см.requirements.txt

pip install -r requirements.txt
pip install -U "langgraph-cli[inmem]"

3. Убедитесь, что в Ollama загружена требуемая LLM:

ollama list
ollama pull qwen3:latest

command_02.png

Шаг 4. Перейти в папку Swarm и запустить пример

cd ..\..\Python\Swarm

python.exe swarm_flight_hotel.py

После этого:

  • откроется PNG с графом агентов (Alice ↔ Bob);

swarm_flight_hotel_graph.PNG

  • в консоль будут выведены результаты turn_1 и turn_2.

Пример вывода см. в файле: output_01.txt


🐞 Отладка через LangSmith (опционально)

В .env можно указать:

LANGSMITH_API_KEY=...
LANGCHAIN_TRACING_V2=true
LANGCHAIN_PROJECT=multi-agent-supervisor-demo

После этого:

  • все шаги выполнения будут доступны в веб-интерфейсе LangSmith;
  • можно видеть цепочку вызовов Supervisor → Agents → Tools.

DeBug_01.png

🧩 Отладка через LangGraph Studio

Для визуальной работы с графом:

langgraph dev
  • Откроется интерфейс по адресу http://localhost:8123

  • Можно:

    • просматривать граф;
    • запускать и отлаживать сценарии Swarm;
    • анализировать шаги и сообщения.

DeBug_02.png

DeBug_03.png

DeBug_04.png

🎯 Итоги

Этот пример — отличный старт для:

  • изучения роевых мультиагентных систем;
  • экспериментов с локальными моделями через Ollama;
  • построения гибких AI-сценариев, где несколько агентов динамически делят между собой задачи.