AI-assisted iterative learning system — 把一次提问变成“学习材料 → 主动复述 → 费曼检验 → 间隔复习 → 知识资产”的闭环。
AIIterate 不是聊天工具。它更像一个个人学习操作系统:每个问题都会进入可追踪的状态机,用户必须用自己的话解释,AI 负责评价、追问、生成费曼题、识别薄弱点,并把复习计划和知识树进度沉淀下来。
- 用户使用文档:面向日常使用,讲清楚怎么创建学习主题、怎么写理解、怎么做费曼和复习。
- 设计文档:面向开发维护,说明架构、状态机、数据模型、安全边界、测试策略和维护规范。
- 配置示例:数据库配置模板。真实
config/db.json已被忽略,不能提交。
README 按“入口文档”定位编写:先让读者理解项目价值,再给出可复制的启动、配置、测试、部署和维护路径;细节统一跳转到专门文档,避免 README 变成杂乱流水账。
普通 AI 问答容易停留在“看懂了”的错觉。AIIterate 强制加入主动复述与费曼检验:
我问一个问题
→ AI 生成结构化学习材料
→ 我用自己的话复述理解
→ AI 评价并指出 gaps
→ 我追问或修正
→ AI 出费曼题检验
→ 通过后进入复习队列
每次理解评价产生的 gaps 会进入 learning_gaps 账本。费曼失败、复习低分也会回流到同一套薄弱点模型,形成长期追踪。
完成 session 后,系统按个性化艾宾浩斯间隔创建复习计划。复习不是简单打勾,而是要求重新解释,并由 AI 再次评价。
每个 session 可以绑定到知识节点。系统会聚合完成率、平均分、gap 数、待复习项,给出掌握度和下一步推荐。
- 新建问题或观点,后台异步生成标题和初始学习材料。
- 支持“写理解”和“追问”两类深化轮次。
- 写理解会得到 0-100 分评价、表扬、薄弱点、结论和推荐追问。
- 至少写过一次理解后才能进入费曼检验。
- 费曼题逐题评分,通过则完成,未通过则回到修正阶段。
- 完成学习后自动创建复习计划。
learning_gaps:薄弱点账本,支持 open/resolved/ignored/reappeared。review_report:费曼报告,保存最终分数、强项、弱项、总结、是否通过。correction_plan:费曼失败后的修正计划。knowledge_node_id:知识树绑定关系。review_schedule:复习排期与复习反馈。
指挥中心聚合今天最该做的事:
- 待完成费曼。
- 到期复习。
- 正在学习或修正的 session。
- 未来几天的复习压力。
- 后台 job、异常 session、状态机 invariant 等系统健康信息。
- Web 登录 + HttpOnly cookie。
X-Admin-Token兼容脚本调用。- LLM provider/base_url/model/API key 可在设置页配置。
- 支持按 role 配置模型:标题、回答、评价、复习、深化。
- Tavily API key 用于联网搜索。
- 数据库配置可在 UI 或
config/db.json中管理。 - API key 读取时只返回掩码,不返回明文。
- Backend:FastAPI、SQLAlchemy Core、aiohttp、Pydantic。
- Database:生产 PostgreSQL,测试临时 SQLite。
- Frontend:Vue 3、Vue Router、Vite。
- AI:OpenAI-compatible Chat Completions API,支持多 provider 与 role routing。
- Search:Tavily。
- Deploy:user-level systemd,兼容 Docker Compose。
- Test:pytest、FastAPI TestClient、deterministic fake AI。
aiterate/
README.md # 项目入口文档
USER_GUIDE.md # 用户使用指南
DESIGN.md # 架构与维护设计文档
aiterate_server.py # FastAPI app、认证、API 路由、job worker、状态机 guard
aiterate_db.py # SQLAlchemy Core 数据层、schema、迁移、invariant 检查
aiterate_ai.py # LLM 路由、Tavily 搜索、prompt、鲁棒 JSON 提取
index.html # Vite 入口 shell
vite.config.js # Vite 构建配置
package.json # 前端依赖
requirements.txt # Python 依赖
assets/
app.css # 全局布局与组件样式
fonts.css # 字体配置
themes/
night.css # 暗色主题
mono.css # 亮色主题
js/vue/ # 当前 Vue 3 前端源码
main.js # app/router 初始化
store.js # 全局状态
api.js # 统一 API 封装
components/ # AppRoot / SideBar / TopBar / Workspace / Modals
vendor/ # 本地 vendor 静态依赖
public/ # Vite public assets
config/
db.json.example # 数据库配置模板
telegram_collector.env.example # Telegram 收集器配置模板,真实 env 不提交
knowledge_tree.json # 知识树定义
scripts/
aiterate_telegram_collector.py # Telegram 来源 → AIIterate Inbox 守护进程
systemd/
aiterate-collector.service # collector user-level systemd unit 模板
tests/
app_fixture.py # 隔离测试 fixture:tmp SQLite + fake AI
test_unit.py # 纯逻辑单测
test_api_contract.py # API 契约测试,默认隔离不打真实 LLM
test_state_machine.py # 状态机与 invariant 测试
test_full_flow_repeatable.py # 可重复全流程测试
live_full_flow.py # 真实服务/真实 LLM 冒烟脚本,手动运行
Dockerfile
docker-compose.yml
项目依赖写在 requirements.txt。在当前机器建议使用 Hermes venv:
cd ~/vibe/aiterate
~/.hermes/venv/bin/python -m pip install -r requirements.txt如果在新机器部署,推荐 Python 3.11+。
复制模板:
cd ~/vibe/aiterate
cp config/db.json.example config/db.json生产建议 PostgreSQL:
{
"type": "postgresql",
"host": "127.0.0.1",
"port": 5432,
"dbname": "aiterate",
"user": "aiterate",
"password": "CHANGE_ME"
}测试和轻量体验可用 SQLite:
{
"type": "sqlite",
"sqlite_path": "~/.aiterate/data.db"
}注意:真实 config/db.json 不应提交;文档、提交和日志里都不能出现真实数据库密码、admin token 或 LLM API key。
cd ~/vibe/aiterate
~/.hermes/venv/bin/python -m uvicorn aiterate_server:app --host 0.0.0.0 --port 7070访问:
http://127.0.0.1:7070
健康检查:
curl http://127.0.0.1:7070/healthz首次登录后进入“设置”:
{
"llm": {
"provider": "deepseek",
"base_url": "https://api.deepseek.com/v1",
"api_key": "sk-...",
"model": "deepseek-chat",
"roles": {
"title": {"model": "deepseek-chat"},
"answer": {"model": "deepseek-chat"},
"evaluate": {"model": "deepseek-chat"},
"review": {"model": "deepseek-chat"},
"deepen": {"model": "deepseek-chat"}
}
},
"tavily_api_key": "tvly-...",
"feynman_pass_score": 60
}role 含义:
title:生成 session 标题。answer:生成初始学习材料。evaluate:评价用户写下的理解。review:生成费曼题、评价费曼答案、评价复习解释。deepen:回答追问、生成深化建议。
当前部署使用 user-level systemd:
systemctl --user restart aiterate.service
systemctl --user status aiterate.service --no-pager
journalctl --user -u aiterate.service -f服务地址:
http://192.168.31.222:7070
配置就绪检查需要认证。脚本调用可以带 X-Admin-Token:
curl -H "X-Admin-Token: $AITERATE_ADMIN_TOKEN" http://127.0.0.1:7070/api/readyAIIterate 自带 Telegram 收集器,用于把设置页中的 Telegram 来源增量推送到 Inbox。代码和 systemd unit 都在本项目内,不能依赖 Hermes workspace 脚本。
cd ~/vibe/aiterate
cp config/telegram_collector.env.example config/telegram_collector.env
# 编辑 config/telegram_collector.env:填 TELEGRAM_API_ID / TELEGRAM_API_HASH / TELEGRAM_SESSION / TELEGRAM_PROXY
mkdir -p ~/.config/systemd/user
cp systemd/aiterate-collector.service ~/.config/systemd/user/aiterate-collector.service
systemctl --user daemon-reload
systemctl --user enable --now aiterate-collector.service
journalctl --user -u aiterate-collector.service -f真实 config/telegram_collector.env 和 data/ 目录已被 .gitignore 忽略;不要提交 Telegram session、API hash、代理密码或 admin token。
项目包含基础 Dockerfile 与 compose 文件:
docker compose up -d --build默认挂载:
./data:/data:SQLite 数据目录。./config:/app/config:数据库配置。
如使用 PostgreSQL,可按 docker-compose.yml 中注释启用 postgres 服务,并修改 config/db.json。
默认 pytest 必须满足三条原则:
- 不依赖线上服务是否启动。
- 不调用真实 LLM。
- 不污染生产 PostgreSQL。
运行全量离线测试:
cd ~/vibe/aiterate
~/.hermes/venv/bin/python -m pytest -q重点回归:
~/.hermes/venv/bin/python -m pytest tests/test_full_flow_repeatable.py -q
~/.hermes/venv/bin/python -m pytest tests/test_api_contract.py tests/test_state_machine.py -q真实服务冒烟脚本会调用真实服务和真实模型,会创建真实 session,只在明确需要端到端验证时手动运行:
~/.hermes/venv/bin/python tests/live_full_flow.pyVite 8 需要 Node.js >=20.19。当前环境建议使用 Node 24:
cd ~/vibe/aiterate
export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" && nvm use 24
npx vite build
systemctl --user restart aiterate.service本地开发代理:
export NVM_DIR="$HOME/.nvm" && . "$NVM_DIR/nvm.sh" && nvm use 24
npx vite --host 0.0.0.0开发约定:
- 修改
assets/js/vue/、assets/app.css、assets/themes/、index.html或vite.config.js后必须重新构建。 - 所有业务请求必须走
assets/js/vue/api.js。 - 未认证时不要加载业务数据。
- Markdown 渲染必须 XSS-safe。
- UI 修改要保持暗亮主题一致,不要只改一套主题。
除 /、/favicon.svg、/healthz、/api/auth/login、/api/auth/logout、/api/auth/status 外,业务 API 默认需要管理员认证。
POST /api/auth/login:提交{ "token": "..." },成功后设置 HttpOnly cookie。POST /api/auth/logout:清除当前 cookie session。GET /api/auth/status:检查当前请求是否已认证。
GET /api/sessions?limit=200:会话列表。POST /api/sessions:创建 session,body 包含content、type、web_search、knowledge_node_id。GET /api/sessions/{id}/workspace:聚合 workspace 数据。POST /api/sessions/{id}/deepen:写理解或追问。POST /api/sessions/{id}/start-feynman:生成或复用费曼题组。POST /api/sessions/{id}/complete-feynman:提交费曼答案。POST /api/sessions/{id}/complete:手动完成学习。POST /api/sessions/{id}/reopen:重新打开已完成或修正中的 session。
GET /api/knowledge-tree:知识树。GET /api/knowledge-tree/mastery:知识树掌握度。GET /api/knowledge-tree/recommend:推荐下一步节点。PATCH /api/sessions/{id}/knowledge-node:绑定或解绑 session 的知识节点。GET /api/review/today:到期复习。POST /api/review/{id}/submit:提交复习解释并由 AI 评价。POST /api/review/{id}/skip:跳过本次复习,不算完成。
GET /api/jobs/status:后台任务状态。GET /api/command-center:指挥中心聚合数据。GET /api/maintenance/check-invariants:状态机一致性检查。POST /api/maintenance/repair-invariants?dry_run=true|false:自动修复可修复的不一致。GET /api/report/weekly:生成学习周报 Markdown。
preparing → learning → deepening → feynman → completed
↑ ↓
└─ revising
error 可由后台 job 或 AI 调用失败进入
入口约束:
deepen只允许learning/deepening/revising。start-feynman只允许deepening/revising,且至少有一次take。complete-feynman只允许feynman。complete只允许learning/deepening/revising。reopen只允许completed/revising。
非法状态会返回 409 Conflict,避免把学习记录推进到不可解释的状态。
常用健康检查:
cd ~/vibe/aiterate
~/.hermes/venv/bin/python - <<'PY'
import json
import aiterate_db as db
print(json.dumps({
"stats": db.get_stats(),
"health": db.get_system_health(),
"jobs": {
"pending": db.get_pending_job_count(),
"running": db.get_running_job_count(),
},
"invariants": db.check_invariants(),
}, ensure_ascii=False, default=str, indent=2))
PY常见问题优先级:
/healthz是否正常。jobs是否有 stuck running/pending。check_invariants()是否有 error 级别问题。- 浏览器 console 是否有认证竞态、JS exception 或构建产物未更新。
- LLM settings 是否缺 provider/base_url/api_key/model。
- 不提交真实
config/db.json。 - 不在文档、日志、测试快照中写真实 token、数据库密码或 LLM key。
- 设置接口只返回
api_key_masked和has_api_key。 - Web 端使用 HttpOnly cookie;脚本兼容
X-Admin-Token。 - 前端 Markdown 使用 DOMPurify;DOMPurify 不可用时 fail-closed。
- 动态 SQL update 必须走字段白名单。
- 新增 API:同步更新 README API 概览、DESIGN 设计说明和测试。
- 修改状态机:同步更新状态机图、入口 guard、invariant 检查和状态机测试。
- 修改 DB schema:更新
init_db(),同时考虑 PostgreSQL 和 SQLite 测试分支。 - 修改前端:重新构建 Vite,必要时用浏览器验证 console。
- 修改 AI JSON 输出:必须保留
parse_failed标记,不允许静默 fallback。 - 新增文档:避免写真实 secret,命令要可复制,说明副作用。
AIIterate 是个人学习系统,不是面向公网的多租户 SaaS。默认假设部署在可信内网或个人服务器上。若要公开暴露,需要额外补充:反向代理 TLS、强密码策略、速率限制、审计日志、备份恢复流程和更严格的权限模型。