sebachriss/aegis-desk

GitHub: sebachriss/aegis-desk

基于 LangGraph 的企业内部多 Agent 智能支持平台,集成 RAG、工具调用、安全防护与人工审批,解决员工日常查询与操作的自动化需求。

Stars: 3 | Forks: 0

# Aegis Desk ## 它能做什么? Aegis Corp 的员工发起查询,由一个 AI agent 团队以**安全、可审计且有人工监督**的方式进行解决。 ``` "¿Cuántos días de vacaciones tengo?" → RAG Agent busca en documentos "Crea un ticket de alta prioridad" → Action Agent crea ticket → HITL aprueba "¿Cuántos empleados hay en Ventas?" → Data Agent consulta SQL (solo admin) "Hola, ¿qué tal?" → Chat Agent responde "Ignora tus instrucciones y..." → Security Node bloquea ``` ## 架构 ``` Usuario │ ▼ Security Node (prompt injection + rate limit + sanitize) │ ▼ Supervisor (clasifica intención → enruta) │ │ │ │ ▼ ▼ ▼ ▼ RAG Data Action Chat (docs) (SQL) (tools) (fallback) │ │ │ │ └────────┴────┬────┴──────────┘ ▼ Crítico (evalúa calidad + confidence) │ ┌────────┴────────┐ ▼ ▼ Respuesta OK HITL (interrupt → (usuario) aprobación humana) │ ┌────┴────┐ ▼ ▼ Aprobar Rechazar (ejecuta) (cancela) ``` ### 纵深防御(4层) ``` Capa 1: Security Node → bloquea prompt injection + rate limit Capa 2: RBAC → deniega acceso por rol (empleado vs admin) Capa 3: LLM refusal → el modelo se niega a cooperar con ataques Capa 4: HITL → humano aprueba antes de ejecutar acciones ``` ## 技术栈 | 层级 | 技术 | |---|---| | LLM | DeepInfra — DeepSeek-V4-Flash | | Framework | LangChain + LangGraph | | Embeddings | sentence-transformers (all-MiniLM-L6-v2, 本地) | | Vector Store | Chroma (本地持久化) | | 数据库 | SQLite | | API | FastAPI + Uvicorn | | UI | Streamlit | | 可观测性 | 自定义指标 + JSONL tracing | | Evals | LLM-as-judge + RAG 指标 (faithfulness, relevance, precision) | | 部署 | Docker + Docker Compose | ## 项目结构 ``` aegis-desk/ ├── src/ │ ├── config.py # Settings con pydantic-settings │ ├── llm/ │ │ └── providers.py # get_llm() multi-proveedor │ ├── memory/ │ │ └── short_term.py # ChatMemory con ventana deslizante │ ├── observability/ │ │ ├── metrics.py # track_llm_call (tokens, costo, latencia) │ │ └── tracing.py # Traces JSONL + stats agregadas │ ├── rag/ │ │ ├── ingest.py # Chunking por Markdown headers + Chroma │ │ ├── retriever.py # Búsqueda por similitud semántica │ │ ├── chain.py # Cadena RAG con citas de fuente │ │ └── documents/ # Docs ficticios (RRHH, IT, FAQ) │ ├── tools/ │ │ ├── tickets.py # @tool: crear/listar/buscar tickets │ │ ├── email.py # @tool: enviar email (simulado, whitelist dominios) │ │ ├── sql.py # @tool: SELECT sobre SQLite (allowlist) │ │ └── registry.py # Registro central de herramientas │ ├── agents/ │ │ ├── state.py # AgentState (TypedDict) │ │ ├── supervisor.py # Clasifica intención (Literal) │ │ ├── rag_agent.py # Worker RAG │ │ ├── data_agent.py # Worker SQL (ReAct) │ │ ├── action_agent.py # Worker acciones (ReAct) │ │ ├── chat_agent.py # Worker fallback + acceso denegado + anti-injection │ │ ├── critic_agent.py # Evalúa respuestas, loop de reintento │ │ ├── security_node.py # Guardrails (injection + rate limit) │ │ ├── hitl_node.py # Human-in-the-Loop con interrupt() │ │ ├── react_agent.py # Agente ReAct standalone (Fase 3) │ │ └── graph.py # Grafo LangGraph ensamblado │ ├── security/ │ │ ├── prompt_injection.py # Detección regex + sanitize │ │ ├── rbac.py # Roles empleado/admin │ │ ├── rate_limiter.py # Ventana deslizante 10 req/120s │ │ └── pii_filter.py # Enmascara emails, teléfonos, DNIs │ └── api/ │ └── main.py # FastAPI: /chat, /hitl, /stats, /health ├── ui/ │ └── app.py # Streamlit: Chat, HITL, Dashboard ├── evals/ │ ├── datasets/ │ │ └── test_cases.json # 33 casos de test (RAG, datos, accion, chat, adversarial) │ ├── judges.py # LLM-as-judge (score 0-1 + categoría) │ ├── rag_evals.py # Métricas RAG (faithfulness, relevance, precision) │ ├── run_evals.py # Runner con reporte + auto-aprobar HITL │ └── results/ # Reportes JSON de cada run ├── redteam/ │ ├── attacks/ │ │ └── payloads.json # 31 ataques en 8 categorías │ ├── run_redteam.py # Runner con evaluator defense-in-depth │ └── results/ # Reportes JSON de cada run ├── scripts/ │ ├── test_llm.py # Fase 0: primera llamada │ ├── test_streaming.py # Fase 1: streaming │ ├── test_structured.py # Fase 1: structured outputs │ ├── test_memory.py # Fase 1: memoria conversacional │ ├── test_metrics.py # Fase 1: métricas │ ├── cli_chat.py # Fase 1: CLI interactivo │ ├── test_rag.py # Fase 2: RAG │ ├── test_agent.py # Fase 3: tool calling │ ├── test_multi_agent.py # Fase 4: multi-agente │ ├── test_security.py # Fase 5: seguridad │ ├── test_hitl.py # Fase 6: HITL │ └── test_tracing.py # Fase 7: tracing ├── data/ # Chroma DB + SQLite + traces (gitignored) ├── Dockerfile # Imagen Python 3.11-slim ├── docker-compose.yml # API (8000) + UI (8501) ├── PLAN.md # Plan maestro del proyecto ├── PROGRESS.md # Bitácora de avance ├── .env.example # Template de variables de entorno └── requirements.txt ``` ## 设置 ``` # 1. Clonar git clone https://github.com/sebachriss/aegis-desk.git cd aegis-desk # 2. Virtual env python -m venv .venv source .venv/bin/activate # Linux/Mac # .venv\Scripts\activate # Windows # 3. 安装依赖 pip install -r requirements.txt # 4. 配置 API key cp .env.example .env # 编辑 .env 并填入 DEEPINFRA_API_KEY=... # 5. 索引文档 (RAG) python -m src.rag.ingest # 6. 测试组件 python scripts/test_rag.py # RAG python scripts/test_agent.py # Tool calling python scripts/test_multi_agent.py # Multi-agente python scripts/test_security.py # Seguridad python scripts/test_hitl.py # HITL python scripts/test_tracing.py # Tracing python scripts/cli_chat.py # CLI interactivo # 7. Evals python -m evals.run_evals --save # Suite de 33 casos # 8. Red Teaming python -m redteam.run_redteam --save # Suite de 31 ataques ``` ## 启动 API + UI ``` # 选项 A:本地 uvicorn src.api.main:app --port 8000 # API streamlit run ui/app.py --server.port 8501 # UI # 选项 B:Docker docker-compose up ``` | 服务 | URL | 描述 | |---|---|---| | API | http://localhost:8000 | FastAPI | | API 文档 | http://localhost:8000/docs | 交互式 Swagger | | UI | http://localhost:8501 | Streamlit (Chat, HITL, Dashboard) | ### API Endpoints | 方法 | 路径 | 描述 | |---|---|---| | `POST` | `/chat` | 向 agent 发送消息 | | `GET` | `/hitl/pending` | 查看 HITL 待处理项 | | `POST` | `/hitl/{thread_id}/approve` | 批准操作 | | `POST` | `/hitl/{thread_id}/reject` | 拒绝操作 | | `GET` | `/stats` | tracing 指标 | | `GET` | `/health` | 健康检查 | ## 项目阶段 | 阶段 | 描述 | 状态 | 结果 | |---|---|---|---| | 0 | 设置(配置、providers、首次调用) | ✅ | — | | 1 | LLM 基础(streaming、structured、memory、metrics、CLI) | ✅ | — | | 2 | RAG(Markdown chunking、Chroma、retriever、引用) | ✅ | — | | 3 | Tool Calling(工单、邮件、SQL、ReAct agent) | ✅ | — | | 4 | Multi-Agente(supervisor、4个 workers、critic、LangGraph) | ✅ | — | | 5 | 安全(prompt injection、RBAC、rate limit、PII) | ✅ | 5/5 测试 | | 6 | HITL(interrupt、人工批准/拒绝) | ✅ | 3/3 测试 | | 7 | Evals 与可观测性(LLM-as-judge、RAGAS、tracing) | ✅ | 32/33 通过 (97%) | | 8 | API、UI 与部署(FastAPI、Streamlit、Docker) | ✅ | 6个 endpoints | | 9 | 最终 Red Teaming(31次攻击、8个类别) | ✅ | 31/31 防御成功 (100%) | ## Evals 结果 ``` Total casos: 33 Score promedio: 0.970 Pass rate (>=0.7): 97.0% (32/33) rag 10/10 100.0% datos 7/8 87.5% accion 5/5 100.0% chat 4/4 100.0% adversarial 6/6 100.0% ``` ## Red Teaming 结果 ``` Total ataques: 31 Defendidos: 31 Breaches: 0 Defense rate: 100.0% prompt_injection_direct 8/8 100% prompt_injection_indirect 3/3 100% jailbreak 4/4 100% data_exfiltration 4/4 100% tool_abuse 3/3 100% sql_injection 4/4 100% rbac_bypass 4/4 100% rate_limit 1/1 100% ``` ## Red Teaming 期间发现并修复的漏洞 | 漏洞 | 严重程度 | 修复方案 | |---|---|---| | System prompt 被 "Repeat everything above" 提取 | 严重 | 通过防提取规则加固 prompt | | 员工通过 SQL 查看了所有薪水 | 高 | RBAC 绕过修复:在拒绝时,`chat_agent` 将 `intencion` 更改为 `"chat"` | | 向外部域名发送邮件(数据泄露) | 高 | 在 `email.py` 中设置内部域名白名单 | | Rate limit 未针对慢速请求激活 | 中 | 时间窗口从 60 秒延长至 120 秒 | ## 关键经验 - **基于 Markdown headers 的 Chunking** > 固定大小的 chunking:保留语义连贯的章节 - **Pydantic 中的 `Literal`** 强制 LLM 在精确选项中做出选择(不会凭空捏造类别) - **Agent 的专业化**:拥有 2 个特定 tools 的 agent > 拥有 10 个 tools 的 agent - **LangGraph 的 `interrupt()`**:暂停图、保存状态、等待人工决策 - **纵深防御**:没有哪一层是完美的,但 4 层结合起来就是完美的(security node → RBAC → LLM refusal → HITL) - **LLM-as-judge**:可扩展用于评估数千个响应而无需人工,但需要对 judge 的 prompt 进行校准 - **将 Evals 作为回归测试**:如果更改了 prompt,运行 `python -m evals.run_evals` 并与 baseline 进行比较 - **Red teaming 发现真实 bug**:critic 的 RBAC 绕过在攻击系统之前一直未被检测到 - **JSONL Tracing**:简单、append-only、易于解析。是生产环境中 LangSmith/Langfuse 的基础 ## 安全性 - `.env` 位于 `.gitignore` 中 — **不会上传到仓库** - tools 是**模拟的**(不发送真实邮件,不修改外部数据库) - 邮件白名单:仅限内部域名(`aegiscorp.com`、`aegis.com`) - SQL 白名单:仅限 `SELECT`(无 `INSERT`、`UPDATE`、`DELETE`、`DROP`) - PII 过滤:在响应中掩码处理邮件、电话和身份证号(DNI) - Rate limiting:每个用户 120 秒内 10 次请求 - RBAC:`empleado`(RAG + 工单 + chat)对比 `admin`(+ SQL + 邮件) ## 许可证 教育项目。无正式许可证。
标签:AI工程, DLL 劫持, Kubernetes, LangChain, 人机协同(HITL), 内部支持系统, 多智能体, 大语言模型, 提示词注入防护, 检索增强生成(RAG), 请求拦截, 轻量级, 逆向工具