Nicksxs's Blog

What hurts more, the pain of hard work or the pain of regret?

上次是开始使用了Obsidian,之前也听说了Obsidian也推出了cli命令行工具,这次就来体验下,主要是为了能在例如claude code跟codex中直接操作Obsidian,比如在一些知识的学习之后希望整理成笔记
首先安装比较简单,就是在软件内开启命令行就行,会加到系统的PATH路径里
开启命令行有版本要求

1
Using the CLI requires the Obsidian 1.12 installer. See the installer version update guide.


在关于的最后高级菜单中就可以开启了
我们可以先看看这个cli能用来干啥
当然可以用help命令来查看

1
obsidian help

日常使用可以参考这些命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Open today's daily note
obsidian daily

# Add a task to your daily note
obsidian daily:append content="- [ ] Buy groceries"

# Search your vault
obsidian search query="meeting notes"

# Read the active file
obsidian read

# List all tasks from your daily note
obsidian tasks daily

# Create a new note from a template
obsidian create name="Trip to Paris" template=Travel

# List all tags in your vault with counts
obsidian tags counts

# Compare two versions of a file
obsidian diff file=README from=1 to=3

包括记录今日的日常笔记,搜索,查看活动日志等等
在结合Claude Code使用的时候
我们可以装下大佬的skill
https://github.com/kepano/obsidian-skills
我们可以通过这个安装

1
2
/plugin marketplace add kepano/obsidian-skills
/plugin install obsidian@obsidian-skills

然后我们就能用它里面的技能来处理知识笔记处理
比如

1
使用defuddle技能帮我摘录这篇文章 https://obsidian.md/help/cli

这样就能用defuddle来处理这篇文章,摘录到本地
然后再用这个包里的obsidian技能把摘录下来的文章保存到obsidian
可以看到初步的效果

这样就初步打通了这个cli的一体化体验了
当然更细致的使用还有待研究和学习
可能这块的生态来说,的确有了cli工具,整体使用起来也会变得更丝滑
从文章摘录到整理到笔记
刚才还有一步重要的就是把知识进行总结整理
通过仔细查看cli的文档也能看到这个工具不是只做出来有个样子而已
已经是比较深入到整体的系统使用
甚至包括插件的管理都有
查看安装的所有插件
plugins

List installed plugins.

1
2
3
4
filter=core|community  # filter by plugin type

versions # include version numbers
format=json|tsv|csv # output format (default: tsv)

查看启动的插件
plugins:enabled

1
2
3
4
filter=core|community  # filter by plugin type

versions # include version numbers
format=json|tsv|csv # output format (default: tsv)

启用插件
plugin:enable

1
2
id=<id>                # (required) plugin ID
filter=core|community # plugin type

这些也只是一小部分,可以具体在cli进行学习参考

之前看到Karpathy这个wiki知识库提到了使用Obsidian作为笔记软件,因为Obsidian存储笔记的格式就是markdown
Obsidian的使用方式和别的笔记系统还是有比较大差别的,我们只需要指定一个笔记目录,就可以往里存放笔记了
它的语法整体就是markdown的语法,之前比如像我用hexo写博客的话大概也知道基本的语法,
只是有个比较特殊的内部链接
通过

1
[[标题]]

来做内部链接,就能链接到笔记库内部的另一篇笔记,同时会在被链接笔记的右侧侧边栏显示链接当前笔记的笔记,有点绕
这样呢,我个人理解还是通过文章之间的联系,把孤立的一篇篇文章连接成知识体系,因为像我之前就也出现了碰到一个问题想解决它,结果解决了想记录下,一搜发现以前已经写过了
没有成体系化的笔记系统,就需要定期去整理回顾之前的笔记和文章,当然呢,工具永远只是一部分,主动地去整理记忆才是最重要的。
哪怕最好的工具,不去好好使用也只是工具
当然这个Obsidian在使用还有它很好用的网页摘录插件,因为这个甚至是把它作为笔记软件的一个重要原因
我之前使用的是为知笔记,它有个特别好用的就是在微信公众号里的文章可以直接转发他们的企微助理号,就会直接同步到笔记库里,但是前阵子可能是被微信封了
目前这个也没有完全恢复,所以也这个最大的优点没有了之后,也在考虑可以换个软件
它的网页摘录插件就是
https://chromewebstore.google.com/detail/obsidian-web-clipper/cnjifjpddelmedmihgijeibhnjfabmlf

安装这个插件后就可以把网页直接转换成markdown进行保存,包括像网页内的图片也会摘取链接转换成markdown的图片格式
还有就是笔记多端同步了,这边因为我比较熟悉syncthing,所以可以使用syncthing来做同步,我现在主力使用的安卓机,
也可以安装syncthing和Obsidian的安卓客户端,通过syncthing同步后,手机上同样指定同步的笔记库目录,就可以跨端查看笔记了

上次把pdf文档转成了markdown,这次就来试下把文档进行具体的整理学习
创建我的wiki目录,然后在目录下创建raw目录,用于存放原始的文档,最好是转成了markdown的,
方便模型读取,当然模型是多模态的,并且土豪可以无视
然后使用claude在目录下让模型帮我开始整理我的知识库
它就开启了plan模式,使用了多个agent来处理文件

