nonlinear-learner
by Jlu45
README.md
<div align="center">
# Nonlinear Learner
**任务驱动的非线性学习导师 | Task-Driven Nonlinear Learning Tutor**
先了解你的背景和任务,从你提出的知识点出发,拆开整个领域所需的知识
Understand your background and task, unpack the knowledge you need from your starting point
[](https://opensource.org/licenses/MIT)
[](https://www.python.org/)
[](#tests)
</div>
---
## 核心理念 | Core Philosophy
传统学习工具假设你有一张完整的知识地图,然后规划从 A 到 B 的路径。但现实中,当你对一个领域一无所知或只有片面了解时,你往往是从**一个具体的小知识点**出发的——一篇文章里看到的一个术语、一个项目里用到的一个概念。
**Nonlinear Learner** 先了解你的背景和任务,从你提出的那个点出发,非线性地把完成任务所需的知识"拆开":
- **非线性离散**:可以跳跃到任务需要的任意知识点,不按拓扑顺序
- **逻辑保证**:每次跳跃都说明为什么,知识点之间有清晰关联
- **应用导向**:优先学能立即用于完成任务的知识,跳过暂时用不到的
- **背景感知**:根据你的背景跳过已知的,补充缺失的
Traditional tools plan A-to-B paths on a complete map. But in reality, you start from **one small concept**. This tool understands your background and task, then **unpacks** the knowledge you need — non-linearly but logically, application-oriented.
```
用户: "我想用 React 做仪表盘,会 HTML/CSS,看到别人用 useEffect"
│
┌─────────▼──────────┐
│ 导师拆解知识轨迹 │
└─────────┬──────────┘
│
[1] 组件 ← 你看到的 useEffect 就在组件里
│
[2] JSX ← 组件用 JSX 写(跳到这里因为你不了解)
│
[3] useEffect ← 回到你的起始点,现在理解了上下文
│
[4] useState ← 仪表盘需要交互状态(跳跃,但应用需要)
│
[5] 数据获取 ← 仪表盘要从 API 拉数据(跳跃,任务驱动)
│
[6] 列表渲染 ← 展示多个数据卡片
│
✗ 不学 Redux(暂时不需要) ✗ 不学 SSR(任务用不到)
```
---
## ✨ 特性 | Features
| 中文 | English |
|------|---------|
| **任务驱动导师**:先问背景和任务,再拆解知识 | **Task-driven tutor**: ask background first, then unpack |
| 非线性跳跃,但每步有逻辑关联 | Non-linear jumps with logical connections |
| 应用导向,跳过暂时用不到的 | Application-oriented, skip unnecessary |
| 对话式交互,可提问/跳过/调整 | Conversational, ask/skip/adjust anytime |
| MCP Server,接入 Claude/Cursor | MCP Server for AI tool integration |
| 辐射式探索 + 路径规划两种补充模式 | Radiative exploration + path planning modes |
| SQLite 持久化,进度自动保存 | SQLite persistence, auto-save |
---
## 🚀 快速开始 | Quick Start
### 1. 安装 | Install
```bash
pip install -e .
```
### 2. 一键配置 | One-Click Setup
```bash
nonlinear-learner setup
```
### 3. 对话式导师(核心功能) | Guided Tutor (Core)
```bash
nonlinear-learner guide
```
导师会引导你完成三步:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
对话式学习导师 | Guided Learning
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第一步:告诉我你的学习目标
例如:用 React 做一个仪表盘、理解 Transformer 原理
> 用 React 做一个数据仪表盘
第二步:告诉我你的知识背景
例如:会 HTML/CSS 和一些 JS
> 会 HTML/CSS,JS 基础薄弱
第三步:你从哪里开始?
你看到了什么、遇到了什么、对什么好奇?
> 看到别人代码里有 useEffect,不懂是什么
正在拆解知识...
✓ 学习轨迹已生成(6 个知识点)
领域概述: React 是用于构建用户界面的库...
学习轨迹:
→ [1] 组件 (难度3/5)
你看到的 useEffect 就在组件内部使用
[2] JSX (难度2/5) ← 组件
组件用 JSX 语法编写,需要先理解
[3] useEffect (难度3/5) ← 组件, JSX
回到你的起始点,现在有了上下文
[4] useState (难度3/5) ← useEffect
仪表盘需要交互状态
[5] 数据获取 (难度3/5) ← useEffect
仪表盘需要从 API 拉数据
[6] 列表渲染 (难度2/5) ← useState
展示多个数据卡片
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
步骤 1/6: 组件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 React 组件是可复用的 UI 单元
❓ 为什么学: 你看到的 useEffect 就在组件内部
🔗 关联: 起始点
⏱ 预计 30 分钟
[AI 生成结合你任务的讲解...]
>>> next ← 继续下一步
>>> ask ← 提问(系统会调整轨迹)
>>> skip ← 跳过这步
>>> info ← 查看完整轨迹
>>> quit ← 退出保存
```
---
## 📖 使用方式 | Usage
### CLI 命令 | CLI Commands
| 命令 | 说明 | Description |
|------|------|-------------|
| **`guide`** | **任务驱动导师(核心)** | **Task-driven tutor (core)** |
| `explore` | 辐射式探索 | Radiative exploration |
| `learn` | 交互式学习 | Interactive learning |
| `serve` | 启动 MCP Server | Start MCP Server |
| `setup` | 一键配置 | One-click setup |
| `generate` | 生成完整图谱 | Generate full graph |
| `plan` | 规划路径 | Plan path |
| `explain` | AI 讲解 | AI explain |
| `ask` | 对话式学习 | Conversational Q&A |
| `info` | 图谱信息 | Graph info |
| `config` | 生成 MCP 配置 | Generate MCP config |
### 接入 AI 工具 | Connect to AI Tools
```bash
nonlinear-learner serve
```
| AI 工具 | 配置文件位置 |
|---------|-------------|
| Claude Desktop | `~/Library/Application Support/Claude/claude_desktop_config.json` |
| Cursor | `~/.cursor/mcp.json` |
### Python 库 | Python Library
```python
import asyncio
from nonlinear_learner import NonlinearLearner
async def main():
engine = NonlinearLearner(llm_config={
"endpoint": "https://api.openai.com/v1",
"api_key": "sk-...",
"model": "gpt-4o-mini",
})
# 启动学习会话 | Start learning session
session = await engine.start_session(
task="用 React 做一个仪表盘",
background="会 HTML/CSS,JS 基础薄弱",
starting_point="看到别人用 useEffect",
)
print(f"轨迹: {len(session.trajectory)} 步")
for i, step in enumerate(session.trajectory):
print(f" {i+1}. {step.label} — {step.why_needed}")
# 逐步讲解 | Guide step by step
explanation = await engine.guide_current(session)
print(explanation)
# 推进 | Advance
engine.advance_session(session)
# 用户提问,调整轨迹 | Adjust trajectory
result = await engine.adjust_session(session, "什么是闭包?")
print(result["message"])
asyncio.run(main())
```
---
## 🔧 MCP 工具 | MCP Tools
20 个工具,其中 3 个为任务驱动学习核心工具:
20 tools, 3 core tools for guided learning:
| 工具 Tool | 说明 Description |
|-----------|-----------------|
| **`start_guided_learning`** | **启动任务驱动学习会话** |
| **`guide_next_concept`** | **讲解当前知识点并推进** |
| **`adjust_learning_path`** | **根据反馈调整轨迹** |
| `radiate_concept` | 辐射式探索 |
| `get_unexplored_concepts` | 获取未探索知识点 |
| `generate_knowledge_graph` | 生成完整图谱 |
| `plan_learning_path` | 规划路径 |
| `get_prerequisites` | 获取前置 |
| `get_suggested_next` | 推荐下一步 |
| `get_knowledge_gaps` | 知识缺口 |
| `mark_concept_mastered` | 标记掌握 |
| `add_concept` / `add_dependency` | 添加知识点/依赖 |
| `explain_concept` | AI 讲解 |
| `ask_question` | 对话学习 |
| `get_graph_info` / `get_graph_json` | 图谱信息/导出 |
| `load_graph_json` | 加载图谱 |
| `save_state` / `load_state` | 保存/加载状态 |
---
## 🏗️ 架构 | Architecture
```
src/nonlinear_learner/
├── cli.py # CLI + guide 对话导师 + explore 辐射探索
├── core/
│ ├── models.py # 数据模型 (含 TrajectoryStep, LearningSession)
│ ├── graph.py # networkx DAG 操作
│ ├── pathfinder.py # 路径规划 (3 种模式)
│ └── engine.py # 引擎 + 会话管理 + 辐射 + SQLite
├── llm/
│ └── client.py # LLM (unpack + guide + adjust + radiate + graph)
└── mcp_server/
└── server.py # FastMCP Server (20 工具)
```
**技术栈 | Tech Stack:** FastMCP + networkx + pydantic v2 + OpenAI SDK + click + SQLite
---
## 🧪 测试 | Tests
```bash
pip install -e ".[dev]"
pytest tests/ -v
```
137 个测试覆盖会话管理、辐射学习、数据模型、DAG、路径规划、引擎、LLM 客户端。
---
## ⚙️ 配置 | Configuration
配置文件 `~/.nonlinear_learner/config.json`(由 `setup` 自动生成):
Config at `~/.nonlinear_learner/config.json` (auto-generated by `setup`):
```json
{
"endpoint": "https://api.openai.com/v1",
"api_key": "sk-...",
"model": "gpt-4o-mini"
}
```
也支持环境变量 | Also supports env vars: `OPENAI_API_KEY`, `OPENAI_ENDPOINT`, `OPENAI_MODEL`
---
## 📄 License
MIT
This server cannot be deployed
Maintenance
ActivityStale
ResponsivenessNo issues