AI个人学习机器人实现报告
一、项目背景
1.1 核心需求
在学习和项目开发过程中,存在以下核心问题:
- 学习连续性不足:面向就业的”锦上添花”任务容易被忽略
- 任务优先级混乱:课程作业(强制)vs 就业准备(重要但非强制)难以平衡
- 缺乏实时提醒:需要频繁、个性化的学习督促机制
- 知识碎片化:学习进度、任务状态、技术笔记分散存储
目标:搭建一个面向就业的AI学习管家,实现:
- ✅ 持续、系统的学习计划制定与跟进
- ✅ 实时个性化提醒(根据主要矛盾动态调整频率)
- ✅ 对话记录与任务状态的统一管理
- ✅ 基于实际进度的动态调整与反馈
二、方案设计
2.1 资源分工表
| 设备 / 资源 | 最终分工 | 不使用原因 |
|---|---|---|
| 腾讯云 2 核 4G | 核心运行:脚本 / 定时任务 / Git 同步 / JSON存储 | 主力设备,仅运行轻量服务 |
| DeepSeek API | 唯一 AI 大脑(解析 / 规划 / 反馈 / 写作) | 国内最稳,适配统一接口 |
| Obsidian+GitHub | 双向同步笔记(本地↔云端) | 数据持久化,自动同步 |
| Mac / 游戏本 | 脚本调试 / 查看笔记 | 不参与核心运行 |
| 实验室 A100 | 进阶备用(后期笔记爆炸再启用) | 现阶段完全不需要,极简优先 |
2.2 双知识库架构设计
核心理念
- Obsidian:你的”大脑外挂” - 外置知识库 + 个人学习笔记(静态,你是唯一编辑者)
- MongoDB:程序的”日记本” - 对话历史 + 任务状态机(动态,程序自动读写)
三层AI认知体系
┌─────────────────────────────────────────────────┐
│ 长期知识库 (Obsidian) │
│ 技术笔记 / 学习路径 / 项目方案 / 面试资料 │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ 中期档案层 (MongoDB) │
│ 每日总结 / 周总结 / 对话意图总结 │
│ 客观完成 + 主观意图分离存储 │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ 短期对话层 (滑动窗口 8轮) │
│ 实时对话上下文 (16条消息) │
└─────────────────────────────────────────────────┘
MongoDB集合设计
1. conversations(对话记录)
user_id:用户标识role:user/assistantcontent:对话内容timestamp:时间戳
2. daily_summaries(每日总结)
date:日期标识 (2026-03-30)content:120字技术客观摘要created_at:生成时间
3. weekly_summaries(周总结)
week_tag:周标识 (2026-W13)content:300字周进度汇总created_at:生成时间
4. task_lifecycle(任务状态)
user_id:用户标识task_desc:任务描述status:pending/in_progress/completedcreated_at:创建时间updated_at:更新时间ai_comment:AI评语
2.3 技术栈选型
轻量化设计原则:
- ✅ AI永久记住你的背景:JSON画像每次调用API注入,无遗忘
- ✅ 处理Markdown笔记:纯文本处理,无需向量库
- ✅ API模型迭代画像:不微调模型,只更新本地JSON文件
- ✅ 双向同步:企微发消息→AI记笔记,弥补手动记录缺失
- ✅ 动态规划:读取日程/外部路径,实时修改学习要求
- ✅ 轻量化运行:2核4G服务器轻松运行,无卡顿
三、实现方法
3.1 第一阶段:基础环境搭建
1. 目录结构设计
cd ~/personal_ai
mkdir -p {obsidian_vault,scripts,logs}
2. Git自动同步
配置SSH Key:
ssh-keygen -t ed25519 -C "your_email@example.com"
# 公钥添加到GitHub
Clone仓库:
cd ~/personal_ai/obsidian_vault
git clone git@github.com:your_username/your_repo.git .
自动同步脚本 (scripts/sync_vault.sh):
#!/bin/bash
cd ~/personal_ai/obsidian_vault
git fetch --all
git reset --hard origin/main
echo "Vault synced at $(date)" >> ~/personal_ai/logs/sync_log.txt
定时任务 (crontab -e):
# 每日00:00 同步Obsidian笔记
0 0 * * * /bin/bash ~/secretary/scripts/sync_vault.sh
3. GitHub Webhook实时同步
Webhook监听脚本 (scripts/webhook_listener.py):
from fastapi import FastAPI, Request, Header
import subprocess
import os
app = FastAPI()
SECRET_TOKEN = "188390AA52f@"
SYNC_SCRIPT = "/home/ubuntu/secretary/scripts/sync_vault.sh"
@app.post("/webhook")
async def github_webhook(request: Request, x_github_event: str = Header(None)):
body = await request.body()
try:
result = subprocess.run(
["bash", SYNC_SCRIPT],
capture_output=True,
text=True,
cwd=os.path.dirname(SYNC_SCRIPT)
)
print("同步成功:", result.stdout)
return {"status": "success", "message": "Obsidian 已实时同步"}
except Exception as e:
return {"status": "error", "message": str(e)}
后台永久运行:
nohup uvicorn webhook_listener:app --host 0.0.0.0 --port 8888 > ~/secretary/logs/webhook.log 2>&1 &
3.2 第二阶段:自动化系统
1. 每日总结脚本 (scripts/daily_summary.py)
核心功能:读取Obsidian每日笔记,生成120字技术客观摘要
import os
import asyncio
from datetime import datetime
import pytz
from openai import AsyncOpenAI
from mongo_client import summary_db
VAULT_ROOT = os.path.expanduser("~/secretary/obsidian_vault")
TIMEZONE = pytz.timezone("Asia/Shanghai")
def get_today_log_path():
now = datetime.now(TIMEZONE)
year = now.year
month = now.month
date_str = now.strftime("%Y-%m-%d")
return os.path.join(VAULT_ROOT, "我的工作量", f"{year}年度", f"{month}月份", f"{date_str}.md")
def read_today_log():
log_path = get_today_log_path()
if not os.path.exists(log_path):
return "今日未记录学习/工作内容"
try:
with open(log_path, "r", encoding="utf-8") as f:
return f.read()
except:
return "日志文件读取失败"
async def generate_daily_summary(text):
client = AsyncOpenAI(
base_url=os.getenv("DEEPSEEK_API_URL"),
api_key=os.getenv("DEEPSEEK_API_KEY")
)
prompt = f"""请以「技术学习+技术工作量」为核心,用不超过120字,客观总结今日内容,仅保留技术相关事实,严格排除非技术内容,不添加主观评价。需包含:
1. 技术学习:AI技术、java、python、框架、算法/刷题、技术知识点复习、技术笔记整理;
2. 技术工作量:实验室技术任务、项目开发(技术模块);
3. 完成情况:技术相关任务/学习是否完成、未完成原因;
4. 核心细节:仅提炼与技术学习、技术工作相关的关键内容。
{text}"""
response = await client.chat.completions.create(
model="deepseek-reasoner",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
async def main():
log_content = read_today_log()
summary = await generate_daily_summary(log_content)
date_str = datetime.now(TIMEZONE).strftime("%Y-%m-%d")
summary_db.save_daily_summary(date_str, summary)
print(f"✅ {date_str} 每日摘要已保存")
if __name__ == "__main__":
asyncio.run(main())
2. 每周总结脚本 (scripts/weekly_summary.py)
核心功能:合并7天每日总结,生成300字周进度汇总
async def generate_weekly_summary(daily_list):
client = AsyncOpenAI(
base_url=os.getenv("DEEPSEEK_API_URL"),
api_key=os.getenv("DEEPSEEK_API_KEY")
)
content = "\n".join([f"{item['date']}:{item['content']}" for item in daily_list])
prompt = f"""请以「技术学习+技术工作量」为核心,合并以下7天的记录,用280-320字客观总结,仅保留技术相关事实,严格排除非技术内容,不添加主观评价。需包含:
1. 技术学习累计成果:编程语言/框架学习时长、算法/刷题总数量/模块、技术知识点复习范围、Obsidian技术笔记核心内容;
2. 技术工作量:具体技术工作内容、项目开发推进情况;
3. 完成与问题:本周技术相关计划是否达标、未完成技术任务及核心原因;
4. 关键细节:仅提炼与技术学习、技术工作相关的调整动作。
{content}"""
response = await client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
async def main():
daily_list = summary_db.get_recent_7days()
if not daily_list:
print("❌ 近7天无每日摘要,无法生成周总结")
return
weekly_summary = await generate_weekly_summary(daily_list)
week_tag = datetime.now(TIMEZONE).strftime("%Y-W%U")
summary_db.save_weekly_summary(week_tag, weekly_summary)
print(f"✅ {week_tag} 每周摘要已保存")
3. 定时任务配置
crontab -e
# 每日00:00 同步Obsidian笔记
0 0 * * * /bin/bash ~/secretary/scripts/sync_vault.sh
# 每日00:10 生成每日摘要
10 0 * * * /home/ubuntu/miniconda3/bin/python ~/secretary/scripts/daily_summary.py >> ~/secretary/logs/summary.log 2>&1
# 每周日00:20 生成每周摘要
20 0 * * 0 /home/ubuntu/miniconda3/bin/python ~/secretary/scripts/weekly_summary.py >> ~/secretary/logs/summary.log 2>&1
3.3 第三阶段:AI对话系统
1. 上下文压缩方案
问题:对话超过8轮(16条消息)后,如何处理溢出部分?
方案选择:
- ❌ 方案一:超出一条立即总结(时间冲突,高强度对话时失效)
- ❌ 方案二:每8轮总结一次(频率适中,但非主流)
- ✅ 方案三:滚动窗口 + 增量递归摘要(主流方案,Kimi、Claude 3在使用)
- ❌ 方案四:向量数据库(服务器性能不足,需求过度)
实现逻辑:
对话过程:
0~8轮 → 完整对话上下文
9~16轮 → 0~8轮滑出窗口 → 压缩进摘要池 + 9~16轮保持完整
17~24轮 → 9~16轮滑出窗口 → 摘要池增量合并 + 17~24轮保持完整
...
技术要点:
- 溢出内容写入数据库(非内存缓存),防崩溃丢失
- 专用摘要模型(独立DeepSeek实例)并行压缩
- 摘要池持续合并更新,非一次性总结
2. 上下文注入模板
full_context = f"""【角色定位】你是我的专属技术学习管家,核心职责:
1. 基于我的技术学习/工作进度,制定精简可行的任务计划
2. 跟进任务完成情况,针对性督促执行
3. 结合我的反馈实时调整安排,回答极简、聚焦任务,不冗余闲聊
4. 仅围绕Java/Python/项目开发/技术学习相关内容响应
【我的本周技术整体进度】
笔记总结:{weekly_note}
对话总结:{weekly_chat}
【我的昨日技术完成情况】
笔记总结:{daily_note}
对话总结:{daily_chat}
【近期沟通记录】
{context}
【我的当前反馈/需求】
{prompt}
请按管家职责,极简回复,聚焦任务安排与督促。
"""
3. 企业微信机器人模块
功能:
- ✅ 接收消息(用户交互)
- ✅ 发送消息(主动提醒)
- ✅ 上下文数据库记忆(MongoDB读取/写入)
- ✅ 自动推送逻辑(定时触发)
技术要点:
- 异步函数处理(提高并发性能)
- 代理配置(解决502报错)
- 消息格式化(符合企业微信API规范)
3.4 第四阶段:智能优化
1. 自动推送逻辑
触发条件:
- 定时推送(每日早晚固定时间)
- 任务截止前提醒(根据task_lifecycle状态)
- 长期未完成任务预警(优先级动态调整)
推送内容:
- 今日任务清单(基于近期对话总结 + 每日笔记总结)
- 进度回顾(周总结 + 任务完成率)
- 激励性语言(家长口吻,针对主要矛盾)
2. 主观与客观分离
Obsidian笔记 = 客观事实层:
- 记录你「实际干了什么」
- 刚性行为、时间分配、学习/实验室工作量
AI对话记录 = 主观意图层:
- 记录你「想干什么、为什么没干、诉求变化、优先级调整」
- 柔性想法、反馈、计划、提醒要求
存储策略:
- 对话记录直接存入
conversations集合 - 笔记总结存入
daily_summaries/weekly_summaries集合 - 每日/周对话意图总结独立存储(压缩后)
3.5 项目整合
目录结构调整:
~/secretary/
├── obsidian_vault/ # Obsidian笔记(Git同步)
├── scripts/ # 所有Python脚本
│ ├── daily_summary.py
│ ├── weekly_summary.py
│ ├── sync_vault.sh
│ ├── webhook_listener.py
│ └── mongo_client.py # 统一数据库访问
├── logs/ # 日志文件
└── .env # 环境变量配置
统一数据库访问 (mongo_client.py):
class SummaryDB:
def save_daily_summary(self, date: str, content: str):
self.daily_summaries.update_one(
{"date": date},
{"$set": {"content": content, "updated_at": datetime.now()}},
upsert=True
)
def get_recent_7days(self):
return list(self.daily_summaries.find().sort("date", -1).limit(7))
def save_weekly_summary(self, week_tag: str, content: str):
self.weekly_summaries.update_one(
{"week_tag": week_tag},
{"$set": {"content": content, "updated_at": datetime.now()}},
upsert=True
)
# ... 其他方法
四、技术落地
4.1 核心技术栈
| 组件 | 技术选型 | 版本/配置 |
|---|---|---|
| 服务器 | 腾讯云轻量应用服务器 | 2核4G |
| AI模型 | DeepSeek API | deepseek-reasoner, deepseek-chat |
| 数据库 | MongoDB | Community Edition |
| 笔记同步 | Git | GitHub |
| Web框架 | FastAPI | 0.104+ |
| 异步运行 | uvicorn | 0.24+ |
| 任务调度 | crontab | Linux内置 |
| Python版本 | Python 3.10+ | miniconda3 |
4.2 数据流架构
┌──────────────┐
│ 本地Obsidian │ ──Git Push──→ GitHub ──Webhook──→ 服务器Git Pull
└──────────────┘ │
↓
┌──────────────┐ ┌─────────────────┐
│ 企业微信机器人 │ ←─API调用───────→ │ DeepSeek API │
└──────────────┘ └─────────────────┘
↑ ↓
│ ┌─────────────┐
└───MongoDB读写────────────────→│ MongoDB │
│ - conversations
│ - daily_summaries
│ - weekly_summaries
│ - task_lifecycle
└─────────────┘
4.3 性能优化
Token消耗优化:
- 上下文压缩(滑动窗口8轮 + 增量摘要)
- 主客观分层存储(避免重复信息注入)
- 双层总结系统(每日120字 + 每周300字)
响应速度优化:
- 异步函数处理(AsyncOpenAI)
- Webhook实时同步(无需等待定时任务)
- MongoDB索引优化(timestamp、date字段)
服务器资源优化:
- 轻量化技术栈(2核4G即可运行)
- 后台进程管理(nohup + uvicorn)
- 日志系统(便于排查问题)
4.4 日志系统
日志位置:~/secretary/logs/
| 日志文件 | 内容 | 记录频率 |
|---|---|---|
sync_log.txt |
Git同步状态、时间戳 | 每次 |
summary.log |
每日/周总结生成状态、错误信息 | 定时 |
webhook.log |
GitHub Webhook请求记录 | 每次 |
ai_conversation.log |
AI对话记录(调试用) | 每次 |
五、实施路径
✅ 第一阶段:基础环境(已完成)
- 服务器环境搭建(SSH连接、目录结构)
- Git同步配置(SSH Key、Clone仓库)
- 自动同步脚本(sync_vault.sh + crontab)
- MongoDB部署(安装、测试脚本)
✅ 第二阶段:自动化系统(已完成)
- 每日总结脚本(daily_summary.py)
- 每周总结脚本(weekly_summary.py)
- 定时任务配置(crontab)
- GitHub Webhook实时同步(webhook_listener.py)
✅ 第三阶段:AI对话系统(已完成)
- 上下文压缩方案(滚动窗口 + 增量摘要)
- MongoDB对话记录存储
- 企业微信机器人模块(消息收发)
- 提示词模板设计
🔄 第四阶段:智能优化(进行中)
- 自动推送逻辑(定时提醒 + 任务预警)
- 主观客观分离存储完善
- 外置知识库检索(Obsidian 99_AI_Knowledge_Base/)
- Java学习路径集成(基于外部资料)
⏳ 第五阶段:应用落地(待开始)
- 完整测试(全链路闭环验证)
- 性能调优(Token消耗、响应速度)
- 用户反馈迭代(实际使用场景优化)
- 扩展功能(Google邮箱监听、AI新闻推送)
六、技术亮点
1. 三层AI认知体系
- 短期:实时对话上下文(8轮)
- 中期:压缩档案(每日120字 + 每周300字)
- 长期:Obsidian知识库(技术笔记/学习路径)
2. 主客观分离存储
- 客观层:Obsidian笔记(实际做了什么)
- 主观层:对话记录(想做什么、为什么没做)
3. 增量递归摘要
- 滚动窗口(主流方案,Kimi、Claude 3使用)
- 并行压缩(专用摘要模型)
- 数据库持久化(防崩溃丢失)
4. 双知识库架构
- 静态:Obsidian + Git(你唯一编辑者)
- 动态:MongoDB(程序自动维护)
5. 轻量化设计
- 2核4G服务器即可运行
- 无需向量数据库(纯文本处理)
- API模型迭代(JSON画像更新,无需微调)
七、问题与解决方案
1. 502代理问题
问题:企业微信机器人返回502错误
解决:在.env文件中配置代理参数,或取消代理(使用国内模型)
2. 上下文长度爆炸
问题:对话超过8轮后上下文过大
解决:滚动窗口 + 增量递归摘要(工业级稳定方案)
3. 项目路径混乱
问题:自动化脚本与AI机器人不在同一目录,数据库访问不便
解决:项目整合,统一mongo_client.py访问接口
4. Git同步延迟
问题:定时任务每小时同步一次,实时性不足
解决:GitHub Webhook实时监听,Push即同步
八、未来规划
短期目标(1个月)
- 完成Java学习路径集成
- 实现自动推送消息逻辑
- 外置知识库检索功能
- 完整测试与性能调优
中期目标(3个月)
- Google邮箱自动监听
- AI新闻推送(新闻联播总结)
- 向量数据库升级(A100服务器)
- 多用户支持(实验室内部推广)
长期目标(6个月)
- 智能任务优先级算法
- 个性化学习推荐系统
- 跨平台客户端(Web/移动端)
- 开源社区版本
九、总结
9.1 核心价值
- 系统化学习:从碎片化到连续性,AI实时跟进进度
- 主客观统一:实际完成情况 + 个人意图,精准规划
- 轻量化部署:2核4G服务器即可运行,低成本高效率
- 可扩展架构:模块化设计,易于迭代升级
9.2 技术创新
- 三层认知体系:短期实时 + 中期压缩 + 长期知识
- 主客观分离:客观事实 + 主观意图独立存储
- 增量递归摘要:工业级上下文压缩方案
- 双知识库设计:静态Obsidian + 动态MongoDB
9.3 个人成长
- 从”被动学习”到”主动规划”
- 从”任务管理”到”智能管家”
- 从”单点工具”到”系统化生态”
未来愿景:这个AI学习管家会越来越懂我,长远来看,它就是第一个为我量身定做的操作系统,训练这样一个AI是让我操作系统更上一个层次的好方法。
十、附录:关键代码片段
A. MongoDB封装类 (mongo_client.py)
from datetime import datetime
from pymongo import MongoClient, ASCENDING, DESCENDING
class SummaryDB:
def __init__(self, uri="mongodb://localhost:27017/", db_name="personal_ai"):
self.client = MongoClient(uri)
self.db = self.client[db_name]
self.daily_summaries = self.db["daily_summaries"]
self.weekly_summaries = self.db["weekly_summaries"]
self.conversations = self.db["conversations"]
self.task_lifecycle = self.db["task_lifecycle"]
# 创建索引
self.daily_summaries.create_index([("date", ASCENDING)], unique=True)
self.weekly_summaries.create_index([("week_tag", ASCENDING)], unique=True)
self.conversations.create_index([("timestamp", DESCENDING)])
self.task_lifecycle.create_index([("user_id", ASCENDING), ("created_at", DESCENDING)])
def save_daily_summary(self, date: str, content: str):
self.daily_summaries.update_one(
{"date": date},
{"$set": {"content": content, "updated_at": datetime.now()}},
upsert=True
)
def get_daily_summary(self, date: str):
return self.daily_summaries.find_one({"date": date})
def get_recent_7days(self):
return list(self.daily_summaries.find().sort("date", -1).limit(7))
def save_weekly_summary(self, week_tag: str, content: str):
self.weekly_summaries.update_one(
{"week_tag": week_tag},
{"$set": {"content": content, "updated_at": datetime.now()}},
upsert=True
)
def save_conversation(self, user_id: str, role: str, content: str):
self.conversations.insert_one({
"user_id": user_id,
"role": role,
"content": content,
"timestamp": datetime.now()
})
def get_recent_conversations(self, user_id: str, limit: int = 8):
return list(self.conversations.find(
{"user_id": user_id}
).sort("timestamp", -1).limit(limit * 2)) # user + assistant pairs
B. Git同步脚本 (sync_vault.sh)
#!/bin/bash
VAULT_DIR="/home/ubuntu/secretary/obsidian_vault"
LOG_FILE="/home/ubuntu/secretary/logs/sync_log.txt"
cd $VAULT_DIR
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始同步Obsidian仓库" >> $LOG_FILE
# 强制拉取最新代码
git fetch --all >> $LOG_FILE 2>&1
git reset --hard origin/main >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ 同步成功" >> $LOG_FILE
else
echo "[$(date '+%Y-%m-%d %H:%M:%S')] ❌ 同步失败" >> $LOG_FILE
fi
C. 进程管理脚本
# 查看Python进程
ps aux | grep python
# 查看指定PID进程详情
ps -p <PID> -o args=
# 按端口查找进程
netstat -tlnp | grep <端口号>
# 优雅关闭进程
kill <PID>
# 强制关闭进程
kill -9 <PID>
# 查找Python进程PID
pidof python
# 批量关闭所有Python进程
pkill python
# 按名称查找并关闭特定脚本
pkill -f script.py
报告生成时间:2026年4月2日
项目周期:2026年3月26日 - 2026年4月1日
作者:kipley
版本:v1.0 (GLM版本)
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 kipleyarch@gmail.com