1
2
3
4
5
6
7
8
9
⏺ Entered plan mode
Claude is now exploring and designing an implementation approach.

⏺ 3 Explore agents finished (ctrl+o to expand)
├─ Survey wiki structure · 9 tool uses · 0 tokens
│ ⎿ Done
├─ Inspect raw materials · 10 tool uses · 0 tokens
│ ⎿ Done
└─ Find related study notes · 9 tool uses · 0 tokens

在完成之后就又给出了我需要做的针对性选项

1
2
3
4
5
6
7
8
9
10
11
⏺ Plan(Design KB plan)
⎿  Done (0 tool uses · 11.4k tokens · 20s)
(ctrl+o to expand)

Searched for 2 patterns, read 1 file (ctrl+o to expand)

⏺ User answered Claude's questions:
⎿  · 你希望这个知识库更偏哪种使用场景? → 教材精读

⏺ Searching for 3 patterns, reading 1 file… (ctrl+o to expand)
⎿ raw/教材.md

接下去再做生成和校验

1
2
3
4
5
6
7
8
9
10
11
12
13
Verification

1. 运行脚本后,确认 1–21 章都已生成目录,尤其检查带分页符前缀的章标题是否正确识别。
2. 抽检至少 3 章:
- 第 1 章(开头正常)
- 第 9 章(架构核心章节)
- 第 10 章(前有分页符)
3. 抽检至少 15 个节/小节文件,确认:
- 文件名编号正确
- 内容没有串章
- 小节没有落错父目录
4. 检查总入口和章节索引里的链接是否全部可跳转。
5. 随机检查若干 图/表格残片,确认都被标成“待人工核对”,而不是被错误改写。

其实针对这种还是最好通过比较好的OCR模型或者多模态模型进行构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
⏺ 已帮你把教材整理成一版“教材精读型”知识库骨架。

