12 KiB
12 KiB
Jarvis 个人 AI 助理 — Phase 1 实现计划
生成日期:2026-03-20 目标:完成 Jarvis 核心功能的 MVP 版本
技术栈确认
| 组件 | 技术选型 |
|---|---|
| 后端框架 | FastAPI (Python 3.12+) |
| Agent 框架 | LangGraph(多 Agent 编排、工具调用、状态机) |
| LLM 适配器 | LangChain Claude / OpenAI / Ollama(可切换) |
| 知识库框架 | LlamaIndex(Node 关系索引、语义检索) |
| 向量数据库 | ChromaDB |
| 关系数据库 | SQLite + SQLAlchemy |
| 前端框架 | Vue 3 + TypeScript + Vite |
| 移动端 | Kotlin (Android) |
| 定时任务 | APScheduler |
| 部署 | Docker(NAS 本地运行) |
目录结构
MyAgents/
├── backend/ # 后端项目
│ ├── app/
│ │ ├── __init__.py
│ │ ├── main.py # FastAPI 入口
│ │ ├── config.py # 配置管理
│ │ ├── database.py # SQLAlchemy 数据库连接
│ │ ├── models/ # 数据库模型
│ │ │ ├── __init__.py
│ │ │ ├── user.py
│ │ │ ├── document.py
│ │ │ ├── task.py
│ │ │ ├── forum.py
│ │ │ ├── agent.py
│ │ │ ├── conversation.py
│ │ │ └── knowledge_graph.py
│ │ ├── schemas/ # Pydantic 请求/响应模型
│ │ │ ├── __init__.py
│ │ │ ├── auth.py
│ │ │ ├── conversation.py
│ │ │ ├── document.py
│ │ │ ├── task.py
│ │ │ ├── forum.py
│ │ │ └── graph.py
│ │ ├── routers/ # API 路由
│ │ │ ├── __init__.py
│ │ │ ├── auth.py
│ │ │ ├── conversation.py
│ │ │ ├── document.py
│ │ │ ├── task.py
│ │ │ ├── forum.py
│ │ │ └── graph.py
│ │ ├── agents/ # LangGraph Agent 系统
│ │ │ ├── __init__.py
│ │ │ ├── graph.py # 主 Agent 图定义
│ │ │ ├── nodes/ # Agent 节点
│ │ │ │ ├── __init__.py
│ │ │ │ ├── master.py # 主调度 Agent
│ │ │ │ ├── planner.py # 规划 Agent
│ │ │ │ ├── executor.py # 执行 Agent
│ │ │ │ ├── librarian.py # 知识管理员 Agent
│ │ │ │ └── analyst.py # 分析师 Agent
│ │ │ ├── tools/ # Agent 工具集
│ │ │ │ ├── __init__.py
│ │ │ │ ├── search.py # 知识库检索工具
│ │ │ │ ├── task.py # 任务操作工具
│ │ │ │ ├── forum.py # 论坛操作工具
│ │ │ │ └── graph.py # 图谱操作工具
│ │ │ └── prompts/ # Agent 提示词
│ │ │ ├── __init__.py
│ │ │ ├── master_prompt.py
│ │ │ └── sub_agent_prompts.py
│ │ ├── services/ # 业务逻辑服务
│ │ │ ├── __init__.py
│ │ │ ├── llm_service.py # LLM 调用服务
│ │ │ ├── knowledge_service.py # 知识库服务
│ │ │ ├── graph_service.py # 知识图谱服务
│ │ │ ├── scheduler_service.py # 定时任务服务
│ │ │ └── agent_service.py # Agent 调用服务
│ │ ├── knowledge/ # 知识库核心
│ │ │ ├── __init__.py
│ │ │ ├── indexer.py # LlamaIndex 索引器
│ │ │ ├── chunker.py # 文档分块策略
│ │ │ └── retriever.py # 检索器
│ │ └── utils/ # 工具函数
│ │ ├── __init__.py
│ │ └── security.py
│ ├── tests/ # 测试
│ │ ├── __init__.py
│ │ ├── test_agents.py
│ │ ├── test_knowledge.py
│ │ └── test_api.py
│ ├── pyproject.toml
│ ├── uv.lock
│ └── Dockerfile
│
├── frontend/ # 前端项目
│ ├── src/
│ │ ├── App.vue
│ │ ├── main.ts
│ │ ├── api/ # API 调用
│ │ │ ├── index.ts
│ │ │ ├── conversation.ts
│ │ │ ├── document.ts
│ │ │ ├── task.ts
│ │ │ ├── forum.ts
│ │ │ └── graph.ts
│ │ ├── components/ # 通用组件
│ │ ├── views/ # 页面视图
│ │ │ ├── ChatView.vue # 主对话页
│ │ │ ├── KnowledgeView.vue # 知识库页
│ │ │ ├── GraphView.vue # 知识图谱页
│ │ │ ├── ForumView.vue # 论坛页
│ │ │ ├── KanbanView.vue # 看板页
│ │ │ └── LoginView.vue # 登录页
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── router/ # Vue Router
│ │ ├── types/ # TypeScript 类型
│ │ └── styles/ # 全局样式
│ ├── public/
│ ├── package.json
│ └── vite.config.ts
│
├── android/ # Android 项目(后续)
│
├── docker-compose.yml
├── .env.example
└── README.md
开发阶段
Phase 1 — 核心骨架(第 1-2 周)
目标:跑通最基础的服务,能对话、能上传文档、能检索
- 搭建后端项目 — FastAPI + 项目结构 + 依赖安装
- 搭建前端项目 — Vue 3 + Vite + TypeScript + 基础路由
- 实现 LLM 适配器 — LangChain Claude/OpenAI/Ollama 统一接口
- 实现简单对话 — 单 Agent + WebSocket 流式输出
- 实现知识库上传 — LlamaIndex + ChromaDB + 文档分块
- 实现基础检索 — 向量检索 + 返回结果
Phase 2 — 多 Agent 系统(第 3-4 周)
目标:多 Agent 协作跑起来
- 实现主 Agent — LangGraph 状态机 + 工具注册
- 实现子 Agent — 规划、执行、知识管理、分析师 4 个角色
- 实现工具集 — 知识检索、任务操作、论坛操作工具
- Agent 通信 — 协作式 + 主 Agent 协调模式
Phase 3 — 知识图谱(第 5-6 周)
目标:文档知识能沉淀到图谱中
- 实体识别 — LLM 从文档 Node 中提取实体
- 关系抽取 — LLM 抽取实体间关系
- 图谱存储 — nodes + edges 存入 SQLite
- 图谱可视化 — 前端 D3.js / ECharts 渲染
Phase 4 — 论坛 + 看板(第 7-8 周)
目标:论坛发帖、AI 扫描执行、看板任务管理
- 论坛 CRUD — 帖子发布、回复、列表
- AI 扫描引擎 — 定时扫描论坛、识别可执行指令
- 看板 CRUD — 任务卡片、优先级、状态
- AI 每日规划 — 凌晨分析完成情况、生成次日建议
Phase 5 — 前端完整 UI(第 9-10 周)
目标:所有功能页面完成,科幻风格 UI
- 主对话界面 — 流式输出、Agent 角色切换
- 知识库界面 — 文件上传、检索、结果展示
- 图谱可视化 — 可交互的节点关系图
- 论坛界面 — 发帖、列表、AI 执行标记
- 看板界面 — 拖拽卡片、状态流转、AI 建议
Phase 6 — Android App(第 11-12 周)
目标:移动端能对话、能看看板
- Android 项目搭建 — Kotlin + Jetpack Compose
- 对话界面 — WebSocket 连接后端、流式对话
- 看板视图 — 任务列表、状态切换
- 基础设置 — 服务器地址配置
Phase 7 — 部署 + 优化(第 13-14 周)
目标:部署到 NAS,稳定运行
- Docker 打包 — 后端 + 前端镜像
- NAS 部署 — Docker Compose 一键启动
- 性能优化 — 缓存、异步、数据库索引
- 安全加固 — JWT、API 限流、数据加密
Phase 1 详细任务
1.1 后端项目初始化
backend/
├── pyproject.toml
│ ├── fastapi>=0.115.0
│ ├── uvicorn[standard]>=0.30.0
│ ├── langgraph>=0.2.0
│ ├── langchain-anthropic>=0.3.0
│ ├── langchain-openai>=0.2.0
│ ├── llama-index>=0.12.0
│ ├── llama-index-vector-stores-chroma>=0.3.0
│ ├── chromadb>=0.5.0
│ ├── sqlalchemy>=2.0.0
│ ├── aiosqlite>=0.20.0
│ ├── pydantic>=2.0.0
│ ├── pydantic-settings>=2.0.0
│ ├── python-jose[cryptography]>=3.3.0
│ ├── passlib[bcrypt]>=1.7.4
│ ├── APScheduler>=3.10.0
│ ├── python-multipart>=0.0.12
│ ├── websockets>=12.0
│ └── aiofiles>=24.0.0
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── config.py
│ └── database.py
└── Dockerfile
1.2 前端项目初始化
frontend/
├── Vite + Vue 3 + TypeScript
├── Pinia (状态管理)
├── Vue Router 4
├── Axios (HTTP 客户端)
├── VueUse (工具函数)
├── TailwindCSS (样式)
└── Lucide Vue (图标)
1.3 LLM 适配器接口
# backend/app/services/llm_service.py
from langchain_anthropic import ChatAnthropic
from langchain_openai import ChatOpenAI
from langchain_ollama import ChatOllama
from abc import ABC, abstractmethod
class LLMAdapter(ABC):
@abstractmethod
async def invoke(self, messages: list[dict]) -> str:
...
@abstractmethod
async def stream(self, messages: list[dict]):
...
class ClaudeAdapter(LLMAdapter):
def __init__(self, api_key: str, model: str = "claude-sonnet-4-20250514"):
self.llm = ChatAnthropic(api_key=api_key, model=model)
class OpenAIAdapter(LLMAdapter):
def __init__(self, api_key: str, model: str = "gpt-4o"):
self.llm = ChatOpenAI(api_key=api_key, model=model)
class OllamaAdapter(LLMAdapter):
def __init__(self, base_url: str = "http://localhost:11434", model: str = "llama3"):
self.llm = ChatOllama(base_url=base_url, model=model)
# 工厂函数,根据配置返回对应适配器
def get_llm_adapter(provider: str, **kwargs) -> LLMAdapter:
adapters = {
"claude": ClaudeAdapter,
"openai": OpenAIAdapter,
"ollama": OllamaAdapter,
}
return adapters[provider](**kwargs)
1.4 简单对话 API
# POST /api/chat
# Body: { "message": "你好 Jarvis", "conversation_id": "uuid" }
# Response: WebSocket 连接,流式返回
@app.websocket("/ws/chat/{conversation_id}")
async def websocket_chat(websocket, conversation_id: str):
async for message in websocket:
# 1. 存入历史
# 2. 调用 LangGraph Agent
# 3. 流式返回结果
yield "data: ..."
# GET /api/conversations — 对话历史列表
# POST /api/conversations — 创建新对话
# DELETE /api/conversations/{id} — 删除对话
1.5 知识库上传 API
# POST /api/documents/upload
# Body: multipart/form-data, file + metadata
# 返回: document_id, chunk_count
# GET /api/documents — 文档列表
# GET /api/documents/{id} — 文档详情 + chunks
# DELETE /api/documents/{id} — 删除文档
# POST /api/documents/search
# Body: { "query": "查找...", "top_k": 5 }
# 返回: 检索结果列表
第一步操作
现在开始执行 Phase 1.1 — 搭建后端项目结构。
需要创建:
backend/pyproject.tomlbackend/app/__init__.pybackend/app/main.pybackend/app/config.pybackend/app/database.pybackend/.env.example
是否现在开始?