Anchor your knowledge with full source traceability
Turn your documentation and code into personalized AI quizzes—every answer traces back to its source.
Features • Quick Start • Architecture • Docs • Contributing
🌐 Website: anchor.playlab.eu.cc
Open the bilingual demo to complete 12 traceable questions across Flutter, Git, and JavaScript datasets.
The browser demo uses bundled sample data and scripted tutor hints. It does not call an AI provider or replace the full Flutter application.
Anchor Learning (锚学) is an open-source AI learning assistant that transforms your personal documents, technical notes, and code projects into traceable practice questions and learning content.
🔗 Complete Citation Chain: Every question traces back to specific locations in source documents
🤖 AI Agent Tutoring: Interview-style guidance helps you understand code projects
🛡️ Anti-Hallucination: Citation Verification + Question Validator dual verification
🔒 Privacy First: Local data storage with export, backup, restore, and deletion controls
📱 Private Alpha: Android native app; the public Web experience is a separate static demo
- Markdown 语义切分: 按标题层级切分,保持语义完整
- 代码项目理解: 分析项目架构,提取关键概念
- 精确定位: 每个知识块都有可读的 locator(如
README.md:## 快速开始)
- 知识点提取: 自动识别文档中的核心概念
- 多样化题型: 单选/多选/填空/判断/匹配题
- 前置依赖推理: 自动构建知识图谱
- 质量验证: AI 二次核验事实准确性
- 间隔重复: 基于遗忘曲线的智能复习调度
- 掌握度追踪: 实时追踪每个知识点的掌握情况
- 来源溯源: 点击题目查看原文,理解上下文
- AI 语义判题: 填空题支持同义答案判定
- 知识问答: 基于知识库回答你的问题,附带引用链
- 项目面试: 引导式提问帮助你理解大型代码库
- 苏格拉底式: 通过反问启发思考,而非直接给答案
- 长会话恢复: 支持中断后继续学习
- 📝 正在学习新技术的开发者 - 把文档变成可练习的知识
- 🏗️ 需要理解大型项目的工程师 - AI 引导你读懂复杂代码
- 🎓 准备面试的求职者 - 从项目中生成面试题
- 🛠️ 想构建教育 AI 产品的团队 - 参考完整的实现方案
- Flutter 3.44.8 stable(本地开发与 CI 推荐版本)
- Dart SDK 无需单独安装;项目最低约束为 Dart
^3.5.0 - 已归档的
1.0.0+2005release 候选实际由 Flutter 3.44.6 / Dart 3.12.2 构建,复核该产物时应保持原工具链记录 - 兼容 OpenAI 协议的模型 profile(凭据在应用内保存)
# 1. 克隆项目
git clone https://github.com/Drew-Z/anchor.git
cd anchor
# 2. 安装依赖
flutter pub get
# 3. 运行应用
flutter run
# 4. 在应用内配置模型 profile
# 打开应用 → 设置 → AI 配置 → 保存 provider、Base URL、模型名和 API Key- 打开应用,点击底部导航栏的 "导入"
- 选择 "选择 Markdown 文件" 或 "导入项目代码"
- 等待 AI 分析(30-120 秒,取决于文档大小)
- 进入 "练习" 页面,开始答题! 🎉
💡 提示: Flutter 应用首次运行需要导入自己的 Markdown 或项目文件;无需 API Key 即可先完成本地导入和范围预览。AI 生成流程需要在应用内配置兼容的模型凭据。
📚 详细指南: 快速开始文档
用户上传文档
↓
[Semantic Chunker] 语义切分
↓
[AI Tasks] 提取知识点 → 生成题目
↓
[Citation Verification] 验证引用
↓
[Question Validator] 验证事实
↓
[人工审核] 最终确认
↓
[题库] 开始学习
-
Layer 1: Semantic Chunker
保持源文档的结构完整性,不切断语义边界 -
Layer 2: Citation Verification
强制 AI 引用具体 chunk ID,验证引用有效性 -
Layer 3: Question Validator
二次核验生成的答案是否与源文档一致
- 前端: Flutter + Riverpod
- 数据: SQLite(本地优先)
- AI: OpenAI API / 兼容的本地模型
- 检索: BM25 + Semantic Embedding 混合搜索
📖 深入了解: 系统架构文档
# Flutter Widget 生命周期
StatefulWidget 通过 State 对象管理状态...
## 关键方法
- `initState()`: 初始化,只调用一次
- `build()`: 构建 UI,可能多次调用
- `dispose()`: 清理资源生成的题目:
题目: 以下关于 StatefulWidget 生命周期的说法,正确的是?
A. initState() 可以多次调用
B. dispose() 在 Widget 销毁时调用 ✅
C. build() 只调用一次
D. setState() 可以在 dispose() 后调用解析: 根据文档 [README.md:## 关键方法],dispose() 方法在 State 对象被永久移除时调用,用于释放资源。
来源:
README.md:## 关键方法(可点击跳转)
👤 用户: 这个项目是怎么实现间隔重复的?
🤖 AI: 我看到项目中有 ReviewSchedulerService。
在回答之前,你能先告诉我,你理解的"间隔重复"
是什么原理吗?
👤 用户: 就是根据记忆曲线,越熟悉的内容复习间隔越长?
🤖 AI: 非常好! 那你觉得系统需要追踪哪些数据,
才能实现这个算法?
提示: 看看 Question 模型里的字段
[lib/data/models/question.dart:15-42]
不知道从哪里看起? → 阅读指南 按角色推荐路径
- 快速开始 - 5 分钟上手
- 导入文档 - 最佳实践和技巧
- 自定义 Prompt - 调整 AI 行为
- 系统概览 - 核心流程和设计理念
- 数据模型 - ER 图和表结构
- AI Pipeline - 每个 AI Task 的设计
我们欢迎所有形式的贡献!
寻找标记为 good first issue 的任务:
- 添加 PDF 导入支持
- 改进 Markdown 表格解析
- 添加西班牙语翻译
- 为核心服务补充单元测试
📖 阅读: 贡献指南
本项目受以下项目启发:
- aicoding-cookbook - Claude Code Skills 最佳实践
- Anki - 间隔重复算法先驱
- Obsidian - 个人知识管理理念
本项目采用 MIT License 开源。
感谢所有贡献者和使用者! ❤️
- GitHub Issues: Report Bug / Request Feature
- Discussions: Join Discussion
Made with ❤️ by bill
If this helps you, give it a ⭐ Star!