完成内容:
- 新增构建脚本:./wiki/scripts/build_architect_kb.py
- 生成知识库入口:./wiki/系统架构设计师/README.md
- 生成章节目录与索引:
- 系统架构设计师/章节/**
- 系统架构设计师/索引/按章节索引.md

本次生成结果:
- 21 章
- 118 节
- 265 个小节

我已抽检通过的点:
- 第 9 章目录正常:教材/章节/09-软件架构设计/README.md:1
- 第 10 章分页符章节也识别正常:系统架构设计师/章节/10-设计模式/README.md:1
- 第 21 章重复小节问题已修正:系统架构设计师/章节/21-虚拟化、云计算与物联网/README.md:1
- 图片缺失占位已落地:系统架构设计师/章节/01-计算机组成与体系结构/01-1.1.1-计算机硬件的组成.md:11

当前知识库特点:
- 保留教材章节主线
- 自动清洗了部分 OCR 噪声和分页符
- 把孤立的“图/表”替换为待人工核对占位
- 每章都有 README,每节/小节独立成文件,并带来源行号

已知限制:
- 原始教材 OCR 质量一般,个别公式/符号仍有乱码,比如 系统架构设计师/章节/03-数据库系统/02-3.2.2-关系代数.md:11
- 这版重点是“结构化落库”,不是“内容精修”

如果你愿意,我下一步可以继续做两件事之一:
1. 继续清洗 OCR 乱码,优先修数据库/公式类章节。
2. 开始做“精读增强”,给每章补“重点 / 易混点 / 关联章节”。

这样基于这个知识库,我们可以继续进行更多的问答学习总结,防止大模型幻觉或者知识的不准确性

这个工具的来源是看到了大神的个人知识库的文章,比之以前可能都是以rag的形式,现在是通过直接让大模型学习提取原始知识文档,来给自己做个人知识库的索引和整理,那么有一个前提是大模型更擅长的文档格式是纯文本的,或者说就是以Markdown的形式,因为既有段落格式,又是相对纯文本的,便于输入大模型.
那很多情况我们就需要把我们现有的文档转换成Markdown形式,便于大模型去分析理解
刚好想起来前阵子微软开源了这么个工具,
仓库在这里
我们就来简单的使用体验下

1
2
3
git clone git@github.com:microsoft/markitdown.git
cd markitdown
pip3 install -e 'packages/markitdown[all]'

我们不去具体阅读代码,就是来使用体验下
可以直接把仓库Clone下来,然后安装就可以了
简单的使用说明是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
usage: SYNTAX:

markitdown <OPTIONAL: FILENAME>
If FILENAME is empty, markitdown reads from stdin.

EXAMPLE:

markitdown example.pdf

OR

cat example.pdf | markitdown

OR

markitdown < example.pdf

OR to save to a file use

markitdown example.pdf -o example.md

OR

markitdown example.pdf > example.md

Convert various file formats to markdown.

我们可以用最贱的方式

1
markitdown path-to-file.pdf > document.md

我在网上找了个transformer的论文中文版pdf
来转换成markdown试一下
发现其实这个转换还是限制挺大的,并没有非常全能
比如pdf中是文本的表格
也会错乱的比较多

模型BLEU训练成本(FLOPs)
cmidrule
EN-DE EN-FREN-DEEN-FR
———————–—–—–
ByteNet [18]23.75
1.0 ⋅ 1020
Deep-Att + PosUnk [39]39.2
——————————-———–———-———-
GNMT + RL [38]24.6 39.922.3 ⋅ 10191.4 ⋅ 1020
9.6 ⋅ 10181.5 ⋅ 1020
ConvS2S [9]25.16 40.46
MoE [32]26.03 40.562.0 ⋅ 10191.2 ⋅ 1020
Deep-Att + PosUnk Ensemble [39]40.48.0 ⋅ 1020
1.8 ⋅ 10201.1 ⋅ 1021
GNMT + RL Ensemble [38]26.30 41.16
ConvS2S Ensemble [9]26.36 41.297.7 ⋅ 10191.2 ⋅ 1021
第6张的表就变成了这样子,可能还是主体的文本稍微好一点
但是论文相对来说结构也不是那么已读也是个原因
另外如果是非文本型的可能还是需要结合外部的ocr和大模型来辅助提取内容
可以用markitdown的插件系统
markitdown-ocr Plugin
The markitdown-ocr plugin adds OCR support to PDF, DOCX, PPTX, and XLSX converters, extracting text from embedded images using LLM Vision — the same llm_client / llm_model pattern that MarkItDown already uses for image descriptions. No new ML libraries or binary dependencies required.
1
2
pip install markitdown-ocr
pip install openai # or any OpenAI-compatible client

然后通过代码设置

1
2
3
4
5
6
7
8
9
10
from markitdown import MarkItDown
from openai import OpenAI

md = MarkItDown(
enable_plugins=True,
llm_client=OpenAI(),
llm_model="gpt-4o",
)
result = md.convert("document_with_images.pdf")
print(result.text_content)

这样就能把包含图片的信息也进行转换,迫于没有外国信用卡,我就没法演示了

我们在开发中还是有挺多时候会需要经常切换分支,比如在项目A的过程中突然要修个bug,或者想去看看另一个分支的代码逻辑是怎么样的等等
如果频繁的切换分支,那要不就是经常git stash,有时候甚至会忘了已经开发了的代码,要不就是写到一半提交
最近发现了worktree这个功能,
比如我有一个仓库叫repo0,有两个分支main和feat1,
我可能需要在feat1上开发,但是偶尔又要回main上看看代码逻辑等
我就可以使用worktree,
比如我就是创建一个feat1的worktree

1
git worktree add ../feat1 feat1

就会在repo0的同级目录创建一个feat1
这样就会变成两个目录对应的不同分支,但优点是啥呢,因为这是git天然支持的,不是我们直接clone了两份,会有两个.git目录,这样就省掉了很大的版本管理空间
另外我们仓库路径下就是个主的worktree
这样呢其实还有一个现在比较时兴的好处,就是如果有多个agent,就可以开多个worktree,一个开发新代码,一个写单测,一个review代码,加快流水线并行化速度
对应的常用参数可以看一下help

1
2
3
4
5
6
7
8
9
usage: git worktree add [-f] [--detach] [--checkout] [--lock [--reason <string>]]
[-b <new-branch>] <path> [<commit-ish>]
or: git worktree list [-v | --porcelain [-z]]
or: git worktree lock [--reason <string>] <worktree>
or: git worktree move <worktree> <new-path>
or: git worktree prune [-n] [-v] [--expire <expire>]
or: git worktree remove [-f] <worktree>
or: git worktree repair [<path>...]
or: git worktree unlock <worktree>

第一个就是add,像我刚才就是指定了worktree的路径和对应的分支,如果直接是路径就会找这个路径名对应的分支,如果不存在跟路径同名的分支,就是新建分支
而如果后面是分支名,就会切到这个分支,它还可以是tag,commit-id;
还有比如我只是想做一些实验性的改动
可以用

add命令

1
git worktree add -d <path>

它不会新建分支,创建一个不与任何分支关联的 throwaway worktree(一次性工作树)。

list命令

1
git worktree list

另外像git worktree list就是查看当前仓库有哪些worktree

lock命令

1
git worktree lock

lock是说我的worktree可能会被移动,防止文件被破坏,我需要进行锁定

move命令

1
git worktree move <worktree> <new-path>

move就是把worktree移动到一个新的路径

remove命令

1
git worktree remove

remove就是删除worktree,
但有个前提是不能删除还有代码没提交,有未提交的变更这种

prune命令

1
git worktree prune

这个其实更偏向于git来清理所管理的worktree,比如worktree的目录直接被删掉不用了

repair命令

1
git worktree repair 

修复命令是指比如我们的主worktree被移动了,
那需要修复其他的worktree的引用关系
就可以用这个命令

unlock命令

1
git worktree unlock 

这个跟刚才的lock就是互为反操作
如果对一个仓库有这种多分支并行操作,
用worktree还是挺好用的
之前还不知道,最近是跟着最新这波龙虾热才知道
想要搞个数字团队
分工各司其职
正好可以用到这个功能

0%