Practical notes: Создание автономных ИИ-агентов локально: пошаговая инструкция
Пошаговое руководство по Practical notes: Создание автономных ИИ-агентов локально: пошаговая инструкция, включающая контракты, проверки и слоты для кода для команд, использующих эту модель.
В следующих примечаниях описан практический подход к реализации проекта «Создание автономных ИИ-агентов локально: пошаговое руководство для систем с 16 ГБ ОЗУ». Основное внимание уделяется контрактам, проверкам и местам для вставки кода, а не мотивирующим формулировкам.
Пообещанное и проблемы
В процессе работы над этапом «Пообещанное и проблемы» сначала запишите контракт: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Создавайте точки контроля после дорогостоящих операций. При возобновлении работы система не должна повторно запрашивать один и тот же вызов LLM, если оператор пытается выполнить следующий шаг заново.
Часть 1: Выбор оружия — дилемма выбора модели — оценка локальных моделей для генерации токенов и повышения эффективности агентов
При работе над этапом «Выбор оружия» из Части 1 сначала запишите условия работы: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список поможет избежать ошибок при последующих изменениях кода. Задокументируйте как успешный, так и восстановительный сценарии работы. Повторные попытки, проверка человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых входных данных — распространенная причина ресурсозатрат.
Конкуренты: прямое сравнение
При работе над этапом The Contenders A Head-to-Head сначала запишите условия контракта: необходимые входные данные, сигнал успешного выполнения и действия при частичной неудаче. Такой список помогает сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые модули большим скриптам. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM, когда оператор пытается выполнить следующий узел.
Qwen3.5:4b — Демон скорости
При работе над этапом Qwen3 5 4b сначала запишите контракт: необходимые входные данные, сигнал о успехе и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными данными. Дайте названия результатам обработки, определите критерии успеха и не допускайте безусловного частичного завершения работы. Выполняйте контрольные точки после дорогостоящих операций. Система возобновления работы не должна снова взимать плату за один и тот же вызов LLM, когда оператор пытается выполнить следующий шаг.
Llama3.1:latest (8B) — Надежный универсал
При работе с последней версией Llama3 1 8B необходимо сначала составить описание требований: какие входные данные нужны, какой сигнал указывает на успех и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат заранее предотвращает неожиданные счета при переходе от демо-режима к общедоступным средам. Создавайте контрольные точки после дорогостоящих операций. Функция возобновления работы не должна снова взимать плату за один и тот же вызов ЯИ, если оператор пытается выполнить следующий шаг. При работе с последней версией Llama3 1 8B необходимо сначала составить описание требований: какие входные данные нужны, какой сигнал указывает на успех и что происходит при частичной неудаче. Такой чек-лист помогает сохранять честность при последующих изменениях кода. Документируйте как успешный, так и восстановительный пути работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
Gemma4:12b-it-q4_K_M — Мощный инструмент для логических вычислений
Этап рассуждений в Gemma4 12b-it-q4KM работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один идеальный пример вывода, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма задачи. Предпочитайте небольшие, тестируемые единицы вместо обширных скриптов. Когда какой-то шаг терпит неудачу, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Установите лимит токенов на один ход и на всю сессию. Инструменты агентов активно расширяют контекст; жёсткие ограничения предотвращают появление неожиданных счетов во время демонстраций.
Qwen3.5:9b-q4_K_M — идеальный выбор
Qwen3 5 9b-q4KM: этот этап работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один образец успешного результата, один пример сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия всем элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, что приводит к нарушению возобновления работы после перерывов.
Анализ сравнительных моделей
Этап анализа сравнительной модели работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Записывайте время выполнения операций, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Установите лимит токенов на один ход и на одну сессию. Инструменты типа агентов активно расширяют контекст; жесткие ограничения не позволяют демо-версиям превращаться в неожиданные счета.
Вердикт
Этап The Verdict работает наилучшим образом, когда его рассматривают как измеримую поверхность. Соберите один образец успешной работы, один пример сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф. Сохраняйте состояние графа простым и типизированным. Вложенные структуры данных скрывают информацию о том, какой узел записал какое поле, и приводят к нарушению возобновления работы после перерывов.
Часть 2: Подготовка оборудования и настройка локальных вычислений
Этап подготовки оборудования в части 2 будет работать наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объёма работ. Документируйте одновременно успешный и восстановительный пути выполнения. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
Шаг 1: Установка Ollama — вашего локального движка инференса
Этап установки Ollama, соответствующий шагу 1, работает наилучшим образом, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Закрепите версию интерпретатора и файл с информацией о зависимостях до того, как начнёте использовать циклы. Различия между лаптопом и средой CI являются наиболее распространённой причиной скрытых сбоев в демонстрациях API.
Установка на Linux
Этап установки Linux работает наилучшим образом, если рассматривать его как измеримую структуру. Зафиксируйте один идеальный пример выполнения, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия всем элементам, определите критерии успешного завершения и не допускайте молчаливого частичного выполнения задачи. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, что приводит к нарушению возобновления работы после перерывов.
curl -fsSL https://ollama.com/install.sh | sh
Установка macOS
Этап установки macOS работает наилучшим образом, когда его рассматривают как измеримую среду. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил какое поле, и могут нарушить возобновление работы после прерываний. Этап установки macOS работает наилучшим образом, когда его рассматривают как измеримую среду. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Документируйте одновременно успешный и восстановительный пути работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
curl -fsSL https://ollama.com/install.sh | sh
Установка Windows
На этапе установки в Windows необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние системы. Лучше использовать небольшие, тестируемые модули вместо обширных скриптов. При сбое шага причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных. Внедрять человеческое утверждение там, где происходит расход средств или изменяются данные в продакшене. Простая связь между компонентами на этапе компиляции не гарантирует полноты функционала системы.
irm https://ollama.com/install.ps1 | iex
Проверка установки
На этапе проверки установки необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывания скрытого состояния. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Укажите названия файлов, определите критерии успеха и не допускайте молчаливого частичного завершения работы. Внедряйте утверждение человека для операций, связанных с тратой денег или изменением производственных данных. Простая настройка во время компиляции не гарантирует полноты выполнения бизнес-задач.
ollama --version
ollama version is 0.5.x
Шаг 2: Загрузка вашей модели
Для этапа 2 «Pull Your stage» необходимо определить входные данные, ответственного за выполнение этапа и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить этап с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. При следующем этапе, связанном с кодом или вызовом инструмента, предпочтительнее использовать структурированные выводы с проверкой схемы вместо свободного текста. Для этапа 2 «Pull Your stage» необходимо определить входные данные, ответственного за выполнение этапа и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить этап с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте одновременно «идеальный путь» выполнения и пути восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
# For the winner
ollama pull qwen3.5:9b-q4_K_M
# For speed
ollama pull qwen3.5:4b
# For reasoning
ollama pull gemma4:e4b-q4_K_M
Шаг 3: Запуск сервера Ollama
При работе над шагом 3 «Запуск» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и последствия частичной неудачи. Такой список поможет избежать ошибок при последующих изменениях кода. Лучше использовать небольшие, тестируемые модули вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без этих данных периодические ошибки поставщика могут показаться багами самого приложения.
ollama serve
Шаг 4: Тестирование вашей модели
При работе над этапом «4. Проверка» сначала запишите условия контракта: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет избежать ошибок при последующих изменениях кода. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия элементов, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Храните в кэше стабильные инструкции системы и схемы инструментов. Пересылка одинаковых данных является распространенной причиной избыточных ресурсов.
ollama run qwen3.5:9b-q4_K_M "Hello, introduce yourself briefly."
Часть 3: Настройка CrewAI — фреймворк оркестрации
При работе над этапом настройки из Части 3 сначала запишите условия работы системы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Записывайте время выполнения операций, а также стоимость токенов или запросов рядом с результатами их работы. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Выполняйте контрольные точки после дорогостоящих шагов. Система должна не взимать плату за повторный вызов того же LLM, если оператор пытается выполнить задачу снова через более поздний этап. При работе над этапом настройки из Части 3 сначала запишите условия работы системы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Документируйте как успешный, так и восстановительный пути работы системы. Повторные попытки, проверки со стороны человека и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки.
Требования к системе
Этап определения системных требований работает наилучшим образом, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда какой-то шаг сбивается, причина сбоя должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил тот или иной поле, и приводят к нарушению последовательности выполнения после перерывов.
Шаг 1: Установка uv (современный установщик пакетов для Python)
На первом этапе установки среды uv stage наилучшим образом работает, когда её рассматривают как измеримую поверхность. Соберите один пример успешной работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия создаваемым файлам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи. Фиксируйте версию интерпретатора и файлы с информацией о зависимостях до того, как начнёте использовать циклы. Различия в версиях программного обеспечения между ноутбуком и средой CI являются наиболее распространённой причиной незаметных сбоев в демонстрациях API.
curl -LsSf https://astral.sh/uv/install.sh | sh
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
Шаг 2: Установка CrewAI CLI
Этап установки CrewAI на втором шаге работает наилучшим образом, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Записывайте время выполнения операций, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить возобновление работы после прерываний.
uv tool install crewai
Шаг 3: Создайте свой проект Crew
Шаг 3 «Создайте свою сцену» работает наилучшим образом, если рассматривать его как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и запись о возврате к предыдущему состоянию перед расширением объёма работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф. Сохраняйте состояние графа простым и типизированным. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, и приводят к нарушению возобновления работы после перерывов.
crewai create crew my_agent_team
cd my_agent_team
my_agent_team/
├── src/
│ └── my_agent_team/
│ ├── __init__.py
│ ├── crew.py
│ ├── agents.py
│ ├── tasks.py
│ └── main.py
├── .env
└── pyproject.toml
Шаг 4: Установка зависимостей
Этап установки зависимостей на шаге 4 будет работать наилучшим образом, если рассматривать его как измеримую составляющую. Зафиксируйте один идеальный пример выполнения, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Документируйте одновременно успешный и восстановительный пути выполнения. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.
uv pip install -e .
Шаг 5: Установка дополнительных инструментов
Этап 5 «Установка дополнительных компонентов» работает наилучшим образом, если рассматривать его как измеримую единицу. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объёма работ. Предпочитайте небольшие, тестируемые модули вместо обширных скриптов. При сбое какого-либо шага причина должна быть связана с конкретной функцией, а не с запутанной цепочкой операций. Используйте инструменты с узкими схемами и чёткими метками о побочных эффектах. У операторов должна быть возможность узнать, какие вызовы изменяют состояние, прежде чем они автоматически одобрят действие.
uv pip install crewai-tools langchain-ollama python-pptx
Часть 4: Создание команды агентов
Четвертый этап «Создание сцены» работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример результата, один пример сбоя и запись о возврате к предыдущему состоянию перед расширением объёма работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия создаваемым элементам, определите критерии успешного завершения и не соглашайтесь на молчаливое частичное выполнение задачи. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и приводят к нарушению последовательности выполнения после перерывов.
Архитектура
Этап архитектурирования работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Записывайте временные показатели, а также стоимость токенов или запросов рядом с функциональными результатами. Отслеживание затрат на раннем этапе предотвращает неожиданные счёты при переходе от демо-среды к общедоступным средам. Сохраняйте структуру графа простой и типизированной. Вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и могут нарушить возобновление работы после прерываний. Этап архитектурирования работает наилучшим образом, когда его рассматривают как измеримую структуру. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию до расширения объёма работ. Документируйте одновременно успешный путь выполнения и путь восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Шаг 1: Настройка LLM
На шаге 1 «Настройка этапа» необходимо определить входные данные, ответственного за выполнение этапа и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить этап с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое этапа причина должна быть связана с конкретной функцией, а не с запутанной структурой обработки данных. При следующем этапе, представляющем собой код или вызов инструмента, лучше использовать структурированные выходные данные с проверкой соответствия шаблону вместо свободного текста.
from langchain_ollama import OllamaLLM
def get_llm():
""" Initialize the local LLM for CrewAI."""
return OllamaLLM(
model="qwen3.5:9b-q4_K_M",
base_url="http://localhost:11434",
temperature=0.3, # Lower = more deterministic
top_p=0.9,
)
Шаг 2: Определение ваших агентов
На этапе 2 «Определение ваших задач» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия результатов работы, определите критерии успеха и не допускайте молчаливого частичного завершения задачи. Внедряйте проверку человеком для операций, связанных с тратой денег или изменением производственных данных. Простая настройка во время компиляции не гарантирует полноты выполнения бизнес-задач.
from crewai import Agent
from crewai_tools import SerperDevTool, FileReadTool
from .llm_config import get_llm
# Initialize tools
search_tool = SerperDevTool() # Requires Serper API key (free tier available)
file_tool = FileReadTool()
def create_coding_agent():
"""Agent specialized in writing and reviewing code."""
return Agent(
role="Senior Software Engineer",
goal="Write clean, efficient, and well-documented code that solves the given problem",
backstory="""You are a senior software engineer with 15 years of experience
across multiple programming languages. You specialize in Python, JavaScript,
and system architecture. You write code that is not only functional but
also maintainable and follows best practices.""",
tools=[file_tool], # Can read existing files
llm=get_llm(),
verbose=True,
allow_delegation=False,
)
def create_research_agent():
"""Agent specialized in deep research and report writing."""
return Agent(
role="Lead Research Analyst",
goal="Conduct thorough research and synthesize findings into comprehensive reports",
backstory="""You are a seasoned research analyst with a PhD in Computer Science.
You have expertise in finding, verifying, and synthesizing information from
multiple sources. Your reports are known for their depth, clarity, and
actionable insights.""",
tools=[search_tool], # Can search the web
llm=get_llm(),
verbose=True,
allow_delegation=False,
)
def create_presentation_agent():
"""Agent specialized in creating PowerPoint presentations."""
return Agent(
role="Senior Presentation Designer",
goal="Transform research findings into compelling, visually-appealing PowerPoint presentations",
backstory="""You are a presentation designer with 10 years of experience
creating executive-level decks for Fortune 500 companies. You know how to
structure information for maximum impact and create slides that tell a
compelling story.""",
tools=[], # We'll handle PPT generation separately
llm=get_llm(),
verbose=True,
allow_delegation=False,
)
Шаг 3: Определение ваших задач
На этапе 3 «Определите свою стадию» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Регистрируйте время выполнения и стоимость токенов или запросов рядом с функциональными результатами. Отображение стоимости заранее предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Внедряйте человеческое утверждение для операций, связанных с тратой денег или изменением производственных данных. Подключение компонентов во время компиляции не гарантирует полноты функционала продукта. На этапе 3 «Определите свою стадию» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Документируйте одновременно «идеальный путь» и пути восстановления. Повторные попытки, человеческое утверждение и обработка некорректных сообщений являются частью продукта, а не элементами, добавляемыми позже.
from crewai import Task
def create_coding_task(topic, requirements):
"""Task for the coding agent."""
return Task(
description=f"""
Write a Python solution for the following problem:
Topic: {topic}
Requirements: {requirements}
Your response should include:
1. Complete, working Python code
2. Explanation of the approach
3. Time and space complexity analysis
4. Example usage
Make sure the code is production-ready and includes error handling.
""",
expected_output="A complete Python solution with documentation and analysis.",
agent=None, # Will be assigned later
)
def create_research_task(query):
"""Task for the research agent."""
return Task(
description=f"""
Conduct in-depth research on the following topic:
Query: {query}
Your research should cover:
1. Current state of the art
2. Key players and technologies
3. Challenges and limitations
4. Future trends and predictions
5. Actionable recommendations
Cite your sources and provide a well-structured report.
""",
expected_output="A comprehensive research report with citations.",
agent=None, # Will be assigned later
)
def create_presentation_task(research_findings):
"""Task for the presentation agent."""
return Task(
description=f"""
Create a PowerPoint presentation based on the following research:
{research_findings}
The presentation should include:
1. Title slide with a compelling title
2. Executive summary
3. Key findings (3-5 slides)
4. Visual data representation
5. Recommendations
6. Conclusion and next steps
Provide a detailed outline and slide content.
""",
expected_output="A detailed PowerPoint presentation outline with slide content.",
agent=None, # Will be assigned later
)
Шаг 4: Организация работы команды
При выполнении шага 4 «Организация работы команды» сначала запишите контракт: необходимые входные данные, сигнал успешного завершения и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое на каком-либо этапе причина неудачи должна указывать на конкретную ответственность, а не на запутанную цепочку операций. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна повторно взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий элемент цепочки.
from crewai import Crew, Process
from .agents import (
create_coding_agent,
create_research_agent,
create_presentation_agent
)
from .tasks import (
create_coding_task,
create_research_task,
create_presentation_task
)
def create_crew(topic, query, requirements):
"""Create and configure the multi-agent crew."""
# Initialize agents
coding_agent = create_coding_agent()
research_agent = create_research_agent()
presentation_agent = create_presentation_agent()
# Create tasks
coding_task = create_coding_task(topic, requirements)
research_task = create_research_task(query)
# Assign agents to tasks
coding_task.agent = coding_agent
research_task.agent = research_agent
# The presentation task depends on research findings
# We'll create it dynamically after research is complete
return Crew(
agents=[coding_agent, research_agent, presentation_agent],
tasks=[coding_task, research_task],
process=Process.sequential, # Tasks run in order
verbose=True,
)
def run_crew(topic, query, requirements):
"""Run the multi-agent crew and return results."""
crew = create_crew(topic, query, requirements)
result = crew.kickoff()
return result
Шаг 5: Основная точка входа
При работе над этапом 5 «Основная стадия» сначала запишите условия соглашения: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как соглашение между входными данными и проверенными выходными результатами. Дайте названия элементам, определите критерии успеха и не допускайте безответственного частичного выполнения задач. Выполняйте контрольные точки после дорогостоящих шагов. Система возобновления работы не должна снова взимать плату за один и тот же вызов большой языковой модели, когда оператор пытается выполнить следующий элемент.
import os
from .crew import run_crew
def main():
"""Main entry point for the multi-agent system."""
# Define your project
topic = "Building a REST API with FastAPI"
query = "Best practices for FastAPI REST API development in 2026"
requirements = """
- Python 3.11+
- FastAPI framework
- PostgreSQL database
- JWT authentication
- Docker deployment
"""
print("🚀 Starting multi-agent workflow...")
print("=" * 50)
# Run the crew
result = run_crew(topic, query, requirements)
print("\n✅ Workflow complete!")
print("=" * 50)
print("\n📊 Results:")
print(result)
return result
if __name__ == "__main__":
main()
Часть 5: Автоматическое создание презентаций PowerPoint
При работе над этапом «Автоматическое создание презентаций PowerPoint» части 5 сначала запишите условия соглашения: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет сохранять честность при последующих изменениях кода.
Шаг 1: Создание генератора PPT
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.dml.color import RGBColor
import os
def create_presentation_from_content(content, filename="presentation.pptx"):
"""
Generate a PowerPoint presentation from structured content.
Args:
content: Dictionary with slide titles and content
filename: Output filename
"""
prs = Presentation()
# Set slide dimensions (16:9)
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# Title Slide
title_slide_layout = prs.slide_layouts[0]
slide = prs.slides.add_slide(title_slide_layout)
slide.shapes.title.text = content.get("title", "AI-Generated Presentation")
slide.placeholders[1].text = content.get("subtitle", "Powered by CrewAI + Ollama")
# Content Slides
for slide_data in content.get("slides", []):
bullet_slide_layout = prs.slide_layouts[1]
slide = prs.slides.add_slide(bullet_slide_layout)
# Title
slide.shapes.title.text = slide_data.get("title", "Untitled")
# Content
content_text = slide.placeholders[1]
content_frame = content_text.text_frame
content_frame.clear()
for point in slide_data.get("points", []):
p = content_frame.add_paragraph()
p.text = point
p.level = 0
p.font.size = Pt(18)
# Save
prs.save(filename)
print(f"✅ Presentation saved as: {filename}")
return filename
def generate_ppt_from_research(research_text, topic):
"""
Generate a PPT from research findings using the presentation agent.
"""
from .agents import create_presentation_agent
from .llm_config import get_llm
# Have the presentation agent structure the content
agent = create_presentation_agent()
prompt = f"""
Based on the following research about "{topic}", create a structured
presentation outline with 6-8 slides.
Research:
{research_text[:2000]} # Limit to avoid context overflow
Return a JSON object with the following structure:
{{
"title": "Presentation title",
"subtitle": "Subtitle or tagline",
"slides": [
{{
"title": "Slide title",
"points": ["Point 1", "Point 2", "Point 3"]
}}
]
}}
"""
# Get structured output from the agent
response = agent.llm.invoke(prompt)
# Parse the response (simplified - in production, use proper JSON parsing)
import json
try:
# Extract JSON from response
content = json.loads(response)
except:
# Fallback: create a simple structure
content = {
"title": f"Research on {topic}",
"subtitle": "AI-Generated Presentation",
"slides": [
{"title": "Introduction", "points": ["Overview of research"]},
{"title": "Key Findings", "points": ["Finding 1", "Finding 2"]},
{"title": "Recommendations", "points": ["Recommendation 1"]}
]
}
# Generate the PPT
filename = f"{topic.replace(' ', '_')}_presentation.pptx"
return create_presentation_from_content(content, filename)
Шаг 2: Интеграция генератора PPT в систему Crew
from .ppt_generator import generate_ppt_from_research
def run_full_workflow(topic, query, requirements):
"""Run the complete workflow including PPT generation."""
# Step 1: Run the crew (coding + research)
crew_result = run_crew(topic, query, requirements)
# Step 2: Extract research findings (simplified - in production, parse properly)
research_findings = crew_result # This would be the research agent's output
# Step 3: Generate PowerPoint
ppt_file = generate_ppt_from_research(research_findings, topic)
return {
"crew_result": crew_result,
"presentation_file": ppt_file
}
Часть 6: Распространённые проблемы и способы их решения
Проблема 1: «Соединение отклонено», когда CrewAI пытается подключиться к Ollama
litellm.APIConnectionError: OllamaException - [Errno 111] Connection refused
llm = OllamaLLM(
model="qwen3.5:9b-q4_K_M",
base_url="http://localhost:11434", # Ensure this is correct
)
Проблема 2: Модель не справляется с схемами вызова инструментов
Проблема 3: Ошибки нехватки памяти (OOM)
Проблема 4: Агент застревает в рекурсивных циклах
Проблема 5: Медленная генерация токенов
Часть 7: Запуск вашего первого мультиагентного рабочего процесса
Полная настройка
#!/usr/bin/env python3
"""
Complete Multi-Agent System with Ollama and CrewAI
"""
import os
import sys
from src.my_agent_team.crew import run_full_workflow
def main():
print("""
╔═══════════════════════════════════════════════════════╗
║ 🤖 Multi-Agent AI System - Local Edition ║
║ Powered by Ollama + CrewAI + Qwen3.5:9b ║
╚═══════════════════════════════════════════════════════╝
""")
# Check if Ollama is running
import requests
try:
response = requests.get("http://localhost:11434")
print("✅ Ollama is running!")
except:
print("❌ Ollama is not running. Please start it with: ollama serve")
sys.exit(1)
# Define your project
topic = input("Enter your project topic (e.g., 'Building a REST API with FastAPI'): ")
query = input("Enter your research query (e.g., 'Best practices for FastAPI'): ")
requirements = input("Enter your requirements (e.g., 'Python, PostgreSQL, JWT'): ")
print("\n🚀 Starting multi-agent workflow...")
print("=" * 60)
try:
result = run_full_workflow(topic, query, requirements)
print("\n✅ Workflow complete!")
print("=" * 60)
print(f"\n📄 Presentation saved as: {result['presentation_file']}")
print("\n📊 Crew Results:")
print(result['crew_result'])
except Exception as e:
print(f"\n❌ Error: {e}")
print("\n💡 Troubleshooting tips:")
print("1. Make sure Ollama is running: ollama serve")
print("2. Check if the model is downloaded: ollama list")
print("3. Ensure you have enough memory (close other apps)")
print("4. Check the error message above for specific issues")
if __name__ == "__main__":
main()
Запустите его!
python run.py