分类 默认分类 下的文章

说明:主要是人工写作完成的,但部分由 AI(Claude Code + DeepSeek + Waza Skills)完成的,持续更新(通常这句话是落空的)。

学习如何开发 Agent?我还是持续学习的一个过程,从理论到代码,但是缺少的是具体实践,希望自己从这个小文开始慢慢可以学着开发出一个 Agent 来,但是有多慢是不是会弃坑,回顾过去我总是这样的,但是希望这次真的不会,担心的一点由于足够慢,自己写的东西可能很快落后了,但是落后也比啥都没有强。

Agent 定义和架构

什么是 Agent?

一个 AI Coding Agent,本质上是在「用户输入 → LLM 推理 → 工具调用 → 结果反馈 → LLM 再推理」这个循环里跑的程序。拆开来看就四块:

  1. Agent Loop(主循环):驱动整个对话流转,管理 turn 的边界
  2. LLM API(模型调用):对接不同大模型,发送消息、接收响应
  3. Tool System(工具系统):让 LLM 能执行实际操作(读文件、执行命令、编辑代码)
  4. Context/Memory Management(上下文与记忆管理):管理对话历史、项目上下文、Skills 等

pi-mono 的分层设计

pi-mono 把 Agent 拆成了两层,这个设计思路很值得借鉴:

pi-coding-agent (Harness 层:CLI、资源加载、Session 管理、工具定义)
     ↓ 依赖
pi-agent-core      (Runtime 层:Agent Loop、AgentHarness、状态管理)
     ↓ 依赖
pi-ai              (API 层:多 Provider 统一接口、stream、类型定义)

核心思想:pi-agent-core 是「笨」的执行器,pi-coding-agent 是「聪明」的编排器。所有跟产品体验相关的内容(项目上下文、AGENTS.md、Skills、工具定义)都由 coding-agent 解析好,以纯字符串和工具对象的形式注入 agent-core。agent-core 只管跑 loop、调工具、管理状态,不关心这些内容从哪来。

这样分层后,如果想基于 pi-agent-core 做一个完全不同的 Agent(比如数据分析的、客服的),替换 coding-agent 这一层就够了,core 不用动。

Agent Loop 的运作方式

Agent Loop 是 Agent 的心跳。pi-mono 的 Agent Loop(packages/agent/src/agent-loop.ts)是一个双重循环:

外层循环(Follow-up),处理 follow-up 消息队列。Agent 完成一轮工作准备停下时,队列里如果有 follow-up 消息,就继续跑。

内层循环(Turn),单次对话轮次。每个 turn 包含:

  1. 发送消息给 LLM,流式接收响应
  2. 解析响应中的 tool_calls
  3. 执行工具(并行或串行),获取结果
  4. 将工具结果追加到上下文
  5. 检查 steering 消息队列,有新消息就注入
  6. 判断是否继续(还有 tool calls?有 steering 消息?)
  7. 继续的话回到第 1 步

下面是 Agent Loop 的简化伪代码:

while (有 follow-up 消息 或 有 tool calls 待处理) {
  // 1. 注入待处理消息(steering 或 follow-up)
  if (pendingMessages.length > 0) {
    context.messages.push(...pendingMessages)
  }

  // 2. 调用 LLM
  messages = convertToLlm(context.messages)  // AgentMessage[] → LLM Message[]
  response = await streamFn(model, { systemPrompt, messages, tools })

  // 3. 执行工具调用
  toolCalls = response.content.filter(c => c.type === "toolCall")
  toolResults = await executeTools(toolCalls)  // 支持并行/串行
  context.messages.push(...toolResults)

  // 4. 检查是否继续
  pollingMessages = await getSteeringMessages()
}

Agent 类(agent.ts)是对 Loop 的有状态封装,管理着当前对话记录(messages)、可用工具(tools)、系统提示词(systemPrompt)、思考级别(thinkingLevel),以及两个消息队列:steering(注入当前对话流)和 followUp(Agent 空闲后触发)。Agent 通过 subscribe() 暴露事件系统,外部监听 agent_startturn_startmessage_startmessage_updatemessage_endtool_execution_start/endagent_end 等生命周期事件来驱动 UI 更新。

开源 Agents 实现的分析小结

坚持把分析 pi-mono 和 bub 这个事情坚持下去,同时结合最近不同人对于 Calude Code 源码分析文章(分析源码的实践做法,参考这个:# 如何阅读一份源代码?(2020年版),下面是简单的摘录)。

跑起来;明确目的;区分主线和支线剧情;纵向(单模块)和横向(模块之间的依赖);情景分析;利用好测试用例;厘清核心数据结构之间的关系;多问自己几个问题;写自己的代码阅读笔记。

以上是我简单总结的一些阅读源码时候的手段和注意方法,大体而言有那么几点吧:
- 只有更好的输出才能更好的消化知识,所谓的搭建调试环境、情景分析、多问自己问题、写代码阅读笔记等都是围绕输出来展开的。总而言之,不能像一条死鱼一样指望着光靠看代码就能完全理解它的原理,需要想办法跟它互动起来。
- 写作是人的基础硬实力之一,不仅锻炼自己表达能力,还能帮助整理自己的思路。对程序员而言锻炼写作能力的手段之一就是写博客,越早开始锻炼越好。
最后,如同任何可以习得的技能一般,阅读代码这种能力也需要长时间、大量的反复练习,下一次就从自己感兴趣的项目开始锻炼自己的这种技能吧。

分析 pi-mono 目的是啥?1)如何实现加载 harness 相关的内容?2)如何管理记忆(状态)?3)如何管理 skills 和按需加载?4)如何管理工具调用?
分析 Bub 目的是啥?1)如何实现相关的理念的?2)如何对接 telegram?3)如何实现 tape 系统?
分析 Claude Code 目的是啥?

还有一个可能的参考项目,Agent-SDK without CLI dependencies, as an alternative to claude-agent-sdk, completely open source

pi-mono

项目地址:https://github.com/badlogic/pi-mono

不同 packages 的介绍:

  • pi-ai: "Unified multi-provider LLM API (OpenAI, Anthropic, Google, etc.)" 通过 API 对接各种不同大模型
  • pi-agent-core: "Agent runtime with tool calling and state management" 带工具调用和状态管理的 agent
  • pi-coding-agent: "Interactive coding agent CLI" 实现了 Coding Agent CLI,依赖 agent-code 和 ai
  • 其他的包括 pi-mom,pi-tui,pi-web-ui,pi-pods,不做分析

如何运行

基于 readme,npm install/run build/run check 完成后,以及 ./test.sh 之后,运行 ./pi-test.sh,启动 agent,然后执行 /login 选择 LLM provider,我选了 Github Copilot,基于提示完成登录后执行 /model 选择相应的模型,如:Opus 4.6,完成就可以用这个测试的 coding-agent 了。

pi-ai

主要问题:如何对接不同大模型?

pi-ai 是 pi-mono 的模型接入层,不在这次分析的重点范围。它通过统一接口 streamSimple(model, context, options) 屏蔽了不同 Provider(Anthropic、OpenAI、Google、GitHub Copilot 等)的差异,上层代码不关心具体是哪个 Provider,传 model 对象和消息上下文就行。agent-core 和 coding-agent 可以自由切换模型,核心逻辑不动。

pi-agent-core

Agent Core 的定位,以及其中的概念?

什么是 Core?为什么需要 Core?如何实现和使用 Core?

Stateful agent with tool execution and event streaming. - pi-agent-core

pi-agent-core 定位为一个「有状态的 Agent 运行时」,提供三个核心能力:

