第一次团队作业
| 作业所属课程 | https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS/ |
|---|---|
| 作业要求链接 | https://edu.cnblogs.com/campus/gdgy/Class56-Grade2024-CS/homework/16766 |
| 团队名称 | 不想加班队 |
| 团队成员 | 陈梓铤-3124004053 郑剀元-3124004075 |
| GitHub 仓库地址 | Zztt417/----3 |
一、团队展示与项目背景
在大模型能力日益普及的今天,如何让模型真正“动手做事”而不是仅仅聊天,成为很多开发者探索的方向。本次作业我们以gpt为蓝图实现了一个运行在本地的个人助手——MyBot,它同时提供 CLI 命令行和 Web UI 两种交互方式。
项目参考了 nanobot 的极简架构,核心目标是实现:接收用户输入 → LLM 判断是否需要调用工具 → 执行工具 → 把结果返回给 LLM → 继续推理,直到给出最终答案。
在实际生活中,它能够像一个真正的私人助理一样,帮你整理并制作个人课程表、自动读取并回复邮件、解析本地 PDF 文档,成为一个可以真正辅助日常学习与工作的本地智能体。
二、项目标志与迭代规划
2.1 项目标志 (Logo)
(注:此处为占位符,可替换为实际设计好的 Logo 图片)
MyBot —— 你的本地智能执行体。
🤖 🛠️ 💻(极简、工具、本地化)
2.2 迭代记录表格
本项目采取敏捷开发模式,按功能模块拆分为四个主要迭代:
| 迭代阶段 | 时间节点 | 核心目标与交付物 | 状态 |
|---|---|---|---|
| 迭代一:需求与架构 | 第1-2周 | 完成需求分析、技术选型;跑通基础 LLM 客户端与消息格式;确定项目骨架。 | ✅ 已完成 |
| 迭代二:核心循环与工具 | 第3-4周 | 实现 ReAct 主循环;完成本地工具(文件、Shell、网页搜索、PDF解析)的注册与执行框架。 | ✅ 已完成 |
| 迭代三:记忆与双端交互 | 第5-6周 | 接入短期记忆滑动窗口与摘要压缩;基于 Chroma 和 bge 实现长期记忆;完成 Vue 3 前端界面与 FastAPI 联调。 | ✅ 已完成 |
| 迭代四:MCP 扩展与测试 | 第7-8周 | 实现 MCP 同步桥接,接入邮件收发能力;完成多会话隔离;进行全局安全性审计与文档编写。 | ✅ 已完成 |
三、需求描述与功能清单
3.1 功能描述
本系统的功能设计围绕“个人本地助手”的定位展开,具体如下:
- 智能办公与日程管理:能够根据用户提供的碎片化信息,自动生成并排版每周课程表;同时通过 MCP 协议接入邮箱,实现自动收取、总结邮件并进行智能回复。
- ReAct 工具生态:支持一次返回多个工具调用。支持本地文件读写、Shell 命令执行、网页搜索与抓取、PDF 正文及嵌套表格解析。
- 双层记忆机制:
- 短期记忆:滑动窗口 + 溢出摘要压缩,保证当前对话连贯。
- 长期记忆:基于本地 Chroma 向量库 + bge 中文向量模型,支持跨会话的知识持久化与语义检索。
- 多会话隔离管理:支持新建、切换、列出、删除、查看历史。不同对话互不干扰,长期记忆按
session_id物理隔离。 - 双端交互体验:命令行 REPL 支持连续对话;Vue 3 + Vite 提供可视化界面,Markdown 渲染让课表等结构化数据展示更美观。
3.2 需求约束
本项目默认是个人本地工具:run_shell 可执行本机命令,文件工具可访问本机文件。FastAPI 默认仅监听 127.0.0.1,请勿将其直接暴露到公网,真实密钥必须放在仓库外。
四、系统设计:思维导图与类图
4.1 思维导图 (Mind Map)
系统功能模块划分如下:
4.2 核心类图 (Class Diagram)
核心模块之间的依赖与调用关系如下:
五、验收标准 (Acceptance Criteria)
为确保项目交付质量,我们设定了以下验收标准:
- 核心循环 (ReAct):
- 输入明确需要工具的问题(如“读取 README.md 概括”),Agent 能正确调用
read_file工具并将结果回填。 - 工具执行异常时(如文件不存在),系统不崩溃,能向用户返回友好的错误提示。
- 输入明确需要工具的问题(如“读取 README.md 概括”),Agent 能正确调用
- 记忆系统:
- 在单次会话中连续对话超过 20 轮,系统能自动触发摘要压缩,不报 Token 超限错误。
- 重启程序后,同一会话中提问“我之前说我爱喝什么?”,能准确提取长期记忆并回答。
- 多会话隔离:
- 在会话 A 中设定的记忆,在会话 B 中提问,系统默认不会检索到。
- 工具与扩展:
- 能够成功解析包含嵌套表格的测试 PDF,并输出 Markdown 格式。
- 启用邮件 MCP 配置后,能成功调用发送工具发送一封测试邮件。
- UI 与部署:
- 无需额外配置 Node.js 环境,通过
python api_server.py即可启动 Web UI 并正常对话。 - 执行
scripts/check_github_safety.py脚本,不报敏感信息泄露告警。
- 无需额外配置 Node.js 环境,通过
六、系统架构与业务流
6.1 整体架构
项目在前后端分离的基础上,通过 Agent 核心层统一调度大模型与工具链:
┌──────────────────────┐
│ Vue 3 Web UI │
│ 会话列表 / 聊天 / 状态 │
└──────────┬───────────┘
│ HTTP /api
▼
┌──────────────────────┐
│ FastAPI │
│ 聊天 / 会话 / 历史接口 │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ Agent │
│ ReAct + Session │
└──────┬───────┬───────┘
│ │
▼ ▼
┌──────────┐ ┌──────────────┐
│ LLMClient│ │ ToolRegistry │
└──────────┘ └──────┬───────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
文件/Shell 网页/PDF MCP 工具
│ │ │
└─────────────┴─────────────┘
│
▼
短期记忆 / 长期记忆
6.2 关键技术决策
在项目开发中,我们为了保持代码的极简与健壮性,做出了以下技术决策:
| 技术难点 | 决策方案 | 原因 |
|---|---|---|
| 异步 MCP 桥接 | MCP 使用后台线程桥接,对外提供同步接口 | MCP SDK 是异步的,但 Agent 内部工具均基于同步开发,桥接可大幅降低复杂度 |
| 会话 ID 传递 | 使用 ContextVar 传递当前会话 ID |
工具实例全局唯一,用 ContextVar 可避免模型自行编造会话 ID |
| 上下文截断保护 | 摘要压缩只在回合开始执行 | 避免在循环中间截断 tool_calls 与 tool 的对应关系 |
| PDF 表格识别 | 缩进按 X 坐标聚类 | PDF 没有显式缩进结构,依靠坐标聚类能有效还原表格层级 |
| 并发安全 | FastAPI 使用 RLock 保证单例运行 |
避免多请求并发修改 Agent 状态,导致 JSONL 或向量库写入冲突 |
| 前端免安装 | ui/dist 随仓库提交 |
普通用户无需配置 Node.js 环境即可直接启动 Web UI |
七、快速上手与功能演示
7.1 环境安装与配置
配置读取优先级为:MYBOT_ENV_FILE > 项目根目录 .env > 用户目录 ~/.mybot/.env。推荐将真实密钥放在用户目录下。
# 1. 创建虚拟环境并安装依赖
python -m venv .venv
source .venv/bin/activate # Windows 使用 .\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
# 2. 配置密钥
mkdir -p ~/.mybot
cp .env.example ~/.mybot/.env
# 编辑 ~/.mybot/.env,填入 OPENAI_API_KEY、OPENAI_BASE_URL 等配置
# 3. 启动(二选一)
python main.py # CLI 模式
python api_server.py # Web UI 模式 (访问 http://127.0.0.1:8000)
7.2 实际场景演示
场景一:文件与系统操作
用户:在当前目录创建
schedule.txt,内容为“周一:高数;周二:英语”,然后运行python --version告诉我版本。
Agent:自动调用write_file创建文件,随后调用run_shell(command="python --version"),最后整合信息回复。
场景二:网页搜索与 PDF 解析
用户:解析
samples/_synthetic_nested.pdf的第 1 页,提取其中包含嵌套结构的表格。
Agent:调用pdf_parse工具,按坐标聚类还原缩进,最终以 Markdown 表格形式输出。
场景三:记忆管理与跨会话检索
用户:记住:我的项目使用 FastAPI + Vue 3,我喜欢喝美式咖啡。
Agent:调用memory_save写入长期记忆。重启程序后,用户提问“我喜欢喝什么?”,系统生成查询向量从 Chroma 检索,回复“你喜欢喝美式咖啡。”
八、团队分工
| 成员 | 主要职责 |
|---|---|
| 陈梓铤 3124004053 | 核心模块研发:Agent 核心 ReAct 循环、ToolRegistry 工具层实现、PDF 解析与坐标聚类、MCP 后台线程桥接与邮件扩展。 |
| 郑剀元 3124004075 | 系统与前端研发:短期/长期记忆系统设计、FastAPI 接口层搭建、Vue 3 前端开发、ContextVar 会话隔离机制。 |
两人在接口约定和联调阶段保持紧密配合,确保 CLI 与 Web UI 两个入口共用同一套 Agent 运行时和工具生态。
九、总结与展望
MyBot 是一次将大模型从“聊天对象”推向“本地执行体”的完整实践。通过 ReAct 循环、工具调用、双层记忆和双端交互的设计,项目验证了本地个人 Agent 在课表制作、邮件自动回复、文件操作、信息检索等场景下的巨大潜力。
后续可以改进的方向:
- 安全沙箱:为
run_shell、文件操作和邮件发送增加更细粒度的权限控制和用户二次确认机制。 - 工具生态扩展:基于 MCP 协议接入更多外部服务(如校园教务系统、本地日历),降低新工具的接入成本。
- 记忆策略优化:探索更智能的摘要触发条件和长期记忆检索排序策略,提升大段上下文的理解能力。
- 前端体验:增强 Web UI 中的工具调用过程可视化,让 Agent 的“思考与行动”链路对用户更加透明。
项目仓库:Zztt417/----3

浙公网安备 33010602011771号