Skip to content

Repository files navigation

⚓ Anchor Learning (锚学)

Anchor your knowledge with full source traceability

Turn your documentation and code into personalized AI quizzes—every answer traces back to its source.

Flutter License PRs Welcome

FeaturesQuick StartArchitectureDocsContributing


🌐 Website: anchor.playlab.eu.cc

From BIAU PORT (泊岸) 🌊

📺 Demo Video

🎬 Coming soon...

See how Anchor Learning prevents AI hallucinations in 3 minutes

📖 About

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.

Core Highlights

🔗 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


✨ Features

📚 智能导入

  • Markdown 语义切分: 按标题层级切分,保持语义完整
  • 代码项目理解: 分析项目架构,提取关键概念
  • 精确定位: 每个知识块都有可读的 locator(如 README.md:## 快速开始)

🎯 AI 驱动的内容生成

  • 知识点提取: 自动识别文档中的核心概念
  • 多样化题型: 单选/多选/填空/判断/匹配题
  • 前置依赖推理: 自动构建知识图谱
  • 质量验证: AI 二次核验事实准确性

🧠 学习功能

  • 间隔重复: 基于遗忘曲线的智能复习调度
  • 掌握度追踪: 实时追踪每个知识点的掌握情况
  • 来源溯源: 点击题目查看原文,理解上下文
  • AI 语义判题: 填空题支持同义答案判定

🤖 AI Agent 辅导

  • 知识问答: 基于知识库回答你的问题,附带引用链
  • 项目面试: 引导式提问帮助你理解大型代码库
  • 苏格拉底式: 通过反问启发思考,而非直接给答案
  • 长会话恢复: 支持中断后继续学习

🎯 适合谁?

  • 📝 正在学习新技术的开发者 - 把文档变成可练习的知识
  • 🏗️ 需要理解大型项目的工程师 - 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

导入第一份学习资料

  1. 打开应用,点击底部导航栏的 "导入"
  2. 选择 "选择 Markdown 文件""导入项目代码"
  3. 等待 AI 分析(30-120 秒,取决于文档大小)
  4. 进入 "练习" 页面,开始答题! 🎉

💡 提示: 项目内置了示例数据,首次运行即可体验完整功能

📚 详细指南: 快速开始文档


🏗️ 架构设计

核心流程

用户上传文档
    ↓
[Semantic Chunker] 语义切分
    ↓
[AI Tasks] 提取知识点 → 生成题目
    ↓
[Citation Verification] 验证引用
    ↓
[Question Validator] 验证事实
    ↓
[人工审核] 最终确认
    ↓
[题库] 开始学习

防幻觉三层防线

  1. Layer 1: Semantic Chunker
    保持源文档的结构完整性,不切断语义边界

  2. Layer 2: Citation Verification
    强制 AI 引用具体 chunk ID,验证引用有效性

  3. Layer 3: Question Validator
    二次核验生成的答案是否与源文档一致

技术栈

  • 前端: Flutter + Riverpod
  • 数据: SQLite(本地优先)
  • AI: OpenAI API / 兼容的本地模型
  • 检索: BM25 + Semantic Embedding 混合搜索

📖 深入了解: 系统架构文档


📊 示例效果

从 Markdown 到练习题

# 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:## 关键方法 (可点击跳转)

Agent 辅导示例

👤 用户: 这个项目是怎么实现间隔重复的?

🤖 AI: 我看到项目中有 ReviewSchedulerService。
      在回答之前,你能先告诉我,你理解的"间隔重复"
      是什么原理吗?

👤 用户: 就是根据记忆曲线,越熟悉的内容复习间隔越长?

🤖 AI: 非常好! 那你觉得系统需要追踪哪些数据,
      才能实现这个算法?
      
      提示: 看看 Question 模型里的字段
      [lib/data/models/question.dart:15-42]

📚 文档

📖 开始阅读

不知道从哪里看起?阅读指南 按角色推荐路径

使用指南

架构文档

开发者


🤝 贡献

我们欢迎所有形式的贡献!

好的第一个 Issue

寻找标记为 good first issue 的任务:

  • 添加 PDF 导入支持
  • 改进 Markdown 表格解析
  • 添加西班牙语翻译
  • 为核心服务补充单元测试

📖 阅读: 贡献指南


🌟 启发来源

本项目受以下项目启发:


📄 许可

本项目采用 MIT License 开源。


🙏 致谢

感谢所有贡献者和使用者! ❤️

贡献者


📞 Contact


Part of the BIAU PORT (泊岸) experiments 🌊

Made with ❤️ by bill

If this helps you, give it a ⭐ Star!

Releases

Packages

Contributors

Languages