Строим агентов дома бесплатно: инструменты и модели с открытым кодом
Вы можете создать полноценную мультиагентную систему на своём ноутбуке, используя только бесплатные инструменты и открытые модели. Никаких кредитных карт, никаких ограничений API, никакой привязки к вендору. Компромисс? Более медленный инференс и немного меньше возможностей. Но для обучения, экспериментов и небольшой автоматизации этого более чем достаточно.
К концу этого руководства у вас будет работающий локальный агент-исследователь на вашем собственном железе — поиск в интернете, чтение файлов, синтез информации — полностью бесплатно.
Аргументы в пользу открытых агентов
Реальность затрат
Цены на Claude API разумны для продакшн-нагрузок, но обучение и эксперименты накапливаются быстро. Локальный инференс полностью устраняет эту проблему — бесконечные итерации при нулевых предельных затратах.
Конфиденциальность и контроль данных
Некоторые нагрузки нельзя отправлять в облачные API. Данные пациентов, проприетарный код, чувствительная бизнес-логика — всё это выигрывает от хранения на вашей машине. Локальные модели дают то же интеллектуальное поведение без передачи данных за пределы вашего железа.
Проверка реальностью
Открытые модели с 7–13B параметрами заметно отстают от фронтирных моделей в сложном рассуждении, генерации кода и следовании инструкциям. Для продакшна, где важна точность, коммерческие API остаются лучшим выбором. Для обучения и прототипирования локальные модели отлично подходят.
Выбор открытого LLM
Семейства LLM
- Llama (Meta): Наиболее широко поддерживаемое семейство. Llama 3 особенно мощный.
- Mistral: Отличное соотношение качество/параметры. Mistral-7B превосходит свой размер.
- Phi (Microsoft): Крайне эффективные небольшие модели. Phi-3 Mini работает без GPU.
- Qwen (Alibaba): Сильная многоязычная производительность.
Размер модели и требования к железу
| Модель | Параметры | Квантизация | VRAM | Скорость | Качество |
|---|---|---|---|---|---|
| Phi-3 Mini | 3,8B | 4-bit | 4 ГБ | Очень быстро | Хорошее |
| Mistral-7B | 7B | 4-bit | 8 ГБ | Быстро | Хорошее |
| Llama-3-8B | 8B | 4-bit | 8 ГБ | Быстро | Очень хорошее |
| Llama-3-13B | 13B | 4-bit | 10 ГБ | Средне | Очень хорошее |
| Mixtral-8x7B | 46,7B (MoE) | 4-bit | 24 ГБ | Медленно | Отличное |
Квантизация: почему это важно
Квантизация сжимает веса модели для использования меньшего объёма памяти. Модель 7B параметров в полной точности требует ~28 ГБ RAM. Та же модель в 4-bit квантизации нужно ~4 ГБ, с минимальной потерей качества.
Отправные точки по железу:
- Ноутбук (8–16 ГБ RAM): Phi-3 Mini или Mistral-7B в 4-bit
- Десктоп со средней GPU: Mistral-7B или Llama-3-8B с ускорением GPU
- Десктоп с мощной GPU: Mixtral-8x7B или Llama-3-70B в 4-bit
Настройка локального инференса
Ollama: самый простой способ начать
# Установка на macOSbrew install ollama
# Установка на Linuxcurl -fsSL https://ollama.com/install.sh | sh
# Загрузка Mistral-7Bollama pull mistral
# Более лёгкий вариант для слабого железаollama pull phi3
# Запуск сервера инференсаollama serveПроверка работы:
curl http://localhost:11434/api/generate -d '{ "model": "mistral", "prompt": "Что такое агент ИИ в одном предложении?", "stream": false}'LM Studio: графическая альтернатива
LM Studio — десктопное приложение с графическим интерфейсом для загрузки и запуска моделей. Предоставляет API-эндпоинт, совместимый с OpenAI.
Открытые фреймворки для агентов
| Фреймворк | Лучше всего для | Кривая обучения |
|---|---|---|
| LangChain | Широкая поддержка инструментов | Средняя |
| LangGraph | Воркфлоу с конечными автоматами | Средняя-высокая |
| AutoGen | Мультиагентные разговоры | Низкая |
| CrewAI | Ролевые мультиагентные системы | Низкая-средняя |
Начните с AutoGen или LangChain. AutoGen быстрее для прототипирования; LangChain даёт больше контроля над циклом агента.
Создаём первого агента: локальный исследовательский ассистент
Настройка окружения
python3 -m venv agent-envsource agent-env/bin/activatepip install langchain langchain-ollama langchain-community duckduckgo-searchПолный агент
#!/usr/bin/env python3"""Локальный агент-исследователь на Ollama + LangChainПредварительные требования: - ollama serve (работает в фоне) - ollama pull mistral - pip install langchain langchain-ollama langchain-community duckduckgo-search"""
import jsonfrom langchain_core.tools import toolfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_ollama import ChatOllamafrom langchain.agents import AgentExecutor, create_react_agentfrom duckduckgo_search import DDGS
@tooldef search_web(query: str) -> str: """Ищет информацию в интернете через DuckDuckGo.""" try: with DDGS() as ddgs: results = list(ddgs.text(query, max_results=5)) if not results: return "Результаты не найдены." return json.dumps( [{"title": r["title"], "snippet": r["body"], "url": r["href"]} for r in results], indent=2, ensure_ascii=False ) except Exception as e: return f"Поиск не удался: {e}"
@tooldef read_file(filepath: str) -> str: """Читает локальный файл и возвращает его содержимое.""" try: with open(filepath, "r") as f: return f.read() except FileNotFoundError: return f"Файл не найден: {filepath}"
@tooldef calculate(expression: str) -> str: """Безопасно вычисляет простое арифметическое выражение.""" try: result = eval(expression, {"__builtins__": {}}, {}) return str(result) except Exception as e: return f"Ошибка вычисления: {e}"
llm = ChatOllama( model="mistral", base_url="http://localhost:11434", temperature=0.3,)
prompt = ChatPromptTemplate.from_messages([ ("system", """Вы исследовательский ассистент. Отвечайте на вопросы с помощью инструментов.
Доступные инструменты: {tool_names}Описания инструментов: {tools}
Следуйте этому формату точно:Thought: Что мне нужно выяснить?Action: название_инструментаAction Input: входные данные для инструментаObservation: результат инструмента... (повторяйте по необходимости)Thought: Теперь у меня достаточно информации.Final Answer: ваш полный ответ"""), ("user", "{input}"), ("placeholder", "{agent_scratchpad}"),])
tools = [search_web, read_file, calculate]agent = create_react_agent(llm, tools, prompt)agent_executor = AgentExecutor( agent=agent, tools=tools, verbose=True, max_iterations=8, handle_parsing_errors=True,)
if __name__ == "__main__": result = agent_executor.invoke({ "input": "Какие три самых популярных открытых LLM прямо сейчас? Назовите их и укажите по одной ключевой характеристике каждого." }) print(f"\nИТОГОВЫЙ ОТВЕТ:\n{result['output']}")Запуск
# Терминал 1: запустить Ollamaollama serve
# Терминал 2: запустить агентаpython research_agent.pyРасширение возможностей: инструменты без API
Локальный доступ к базе данных
import sqlite3
@tooldef query_database(sql: str) -> str: """Выполняет read-only SQL-запрос к локальной базе данных.""" try: conn = sqlite3.connect("data.db") cursor = conn.cursor() cursor.execute(sql) rows = cursor.fetchall() columns = [desc[0] for desc in cursor.description] conn.close() return json.dumps([dict(zip(columns, row)) for row in rows], indent=2) except Exception as e: return f"Ошибка базы данных: {e}"Локальный поиск по документам с эмбеддингами
pip install sentence-transformers chromadbfrom sentence_transformers import SentenceTransformerimport chromadb
model = SentenceTransformer("all-MiniLM-L6-v2")client = chromadb.Client()collection = client.create_collection("docs")
@tooldef search_docs(query: str) -> str: """Ищет локальные документы по семантическому сходству.""" results = collection.query( query_embeddings=[model.encode(query).tolist()], n_results=3 ) return json.dumps(results["documents"][0], indent=2)Реальные ограничения и решения
Задержка
Ожидайте 2–30 секунд на шаг инференса. Стратегии:
- Проектируйте агентов с меньшим количеством шагов; проще = быстрее
- Группируйте вызовы инструментов там, где это возможно
Пробелы в точности
Стратегии смягчения:
- Более короткие и явные промпты — точно указывайте ожидаемый формат
- Разбивайте сложные задачи на шаги
- Валидируйте выходные данные инструментов перед возвратом агенту
- Используйте температуру 0,1–0,3 для работы с инструментами
Развёртывание: от ноутбука к постоянной работе
Docker
FROM python:3.12-slimRUN pip install langchain langchain-ollama langchain-community duckduckgo-searchCOPY research_agent.py .ENV OLLAMA_HOST=host.docker.internal:11434CMD ["python3", "research_agent.py"]Systemd-сервис (Linux)
sudo systemctl enable ollamasudo systemctl start ollamaИдём глубже: мультиагентные системы дома
def run_pipeline(question: str) -> str: research_result = researcher.invoke({"input": question}) final_output = writer.invoke({ "input": f"На основе этого исследования напишите чёткое резюме:\n{research_result['output']}" }) return final_output["output"]Разработка открытых агентов сегодня практична. Путь такой: Ollama для инференса, LangChain или AutoGen для цикла агента, DuckDuckGo для поиска, и файловая система вашей машины для всего остального.
Начинайте просто — с агента-исследователя выше. Запустите его. Добавьте второй инструмент. Потом второго агента.
Связанные статьи
- Введение в агентную разработку
- Паттерны использования инструментов: надёжные интерфейсы агент-инструмент
- Мультиагентные паттерны: оркестраторы, воркеры и конвейеры
- Создание вашего первого MCP-сервера