跳转到主要内容

TIL

TIL 全称为 Today I Learned,旨在简短的分享自己获得的知识/经验,或者仅仅是自认为有趣的事物。受到 Simon Willision 和 Julia Evans 的启发。形态上可能类似于微博(广义的 micro-blogging),但是不受平台限制。

我曾经让 LLM 找对应 TIL 的两个字的中文翻译,但似乎都不太满意,因此暂时保留原始名字。未来如果找到合适的可能会换上。以下是一些可能的翻译:今学;今知;今悟;今得;今获;今识;今明;今晓;今解。

另外如果你喜欢 TIL,可能也会对我的 书签 和 书签摘要 感兴趣。

  • 来自「You don't know Git」演讲的一些 Git 小技巧

    发布于 TIL 436 字 1 分钟

    油管给我推送了一个名为「You don’t know Git」的演讲1,其中提到了一些我之前不知道的小技巧,特此记录下: git recover:只要某个变更被放入过暂存区(例如 git add 过),即使没有提交,也会被写入 object database,在意外丢失后依然可以从 git 内部数据库中捞回来(似乎有个两周的时间期限);git-recover 是一个简化了恢复过程的小工具2 git diff –word-diff:可以把变更在行内直接显示(而不是分别显示 old 和 new 分行 …

    油管给我推送了一个名为「You don’t know Git」的演讲1,其中提到了一些我之前不知道的小技巧,特此记录下: git recover:只要某个变更被放入过暂存区(例如 git add 过),即使没有提交,也会被写入 object database,在意外丢失后依然可以从 git 内部数据库中捞回来(似乎有个两周的时间期限);git-recover 是一个简化了恢复过程的小工具2 git diff –word-diff:可以把变更在行内直接显示(而不是分别显示 old 和 new 分行 …

  • PocketFlow - 仅有 100 行的 LLM 工作流框架

    发布于 TIL 217 字 1 分钟

    起因是油管给我推送了一个 “Codebase2Tutorial” 的视频,从里面了解到了 PocketFlow 这个框架。特点如下: 设计精巧(用 >> 和 - 连接不同节点) 核心代码只有 100 行左右,可以被包含在单个文件中(让我想起了 Header-Only Lib) 每个节点分为 prep, exec, post 的设计,以及数据单独存放在 shared(有点像 Vue) 因为框架本身很小,让 LLM 帮助写代码的时候也可以很轻松的放在上下文中。 一个示例工作流如下(摘自官方文档): …

    起因是油管给我推送了一个 “Codebase2Tutorial” 的视频,从里面了解到了 PocketFlow 这个框架。特点如下: 设计精巧(用 >> 和 - 连接不同节点) 核心代码只有 100 行左右,可以被包含在单个文件中(让我想起了 Header-Only Lib) 每个节点分为 prep, exec, post 的设计,以及数据单独存放在 shared(有点像 Vue) 因为框架本身很小,让 LLM 帮助写代码的时候也可以很轻松的放在上下文中。 一个示例工作流如下(摘自官方文档): …

  • Wish - 用 SSH 作为任何 TUI 应用的入口

    发布于 TIL 378 字 1 分钟

    从 HackerNews 上看到了一个名为 pico.sh 的项目,可以在不安装第三方工具的前提下,直接使用系统自带的工具(ssh/rsync)来实现发布文章、暴露本地服务等能力。他们的文档有一个 How it works 章节,其中提到底层用的是 wish 的能力。 继续翻 Wish 的文档,是一个看起来很自然但是之前从来没有想过的方向:把 SSH 作为一个通用协议。虽然 SSH 一般都被用于 remote login,但本质上它也提供了一个受加密保护的 tunnel;Server 可以提供一 …

    从 HackerNews 上看到了一个名为 pico.sh 的项目,可以在不安装第三方工具的前提下,直接使用系统自带的工具(ssh/rsync)来实现发布文章、暴露本地服务等能力。他们的文档有一个 How it works 章节,其中提到底层用的是 wish 的能力。 继续翻 Wish 的文档,是一个看起来很自然但是之前从来没有想过的方向:把 SSH 作为一个通用协议。虽然 SSH 一般都被用于 remote login,但本质上它也提供了一个受加密保护的 tunnel;Server 可以提供一 …

  • 用 Quak 探索数据

    发布于 TIL 131 字 1 分钟

    大学里学过一些数据科学的课程,对 Kaggle 上的数据集页面印象深刻:每列顶部有一个分布概览,扫一眼就能对数据有个大概了解。今天遇到了一个开源库,也能实现这一点。更棒的是可以交互式探索数据(例如直接选中某个区间进一步下钻),甚至还能把当前的过滤状态导出为 SQL。 src: https://github.com/manzt/quak demo: https://manzt.github.io/quak/ via: …

    大学里学过一些数据科学的课程,对 Kaggle 上的数据集页面印象深刻:每列顶部有一个分布概览,扫一眼就能对数据有个大概了解。今天遇到了一个开源库,也能实现这一点。更棒的是可以交互式探索数据(例如直接选中某个区间进一步下钻),甚至还能把当前的过滤状态导出为 SQL。 src: https://github.com/manzt/quak demo: https://manzt.github.io/quak/ via: …

  • 用连字实现图标

    发布于 TIL 134 字 1 分钟

    在阅读一篇关于“连字”(ligature)的文章时,了解到原来 Google 的 Material Icon 库用连字实现了图标选择(特定字符在一起会被直接替换为图标)。有趣! 顺带一提,这篇(via)关于连字的文章写的也很棒。强烈推荐阅读。 <span class="material-icons">face</span> (还有,连 Office 也支持连字,不过得自己打开 OpenType 特性开关。) src: …

    在阅读一篇关于“连字”(ligature)的文章时,了解到原来 Google 的 Material Icon 库用连字实现了图标选择(特定字符在一起会被直接替换为图标)。有趣! 顺带一提,这篇(via)关于连字的文章写的也很棒。强烈推荐阅读。 <span class="material-icons">face</span> (还有,连 Office 也支持连字,不过得自己打开 OpenType 特性开关。) src: …

  • Pydantic Evals - 给 LLM 的单元测试

    发布于 TIL 151 字 1 分钟

    最近工作上需要临时当一次 prompt engineer,很快就发现 vibe-based prompting (凭着感觉改 prompt)是不可靠的。理想情况下,应该和传统 ML 类似,有明确定义的 eval set 让我来测试。最后是写了个小脚本来做,但是总觉得有点太粗糙了。今天看到了 Pydantic 的这个 Evals 框架,看起来是一个更干净更系统化的解决方案,抽象也很合理,未来可以试试。 src: https://ai.pydantic.dev/evals/ via: …

    最近工作上需要临时当一次 prompt engineer,很快就发现 vibe-based prompting (凭着感觉改 prompt)是不可靠的。理想情况下,应该和传统 ML 类似,有明确定义的 eval set 让我来测试。最后是写了个小脚本来做,但是总觉得有点太粗糙了。今天看到了 Pydantic 的这个 Evals 框架,看起来是一个更干净更系统化的解决方案,抽象也很合理,未来可以试试。 src: https://ai.pydantic.dev/evals/ via: …

  • debug-gym - 给 LLM 提供调试工具可以提高代码任务能力

    发布于 TIL 246 字 1 分钟

    自 MCP 大爆炸以来,LLM 可以做的事情被大幅扩展了(甚至是 3D 建模!)还有多少 LLM 的能力是因为没有提供足够的工具,而未能被解锁的呢?微软的这篇文章给 LLM 提供了 pdb (Python Debugger),并且(毫不意外地)发现这能提高代码任务的完成成功率。 顺带一提,其中发现相比于 debug 策略(从一开始就可以调用调试器),debug(5)(前5步禁用调试器,只能用传统方式例如加日志或者改代码运行来调试,5步之后才允许启用)的提升更多。听起来很像人类的做法,先尝试一些简 …

    自 MCP 大爆炸以来,LLM 可以做的事情被大幅扩展了(甚至是 3D 建模!)还有多少 LLM 的能力是因为没有提供足够的工具,而未能被解锁的呢?微软的这篇文章给 LLM 提供了 pdb (Python Debugger),并且(毫不意外地)发现这能提高代码任务的完成成功率。 顺带一提,其中发现相比于 debug 策略(从一开始就可以调用调试器),debug(5)(前5步禁用调试器,只能用传统方式例如加日志或者改代码运行来调试,5步之后才允许启用)的提升更多。听起来很像人类的做法,先尝试一些简 …

  • coredumpy - 实现事后调试的 Python 库

    发布于 TIL 218 字 1 分钟

    Coredump 已经是一个被广为人知的概念了,想法是在出错的时候把当前的完整状态保存下来以供事后分析(Post-mortem debugging)。coredumpy 为 Python 实现了这一功能,出现异常的时候生成一个 dump 文件,后续可以用 pdb 或者是 VSCode 的调试工具加载,还原事故现场。这个库有一个优势是没有使用 pickle,因此不要求故障环境和调试环境完全一致,也避免了不安全代码的意外执行。在一个示例中,作者用它调试了一个 CI 问题,看起来比传统排查效率高非常多 …

    Coredump 已经是一个被广为人知的概念了,想法是在出错的时候把当前的完整状态保存下来以供事后分析(Post-mortem debugging)。coredumpy 为 Python 实现了这一功能,出现异常的时候生成一个 dump 文件,后续可以用 pdb 或者是 VSCode 的调试工具加载,还原事故现场。这个库有一个优势是没有使用 pickle,因此不要求故障环境和调试环境完全一致,也避免了不安全代码的意外执行。在一个示例中,作者用它调试了一个 CI 问题,看起来比传统排查效率高非常多 …

  • Node Module Inspector

    发布于 TIL 38 字 1 分钟

    可视化展示本地 node_modules 文件夹中的依赖项的小工具,包括依赖关系、大小分布等。 src: https://github.com/antfu/node-modules-inspector example: https://everything.antfu.dev/chart

    可视化展示本地 node_modules 文件夹中的依赖项的小工具,包括依赖关系、大小分布等。 src: https://github.com/antfu/node-modules-inspector example: https://everything.antfu.dev/chart

  • 让 LLM 从文件生成美观的网页的 prompt

    发布于 TIL 1140 字 3 分钟

    之前看到过这种低饱和度的美观网页,不过从这个 prompt 才知道原来可以这个组件库叫做 Preline UI。仅仅是声明特定组件库,就可以对输出效果有巨大影响。Deepseek V3 最近的更新应该也起到了很大作用。 用手头的不同模型试了下,Claude 3.7 / Deepseek V3 / Genimi 2.5 Pro 基本都在一个水平线上。用 Cursor/Windsurf 的话需要注意单次连续输出可能超出长度限制;网页对话的话可能会因为每次输出都会重跑语法高亮导致页面卡死,建议生成过程 …

    之前看到过这种低饱和度的美观网页,不过从这个 prompt 才知道原来可以这个组件库叫做 Preline UI。仅仅是声明特定组件库,就可以对输出效果有巨大影响。Deepseek V3 最近的更新应该也起到了很大作用。 用手头的不同模型试了下,Claude 3.7 / Deepseek V3 / Genimi 2.5 Pro 基本都在一个水平线上。用 Cursor/Windsurf 的话需要注意单次连续输出可能超出长度限制;网页对话的话可能会因为每次输出都会重跑语法高亮导致页面卡死,建议生成过程 …

  • Think Tool - 用 Noop Tool Call 让 LLM 记录自己的思考

    发布于 TIL 130 字 1 分钟

    给可用工具列表新增一个 think 工具,只有一个必填参数 thought;这个工具什么都不做,唯一的作用就是让 thought 可以在后续对话中被 tool_call 块携带。 因为是标准的 tool call,所以对于非推理模型也能用。看起来似乎在 prompt 对应调优过的情况下表现最佳,但是单独用似乎也不错。值得一试。 src: https://www.anthropic.com/engineering/claude-think-tool via: …

    给可用工具列表新增一个 think 工具,只有一个必填参数 thought;这个工具什么都不做,唯一的作用就是让 thought 可以在后续对话中被 tool_call 块携带。 因为是标准的 tool call,所以对于非推理模型也能用。看起来似乎在 prompt 对应调优过的情况下表现最佳,但是单独用似乎也不错。值得一试。 src: https://www.anthropic.com/engineering/claude-think-tool via: …

  • TypeScript 中的错误处理光谱

    发布于 TIL 353 字 1 分钟

    看了 Theo 的一个视频,讲到了 TypeScript 中的错误处理,把各种“流派”按照对错误的态度(从不在意到视为核心)划分了一个光谱: 完全不管:默认状态,到处 try catch (很不幸我也是这样的) 低度关心:认识到错误需要被明确表达,而不是被隐藏在执行流中;用 tryCatch 或类似实现,让错误在调用返回中明确(const {data, err} = await someFunc(),类似于 Go 的写法) 中等关心:认为需要一个专门的库来封装错误;例如 neverthrow,实 …

    看了 Theo 的一个视频,讲到了 TypeScript 中的错误处理,把各种“流派”按照对错误的态度(从不在意到视为核心)划分了一个光谱: 完全不管:默认状态,到处 try catch (很不幸我也是这样的) 低度关心:认识到错误需要被明确表达,而不是被隐藏在执行流中;用 tryCatch 或类似实现,让错误在调用返回中明确(const {data, err} = await someFunc(),类似于 Go 的写法) 中等关心:认为需要一个专门的库来封装错误;例如 neverthrow,实 …

  • Block Diffusion - 分块扩散的半自回归模型 (2503.09573)

    发布于 TIL 244 字 1 分钟

    又是一个 “middle ground” 的好主意! 自回归模型:效果好,输出长度范围大,但是没法并行 扩散模型:效果差,输出长度固定,但是很好并行 分块扩散模型:输出分成多个块,块间自回归,块内扩散;既有自回归的效果(虽然没有纯自回归那么好),又有扩散模型的高并行度(虽然也没有纯扩散模型那么高)。 不过其实我对扩散模型有好感,其实是因为去噪过程中 token 是可以变化的,意味着模型“原生”就可以改主意。这不像自回归模型一旦 token 输出了就 commit 不能再改了;即使有 …

    又是一个 “middle ground” 的好主意! 自回归模型:效果好,输出长度范围大,但是没法并行 扩散模型:效果差,输出长度固定,但是很好并行 分块扩散模型:输出分成多个块,块间自回归,块内扩散;既有自回归的效果(虽然没有纯自回归那么好),又有扩散模型的高并行度(虽然也没有纯扩散模型那么高)。 不过其实我对扩散模型有好感,其实是因为去噪过程中 token 是可以变化的,意味着模型“原生”就可以改主意。这不像自回归模型一旦 token 输出了就 commit 不能再改了;即使有 …

  • Second Me - 训练一个自己的 AI 化身 (2503.08102)

    发布于 TIL 490 字 1 分钟

    自从 RAG 刚出来的时候,就有不少通过试图往 LLM 里塞自己相关的上下文(笔记/日记),试图让 LLM 更接近自己的尝试了。但是受限于模型能力,以及上下文窗口的限制,总归还是不太接近。另一个方向是微调,但是微调需要大量的 QA 数据,一般人也没有这个心思去问自己各种问题(除非你是传记主角),因此也不算很好推进。 本文提出了一种分层的记忆框架: 输入依然是用户自身的原始数据(L0) 但是在此之上基于 COT 构造问答对,得到用自然语言描述的用户特征(L1); 最后用这些问答对作为数据源,利用已 …

    自从 RAG 刚出来的时候,就有不少通过试图往 LLM 里塞自己相关的上下文(笔记/日记),试图让 LLM 更接近自己的尝试了。但是受限于模型能力,以及上下文窗口的限制,总归还是不太接近。另一个方向是微调,但是微调需要大量的 QA 数据,一般人也没有这个心思去问自己各种问题(除非你是传记主角),因此也不算很好推进。 本文提出了一种分层的记忆框架: 输入依然是用户自身的原始数据(L0) 但是在此之上基于 COT 构造问答对,得到用自然语言描述的用户特征(L1); 最后用这些问答对作为数据源,利用已 …

  • Wasp - 用于构建全栈网站的元框架

    发布于 TIL 252 字 1 分钟

    一个看起来比较有趣的项目。构建网站的时候通常有很多重复工作(登录/鉴权/邮件…)。为了减少重复,作者提出了一种元框架,在现有的前后端框架之上再叠加一层,写一些 DSL 来定义一个“网站”,然后再通过一个自定义的“编译器”生成底层的框架结构。 虽然感觉能解决一些常见问题,但是如果不能满足需求的话,自定义起来可能会是灾难。 DSL 示例如下: app todoApp { title: "ToDo App", // visible in the browser tab auth: { // …

    一个看起来比较有趣的项目。构建网站的时候通常有很多重复工作(登录/鉴权/邮件…)。为了减少重复,作者提出了一种元框架,在现有的前后端框架之上再叠加一层,写一些 DSL 来定义一个“网站”,然后再通过一个自定义的“编译器”生成底层的框架结构。 虽然感觉能解决一些常见问题,但是如果不能满足需求的话,自定义起来可能会是灾难。 DSL 示例如下: app todoApp { title: "ToDo App", // visible in the browser tab auth: { // …

  • DVC - Data Version Control

    发布于 TIL 69 字 1 分钟

    看起来像是一个给数据集用的 Git,还整合了一些模型训练相关的记录和工作流能力(例如对比不同实验,以及把输入、实验和输出结合起来)。 src: https://dvc.org/ via: https://github.com/dfsnow/opentimes

    看起来像是一个给数据集用的 Git,还整合了一些模型训练相关的记录和工作流能力(例如对比不同实验,以及把输入、实验和输出结合起来)。 src: https://dvc.org/ via: https://github.com/dfsnow/opentimes

  • 对代码的上下文检索(Contextual Retrieval)

    发布于 TIL 794 字 2 分钟

    在用各类 LLM 编程工具的时候,难免会遇到“进一步退两步”的情况,例如改一个功能但是把不相关的代码改坏了,或者是为一个简单的功能引入了完全不必要的抽象层。造成这种现象的原因之一,是 LLM 对于项目的上下文并没有明确的感知(不知道应该改哪里、怎么改、会影响什么)。虽然可能在开干之前会读一些代码,但是考虑到每次对话都是全新的,不难想象这样获取到的上下文实际上是不完备的。 今天在阅读他人的博客时,了解到了一种让模型自动总结现有代码库,主动生成一些摘要的做法。这样可以让模型在遇到问题时参考已经生成过 …

    在用各类 LLM 编程工具的时候,难免会遇到“进一步退两步”的情况,例如改一个功能但是把不相关的代码改坏了,或者是为一个简单的功能引入了完全不必要的抽象层。造成这种现象的原因之一,是 LLM 对于项目的上下文并没有明确的感知(不知道应该改哪里、怎么改、会影响什么)。虽然可能在开干之前会读一些代码,但是考虑到每次对话都是全新的,不难想象这样获取到的上下文实际上是不完备的。 今天在阅读他人的博客时,了解到了一种让模型自动总结现有代码库,主动生成一些摘要的做法。这样可以让模型在遇到问题时参考已经生成过 …

  • LLM 是现实世界的快照

    发布于 TIL 185 字 1 分钟

    读到了 Redis 作者 antirez 的一篇文章《LLM 的权重是历史的一部分》。 的确,网络上越来越多的信息已经永久消失了(现在能打开一个 2010~2020 年之间的某个链接都已经几乎是奇迹了)。存档的工作很重要,但是这样做并没有经济效益。已训练的 LLM 虽然可能会有幻觉,但至少代表了某一个时刻的现实。而且考虑到模型分散的足够多,可能比传统的集中式存档(例如 Internet Archive)更能持久的保存下来当前我们所见的世界。 src: …

    读到了 Redis 作者 antirez 的一篇文章《LLM 的权重是历史的一部分》。 的确,网络上越来越多的信息已经永久消失了(现在能打开一个 2010~2020 年之间的某个链接都已经几乎是奇迹了)。存档的工作很重要,但是这样做并没有经济效益。已训练的 LLM 虽然可能会有幻觉,但至少代表了某一个时刻的现实。而且考虑到模型分散的足够多,可能比传统的集中式存档(例如 Internet Archive)更能持久的保存下来当前我们所见的世界。 src: …

  • 浏览器内置的默认 HTML 样式

    发布于 TIL 86 字 1 分钟

    HTML 如果没有指定一个元素的样式,那么会用“默认”样式展示。(在 DevTools 里似乎被标记为“用户代理样式表”)。之前一直有些疑惑到底是在哪里定义的,今天在读其他信息的时候发现了。 src: https://github.com/chromium/chromium/blob/main/third_party/blink/renderer/core/html/resources/html.css via: …

    HTML 如果没有指定一个元素的样式,那么会用“默认”样式展示。(在 DevTools 里似乎被标记为“用户代理样式表”)。之前一直有些疑惑到底是在哪里定义的,今天在读其他信息的时候发现了。 src: https://github.com/chromium/chromium/blob/main/third_party/blink/renderer/core/html/resources/html.css via: …

  • Claude 的 Text Editor Tool

    发布于 TIL 463 字 1 分钟

    Claude 最近新支持了一个特殊的工具:Text Editor Tool,本质上是一组预定义的接口,让 LLM 可以实现文本编辑(不过看起来更像是为了代码编辑准备的)。具体定义的接口有 view, create, str_replace, insert, undo_edit。 文档里一些比较有趣的点: view 文件的时候,可以指定特定的 range(有助于处理特别大的文件) view 的时候,推荐把行号也塞进去(例如1:import os),这样能有助于编辑(因为 insert 需要指定行号 …

    Claude 最近新支持了一个特殊的工具:Text Editor Tool,本质上是一组预定义的接口,让 LLM 可以实现文本编辑(不过看起来更像是为了代码编辑准备的)。具体定义的接口有 view, create, str_replace, insert, undo_edit。 文档里一些比较有趣的点: view 文件的时候,可以指定特定的 range(有助于处理特别大的文件) view 的时候,推荐把行号也塞进去(例如1:import os),这样能有助于编辑(因为 insert 需要指定行号 …