第13章:MVA 实战— 构建你的“笔记数字助手”
本章摘要
欢迎来到课程的终极实战阶段。在前 12 天里,我们像拼乐高一样,逐一掌握了 S.C.O.R.E. 提示工程(大脑)、Obsidian 知识库(记忆)、MCP 协议(神经)以及 Python 脚本(手脚)。我们甚至在第 12 天为了防止 AI“暴走”,专门设计了 安全围栏。 今天,我们将把所有积木组装在一起,构建你的第一个 MVA(Minimum Viable Agent,最小可行智能体) —— 笔记数字助手)。 这个智能体的任务非常具体且具有挑战性:它将自动扫描你的 Obsidian 收件箱 (00-Inbox),阅读杂乱的笔记,分析其内容,为其打上标签,并将其移动到正确的分类文件夹中。
本章交付成果:一个自动化笔记归档管理智能体。你将亲眼见证 AI 在后台“思考”,并弹窗请求你的批准,最后物理移动文件。这是从“聊天机器人”到“数字员工”的质的飞跃。
最小可行智能体的系统架构
在开始构建智能体之前,我们需要先画出图纸。MVA 不是简单的脚本堆砌,而是一个有生命的 PEAR 闭环系统。
2.1 具身智能的解剖图
在这个项目中,我们的系统由以下三部分组成:
•
大脑 (Brain):由 Cherry Studio 加载的 DeepSeek/Qwen 模型。它负责阅读笔记内容,判断它是“项目”、“概念”还是“资源”。
•
手脚 (Body):一个 增强版的 Python MCP Server。它不仅能读写文件,还集成了我们第 12 天研发的 Tkinter GUI 弹窗,即使在后台运行也能强制获得人类关注。
•
环境 (Environment):你的 Obsidian 仓库。这是智能体感知和改变的物理世界。
2.2 交互时序与安全协议
这是一个典型的 “L3 高风险操作”(涉及文件移动和修改)。因此,我们的架构必须包含 HITL (人机协同) 环节。
数据流向图 (Data Flow):
Perceive (感知):Agent 调用 list_handouts 发现讲义,调用 read_handout 读取全文。
Evaluate (评估):Agent 读取内容,根据 Prompt 的内容识别出关键概念,生成带有 YAML Formatter 格式的原子卡片 md文件, 并移动到 /Concepts 目录。
Act(行动):Agent 发起 create_concept_card 调用。
- 情况 A (无冲突):Python 脚本检测到文件不存在 → 直接写入 → 返回 Success。
- 情况 B (有冲突):检测到 S.C.O.R.E.模型.md 已存在 → 弹出 GUI 警告框。
代码块
Plain Text
- 用户点击 **Yes** → 覆盖原文件。
- 用户点击 **No** → 脚本自动重命名为 `..._v1.md` 并写入。
Reflect (反思):Agent 收到工具返回的 Success: [新建副本]...,在对话框回复确认。
实战演练:组装知识挖掘机
我们将分三步完成组装:编写“手”(Python)、注入“灵魂”(System Prompt)、配置“神经”(Cherry Studio)。
3.1 编写Python 脚本
这是本章的核心工程。我们不仅要实现写入,还要在代码层面实现 数据契约(自动注入 YAML) 和 安全围栏(GUI 仲裁)。
文件名:miner_server.py 依赖安装:pip install "mcp[cli]" (如果尚未安装)
$ pip install mcp[cli]
实验完整的参考Python脚本:
代码块
Python
import os
import sys
import datetime
脚本逻辑核心解析:
脚本主要包含三个逻辑模块:感知层(读)、决策辅助层(交互)、行动层(写)。
安全沙箱 (Security Sandbox)
◦
函数: validate_path(path)
◦
逻辑: 所有的文件操作前,都会先调用这个函数。它检查目标路径是否以 VAULT_ROOT 开头。
◦
目的: 防止 AI 出现“幻觉”去修改系统文件或仓库以外的文件(L2 级防御)。
感知工具 (Perception Tools)
◦
函数: list_handouts() 和 read_handout(filename)
◦
逻辑:
▪
扫描 00-Inbox 目录。
▪
只读取 .md 文件,过滤掉系统隐藏文件。
◦
目的: 为 AI 提供“眼睛”,让它能看到有哪些讲义需要处理。
核心行动工具 (Core Action Tool) —— create_concept_card
这部分代码集成了 数据契约 和 冲突仲裁。
逻辑流程图:
a.
路径构建:接收 AI 传来的 concept_name,清洗非法字符,生成目标路径 10-Concepts/概念名.md。
b.
冲突检测与仲裁:
▪
判断: 目标文件是否存在? (if os.path.exists)
▪
若存在 ,触发 L3 级拦截:
•
启动 tkinter 弹窗,强制置顶 (topmost)。
•
展示来源、理由,询问用户:“覆盖(Yes) 还是 新建副本(No)?”
•
分支 A (Yes): 保持原路径,准备覆盖写入。
•
分支 B (No): 调用 get_unique_filename,自动在文件名后加 _v1, _v2,直到找到不冲突的文件名。
c.
数据契约执行:
▪
不信任 AI: 脚本不信任 AI 传入的 content 里是否包含了正确的 YAML。
▪
强制注入: 脚本使用 Python 的 f-string,利用传入的参数 (category, source_file, time) 强制组装 标准的 YAML Frontmatter。
3.2 配置神经连接 (MCP Client)
在 Cherry Studio配置新的 Server。
代码块
JSON
{
"mcpServers": {
"knowledge-miner": {
"command": "python",
"args": [
"/Replace/With/Your/Absolute/Path/To/miner_server.py"
],
"type": "stdio"
3.3 注入“研究员”灵魂 (System Prompt)
这是一个 熵减 的 Prompt。我们通过 Top-3 熔断机制,强迫 AI 进行价值判断,而不是大量主题的提取。
代码块
Markdown
Role (S)
你是一位精通人工智能工程学的 **知识挖掘研究员 (Knowledge Miner)**。
你的核心能力是深度阅读技术文档,识别其中的核心思维模型、工程协议和设计模式,并将它们从非结构化的长文中提炼出来,转化为高内聚、低耦合的 “原子化知识卡片”。
Context (C)
- 运行环境: 你连接着用户的 Obsidian 知识库。
- 输入源: `/00-Inbox` 目录下的课程讲义(Markdown 格式)。
- 输出目标: `/10-Concepts` 目录下的原子概念卡片。
- 工具能力: 你拥有读取文件 (`read_handout`) 和创建卡片 (`create_concept_card`) 的能力。
本章总结
本章将前12章的所有技术资产组装为一个完整的最小可行智能体。你构建的“知识挖掘机”能够自动扫描 Obsidian 收件箱,阅读杂乱笔记,识别核心概念,并在获得人类批准后将原子化卡片写入知识库。MVA 不是 Demo,是可运行的系统原型——它验证了从 Prompt 到 Workflow 的完整工程链路。这是从“聊天机器人”到“数字员工”的质的飞跃。
代码块
Plain Text
💡 MVA(最小可行智能体)是将理论转化为可运行系统的第一次完整闭环。
下一章预告:一个 MCP 工具是“手脚”,多个 MCP 工具协同才是“身体”。第14章将引入 多 MCP 协同涌现——在单一客户端下同时挂载本地读取、网络抓取与安全写入三大服务,见证 AI 自主完成跨工具智能涌现。
课后思考
目前的脚本是运行一次扫描一次(Polling)。如何利用 Python 的 watchdog 库改造 miner_server.py,使其变成一个后台守护进程?即:当你按下 Ctrl+S 保存一篇讲义时,Agent 毫秒级自动触发阅读与归档?
如果在不同的讲义中,AI 分别提取了 “S.C.O.R.E. Model” 和 “SCORE Framework”,系统会创建两个文件。如何在 create_concept_card 之前增加一步“向量检索”?先去 /10-Concepts 查重,如果发现相似度极高的概念,应该执行“合并(Merge)”操作而不是“新建”。
讲义中常包含架构图或白板截图。当前的 read_handout 只读取文本。如何集成 OCR 工具(如带有 Vision 推理能力的模型),让智能体能“看懂”图片中的流程图,并将其转化为 Mermaid 代码存入卡片?
附录1: 核心术语表 (Glossary)