念头。遇见不同想法 NIANTOU.NET

在别人的文字里,遇见自己的念头。

独立书写 · 自由阅读

极客兔兔

按发表时间排列
40 篇

从零实现 GeekAgent —— Day16 插件框架

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 16 把能力封装成独立插件:plugins/ 目录里放一个子目录加 plugin.ts,主程序启动时自动加载,命令、工具、HTTP 服务都能即插即用。

从零实现 GeekAgent —— Day15 MCP 工具接入

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 15 接入 MCP:配置文件里声明 server,启动时在 stdio 上跑 JSON-RPC,外部进程提供的工具直接进入模型的工具清单。

从零实现 GeekAgent —— Day14 轻 RAG 知识库

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 14 复用 Day 13 的切块和 BM25 搜索,实现一个能采集网页与文件、按问题返回相关段落的轻量知识库。

从零实现 GeekAgent —— Day13 主动记忆

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 13 把长期记忆切成小块,用 BM25 找出相关内容,并在每轮对话前自动放进上下文。

从零实现 GeekAgent —— Day10 项目指令与长期记忆

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 10 补上两种跨会话信息:AGENTS.md 保存项目规则,memory 保存运行中积累的经验,让新建会话后的模型既知道项目规则,也想得起以前确认过的偏好。

从零实现 GeekAgent —— Day9 任务规划与子 Agent

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 9 让 Agent 先列清单再动手:加一张由模型维护的 TODO 表,再提供一个隔离上下文的子 Agent。主 Agent 安排顺序,子 Agent 处理边界清楚的小任务,当前进度始终显示在右侧分栏。

从零实现 GeekAgent —— Day8 权限与回滚

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 8 给工具划边界,也给写入留后路:用 .geekagent/GeekAgent.json 划清权限与目录边界,再给每次文件写入保存最近状态——不该做的操作提前拦住,写错还能用 /undo 恢复。

从零实现 GeekAgent —— Day7 轻量 TUI 与用量面板

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 7 给终端换一张桌:程序暂时接管整个终端,左侧放消息流,右侧常驻一块用量面板——本轮/累计 tokens 与上下文占用比例一边聊一边看得见,退出后原终端内容恢复。

从零实现 GeekAgent —— Day6 多会话与持久化

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 6 做两件事:让一个进程内可以同时维护多条互相独立的会话(/new、/sessions、/open),再把整个会话集合连同当前 ID 一次性落成 JSON(/save、/load,退出自动保存)——「聊得长」升级成「分得开、留得住」。

从零实现 GeekAgent —— Day5 历史压缩

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 5 解决「聊得长、不淡忘」:当 history 数组只增不减、对话越来越长,通过压缩历史来控制上下文规模,让长对话不超出模型上下文窗口。

从零实现 GeekAgent —— Day4 文件工具与注册表

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 4 把读写都从 shell 里拆出来:读走免确认的专用工具(ls/read/glob),写走展示 diff 再落盘的专用通道(write/patch),并把攒下的工具统一进一个注册表,让模型第一次走通「读→改→验证」的闭环。

从零实现 GeekAgent —— Day3 Bash 工具

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 3 给模型接上第一个能碰真实机器的工具:在本地执行 shell 命令,并加上超时、输出截断、执行前确认三道护栏,让 Agent 真正「动手」。

从零实现 GeekAgent —— Day2 工具调用循环

7天从零实现Agent教程,用 TypeScript 动手写一个最简单的 Agent/Harness。Day 2 搭建工具调用循环:模型可以请求 get_current_time,程序执行后把真实时间交回模型,为后续命令与文件工具打下基础。

从零实现 GeekAgent —— Day1 REPL 地基

7天从零实现Agent教程(days implement agent from scratch tutorial),用 TypeScript/Node.js 动手写一个最简单的 Agent/Harness,从零实现 REPL 循环与流式多轮对话。本文介绍 REPL 是什么、为什么 Agent 的地基要选它,以及如何用 readline + OpenAI 兼容接口在不到 160 行代码里跑通「能聊」的第一步。

Go sync.Cond

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。sync.Cond 是一个条件锁,也被称为条件变量,常用来一写多读(一个 goroutine 通知多个在等待的 goroutines)的场景。

Go 死码消除与调试(debug)模式

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了编译器在死码消除(Dead code elimination, DCE) 方面的优化,在实际编程中如何利用这一优化提高程序性能。并结合构建标记(build tags) 增加调试模式。

Go sync.Once

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。sync.Once 是 Golang package 中使方法只执行一次的对象实现,作用与 init 函数类似,但也有所不同。本文还解释了 sync.Once 源码中,done 为什么作为第一个字段。

Go sync.Pool

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。Go 语言标准库中的 sync.Pool 可以建立对象池,复用已有对象,解决内存分配碎片化的问题,有效减轻垃圾回收的压力(Garbage Collection, GC),在特定场景下可以有效地降低内存占用,提升性能。最后介绍了 sync.Pool 的作用和用法。

Go 逃逸分析

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。介绍了 Go 内存分配逃逸分析(escape analysis)的几种典型场景,变量所使用的内存什么时候分配到栈上,什么时候分配到堆上。以及如何利用逃逸分析的原理优化代码的性能,例如传值 VS 传指针。

2020 年终总结

从 2020 年开始,在博客里记录每一年的成长与改变。年初的时候,给自己定了两个目标:工作上升一级,博客浏览量能翻一倍。第一个目标没想到刚过完年,就实现了。第二个目标到年底的时候也基本达成了,月 UV 3w,月 PV 8w。在这里,将过程中的一些经历和感悟记录下来。

Go struct 内存对齐

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了结构体(struct)占用的内存空间如何计算,为什么要字节对齐/内存对齐,Go 语言中的大小和对齐保证(size and alignment guarantees),字节对齐和安全访问(原子访问)的关系,以及如果利用内存对齐的规律减小 struct 内存占用。

Go 空结构体 struct{} 的使用

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了使用空 struct{}/空结构体的优点:不占用内存,且具有良好的语义。

控制协程(goroutine)的并发数量

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了 goroutine 协程并发控制,避免并发过高,大量消耗系统资源,导致程序崩溃或卡顿,影响性能。主要通过 2 种方式控制,一是使用 channel 的缓冲区,二是使用第三方协程池,例如 tunny 和 ants。同时介绍了使用 ulimit 和虚拟内存(virtual memory)提高资源上限的技巧。

如何退出协程 goroutine (其他场景)

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了协程没有正常关闭导致内存泄漏的场景,并介绍了如何借助通道/信道(channel) 优雅地退出协程。

如何退出协程 goroutine (超时场景)

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了 Go 语言中实现超时(timeout)退出时常见的错误,即子协程(goroutine)不能正常关闭,导致内存泄漏。常见的实现超时的方式有 time.After 和 context.WithTimeout。

Go 语言陷阱 - 数组和切片

Go 语言/golang 高性能编程(high performance go),Go 语言进阶教程,Go 语言陷阱(gotchas)。这篇文章介绍了 Go 语言中数组(Array) 和切片(Slice)的常见陷阱和规避方式。例如数组作为参数,修改参数,原数组不会发生改变。

减小 Go 代码编译后的二进制体积

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。介绍了 2 种方式(编译选项和 UPX 工具) 来减小 Go 代码编译后的二进制文件/可执行文件的体积/大小。

Go Reflect 提高反射性能

Go 语言/golang 高性能编程,Go 语言进阶教程,Go 语言高性能编程(high performance go)。本文介绍了反射的使用场景,并测试了反射的性能,以及某些场景下的替代方式。