Agent 类(agent.ts,对 Agent Loop 的有状态封装。持有当前的 messages(对话记录)、tools(工具列表)、systemPromptmodelthinkingLevel。通过 prompt() 启动一轮对话,通过 continue() 从当前状态继续,通过 subscribe() 暴露事件系统,外部监听 Agent 生命周期中的每个节点。

AgentHarness 类(harness/agent-harness.ts,在 Agent 之上再加一层抽象,负责:

  • Session 持久化:每次对话自动写入 session 文件
  • 事件钩子系统:on() 注册特定事件的钩子(tool_callbefore_agent_startbefore_provider_request 等),subscribe() 监听所有事件
  • 消息队列管理:steering(中途插入的消息)、followUp(Agent 空闲后继续的消息)、nextTurn(下个 turn 的消息)
  • 资源管理:skills、promptTemplates 的管理和注入
  • 状态协调:模型切换、thinking level 切换、工具列表变更时同步持久化

AgentHarness 几个设计细节:

  • 不直接调用 LLM,而是通过 createStreamFn 创建闭包,每次 LLM 调用前动态解析 API key、headers、sessionId。OAuth token 可能过期,所以每次调用都重新获取。
  • prepareNextTurn 钩子:每个 turn 结束后重建 turnState(最新 context、model、thinkingLevel),下个 turn 用最新状态。用户可以在对话中途切换模型或思考级别。
  • pendingSessionWrites 机制:Agent 运行期间,session 写入先缓存起来,turn 结束时批量刷入,不用每次 event 都触发磁盘 I/O。

Session 系统(harness/session/,管理对话历史的持久化存储,后面细说。

pi-agent-core 本身不定义任何具体工具,也不加载任何具体资源——它只提供运行 Agent 的「引擎」。所有具体内容(工具定义、Skills、系统提示词)都由上层(coding-agent)注入。

AgentState 状态

  • agent-core manages live state, while coding-agent manages session memory

    • A simple way to think about it:

      • State: what the agent is holding in RAM right now to continue execution.
      • Memory: what the app remembers over time and can reload, summarize, or inject back into state.
    • So state is immediate and mutable; memory is durable or reconstructable. In this repo, memory eventually becomes state again when the session is restored or rebuilt.
如何调用工具?

pi-mono 的工具系统设计和 Anthropic 的 tool use 协议对齐,在上层做了工程化封装。工具调用的完整流程:

工具定义(AgentTool 接口,types.ts

interface AgentTool<TParameters, TDetails> extends Tool<TParameters> {
  label: string;                                           // 人类可读标签
  prepareArguments?: (args: unknown) => Static<TParameters>; // 参数预处理(兼容老旧模型输出)
  execute: (toolCallId, params, signal?, onUpdate?) => Promise<AgentToolResult<TDetails>>; // 执行
  executionMode?: "sequential" | "parallel";               // 执行模式
}

prepareArguments 是一个兼容性钩子:有些模型输出可能不符合 schema 的 tool call 参数,这个函数在 schema 验证之前运行,可以修正参数格式。

2. 工具调用流程(agent-loop.ts

prepareToolCall:
  1. 查找工具定义
  2. 运行 prepareArguments(如果有)
  3. schema 验证参数
  4. 调用 beforeToolCall 钩子(外部可以 block 某个工具调用)
  5. 返回 prepared(准备就绪)或 immediate(立即错误)

executePreparedToolCall:
  1. 调用 tool.execute()
  2. 支持 onUpdate 回调,工具可以流式输出执行进度
  3. 异常被捕获,转换为 error 结果(不抛异常,不中断 loop)

finalizeExecutedToolCall:
  1. 调用 afterToolCall 钩子(外部可以修改工具结果、标记错误、设置 terminate)
  2. terminate = true 表示这个工具希望 Agent 停止(当一批工具中所有工具都 set terminate,loop 提前退出)

并行 vs 串行执行,工具执行支持两种模式:

  • parallel(默认):先串行 prepare(因为 prepare 可能依赖前一个工具的结果),然后所有「已准备好」的工具并发执行。执行完成的顺序可能与工具在 assistant message 中出现的顺序不同,但最终 tool_result 消息按原始顺序排列。
  • sequential:逐个执行,每个工具的 prepare → execute → finalize 完成后才开始下一个。适用于有副作用的操作(如文件编辑),避免竞态条件。

内置工具,pi-coding-agent 提供 7 个核心工具(core/tools/index.ts):

工具功能
read读取文件,支持分页、截断、图片渲染
bash执行 shell 命令,支持超时、stdin、后台运行
edit基于精确字符串替换的文件编辑
write创建或覆写文件
grep基于 ripgrep 的内容搜索
find基于 fd 的文件搜索
ls列出目录内容

工具分两组:createCodingTools(read + bash + edit + write,完整读写权限)和 createReadOnlyTools(read + grep + find + ls,只读)。用户可以通过 --no-tools--tools 控制启用的工具。

扩展工具,Extension 系统允许第三方通过 extensions 目录注册自定义工具。Extension 用 TypeScript/JavaScript 编写,可注册:自定义 tool(带 schema 和 execute 函数)、自定义 slash command、自定义 CLI flag。Extension 之间如果有命名冲突,以 load order 先到先得,冲突会报告为诊断警告但不阻止加载。

如何构建 system prompt,并调用 LLM API?

System Prompt 的构建过程

System Prompt 在 core/system-prompt.tsbuildSystemPrompt() 中构建,支持两种模式:

  1. 自定义 Prompt 模式(用户通过 --system-prompt.pi/SYSTEM.md 指定):以用户提供的 prompt 为基础,追加:project context files(AGENTS.md/CLAUDE.md 从根目录到当前目录的所有文件)→ skills 列表(仅元数据,不加载完整内容)→ 日期和当前工作目录
  2. 默认 Prompt 模式:pi 内置了一套完整的默认 prompt,包括:

    • 角色设定:「你是一个运行在 pi coding agent harness 里的专家编程助手」
    • 工具列表和一句话描述
    • 使用指南:优先用 grep/find/ls 而不是 bash 做文件探索、保持简洁、标注文件路径
    • 项目上下文(AGENTS.md/CLAUDE.md)
    • Skills 元数据(<available_skills> XML 块,符合 agentskills.io 规范)
    • 日期和工作目录

Skills 的完整内容不在 system prompt 里,system prompt 只放 skills 的 name、description、filePath(以 XML 格式嵌入)。LLM 判断任务匹配某个 skill 时,调用 read 工具读取 SKILL.md 获取完整指令。这样 system prompt 不会膨胀,skills 在需要时又能拿到。

LLM API 调用过程,实际调用 LLM API 的链路:

AgentHarness.createStreamFn() → 闭包包装
  ↓ 每次调用前
动态获取 API key(处理 OAuth token 过期)
  ↓ 触发钩子
emitHook("before_provider_request") → 扩展可以修改 stream options(headers、timeout 等)
  ↓
streamSimple(model, context, options) → pi-ai 层的统一接口
  ↓ 触发钩子
emitHook("before_provider_payload") → 扩展可以修改请求 payload
  ↓ 发送 HTTP 请求
收到响应 → emit("after_provider_response")
  ↓ 返回 EventStream<AgentEvent>
AgentLoop 消费 stream 事件,更新 state

几个要点:

  • 每次 LLM 调用前重新获取 API key,支撑短生命周期的 OAuth token
  • convertToLlm 负责将内部 AgentMessage 转换为 LLM 兼容的 Message 格式(过滤 custom message、notification 等内部消息类型)
  • transformContextconvertToLlm 之前运行,可用于上下文裁剪(pruning)
  • 通过 before_provider_requestbefore_provider_payload 钩子,Extension 可以在请求发送前修改参数

pi-coding-agent

主要问题:

  • 如何加载 harness 相关的内容?
  • 如何管理记忆(状态)?
  • 如何管理 skills 和按需加载?
  • 如何调用工具?
  • 如何构建 system prompt,并调用 LLM API?
session 设计

https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/session.md

pi 的 Session 设计:

Session = 一个有树状结构的持久化对话记录。 不是线性聊天记录,而是一棵树,每个节点有 idparentId,天然支持 fork、分支、回退。

存储格式,JSONL 文件(session-manager.ts)。每个 Entry 是一行 JSON,类型包括:

Entry 类型说明
message用户/助手/工具结果消息
thinking_level_change用户切换思考级别
model_change用户切换模型
compaction上下文压缩记录
branch_summary分支切换时的摘要
customExtension 的自定义持久化数据
custom_messageExtension 注入上下文的自定义消息
label节点标签(用户命名分支)
session_infoSession 名称

树状结构带来的能力:

  • Fork,用户回到对话的任意节点,分叉一个新的对话方向。实现方式是复制 session 文件,parentId 指向 fork 点的 entry
  • Branch navigation,用户跳转到树中任意节点。目标节点不在当前分支时,系统生成 branch_summary(调 LLM 总结两个分支间的差异),然后 moveTo 到目标节点
  • Compaction,上下文过大时,系统将旧对话发给 LLM 做摘要,生成 compaction entry,保留摘要 + 最近 N 条消息,释放 context window 空间

SessionManagercore/session-manager.ts)封装了对 Session 文件的 CRUD 操作:

  • create(cwd) — 创建新 session
  • open(path) — 打开已有 session
  • forkFrom(sourcePath, cwd) — fork 一个 session
  • list(cwd) — 列出项目中的所有 session
  • continueRecent(cwd) — 恢复最近的 session
  • buildSessionContext() — 重建当前分支的上下文(从 leaf 走到 root)

buildSessionContext() 的逻辑:从当前 leaf 节点出发,沿着 parentId 链走到 root。如果路径上有 compaction entry,只保留 compaction 之后的消息。如果路径上有 branch_summary entry,将其作为上下文注入。最终返回一个 AgentMessage[],可以直接喂给 Agent。

如何加载 harness 相关的内容?

how pi-agent-core load harness related content? "pi-agent-core is a dumb executor. All harness-specific content (project context, AGENTS.md, skills, tool definitions) is resolved by the coding-agent's ResourceLoader and AgentSession, then injected into the agent as plain strings and tool objects. "

coding-agent 相关的代码,如何加载 harness 相关内容:

  • Resource Loading (src/core/resource-loader.ts):
  • System Prompt Assembly (src/core/system-prompt.ts):
  • AgentSession (src/core/agent-session.ts):

ResourceLoader(core/resource-loader.ts)是 harness 内容加载的中心,它的 reload() 方法按以下顺序加载所有内容:

1. 设置加载SettingsManager.reload() 加载全局设置(~/.pi/agent/settings.json)和项目设置(.pi/settings.json),合并优先级。

2. 资源路径解析PackageManager.resolve() 从多个来源收集资源路径:

  • 自动目录扫描:~/.pi/agent/skills/.pi/skills/.agents/skills/(从 cwd 向上到文件系统根目录)
  • settings.json 中的配置
  • Package 声明(npm 包中的 pi.skills 字段)
  • CLI 参数:--skill--extension
  • 每个路径标记了来源(source)和作用域(scope:user/project/temporary)

3. Extensions 加载loadExtensions(extensionPaths) 加载并初始化所有扩展。Extension 编译为 JS 模块运行在受限 runtime 中,可以注册 tools、commands、flags。

4. Skills 发现loadSkills() 扫描 skill 目录,解析 SKILL.md 文件(提取 frontmatter 中的 name、description、disable-model-invocation),只加载元数据,不加载完整内容。

5. Prompt Templates 加载loadPromptTemplates() 类似逻辑,解析 prompt template 文件。

6. Themes 加载loadThemeFromPath() 加载主题 JSON 文件。

7. Context Files 加载loadProjectContextFiles() 从三个位置读取:

  • ~/.pi/agent/ 下的 AGENTS.md 或 CLAUDE.md(全局级别)
  • cwd 向上到根目录的每个目录中的 AGENTS.md 或 CLAUDE.md(项目级别)
  • 离 cwd 越近的文件越排在后面(优先级越高,后加载覆盖前加载)

8. System Prompt 文件发现.pi/SYSTEM.md(项目级别)或 ~/.pi/agent/SYSTEM.md(全局级别)

9. Append System Prompt 文件发现.pi/APPEND_SYSTEM.md(项目级别)或 ~/.pi/agent/APPEND_SYSTEM.md(全局级别)

配置有什么?如何加载?以下是 Github Copilot GPT5.4 给出的一个时序图(mermaid 格式):

sequenceDiagram
    autonumber    
    actor User    
    participant CLI as main.ts    
    participant Args as parseArgs()    
    participant Session as createSessionManager()    
    participant Runtime as createRuntime()    
    participant Services as createAgentSessionServices()    
    participant Loader as DefaultResourceLoader    
    participant Settings as SettingsManager    
    participant Models as ModelRegistry    
    participant Agent as createAgentSessionFromServices()    
    participant SessionObj as AgentSession    
    participant Prompt as buildSystemPrompt()    
    participant Mode as Interactive/Print/RPC    
    participant LLM as Model Provider          
  
    User->>CLI: Start coding-agent CLI    
    CLI->>Args: parse args    
    Args-->>CLI: parsed flags, messages, resource options          
  
    alt early command
        CLI->>CLI: handlePackageCommand() / handleConfigCommand()
        CLI-->>User: exit early
    else normal startup
        CLI->>CLI: resolve app mode
        CLI->>CLI: run migrations
        CLI->>Settings: create startup settings manager
        CLI->>Session: createSessionManager(parsed, cwd, sessionDir)
        Session-->>CLI: SessionManager for effective session cwd
    
        CLI->>Runtime: createAgentSessionRuntime(createRuntime, { cwd, agentDir, sessionManager })    
        Runtime->>Services: createAgentSessionServices({ cwd, agentDir, authStorage, resourceLoaderOptions })
    
        Services->>Settings: create(cwd, agentDir)    
        Services->>Models: create(authStorage, models.json)    
        Services->>Loader: new DefaultResourceLoader({ cwd, agentDir, settingsManager, ...resourceLoaderOptions })
        Services->>Loader: reload()    
    
        Loader->>Loader: resolve extensions, skills, prompts, themes    
        Loader->>Loader: load AGENTS.md / CLAUDE.md from cwd ancestors
        Loader->>Loader: discover .pi/SYSTEM.md or agent SYSTEM.md
        Loader->>Loader: discover .pi/APPEND_SYSTEM.md or agent APPEND_SYSTEM.md
        Loader-->>Services: loaded resources + context files + prompt sources
    
        Services->>Models: register providers from extensions    
        Services-->>Runtime: services + diagnostics
    
        Runtime->>Runtime: resolve scoped models
        Runtime->>Runtime: build session options from CLI + settings + scope    
        Runtime->>Agent: createAgentSessionFromServices({ services, sessionManager, model, thinkingLevel, tools })
    
        Agent->>SessionObj: create AgentSession
        SessionObj->>Loader: getSystemPrompt()
        SessionObj->>Loader: getAppendSystemPrompt()
        SessionObj->>Loader: getSkills()
        SessionObj->>Loader: getAgentsFiles()    
        SessionObj->>Prompt: buildSystemPrompt({ customPrompt, appendSystemPrompt, skills, contextFiles, tools })    
        Prompt-->>SessionObj: final system prompt
    
        Agent-->>Runtime: session + modelFallbackMessage    
        Runtime-->>CLI: runtime
    
        CLI->>CLI: read piped stdin if not RPC    
        CLI->>CLI: prepareInitialMessage()    
        CLI->>CLI: initTheme()    
        CLI->>CLI: report diagnostics
    
        alt interactive mode    
            CLI->>Mode: new InteractiveMode(runtime, initial input)    
            Mode->>SessionObj: run()    
        else print/json mode    
            CLI->>Mode: runPrintMode(runtime, initial input)    
            Mode->>SessionObj: prompt(initial message)    
        else rpc mode    
            CLI->>Mode: runRpcMode(runtime)    
        end          
    
        SessionObj->>Loader: prompt templates available for /template expansion    
        SessionObj->>SessionObj: expand /skill and /template commands    
        SessionObj->>LLM: send messages with current system prompt    
        LLM-->>SessionObj: response/events    
        SessionObj-->>User: output in selected mode    
    end
如何管理记忆(memory)?

什么是记忆(memory)?为什么需要?

  • 记忆(memory):持久态,可以重新加载的上下文,跨 session

什么是 session?为什么需要?

  • 一次会话(conversation)的历史记录
A session in pi is the durable record of one agent conversation, including its tree structure, not just the current in-memory turn state.

Concretely, sessions are stored as JSONL files and each entry has an id and parentId, so pi can preserve branches, rewinds, forks, compactions, model changes, and message history over time. That is described in pi-mono/packages/coding-agent/README.md and implemented in pi-mono/packages/coding-agent/src/core/session-manager.ts.

pi 的 Memory 管理几个关键设计:

1. 树状结构而非线性历史

普通聊天应用是线性的(一条消息接一条消息),pi 用树状结构管理对话,每条 entry 有 idparentId。这带来的能力:

  • Fork,回到某个节点,从那里开始新的对话方向。底层是复制 JSONL 文件,设置新的 parentId
  • Branch navigation,用户在 TUI 中浏览对话树,跳转到任意节点。切换分支时自动生成 branch_summary,让 LLM 知道上下文发生了什么变化
  • Rewind,回到之前的某个点,丢弃之后的内容(本质上是切换到那个节点的分支)

2. Compaction(上下文压缩)

对话历史太长、超出模型的 context window 时,pi 自动触发 compaction:

  • prepareCompaction() 分析当前分支的 entries,算出哪些消息可以摘要、哪些必须保留(保留最近 N tokens,剩余发给 LLM 做摘要)
  • compact() 调用 LLM 生成摘要
  • 生成 compaction entry(包含 summary + firstKeptEntryId + tokensBefore),追加到 session
  • buildSessionContext() 重建时,遇到 compaction entry 从摘要开始,只加载 firstKeptEntryId 之后的消息
  • Compaction 也支持 hooks:session_before_compact / session_compact,Extension 可以干预摘要过程

compaction entry 像是对话树中的「压缩节点」,重建时自动解压,摘要本身可以被后续 compaction 再次摘要(递归压缩)。

3. Custom entries 支持 Extension 持久化

Extension 可以向 session 写入两种自定义数据:

  • custom entry,持久化 Extension 的私有状态(如文件编辑历史),不发送给 LLM
  • custom_message entry,持久化并注入 LLM 上下文(如外部系统的事件通知)

Agent 运行期间,pendingSessionWrites 缓存写入,turn 结束时批量刷入,不用每次 event 都触发磁盘 I/O。

借助 Github Copilot GPT5.4 给出的时序图(mermaid 格式)如下,概括来说:

sequenceDiagram
    autonumber
    actor User
    participant UI as Interactive/Print/RPC Mode
    participant Session as AgentSession
    participant Manager as SessionManager
    participant Store as Session JSONL File
    participant Builder as buildSessionContext()
    participant Compress as Compaction / Branch Summarization
    participant Msg as convertToLlm()
    participant LLM as Model Provider
    participant Ext as Extensions

    User->>UI: Send prompt
    UI->>Session: prompt(text, options)

    Session->>Session: expand /skill and /template
    Session->>Session: flush pending bash messages
    Session->>Session: inject pending next-turn messages

    opt extension pre-processing
        Session->>Ext: emitBeforeAgentStart(text, images, baseSystemPrompt)
        Ext-->>Session: extra custom messages and/or prompt override
    end

    Session->>LLM: agent.prompt(messages, systemPrompt)
    LLM-->>Session: assistant response / tool calls / usage

    Session->>Manager: appendMessage(user)
    Session->>Manager: appendMessage(assistant/tool/custom)
    Manager->>Store: append JSONL entries

    Note over Manager,Builder: Persistent memory is append-only session history

    opt session reload / startup / branch switch
        Session->>Manager: buildSessionContext()
        Manager->>Builder: rebuild current branch path
        Builder->>Builder: walk leaf to root
        Builder->>Builder: resolve model + thinking level

        alt compaction entry exists on path
            Builder->>Builder: emit compaction summary first
            Builder->>Builder: keep messages from firstKeptEntryId onward
            Builder->>Builder: append post-compaction messages
        else no compaction
            Builder->>Builder: emit full branch messages
        end

        Builder-->>Session: reconstructed AgentMessage[]
        Session->>Session: agent.state.messages = reconstructed messages
    end

    opt extension state persistence
        Ext->>Manager: appendCustomEntry(customType, data)
        Note over Manager,Store: Stored for extension restore only, not sent to LLM
    end

    opt extension context injection
        Ext->>Manager: appendCustomMessageEntry(customType, content, display)
        Note over Manager,Builder: Rebuilt as custom messages and included in LLM context
    end

    opt branch navigation
        Session->>Compress: generateBranchSummary(old branch)
        Compress-->>Manager: branch_summary entry
        Manager->>Store: append branch_summary
        Note over Builder: branch_summary becomes a synthetic user-context message
    end

    opt context grows too large
        Session->>Session: check compaction threshold / overflow
        Session->>Compress: compact(branch entries)
        Compress->>Msg: convertToLlm(messages selected for summary)
        Msg-->>Compress: LLM-compatible summary input
        Compress->>LLM: summarize older context
        LLM-->>Compress: summary text
        Compress-->>Manager: appendCompaction(summary, firstKeptEntryId, tokensBefore)
        Manager->>Store: append compaction entry
        Session->>Manager: buildSessionContext()
        Manager->>Builder: rebuild compacted context
        Builder-->>Session: summary + kept messages + newer messages
    end

    Note over Msg,LLM: Messages sent to the model are transformed view-memory, not raw session entries

    Session->>Msg: convertToLlm(agent.state.messages)
    Msg->>LLM: final model input for next turn
    LLM-->>User: next response
如何管理 skills 和按需加载?

这个问题是第一个如何加载 harness 相关内容相关,是不是可以放入一起?

How skills are managed?

At startup, it discovers skills from multiple sources:

  • Global dirs: ~/.pi/agent/skills/, ~/.agents/skills/
  • Project dirs: .pi/skills/, .agents/skills/ (cwd up to repo/filesystem root)
  • Packages: skills/ folders or pi.skills in package package.json
  • settings.json: skills array paths
  • CLI: --skill (repeatable)

Control flags/settings:

  • --no-skills disables auto discovery
  • --skill ... still adds explicitly even with --no-skills
  • enableSkillCommands controls /skill:name commands
  • /reload refreshes discovered skills during a session

How skills are loaded "as required"

  1. On startup, pi reads only each skill's metadata (name, description).
  2. It puts the available skill list into the system prompt (XML per Agent Skills spec).
  3. During a task, if a skill matches, the model should call read on that skill's SKILL.md.
  4. Full skill instructions are then used only for that task.

So: descriptions are always in context; full skill content is loaded on demand.

Forcing load when needed

  • Use /skill: to explicitly load and run it.
  • You can pass args: /skill:pdf-tools extract
    (args are appended as User: to the skill input).
  • If a skill has disable-model-invocation: true, it is hidden from auto-selection and must be invoked via /skill:name.

Skills 系统设计的几个原则:

1. 元数据在 prompt 里,完整内容按需加载

每个 skill 是一个目录,包含 SKILL.md(或其他 .md 文件)。SKILL.md 的 YAML frontmatter 定义 namedescriptiondisable-model-invocationloadSkills()harness/skills.ts)只解析 frontmatter 和 body,构造 { name, description, content, filePath } 对象。只有 namedescription 进入 system prompt(格式化为 <available_skills> XML 块,符合 agentskills.io 规范)。

LLM 看到 skill 的描述,判断是否匹配当前任务,匹配就调用 read 工具读取 SKILL.md 的完整路径。system prompt 不会因为大量 skills 而膨胀。

2. 多来源加载与优先级

Skills 来源发现由 PackageManager.resolve() 统一处理。自动发现的目录(.pi/skills/.agents/skills/)、settings.json 配置、npm package 声明、CLI 参数——这些路径被合并、去重,按优先级排序。每个 skill 标记了 sourceInfo,记录来源(sourcescopeorigin),用于调试和诊断。

3. Ignore 文件支持

Skill 目录支持 .gitignore.ignore.fdignore 规则,遍历时自动跳过被 ignore 的文件和目录。实验性的 skills 可以放在被 gitignore 的目录中,仍然会被加载。

4. 显式调用 Skills

用户可以通过 /skill:name args 显式调用 skill,系统把 skill 内容包装在 <skill> XML 标签中,作为 user message 发送。如果 skill 设置了 disable-model-invocation: true,它不会出现在 <available_skills> 中,只能通过 /skill:name 显式调用——适合危险操作或实验性功能。

5. Agent Skills 规范

pi 的 skills 格式遵循 agentskills.io 规范。Skill 文件的 frontmatter 验证规则:

  • name:必须匹配父目录名,小写字母+数字+连字符,不超过 64 字符
  • description:必填,不超过 1024 字符
  • disable-model-invocation:可选布尔值
   sequenceDiagram                                                                                                  
       autonumber                                                                                                   
       actor U as User                                                                                              
       participant CLI as CLI Parser (args.ts)                                                                      
       participant Main as main.ts                                                                                  
       participant SM as SettingsManager                                                                            
       participant PM as DefaultPackageManager                                                                      
       participant RL as DefaultResourceLoader                                                                      
       participant SK as skills.ts (loadSkills)                                                                     
       participant FS as Filesystem                                                                                 
       participant AS as AgentSession                                                                               
       participant SP as system-prompt.ts                                                                           
       participant LLM as Model                                                                                     
       participant RT as read tool  
       
       U->>CLI: pi [--skill ...] [--no-skills]                                                                      
       CLI-->>Main: parsed.skills, parsed.noSkills                                                                  
       Main->>RL: create with additionalSkillPaths + noSkills                                                       
       RL->>SM: reload settings (global + project)                                                                  
       RL->>PM: resolve resources (auto dirs + settings + packages + CLI)                                         
       PM->>FS: scan ~/.pi/agent/skills, ~/.agents/skills                                                           
       PM->>FS: scan .pi/skills + ancestor .agents/skills                                                           
       PM-->>RL: resolved skill paths (with precedence/enabled flags)                                             
       
       RL->>SK: loadSkills({skillPaths, includeDefaults:false})                                                     
       SK->>FS: read SKILL.md / root .md per discovery rules                                                        
       SK-->>RL: skills[] + diagnostics                                                                             
       RL-->>AS: resourceLoader.getSkills()                                                                         
    
       AS->>SP: buildSystemPrompt({skills,...})
       SP-->>AS: prompt + <available_skills> metadata (if read tool enabled)
       AS->>LLM: send system prompt + user message                                                                  
    
       alt Auto skill load (on-demand)                                                                              
           LLM->>RT: read(<skill location from available_skills>)                                                   
           RT->>FS: read SKILL.md                                                                                   
           FS-->>RT: full skill content                                                                             
           RT-->>LLM: skill instructions                                                                            
           LLM->>AS: continue task using skill guidance                                                             
       else Explicit command (/skill:name args)                                                                     
           U->>AS: /skill:name args                                                                                 
           AS->>FS: read SKILL.md (expand command)                                                                  
           FS-->>AS: file content                                                                                   
           AS->>AS: strip frontmatter, wrap <skill ...>, append args                                                
           AS->>LLM: send expanded skill block as user message                                                   
       end                                                                                                          

Bub

(待补充:分析 Bub 的 Agent 实现,特别是 tape 系统和 Telegram 集成)

Claude Code

(待补充:分析 Claude Code 的 harness 设计,参考 ccunpacked.dev 和 ZaynHao 的文章)

对于目前技术方向,自己的理解和一点思考

分析完 pi-mono 的实现,对「如何开发一个 Agent」有了更具体的认识:

1. Agent 的核心是 Loop + Context,不是模型

注意力容易放在「用什么模型」上,但 Agent 的工程挑战在模型之外。模型只是 loop 中的一个环节——输入消息,输出响应。真正的复杂度在:上下文怎么不爆炸(compaction)、对话中怎么注入正确的信息(system prompt + AGENTS.md + skills 按需加载)、工具调用失败怎么降级、对话状态怎么持久化和恢复。

pi-mono 花了大量代码在 session 管理、compaction、resource loading 上——这些才是 Agent 的骨架。模型升级了换配置就行,基础设施设计不好,后面改起来很痛。

2. 分层设计让 Agent 可扩展

pi-mono 的 core / harness / cli 三层分离是精心设计的。Agent core 不包含任何「产品」逻辑,只提供运行 Agent 的运行时。产品相关的决策(加载什么资源、提供什么工具、构建什么 system prompt)都在 harness 层。基于同一个 core 可以做 coding agent、客服 agent、数据分析 agent——换 harness 层就行。

3. Session 的树状结构是 Agent 的「时间旅行」

普通聊天应用的线性历史在 Agent 的多轮协作场景下不够用。用户可能想回到之前的某个决策点,换个方向。pi 的树状 session + fork + branch summary 解决了这个问题。特别是 branch summary,不是机械拼接历史消息,而是让 LLM 总结两个分支的差异,切换分支后模型能快速理解上下文变化。

4. Skills 的按需加载是上下文管理的典型做法

把 skills 的元数据放在 system prompt 里,完整内容通过 read 工具按需加载——它把「告诉模型有什么能力」和「告诉模型怎么用这个能力」分开了。元数据始终在上下文(成本低),完整指令只在相关任务时加载(按需付费)。

5. Extension 系统让 Agent 从「工具」变成「平台」

pi 的 extension 系统支持注册自定义工具、命令、flag,通过 hooks(before_agent_startbefore_provider_requesttool_calltool_result 等)介入 Agent 各环节。这让 pi 从「一个 coding agent 工具」变成了「一个可以构建各种 Agent 应用的平台」。

什么是未来

阅读 pi-mono 的代码,同时参考 Mitchel Hashimoto 的 My AI Adoption Journey 和 Anthropic 的 Harness design for long-running application development,对 Agent 的未来方向有几条判断:

1. Harness Engineering 会成为独立领域

模型能力在快速提升,但 Agent 的 harness(系统提示词、上下文管理、工具设计、session 管理、扩展系统)才决定实际使用体验。Harness Engineering 会像 DevOps、SRE 一样,逐渐成为一个被认可的工程方向。

2. Agent 的「记忆」会越来越重要

目前的 Agent 记忆主要靠「把历史消息塞进 context window」。随着 Agent 处理越来越长期的任务(跨天、跨周的项目开发),需要更智能的记忆机制——不只是 compaction,而是结构化的知识提取、任务状态追踪、决策理由记录。pi 的树状 session + custom entries 是这个方向的早期探索。

3. Multi-Agent 协作

pi-mono 目前是单 Agent 架构,但它还有一个 pi-pods 包没有深入分析,可能跟多 Agent 相关。未来多个 Agent 各司其职(一个写代码、一个 review、一个测试),通过结构化通信协议协作——这个方向值得关注。

4. Agent 的「操作系统化」

Claude Code 被描述为「运行在终端里的 AI 操作系统」。Agent 不再只是「对话机器人」,而是一个协调工具、管理状态、持久化记忆、执行后台任务的操作系统级抽象。shell 是它的内核,tools 是它的驱动,skills 是它的应用。

自己开发一个 Agent,需要如何做

基于对 pi-mono 的分析,自己开发一个 Coding Agent,可以按这个顺序来:

第一步:跑通最小 loop,对接一个 LLM API(Anthropic / OpenAI 或兼容接口),实现基本的 prompt → response → display 流程。这是「Hello World」,验证你能和模型对话。

第二步:加入工具调用,先加一个最简单的工具(read 读文件),实现 tool call 的解析、执行、结果回传,验证 LLM 能正确使用工具。然后逐步加更多工具(basheditwrite)。

第三步:上下文管理,实现对话历史的管理(线性数组开始就行),上下文压缩(messages 太多时,取最近 N 条 + 对旧消息做摘要),加载项目上下文(读取 AGENTS.md 或类似的项目说明文件)。

第四步:System Prompt 设计,角色设定、工具使用指南、项目上下文,持续迭代调优。这是最需要「手感」的部分。

第五步:Session 持久化,保存对话历史到文件(JSONL 是个好选择),支持恢复历史会话,fork 可选但很有用。

第六步:Skills 系统,支持加载外部 skill 文件,元数据进 system prompt,完整内容按需加载,支持 /skill:name 显式调用。

第七步:TUI / 交互体验,命令行交互界面、流式显示 AI 输出、工具调用的可视化反馈。

核心思路:先让 Agent 能跑起来,哪怕只有最基础的功能,然后基于实际使用逐步迭代。 不要一开始就设计复杂架构——pi-mono 的架构也是迭代出来的(commit 历史可以作证)。

参考

关于共通的一些话题

关于 pi-mono

关于 Bub

关于 Harness

分析 Claude Code 的代码

关于 ironcode - codedump

  • "为了学习如何实现一个Agent,我用Rust照着Python实现的kimi-cli在写一个coding agent,名字叫ironcode,目前还比较粗糙,后面如果能做到:用ironcode的agent来编码ironcode自身就有意思了。项目地址:https://github.com/lichuang/ironcode"

关于 Agent 学习的一些参考

还是和上周一样,多想多写多做,而不是一直的消化吸收他人的,本周博客上改成每周小结的标题,另外加投资方面的小结。

本周观影

  • 《风味人间第一季 2 落地生根:石子馍/馕饼,法式面包,枕头馍,羊肉泡馍,酿皮,包子,伊朗和中国;生鱼片,中日;马来西亚中国的传统,秘鲁利马的中餐;澳门,葡菜;浙江龙泉祈福,种田杀猪包粽祭祀,想不到浙江还有保持这种传统的地方,我老家是没有了。
  • 《盗火线》:95 年老片,情节我觉得一般,但有罗伯特德尼罗啊,能看看。

本周阅读

本周读书时间少了(晚上没看 Kindle 有关系,另外一方面也要留出来时间来读,不然就是有一搭没一搭),不过和自己交流的时间多了,写下了不少。

  • 《金融怪杰》
  • 《笑傲股市》

本周播客

发现一个新的播客《跨国串门儿计划》,X 上看人推荐的一期(#533. Anthropic如何运营一个 AI 原生工程组织),其他的内容也看了看,貌似挺好,后续我会挑更多一些看一下。

https://x.com/ZaynHao/status/2054714515854606632,也有视频版本(参考 https://x.com/ZaynHao/status/2054742909875019828

强烈推荐这期播客,这是最近听到的非常实用,信息不拖沓的 Claude Code (Anthropic)团队是如何运营组织,如何工作的分享。
非常适合身处或正在管理构建 AI Agent 产品的团队朋友听。
里面有很详实的故事来讲述他们团队的分工,大家的做事方式,以及变化等。
很实用。

提出针对个人投资者的具体、可执行的建议:

  1. 核心工具:推荐通过构建低成本、分散化的ETF组合(如A股、美股、黄金ETF)进行投资,这是“节流”的最佳方式。
  2. 关键心态:投资的最终收益取决于敢下多大的仓位并长期持有。构想一个让你买了之后“敢忘记账户密码”放一年的组合,就是好组合。
  3. 自我修炼:坚持每日记录与复盘,成功的模式难以复制,但降低重复犯错的频率就是最大的进步。

本身这个行业,也许我不会关注,但是嘉宾刘重杰(招商基金基金经理)对于行业的思考以及基金经理的思考框架是我可以学习的;其中一点,出海的企业,当地偏好、习惯、行业标准等有磨合过程,但是一定会出去,中国的产业链,有海外营收的有竞争力的,目前还是少数,管理层很勤奋,更广的市场,出海的利润是不是留在国内了,如果有这个情况,是个值得关注的信号。

必选消费和可选消费,分析框架应该完全不一样。 猪肉是刚需标准品,价格再便宜你也不能多吃多少,价格再贵也得买,所以供给的波动才是价格剧烈波动的根本;白酒则不同,剔除高端商务场景之后,它的需求对价格是有弹性的。这两个行业,受经济环境的影响机制,从根本上就不是一回事。他还提出了一个有点“扎心”的判断:食品饮料在GDP中的占比,会缓慢而坚定地下降——这恰恰是一个经济体走向成熟的标志。但这不意味着食品饮料没有投资机会。生意只有这么大规模,不代表这家公司没有利润。而个股层面,他认为:那些已经在布局出海的管理层,是他最愿意关注的信号。

本周胡思乱想

  • 最近又在做减法,信息流、自己的消耗。
  • 关于 AI/LLM 的各种考虑:

    • 这几天我在看如何更好组织 AI 时代的代码结构,有些是有共识的,但是 .harness 这样好像也没啥共识。
    • AGENTS.md 是有共识,要有 rules/changes 类似结构的共识,项目级别共享 skills 这个也不一定有共识;AGENTS.md 是个标准了,README.md 是给人看的,AGENTS.md 是给 AI 看的;.harness 下面解决的就是对 agent 的纠偏,团队层面可以设置一套通用的规范体系。
    • Skills 我是觉得也许还不如在项目方便共享,但是从企业开发来说,要解决的是团队层面的共享和不断迭代更新;global skills + local skills 也许对于企业来说是个更好的选择。
    • 人为的因素要通过自动化的过程和技术把影响降下来,我现在有点理解过去人说的,harness 其实就是约束。
    • AI 代码,其实现在有个趋势都是朝 mono code repo 靠,是有道理的,AI 可以足够的了解到整个开发的细节,远比人强,因为上下文足够的大了。
    • AI native 时代,AI builder 是个更合适的路径。
    • 我今天其实和不同人都聊了不少东西,核心的一点,就现在我们的工具体系和组织流程,AI 只是给我们提效,而不是本质上的一个转变,当然能做到提效也够了,但是提效的前提也是工具体系和组织流程和人的角色的变更。
    • https://github.com/Ar9av/obsidian-wiki :看这种项目的 skills 组织,以及 AGENTS/CLAUDE md 的关系(CLAUDE 指向 AGENTS),项目组织就很通用,在各家之间可以灵活切换。
  • 昨晚没睡好,一方面是睡前聊的太多了,到此为止,不再试着去想着“教育”他人,更多应该只是分享我自己的分享。
  • 继续寻找其他可能性,不要停止,不要温水煮青蛙。
  • 折腾的一周,无聊的工作,同时不要把这样的信息传递给他人,我不是他人的天使或地狱,我只是我自己,不要放弃其他的可能。
  • 学业上,如何可以更好帮助孩子,我没答案也没实际能做的,这个时间节点上我感觉自己能做的很少,但是我一直记着要尝试着做点什么,也许润物细无声应该是常态。

本周投资

  • 重新梳理了一下投资的分层思考和结构,分为适合我自己的三层:

    • 不动和追求 alpha 仓:长期持有,如果没有其他合适的,不考虑卖出;
    • 股息和追求 beta 仓:现金流不求高收益;
    • 试水仓:尝试提升我自己的交易策略和能力,同时结合行业轮动进行买卖,期望博取一些更多的机会;操作来说,控制在 10% 左右的仓位,需要考虑何时卖出:20% 跌幅卖出,2 个月内不动卖出,涨幅过 20%卖出或归入第一层去等等。
  • 买入 DRAM 存储方面的试水仓,极度拥挤,目前是负收益,回过头看想象存储还是会继续往上的,但也许是周期性的;NOW 是上月买入的,目前也还是负收益,但是本周有起伏,从过去财报来说其“当前未履约合同金额(cRPO)”还是可以的,但未来需要看看重 SaaS 企业的 token 收入(看同事分享的 Datadog 上的 AI 能力,可以说是突飞猛进),持续观察。
  • A 股方面没有任何操作,我把美的加入了观察名单,也看过一段时间的中远海控,但还是放弃了,看不懂;从上面说的三层仓位来说,还远远没完成构建,还在第一层和第二层的构建中,第三层在 A 股方向上我是犹豫的,感觉做不好。
  • 基金方面,我部分放弃了了美债(国债加美元企业债)方面的投入(美元持续走弱,汇率方面的损失导致了收益持续下滑),暂时考虑买入同公司的全球科技方向上去,但当下时间节点也许是错的,太拥挤了,这两个月虽然收益很好,但是今年全年看未必,怕会有巨大的回撤。

本周文章

创作、交易与精神独立

十分认同博主的观点,为自己而写作,而不是通过写作想博取什么,也正好看到了这篇 about writing,也摘录了很多观点,关于为什么要写,核心一点还是为了提升自己,梳理自己逻辑和思路,和自己对话。

当你不再把博客当成一项任务,不再向外寻求认同,那么「难」这个字也就不存在了。因为这时候,你已经不是在为了满足谁的「消费欲望」而写作,你只是在完成一次与自己的对话。

更多参考:为什么要写周记

AI 上游投资机会分类学

看到有人分享的,署名是"作者:GPT 5.5 Pro" AI 分析的真好啊,结合"存储投资综述"这个材料看,理解的更好(存储投资综述这个材料真好,理解存储为什么这么短缺以及上下游的产业链);回顾在这方面的投资看,没踏好这一波的浪潮,第一类的从光到存储的方面的热点,是不是能踏上文中说的第二类收益的机会,需要自己好好的研究。

I returned to AWS - and was reminded HARD why I left.

对我不需要弃用选其他,也不是说 AWS 不行,是通过这种文章可以有个更多的了解,对于 AWS 服务的利弊,以及业界的一些讨论,如:DynamoDB 贵,出的流量贵,IAM 复杂,Lambda 的问题,以及对于开源生态的影响等等;相关 Hacker News 上的 thread(对于上面文章的讨论):https://news.ycombinator.com/item?id=48073201,还是讨论的很热烈,特别是对于 open source 的利用。

Notes from inside China's AI labs

一个外人的视角看中国的 AI 情况,还是比较正面的,对于国内这些个公司的他真的是个外部人的视角,几家头部的情况有时候不一定如他说的那么好,DeepSeek 可能反而的确是个“异类”,和互联网的那几家是有些区别(其实这个结论我一个外人也是瞎说);我们需要全球化的合作和走出去,这种对于中国的 AI 或整个技术社区的情况一个叙述,无论怎么看都是利于我们的。

LanceDB 选型指南:它为什么这么火,以及你的项目是否该用它

多模态时代,Lance/LanceDB 在整个生态里面还是值得看一看,这个文章也分析的很清楚,利弊和适用的场景。

Lance 格式是一种列式存储格式,针对多模态 AI 数据做了优化,2022 年 7 月创建。它的技术亮点独立于 LanceDB 数据库存在。
LanceDB 数据库是构建在 Lance 格式之上的 embedded 数据库产品,2023 年 2 月创建,Apache 2.0 协议。开发体验和产品定位是独立于格式本身的工程和产品决策。

假期结束,上班的周六,再提醒一下自己,多想多写多做,少看点没关系。

本周观影

  • 12天探索雪山下的非洲火山岛| 熔岩荒原 月桂森林 玻璃海 废弃麻风村:百万人口的大岛,挺好玩的岛,感谢博主的视频分享并传授各种知识;超市有便宜的酒,是酒鬼的天堂,巨浪、雪山(TEIDE 泰达峰,西班牙的最高峰),天文台;找一个小时充电桩的经历让我想起了英国的经历,最后博主联系租车公司还是建议换了油车;参观博物馆,看生态系统说明,不同海拔丰富多样的物种;茂密独有的照业林;钓鱼佬;加纳利松;信任 AI 去错了取水井的遗迹;环地质公园;暴风雨、山体滑坡和龙血树;南部有点希腊风;各种美食,还有中餐;最后,风暴航班取消,航空公司安排不错,安排酒店和接送。下一站,La Palma。
这次我将来到加那利群岛中人口最多且面积最大的特内里费岛
用12天的时间探索这片以生态多样>而闻名的迷你大陆
徒步雪山下的的熔岩荒漠
穿越云海中的月桂森林 参观废弃的工程遗迹
探索为风病人建造的小镇
并品尝当地的各种美食
最后还因风暴来袭被困机场
  • 看了《第九区 District 9 (2009)》:虫族和人类之争,谁的问题?或有对错吗?不是我喜欢的类型,不过也能看看,剧情一般。
  • 看了《女人,四十》,萧芳芳主演的女主真不容易,疼她的婆婆突然走了,老爷子老年痴呆症,靠自己家里人照顾是个异常累心累力的事了,丈夫兄弟其他姐妹也不管,只能一家人自己扛,送养老院其实也挺难找的,生活的困境啊,只有自己懂,只能自己扛,这部贵在真实和一帮老戏骨们而非情节。
  • 看了《飞驰人生 3》,是不是首先是个车手才能导出这样的赛车电影?韩导厉害,看后半段的比赛段落的确很燃。

本周阅读

  • 《金融怪杰》:艾迪·塞柯塔我个人觉得非常好看(可能是因为他聊的我自己好像也能懂,我说的是可能,不一定真的懂了),从哲学和人性去看市场,自己做系统利用趋势交易;威廉·欧奈尔的观点,我个人是非常认同,选股和原则都是非常值得学习的,还没看过他的《笑傲股市》,和他公司的大卫·瑞安,也是一脉相承。
  • 《三体》:重新读了一下三体,快速的读完了三本,还是觉得真好看,刘慈欣的想象力非凡。

本周播客

这周听了好多播客,一方面是五一假期,另外一方面也是更多利用了平常的时间,早完开车、工作前或间隙和晚上跑步的时候。

  • E53 拥有很多钱,才能考虑做资产配置吗?:关于如何做资产配置,听了还是挺有收获的,总结一句就是想清楚需求通过资产配置去实现,下面是自己零碎记录的片段。

    • 从机构投资者的经验如何管自己的钱,机构投资者有全球视野,个人投资者也要具备
    • 买了一堆境外 QDII ETF,对标的所在国不了解拿不住,没有增加很多收益,反而增加了一堆焦虑,是个很大的负担
    • 境外资产是否需要配置?看是否有需求
    • 资产配置的范畴,更大的视野去看,而不只是自己个人的资产
    • 情绪能力决定了个体的差异,不要追涨杀跌,随意操作等等
    • 考虑长期、中期和短期,不同期限的账户,有个投资主题,配备不同的资产
    • 结构比例,如:黄金配置 5%(3 ~10%,低配、中配或超配),其和大类资产弱相关,参考大鹏之前的说法,应该配置实物黄金,组合比例和资产多少无关
    • 一步一步搭建出自己的框架?08 年亏光了,无法熬过,肯定会缴学费,少的时候去缴学费;慢慢搭建框架,从稳健的现金流走出来,工作上不下个人投资也不行,强相关,调整就是换了工作,人力资产转移,工资和职业稳定;职业生涯跳出来,自由职业者,金融资产调整,考虑是不是往稳定现金流等生息资产转移
    • 80% 的收益是决定于自己心理和行动,心理建设,分短中长,看好个人的资产负债和现金流表,资产规划会让行为会稳定很多,经历和实践决定了会去做什么(能力圈)和相信什么;投资是对世界观的投票
    • “降低决策速度,减少决策数量”,要有冷静期,类似机构投资者的股票池,决定投资是否成功的是慢思考;一个股票占据的资产比例,为什么要压上去,说清楚
    • “定期复盘”,一些时间点上的看法和想法,过段时间会忘,每个月或每个季度复盘足够了,反之是给情绪造成影响,通过这样的方式是积累,投资缴学费不可怕,但是需要定期总结和复盘,长周期的维度去看,更底层的思维模式去复盘,作用是每一代人都有周期,对于能不能抓住浪头有帮助
    • 要有多元配置的概念,回归到大家自己的需求

除了陈博士,这个播客下面这个参与人,思路和表达非常清晰,学习,上一讲是 E52 和大卫翁聊聊:面对机构投资者,个人真的毫无胜算吗?

大卫翁:《起朱楼宴宾客》主播,美国哥伦比亚大学访问学者,逾二十年金融行业工作经验,前头部中资投行董事总经理,资产配置学派坚决拥护者。
”中国籍的全球公司" — 出海新范式,本地化分三层:1)制造本地化,如:申洲国际柬埔寨工厂(但效率低、成本高、关税仍需分担); 2)供应链/产业集群本地化,如:宁德时代覆盖75国售后、赣锋锂业非洲锂矿、顺丰赋能茶饮出海;3)研发本地化,如:百济神州3800人全球临床团队、环旭电子与品牌商深度技术协同。
我在意“组织能不能长出能力”多于“授权换来结果”
2025年就你个人而言,你专注的那个事情是什么:“回到 IP 本身,专注到哪些 IP,更聚焦”
Labubu爆火,我们“灭火”
“集团化”比“全球化”还要更难:“集团化是以 IP 为核心的产业化,集团化和全球化是两个战略”,验证更多 IP 的可能性
泡泡玛特会考虑奢侈品牌的一些运营方式吗:“专注持续运营,形成基本盘,看家的东西,多少比例做创新,固化经典” “经典款/品类”
AI会怎么影响泡泡玛特在做的事情:“更加极致的线下体验,投入更多的是线下乐园”
  • 宋方金×罗永浩!故事必须有人讲下去:B 站上重新看和小宇宙上重新听,宋方金是真牛,口才和思路异常好,非常好玩。

    • 演员和演员之间惺惺相惜,演技是存在的,如:陈道明又帅演技又好;这是一个演员,是一个电影演员,这是一个艺人,这是一个偶像,电影演员和剧集是不通的
    • 足够丰富和层次多态,表演的质感,分布的复杂性,现在都没有了,原来招的是生旦净末丑,毕业可以组成大戏,现在是帅哥美女
    • 演员陈道明很厚道,越走近也佩服;导演张艺谋很厚道,张署名为故事或署名在编剧之后,挖掘了很多演员
    • 编剧署名乱象,行业规则和规范约束
    • 创意
  • 一个简单到不能再简单的指数投资策略:简单听了一下策略,7+3(宽基+行业指数,行业里面继续细分),左侧为主,右侧也不是不可以(比如目前的行情看),考虑的是一把买入。

本周胡思乱想

  • 目前 AI Coding,有几个不同的选择,看看哪个更合适,也许最省钱的最合适,如果差异不是巨大的话:CC + GLM, CC + DeepSeek, GitHub Copilot
  • 看 B 站视频,有一个趋势,不太想看说我朝不好的,这个也是 B 站上所有国外人展示和想给我们看的的视频,但是我心里一直在说服自己,其实不应该是那样的。
  • 如何让自己变得更好品味,这里品味主要是说设计方向的,比如:App 和站点设计,UI 设计等等,是不是通过拍照和欣赏好的作品是一个途径?也考虑构建一个训练品味的站点。
  • 一定要试着构建而不是天天在看不同博客,在想,多写点什么,多做点什么。
  • 感觉自己想开了不少东西,静观其变,积极寻求其他可能。
  • 关于 Agent

    • 我觉得企业  Agent 开发其实也不用搞特别复杂,核心还是记忆的管理,其他都是锦上添花,看具体场景是否合适是否需要。
    • Agent 要看评测效果,我觉得不能过度工程化,先简单开始,如何评测效果要考虑。
    • Agent 可能要分层看,如果是解决工程效率问题的,更多就是利用好 Coding Agent 和大模型,形成最佳实践和积累(如 Skills 集合),这里可能要看看如何降本,如何自己做一层优化一下 input/output。
  • (五一假期有感)感觉对于 AI 和技术失去了热情了,不知道做点啥好的感觉,反而是投资、写作和阅读让我长久可以做下去的感觉,还是得重拾技术上的兴趣,持续折腾,毕竟我还是个技术人还在工作。
  • 覆盖日常支出(短期),孩子和家庭养老的大头支出(中长期),想清楚需求通过资产配置去实现。
  • 在老家时间越多越想着尽快可以早点回老家安安静静过后半生,我不是喜欢热闹的人,小镇的生活适合自己,希望早点做好规划和想清楚。

本周文章

AI 方面的文章有点多,和上面说的那样,有点倦怠了,要吐了,但是需要坚持看下去,多想多输出,可以少看或不看(确保读点好的,特别是外面世界的),个人来说掌握一套体系和工具链就够了,企业开发的就是考虑工程化管理,工具平台和方法组织体系的演进,个人来说:

  • 如何说清楚需求?- SDD 是一种方式
  • 如何做 plan,同时调整?- 先让 AI/LLM 设计 /plan,人在这个过程中给予持续的反馈,也即动手之前先说清楚
  • 如何实现,并做 feedback?- 如何给 AI/LLM 持续的反馈,在实现过程中,可以是自动化的基于目标的 feddback,类似 OpenAI Codex 最近出的 /goal
  • 如何持续迭代,形成飞轮?这个要结合工程管理和工具平台的持续演进,包括方法论,目前 squad 以及 scrum 流程也许都不适用了

下面的几篇,其实可以解决个人研发上面说的几个方面的问题(微信这个体系下面,如何可以通过 RSS 订阅,以及找到相应的短链接,也是不容易)。

Agent 时代的生产力悖论:当协作本身成为最大的瓶颈

这个文章和团队开发的协作体系有关,也和工具平台变化有关。

我在 Gridea 思考箱里记的笔记,变成了 Minttr

以下引文来自上面的 X 信息,作者从自己做产品的历程出发(Gridea: gridea.dev · Minttr: minttr.com),谈到了产品创意可能来自不经意的一些想法和思考,对我来说其实一直是动手的门槛,包括过去一直想做对开源的贡献,怎么说呢?我要继续努力,一直知道是啥问题,但是从未改变,看看是不是可以做出点啥,从自己每天的杂记出发。

如果你也在做点什么——产品、写作、独立项目、副业——

不要等“想清楚了”才开始记。你现在记下的这条粗糙的、半成品的、没人会看的笔记,可能就是你三年后产品的种子。

也不必给自己整一套“知识管理体系”。只要有一个地方,可以让你低门槛地、不被打扰地、把脑子里冒出来的东西丢进去。

那个地方对我来说,是 Gridea 思考箱,后来是 Minttr。对你来说可以是任何东西。

只要它存在,就够了。

几年后某一天,你会回过头打开这些笔记,看到一个你已经认不出来的自己——以及他不知不觉给你留下的几颗种子。

Infinitum:懒人阅读方案 2.0,让信息聚合真正跑起来

特别佩服有想法又有行动力的人,我也一直考虑结合自己的 RSS 如何更好打造自己的阅读工具链,但是又怕 AI 耽误了自己的思考,再看看再想想吧。

为什么要写作

非常认同这个文章的观点,以及文中的相关引用,包括 Paul Graham 的 Writes and Write-Nots 和 37Signals 的 Hire good writers

既然写作是一件收益很高的事,为什么真正写作的人却越来越少了呢?因为它本质上就是一件难事。

首先,它要求你同时做好两件截然不同的事:思考和表达。想要写得好,必须先想得清,而清晰的思考绝非易事,它需要你静下心来去啃透问题的方方面面,确保没有错误和遗漏,然后再形成一个大纲。但如果按照这个大纲去写,又容易掉进另一个陷阱:忽视了读者视角。gwern 在 First, Make Me Care 这篇文章专门讲了这个问题,他以威尼斯这座城市为例,展示了读者视角和非读者视角在内容呈现上的差异。前期准备工作完成后,精准的语言表达也极具挑战,如果没有经过刻意训练,文字和真实想表达的内容之间就可能出现错配。

除此之外,还容易被自己的品味打压。作为阅读者,你的品味往往远高于你当前的写作能力,当你写出第一稿时,你的高品味会立刻觉察到它的粗糙,这种落差会带来极大的自我怀疑和挫败感。要缩小这个差距,唯一的办法就是持续创作。_why 的这段话,用在写作上也一样合适:当你停止创造,你的才能就不再重要,你所拥有的只剩下你的品味。而品味会裹挟你,让你排斥他人、变得狭隘。所以,去创造吧。“when you don't create things, you become defined by your tastes rather than ability. your tastes only narrow & exclude people. so create.” - Why The Lucky Stiff

如果你在几个候选人之间犹豫不决,请务必聘用那个文笔更好的人。无论对方是设计师、程序员、市场营销还是销售人员,优秀的写作能力都会显现出其价值。因为简洁、高效的写作与编辑,往往意味着同样简洁、高效的代码、设计、邮件及日常沟通。
That’s because being a good writer is about more than words. Good writers know how to communicate. They make things easy to understand. They can put themselves in someone else’s shoes. They know what to omit. They think clearly. And those are the qualities you need.

积跬步以至千里

雪球上的文章,写的非常好,坚持习惯、丰富阅历和提升认知,在时间的累积下发挥复利的力量,同时集中持股,要能下重手。

我成长的教育系统里,个人财务和投资的知识完全缺失。如果你没有头绪从哪里开始,推荐几本书:个人财务方面,读JL Collins;股票投资方面,读John Bogle关于指数基金投资的书、格雷厄姆的《聪明的投资者》,以及任何口碑好的巴菲特和芒格相关读物。

其一,必须是总体账户收益率超越平均——如果你持有相当比例的现金仓位,股票部分的表现就要更突出。这一点我自己没有完全做到。我做到的是,去除现金仓位之后的收益大概和标普500持平,但我的持仓估值远低于标普500,总体风险小一些。
其二,想超越标普500,必须集中持仓——持有超过10只股票,大概率很难跑赢指数。
其三,集中的代价是对选股精准度要求极高。
其四,操作频率要非常低——一年内大比例仓位的变动超过一次,往往带来负面结果。
其五,出手时仓位一定要够大。这个真是太难了,今年有所进步,但还是我在修行的一个过程。

五一假期的一周,提前一天回家,错开车流高峰,2 号周六还去趟绍兴安昌古镇和河埠头(在有名的河埠头饭店吃了顿饭),体验还算不错,人流和车流都不太大;静下来还是想着工作上的事情(和老板说也没啥机会,绩效也就那样了,表达了想走的意思),看后面的路如何走吧,没有合适的机会我暂时肯定是不会走的,虽然工作上的人和事一直都是这样,但是随着年纪上来,有时候心态上反而难调整好,一定早日脱离无聊和令人烦恼的工作。

本周观影

  • 看了《我的美食向导 - 云南篇》,看完了也在豆瓣上标记了一下,“陈导是个文化人,也是个吃货。”;版纳村寨赶集,河里的青苔;云南讲武堂,翠湖,粗米线,吃菌子,一直提到汪曾祺,见手青+干巴菌, 菜场看到云南具有不同气候下的菜的品类繁多;勐腊麻芡,又香又麻, 喃咪 - 蘸水繁多,后调味系统,吃的智慧;辣,云南 - 人口和物产垂直分布,无体系而自成一体;回到历史再到吃,历史和人口迁徙,弥渡 - 交通驿站,寻麻,骨头滲,弥渡卷蹄;大理,反而无法谈吃,而是经济,这是现实。
  • 看了《降临》,感觉有点玄妙,继续回味中。

本周阅读

  • 《金融怪杰》:听了播客《精分派》的张翼轸推荐的书,说过去有 5 本,最近会新出一本,在看,还不错,不同人物不同的交易历程。

本周播客

最近听的播客以投资类为主,喜欢的几个有:《厚雪长坡》、《面基》、《投资 ABC》、《知行小酒馆》、《精分派》和《自由进度条》;其他播客还有《十字路口Crossing》、《半拿铁》和《曳尾于涂 | 罪案纪实》等等(还有其他不少,不一一列了)。

五个研究组,五十只股票,一套穿越周期的家底

价值投资和成长投资不一样,价值股和成长股,价值股难度低,成长股要投入大量人力和物力,不要用价值股的衡量标准去评估成长股(如:不要用 PE 衡量,未来的规模去测算);成长投资不是止损的方式操作的,股价不涨有股息也不错,没有比较周期;真正赚钱都是左侧布局,以买断公司为标准。

抛开本身说的内容之外,吴伟志(中欧瑞博董事长、首席投资官)本身的思考和表达都是一流,这是需要学习的地方。

我们聊了一系列关键问题:白酒跌到什么位置才算真正的机会?成长与价值为何必须各自闭环、不能混搭?左侧布局该怎么控制仓位、分阶段加仓?如何从消费、科技、医药、周期、价值五大投研组筛出50-80只核心标的?成长股和价值股的估值逻辑到底差在哪?为什么AI能提升效率,但替代不了深度研究与主观决策?主观与量化又该如何融合?
在节目中,吴伟志还坦诚分享了他的“投资心经”:逆向投资只能用在择时,不能用在选股;共识不可怕,可怕的是高关注度叠加高参与度;真正的大钱,都来自以买断公司为标准的左侧布局;穿越周期无非两件事——持有优质资产,在泡沫期控制敞口、在悲观期守得住信仰。

私募量化时代,赚钱更难了吗?一份给普通投资者的认知升级指南|对话风雨看盘(韩忠益)&戴煜中
私募之前没有了解过,看来监管还是很严格的;戴在这个播客聊的很实在,主要也是我的个人理念和其接近,如:长期跟踪并只做少数股票,但量化我搞不了,要做也是交给专业公司做。

戴煜中:提出战胜市场的三大能力:1. 深度(深研产业,做时间的朋友);2. 广度(用量化工具广覆盖,积小胜为大胜);3. 定力(在高噪音市场中保持决策定力)。普通人难以兼顾,需有所侧重。
戴煜中:给普通投资者的“笨办法”:在自身能力圈内,精选3-5家公司,长期跟踪,吃透其一切信息与波动节奏,只做这少数股票。
戴煜中:构建个人投资框架三步法:1. 判大势(能不能买);2. 选赛道(买什么方向);3. 定个股。之后才是执行层面的择时与仓位管理,避免随意交易。

# 28年,年化21%:读懂布鲁斯·柯夫纳的“背叛”与重生

这个系列还真不错,了解这些怪杰们。

  • 核心铁律:单笔交易亏损严控在总资本的1%-2%,头寸间必须保持低相关性。
  • 给新手的金句:无论你认为持仓应该是多少,请先至少砍掉一半。
  • 总结职业生涯的三准则:倾听市场但不预测、认真对待政策政治、永远不让风控纪律松懈。

本周胡思乱想

  • 要有匠人精神,但不要是匠人心态和执行,需要的是“大师”和“设计师”。
  • (30 号)一早回来了,工作上的事情还是没有释怀,但回到家忘掉一切繁忙,休息一下,也好好折腾技术和投资,早日自由,这是正道。

本周文章

你不知道的 Agent - 原理、架构与工程实践 - 从 Agent Loop、上下文工程、工具设计到 OpenClaw 的落地

这个博主一直挺能折腾的,能说能写能产出且能分享,学习了;回到这个 Agent 本身,最近一直在学习思考这一块,对我来说慢慢的一点一点也变得逐渐清晰了,通过学习、看源代码以及和其他人的讨论,看看自己也能产出点什么吧,文章也好或自己写个 Agent 也好。

这个分享文稿也非常有意思,是 Kami 的前身。Kami 最开始是我在 CC 里面的一个投资报告生成小玩意,然后刚好有一个分享要讲你不知道的 Agent,很懒感觉写一个这么长的 PPT 多费时间啊,然后就直接把原来能力边生成边调试几个版本到满意状态,然后 Kami 就出生了,欢迎阅读。

# 步履不停:企业AI转型的思考

关于企业在 Agent 和 研发提效,以及 AI 创新方面如何走,挺好的一些指南,企业难得是改变内部的组织和江湖,最难的是人。

3、企业智能体建设有三大应用类型:第一是内容生成,其核心价值在于实现知识型工作的自动化流程,提升任务执行的准确性与思考深度;第二是能效提升,其核心价值是加速任务处理,改进工作质量与效率;第三是创新突破,其核心价值是驱动新产品和新服务的诞生,帮助企业打开新的价值空间或者在一个既有模式里找到中间地带。
4、研发团队的AI转型会经历三个阶段:首先是从古法编程到提效1.0的转变,这个阶段侧重于工具的选择和学习;第二个阶段是从提效1.0到提效2.0的阶段,这个阶段侧重于流程的设计,研发方法的迭代和员工胜任力的提升;第三个阶段是组织的升级,包括绩效的设定、团队协同方式和文化的改变。第一阶段会在较短时间内完成,第二和第三阶段会持续相当长的一段时间。
5、踏上AI驱动的历程,企业需要做到三点:实现当前业务的现代化(即利用 AI技术对现有的业务进行降本增效的深度优化);以长远眼光发展业务(利用AI开拓新的增长曲线,如创新商业模式和构建生态系统);不断探索以寻求下一个目标(保持对新技术的敏感度,鼓励内部学习与创新)。

本周过的不好,周末需要好好充充电,放松一下,想一想了,忘掉烦恼,过好周末吧,多去户外走走。

本周观影

  • 看了《我的美食向导 - 山西》,又是有意思的一集,悠久的历史,百种的面食,黑叔叔和老高还吃了一顿,最好吃的还是人;大同,山西最北端,和学者逛菜市场(施教授),牛羊肉和猪肉摊比例类似,农牧交界带,羊肉烧麦和花心思的面皮,冒顿(音墨咄) - 白登之围,汉(刘邦)和匈奴单于,东西向(长城)/南北向(枢纽),石窟、寺庙、道观和天主教堂;太原,开元寺古玩市场卖菜,打散醋,过油肉看着好吃,山西是中国历史的发动机(很长一段时间内,施语),庄菜,五台山蘑菇,鸡汁小米,头脑(酒香肉香,复杂的一种食物)。
  • 看了《挽救计划》(我承认是看了盗版,希望我有空多去电影院支持),洛基(来自艾里德的伙伴)和格雷斯拯救彼此的故事,当中(1 小时 30 分左右)斯塔拉特唱的歌真好,看到后来感觉有点拖沓了,前面和书上的内容比有点太快了(书的后面还没看),结局总归是好的,人类被拯救了。

本周阅读

本周播客

生活中哪些东西已经完全离不开 - 跑鞋、HHKB、口琴、相机?...我们的 10 essentials

生活需要有美好的东西来充实,以上就是,不一定都适用每个人,但是听着也是很美好和享受。

一年前关税战后的大跌都涨回来还创了新高,这次美伊战争会复刻这条曲线吗?

思路和表达都异常清晰,反复听了几次:

  • 中国制造业韧性是超出预期的,我个人体会是浙江/江苏后续的一些制造企业,特别是精密(科技)方向是我可以寻找的标的
  • 不要接飞刀,个人能力水平难以驾驭
  • 关于黄金,自己资产的 5% 可以考虑买入实物黄金(5% 只是说明黄金是个配比资源,而不是主要标的,长期建议是选择二级市场的标的,但不建议买纸黄金和期货黄金)

以下是一些博客的一些内容索引:

中国制造业的韧性远超之前,就连我们自己可能都完全没有想到,更不要说美国了
有多大能力就去做多大的事情,那种在底部去接飞刀的事情是专业机构投资者、最有信息优势的人才能做的
重大事件中,我始终不建议股票投资者频繁调仓换股,因为下一步会发生什么连当事人可能都不清楚
真正能够长期影响世界格局的,是到底会不会形成一个滞胀的预期?

本周胡思乱想

  • 买完菜和水果回来,突然发现自己最近对于魔兽世界好像失去了兴趣和热情,一阵一阵的,可能最近也和我忙其他有事情有关系,我自己觉得也挺好。
  • 读和写以及分享,最有收获的是做的那个人,从来不会是他人,AI 时代持续的阅读、思考和分享更加重要,不然就是个“脑子腐化”的工具人,任何方向上都需要时间的积累和持续的投入,如果想做到深入了解和理解,我一直做的好的一点就是持续的吸收信息,转化,但是不好的一点就是实践动手慢,转化慢。
  • 不过我觉得是好东西(说的是各种各种 claw),好方向,最近我也在看一些文 谈到脑子腐化,太多的信息流 上下文切换,导致无法进入深入思考的心流,无可避免,但是对于未来如何更好重构自己是要想想的。
  • Claw 我装过一些,但是都没好好用起来,我有每天的一些 routine tasks,也许那部分是可以定时执行的,但是我自己又不想交给 AI 去做,可能可以做个补充,比如:RSS 订阅的一些内容总结,加速一些阅读上的事情,还没真正用起来。
  • 一个一个的聊绩效,和一些人聊成长方面的话题,是没有意义的,本身人是没有任何成长性的,说服我自己放弃吧。
  • Obsidian 真是好,也包括 Web Clipper,好的产品是有持久的生命力,和自然会让人想掏钱支持的。

本周文章

周报 #107 - 基于 Multica 与 Impeccable 的开发/设计工作流

文中提到的 Multica 有点意思,是不是 AI 时代的一个工程管理的必备?

Multica 是一个开源平台,将编码 Agent 变成真正的队友。分配任务、跟踪进度、积累技能——在一个地方管理你的人类 + Agent 团队。

也提了 Impeccable 这个设计工具,最近我也在尝试看一些设计相关的工具,看了 pencil.dev,自己这方面没有经验,也没啥品味,需要不断努力的学习和尝试,同时培养自己的品味,好的工具可以加速这个过程。

工程师如何把多个 Coding Agent 真正带起来:一套比“开更多聊天窗口”更像工程流程的方法

Vibe Kanban 要解决的还是工程管理的问题,类似 Multica,如何管理多 agent,同时确保人在 loop 中(如何减轻人在这个过程中的负担,认知和心力的负担?)。

Vibe Kanban 不仅仅是一个工具,他更代表着 —— 让软件工程师更加「软件工程」,我们更关心软件工程架构,而不是写代码。每一个软件工程师都可以依靠自己的经验管理一组 Coding Agent ,去做计划、去做执行。

潮流周刊第 265 期

过去也提过文中提到 https://github.com/tw93/waza ,结合上面的关于设计的话题,/design skill 也提到了 Impeccable,这些都是可以累计关于如何做设计的思考。

「离开的理由」 vs 「留下的意义」

我自己也到了三年的时间节点了,我也是类似博主的人,如果没成长我会考虑离开,当前平台我没啥成长了,也不会有其他啥可能了,但是我不一样的一点是我走到了职业生涯的后半程,选择不多,但又不想退或降低当前的收入水平,这个让我感觉很被动,也很无奈,虽然很多的不开心,很多的理念和现实的冲突,但就是没啥选择,我不逃避但我要挣扎,不怕动就怕不动。

他这种性格是只要大环境不崩,他就默认扎根。而我完全不同,我会给自己设定一个特别短的周期来做 Check。我甚至每个月都会问自己几个问题:当下的平台能不能满足我未来一段时间的发展?我在这里产出的价值和我的成长是否对等?这些东西是不是我现在最看重的?
一旦这些问题的答案开始变得模糊,甚至让我感到犹豫,我会走得非常果断。
这种高频的自我审计,常会被人解读为浮躁或者没耐性。但我自己心里清楚,这真不是坐不住,而是
太看重平台对个人长期的那种潜移默化的影响了。职场上的平庸往往是从「凑合一下」开始的。一旦评估下来发现增量没了,我宁愿背负「不稳定」的名声,也要为了自己的长期成长愤然离席。我害怕那种在安逸中逐渐钝化的感觉,胜过害怕简历上的断层。

AI时代,未来教育最重要的三点

我个人和孩子接触的过程中,包括我个人成长经历以及接触周围这些人看,做到这三点都挺难的,特别是知道自己要什么,但确实是对的,要做难且准确的事情。

那以后的世界,什么东西最重要呢?我觉得有三点
1 清晰的目标,她清楚地知道她的未来想做什么事情,这件事情非常重要
2 超强的执行力,在别人犹豫的过程中,直接就先做了,因为在AI时代,执行不再是瓶颈,犹豫不决才是
3 独特的审美,因为以后所有的产品和服务的附加值,不再是功能的多少,而是你是否有独特的审美,给别人带来独特的情绪价值
有时候想一想,这可能是未来教育最关键的三点,但这三点何尝不是我们现在作为AI从业者最应该具备的能力吗?

科技爱好者周刊(第 393 期):脑腐状态

文中说的脑腐(原文 The Brainrot Industrial Complex),结合我自己情况看,是有发生(如:看书不容易专注,看电影也是,读代码不容易专注),如何避免?个人有个人的方法吧,我自己个人是基本不看短视频的,但是不是还是会时不时看下手机;学校期间和孩子在家期间,主要的问题还是手机,和成年人是一样的,只是学生在 TA 那个阶段面临的问题更加严重;时代和技术在发展,也无法阻挡,唯有不断的清醒看自己,多读多想试着去“抗拒”什么是没错的,自主的系统性学习(AI 可以加速当下的学习)我觉得还是少不了,humans in the loop,人的判断力还是来自于自我的进化。

根据介绍文章,"脑腐"的症状就是思考能力下降,难以长时间集中注意力,进行深入的推理和反思。
一遇到比较难、需要反复思考的问题,你就会烦躁,不仅是心理烦躁,还会生理烦躁,全身不安,不愿意多想,就希望赶快了结。
你有没有这个症状?如果有,就有"脑腐"的危险了。我感觉,我的大脑就有一点。遇到复杂的软件概念和算法,以前会仔细研究,直到搞懂为止,现在更可能看一眼就跳过去,不懂就不懂了,知道名字就可以了。
"脑腐"的主要原因是,网络平台上面那些夸张的"标题党"文章和短视频。它们的目标是吸引流量,在最短时间内引发阅读者/观看者的兴趣,感到满足。当你长期观看这些内容以后,大脑就被密集刺激,思维兴奋状态的维持时间越来越短,丧失了长时间深入思考的能力。
这就是为什么一个人看惯短视频以后,就离不开内容压缩了。一篇几千字的文章,他也会要求大模型生成总结;一部90分钟的电影,他也宁愿看几分钟的电影解说。
一旦"脑腐"了,难以长时间集中注意力进行思考,也就难以学习和处理高难度问题了。现在看上去,没有好的解决办法,因为现代人的时间越来越琐碎,内容碎片化是大趋势。
应对之策也许就是反过来,将学习和思考拆解成一系列短问题。比如,以后的学习不再是一厚本教材,而是几十个的系列短视频,每个用两三分钟解释一个知识点。只有这个时间长度,学生的思维才能保持专注。