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
From BIAU PORT (泊岸) 🌊
🎬 Coming soon...
See how Anchor Learning prevents AI hallucinations in 3 minutes
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 optional cloud sync
📱 Cross-Platform: Android / iOS / macOS / Windows / Linux
- Markdown 语义切分: 按标题层级切分,保持语义完整
- 代码项目理解: 分析项目架构,提取关键概念
- 精确定位: 每个知识块都有可读的 locator(如
README.md:## 快速开始)
- 知识点提取: 自动识别文档中的核心概念
- 多样化题型: 单选/多选/填空/判断/匹配题
- 前置依赖推理: 自动构建知识图谱
- 质量验证: AI 二次核验事实准确性
- 间隔重复: 基于遗忘曲线的智能复习调度
- 掌握度追踪: 实时追踪每个知识点的掌握情况
- 来源溯源: 点击题目查看原文,理解上下文
- AI 语义判题: 填空题支持同义答案判定
- 知识问答: 基于知识库回答你的问题,附带引用链
- 项目面试: 引导式提问帮助你理解大型代码库
- 苏格拉底式: 通过反问启发思考,而非直接给答案
- 长会话恢复: 支持中断后继续学习
- 📝 正在学习新技术的开发者 - 把文档变成可练习的知识
- 🏗️ 需要理解大型项目的工程师 - AI 引导你读懂复杂代码
- 🎓 准备面试的求职者 - 从项目中生成面试题
- 🛠️ 想构建教育 AI 产品的团队 - 参考完整的实现方案
- Flutter 3.0+
- OpenAI API Key(或兼容的本地模型)
# 1. 克隆项目
git clone https://github.com/Drew-Z/anchor.git
cd duoduo
# 2. 安装依赖
flutter pub get
# 3. 运行应用
flutter run
# 4. 在应用内配置 API Key
# 打开应用 → 设置 → API 配置 → 输入 OpenAI API Key- 打开应用,点击底部导航栏的 "导入"
- 选择 "选择 Markdown 文件" 或 "导入项目代码"
- 等待 AI 分析(30-120 秒,取决于文档大小)
- 进入 "练习" 页面,开始答题! 🎉
💡 提示: 项目内置了示例数据,首次运行即可体验完整功能
📚 详细指南: 快速开始文档
用户上传文档
↓
[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 表格解析
- 添加西班牙语翻译
- 为核心服务补充单元测试
📖 阅读: 贡献指南
本项目受以下项目启发:
- xuanli199/duoduo - 早期探索阶段的参考
- aicoding-cookbook - Claude Code Skills 最佳实践
- Anki - 间隔重复算法先驱
- Obsidian - 个人知识管理理念
本项目采用 MIT License 开源。
感谢所有贡献者和使用者! ❤️
- GitHub Issues: Report Bug / Request Feature
- Discussions: Join Discussion