Проект представляет собой многокомпонентного AI-агента в виде Telegram-бота, разработанного в рамках тестового задания. Агент выступает в роли личного помощника, способного управлять задачами и календарем пользователя, искать информацию в интернете и отвечать на вопросы, используя собственную базу знаний.
Личный помощник (Personal Assistant). Его основная задача — помогать пользователю в организации его дня и быстром поиске информации, интегрируясь с его персональными сервисами (Google Calendar, Google Tasks).
- 📅 Управление календарем: Просмотр событий на день, неделю, а также создание новых событий в Google Calendar.
- ✅ Управление задачами: Просмотр списка активных дел и добавление новых задач в Google Tasks.
- 🌐 Поиск в интернете: Поиск актуальной информации и формирование кратких ответов на основе найденных данных.
- 🧠 База знаний: Способность отвечать на вопросы о самом себе, своей архитектуре и целях проекта, используя RAG (Retrieval-Augmented Generation).
- 💬 Контекст диалога: Агент помнит предыдущие сообщения в рамках сессии для ведения осмысленного диалога.
Проект построен на микросервисной архитектуре, где компоненты изолированы и взаимодействуют по сети внутри Docker. Это обеспечивает надежность, масштабируемость и четкое разделение ответственности.
+-------------------------------------------------+ +-------------------------------------------+
| 🤖 Сервис: agent_app | | 🛠️ Сервис: mcp_server |
| | | |
| +-----------+ +----------------+ +--------+ | | +-----------+ +--------------------+ |
| | | | | | | | | | |----->| Google Calendar/Tasks| |
| | Telegram |-->| LangChain |-->| MCP | |----->| | MCP Server| +--------------------+ |
| | Interface | | Agent Core | | Client | | | | (FastMCP) |----->| Tavily Search | |
| | (Aiogram) | | (llama3:8b) | | | | | | | +--------------------+ |
| +-----------+ +----------------+ +--------+ | | +-----------+ |
| ^ | | +-------------------------------------------+
| | (Память) | (База знаний) |
| v v |
| +-----------+ +----------------+ |
| | | | | |
| | Redis | | ChromaDB | |
| | | | | |
| +-----------+ +----------------+ |
+-------------------------------------------------+
agent_app: "Мозг" системы. Принимает сообщения от Telegram, управляет памятью (Redis) и базой знаний (ChromaDB), запускает LangChain-агента для принятия решений и обращается кmcp-serverдля выполнения действий.mcp_server: "Руки" системы. Предоставляет внешние инструменты (Google API, Web Search) по стандартизированному протоколу Model Context Protocol (MCP). Этот сервис инкапсулирует всю логику работы с внешними API, включая аутентификацию.ollama: Локальный сервер для запуска LLM (llama3:8b).redis: Хранилище для кратковременной памяти диалогов (сессий).
Важной особенностью проекта является использование полностью локальной, open-source языковой модели (llama3:8b) вместо коммерческих API (таких как OpenAI GPT). Это обеспечивает полную приватность данных и независимость от внешних сервисов, но также накладывает определенные ограничения:
- Скорость ответа: Локальная модель, работающая на CPU, значительно медленнее облачных аналогов. Ответ на сложный запрос может занимать от 30 секунд до нескольких минут.
- Качество "мышления": Модель
llama3:8b— мощная для своего размера, но может иногда ошибаться в выборе инструмента или "зацикливаться" (для этого предусмотренmax_iterations). Она менее надежна, чем флагманские модели вроде GPT-4. - Требования к ресурсам: Для запуска стека требуется значительный объем RAM (рекомендуется 16 ГБ и более), так как модель загружается в оперативную память.
Этот выбор является осознанным компромиссом между производительностью и полной автономностью системы.
- Язык: Python 3.11
- AI/ML:
- LLM:
llama3:8b(запускается черезOllama) - Оркестрация агента: LangChain
- Векторная база: ChromaDB
- Модель эмбеддингов:
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2
- LLM:
- Backend & API:
- Telegram-интерфейс: Aiogram 3.x
- Протокол инструментов:
mcp-sdk(Model Context Protocol) - Веб-сервер для MCP: FastAPI (встроен в
mcp-sdk)
- Базы данных: Redis (для памяти диалогов)
- DevOps: Docker, Docker Compose
Агент использует три внешних инструмента, предоставляемых через mcp-server:
- Google Calendar API: Для чтения и создания событий в календаре.
- Google Tasks API: Для чтения и создания задач в списках дел.
- Tavily Search API: Для поиска актуальной информации в интернете.
- Память диалога (кратковременная): Реализована с помощью
ConversationBufferWindowMemoryиз LangChain. История сообщений для каждого пользователя хранится в Redis под уникальным ключом (user_id), что обеспечивает персистентность сессий. - База знаний (долговременная): Реализована на базе ChromaDB. Текстовые документы из папки
knowledge_base/при первом запуске преобразуются в векторы (эмбеддинги) и сохраняются на диск. Агент использует эту базу черезRetriever Toolдля ответов на вопросы о самом проекте (RAG).
- Git
- Docker (рекомендуется выделить не менее 8 ГБ RAM в настройках Docker Desktop)
- Docker Compose
git clone https://github.com/your-username/personal-assistant.git
cd personal-assistantЭто самый важный ручной шаг для доступа к Google Calendar и Tasks.
- Перейдите в Google Cloud Console и создайте новый проект.
- Включите API:
Google Calendar APIиGoogle Tasks API. - Настройте "Окно запроса доступа OAuth":
- Тип пользователя: Внешнее.
- На следующих шагах добавьте свой Google-аккаунт в "Тестовые пользователи".
- Создайте учетные данные:
- Нажмите "Создать учетные данные" -> "Идентификатор клиента OAuth".
- Тип приложения: "Настольное приложение" (Desktop App).
- Нажмите "Создать" и скачайте JSON-файл.
- Переименуйте скачанный файл в
credentials.jsonи поместите его в папкуmcp_server/. Этот файл уже есть в.gitignore, поэтому он не попадет в Git.
- Скопируйте пример файла
.env.example:cp .env.example .env
- Откройте файл
.envи вставьте свои реальные токены:TELEGRAM_BOT_TOKEN: Получите у @BotFather в Telegram.TAVILY_API_KEY: Получите после регистрации на Tavily.com.
Этот шаг нужно выполнить один раз, чтобы получить token.json для доступа к вашему аккаунту Google.
# Убедитесь, что у вас установлен Python 3.11+
python3 -m venv venv
source venv/bin/activate # для Linux/macOS
# venv\Scripts\activate # для Windows
# Устанавливаем зависимости локально ТОЛЬКО для этого шага
pip install -r requirements.txt
# Запускаем скрипт аутентификации
python3 mcp_server/auth.py- В консоли появится ссылка. Скопируйте ее, вставьте в браузер.
- Войдите в свой Google-аккаунт и предоставьте разрешения.
- Google выдаст вам код. Скопируйте его и вставьте обратно в консоль.
- В папке
mcp_server/должен появиться файлtoken.json.
docker-compose build --no-cache
docker-compose up -d
Выполните команду в терминале, чтобы скачать модель llama3:8b внутрь контейнера ollama. Это может занять некоторое время и потребует ~4.7 ГБ свободного места.
docker-compose exec ollama ollama pull llama3:8bПосле завершения скачивания, перезапустите сервис агента, чтобы он подхватил готовую модель:
docker-compose restart research_agentВаш ассистент готов к работе!
- Найдите вашего бота в Telegram по имени, которое вы ему дали.
- Начните диалог с команды
/start. - Используйте команды
/helpи/healthдля получения информации и проверки статуса. - Задавайте вопросы на естественном языке:
Какая цель этого проекта?Добавь задачу 'Купить молоко'Какие у меня задачи?Что у меня на завтра?Создай событие 'Встреча с командой' завтра в 15:00Какие последние новости про Apple?
- Model Context Protocol (MCP): Официальная документация протокола.
- Python SDK для MCP: Репозиторий библиотеки, которую мы использовали для создания MCP-сервера и клиента.
- LangChain: Фреймворк для создания приложений на базе LLM.
- Aiogram: Фреймворк для создания Telegram-ботов.
- Ollama: Инструмент для локального запуска LLM.
.
├── agent_app/ # "Мозг" - сервис агента
│ ├── agent.py # Ядро агента (LangChain, LLM, инструменты)
│ ├── bot.py # Логика Telegram-бота (Aiogram)
│ ├── db.py # Управление векторной базой ChromaDB
│ ├── memory.py # Управление памятью диалогов в Redis
│ └── main.py # Точка входа для сервиса agent_app
├── mcp_server/ # "Руки" - сервис инструментов
│ ├── auth.py # Логика аутентификации Google OAuth 2.0
│ ├── tools.py # Функции-обертки для внешних API
│ └── main.py # Сборка MCP-сервера (FastMCP)
├── knowledge_base/ # Документы для базы знаний
├── conversations/ # Логи общения с Cursor IDE
├── .env # Файл с секретами (в .gitignore)
├── .env.example # Шаблон для .env
├── .gitignore
├── docker-compose.yml # Оркестрация всех сервисов
└── README.md # Этот файл```
Весь код проекта написан и отлажен с использованием AI-ассистента в IDE Cursor. История взаимодействия с AI (промпты, сгенерированный код, помощь в отладке) сохранена в папке /conversations.