AIOps Workspace MCP Server
by Lesikhin
README.md
# AIOps Workspace
[](https://www.python.org/)
[](https://modelcontextprotocol.io/)
[](https://qdrant.tech/)
[](https://ollama.com/)
[](https://ollama.com/library/qwen2.5)
[](https://ollama.com/library/nomic-embed-text)
[](https://modelcontextprotocol.io/specification)
[](LICENSE)
Локальный AI-ассистент инженера эксплуатации с MCP-интеграцией, векторным поиском (Qdrant) и локальной LLM. Проект демонстрирует архитектурный подход к безопасному применению AI в промышленном контуре с фокусом на решение проблемы галлюцинаций.
## 1. Бизнес-проблема и решение
**Проблема**: Инженеры L1/L2 тратят 15 минут на поиск runbook'ов в Confluence, Jira и голове. При этом LLM-ассистенты без строгой интеграции с источниками данных генерируют правдоподобные, но ложные инструкции (галлюцинации), что в AIOps-контексте ведет к ложным действиям и увеличению MTTR.
**Решение**: Построен локальный AI-ассистент, который:
- Не отвечает без обращения к инструментам (MCP-протокол).
- Использует векторный поиск по актуальным runbook'ам (Qdrant + nomic-embed-text).
- Работает полностью локально — данные не покидают периметр.
- Требует явного подтверждения для write-операций (в PoC #4).
**Измеримый результат**: Тестирование показало снижение галлюцинаций в метриках с ~40% (базовая llama3.1:8b) до 0% (qwen2.5:7b) при сохранении 100% точности tool-calling.
## 2. Архитектура
```mermaid
flowchart TB
User["Пользователь<br/>(Open WebUI / CLI / MCP Inspector)"]
subgraph LLM_Layer["LLM Layer"]
LLM["Ollama<br/>qwen2.5:7b"]
SP["System Prompt<br/>с guardrails"]
end
subgraph MCP_Layer["MCP Server (stdio)"]
direction LR
T1["get_system_status"]
T2["search_knowledge_base"]
T3["reindex_knowledge_base"]
end
subgraph Storage_Layer["Storage Layer"]
direction LR
Qdrant["Qdrant<br/>(Docker :6333)"]
Emb["Ollama Embeddings<br/>nomic-embed-text"]
end
User -->|"запрос"| LLM
SP -.->|"guardrails"| LLM
LLM -->|"tool-calling"| MCP_Layer
T2 -->|"векторный поиск"| Qdrant
T2 -->|"эмбеддинг"| Emb
%% Определение стилей (безопасный синтаксис для GitHub)
classDef userClass fill:#3b82f6,stroke:#1e40af,color:#ffffff
classDef llmClass fill:#f59e0b,stroke:#b45309,color:#ffffff
classDef mcpClass fill:#10b981,stroke:#047857,color:#ffffff
classDef storageClass fill:#dc2626,stroke:#991b1b,color:#ffffff
class User userClass
class LLM,SP llmClass
class T1,T2,T3 mcpClass
class Qdrant,Emb storageClass
```
## 3. Ключевое инженерное решение: борьба с галлюцинациями
В ходе реализации была выявлена и решена проблема "lazy tool-calling": базовые модели (llama3.1:8b) эмулируют вызов инструмента текстом вместо реального обращения к API, генерируя правдоподобные, но ложные метрики (например, CPU 83.21% вместо реальных 89%).
**Архитектурное решение**:
1. **Смена модели**: переход на qwen2.5:7b, заточенную под агентные задачи.
2. **Усиление промпта**: явный запрет на использование знаний из памяти о runbook'ах.
3. **Обязательное цитирование**: требование указывать только источники, возвращенные инструментами.
Результат — 100% точность tool-calling и полное отсутствие галлюцинаций в метриках.
## 4. Стек технологий
| Компонент | Технология | Назначение |
|---------------------------|------------------------|--------------------------------|
| Язык | Python 3.11+ | Основная реализация |
| Управление зависимостями | uv | Современная замена pip |
| MCP SDK | mcp[cli] < 2.0.0 | Реализация MCP-сервера |
| Векторная БД | Qdrant (Docker) | Хранение эмбеддингов |
| Qdrant-клиент | qdrant-client >= 1.7.0 | Python SDK для Qdrant |
| LLM | Ollama | Локальный inference |
| Модель LLM | qwen2.5:7b | Tool-calling, генерация |
| Модель эмбеддингов | nomic-embed-text | Векторизация текстов (768 dim) |
| LLM-клиент | ollama >= 0.4.0 | Python SDK для Ollama |
## 5. Быстрый старт
### 5.1. Предварительные требования
- Python 3.11+
- Docker Desktop (для Qdrant)
- Ollama (для локальной LLM)
- uv (менеджер зависимостей)
### 5.2. Установка
```powershell
# Клонирование репозитория
git clone <repo-url>
cd aiops-workspace
# Установка зависимостей
uv sync
# Запуск Qdrant
docker run -d -p 6333:6333 -p 6334:6334 -v qdrant_storage:/qdrant/storage --name qdrant qdrant/qdrant
# Загрузка моделей Ollama
ollama pull qwen2.5:7b
ollama pull nomic-embed-text
# Инициализация векторного хранилища
uv run python client/init_vector_store.pyThis server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues