96SEO 2026-08-12 22:05 32
你调 LLM 的时候。传进去的是个 messages 数组,对吧?

await llm.chat
那个 messages 数组又是谁拼的?不过,
使用者痛点:LLM 调用代码往往只关注“能跑”。却忽视程序提示词与历史消息的结构化组织,导致在真实项目中出现视野缺失或上下文溢出。
大多数人写 demo 的时候,system 是一句写死的 "You are a helpful assistant"messages 就是把历史 push 进去完事。能跑,但你把它放进一个真正干活、连续聊几百轮的 Agent 里两个问题立刻冒出来:
messages 累计的 token 早就超过窗口了。下一次调 LLM,provider 直接给你甩一个 context_length_exceeded`——任务当场崩。User Pain Point:If prompt assembly is wrong or incomplete,model behaves unpredictably;if token limits are exceeded,entire conversation crashes.
The catbuddy 「眼睛」正是为这两件事而生。不过,说到它由两半组成,一半负责装配把视野拼出来;另一半负责
User Pain Point:The biggest source of bugs is an inconsistent or outdated system prompt;developers spend hours debugging *** model “doesn’t know” something that should be obvious.
先看「拼」。打开 catbuddy 的日志,你会看到发给 LLM 的 system 大概长这样:
# 为什么是这个顺序?
因为它遵循「最关键 → 可忽略」的降级原则:先立住「我是谁」。再加「怎么干活」,再补「记得什么」,最终挂上「能用什么」。万一哪天 token 预算真的紧张,从后往前砍也不伤主要。
第一层是 Agent 的人格声明——
User Pain Point:If you hard‑code system prompt you lose flexibility;any change requires redeployment.
人格工程本身是个大话题,但那是另一篇的事。这里你只需要记住:*人格是五层里的第一层*,先立人设。
代码就是老老实实遍历这四个文件名。读到内容就拼一段
至于装配侧,ContextBuilder 的五层流水线
You are catbuddy 🐱,a smart and caring cat-spirit AI assistant.
至于OS。darwin / Node.js v20.
Work root: /Users/.../my-project
---## AGENTS.md ...这个项目里 Agent 该怎么表现...
## SOUL.md ...Agent 的性格设定...
## USER.md ...使用者特点:名字、偏好、时区...
## TOOLS.md ...自定义工具使用说明...
---## Long-Term Memory ...关于你的长期记忆...
## Project Memory ...关于这个项目的长期记忆...
---## Always-On Skills ...memory / my 技能的完整正文...
## Available Skills - drawio: 生成架构图
- github: 搜索仓库 ...
① SOUL:人格层
You are catbuddy 🐱.... 它不是写死的字符串,而是一个*Handlebars* 模板**。Handlebars 是 JS 环境里轻量模板引擎,{{变量}} 会被替换成实际值。同一个模板,在 Telegram bot 渲染成「简洁回复」。
在桌面端渲染成「完整工作区上下文」——一个模板,多副面孔。
② 引导文件:四个使用者能改的 .md
类比
AGENTS.md 这个项目里 Agent 该怎么表现 相当于业界常说的 CLAUDE.md
SOUL.md 说话风格、回复偏好 人格的可调旋钮
USER.md 使用者特点:名字、技术栈偏好、时区 「我是谁」
TOOLS.md 自定义工具使用说明 工具的本地备注 `## ${name}
${content}``:
for { //
const content = this.fs.readWorkspaceFile
if parts.push
}
User Pain Point:If any of se files is missing or malformed,assembled prompt becomes incomplete,causing downstream misunderstanding.
注意 User.md` 有个特殊待遇:如果开了「全局画像」,它从 `~/.catbuddy/workspace` 读——这样你在所有项目里*共享同一份使用者特点*,不用在每个项目里都写一遍「我叫张三,喜欢 TypeScript」。"
第三层注入长期记忆。而且*分两层*:
User Pain Point:: Without proper gating。empty placeholder memories waste precious tokens.
这里有个很省 token 的小聪明—— `isDefaultMemory` 检查:如果 `MEMORY.md` 还是模板默认内容,就*不注入*,免得白白浪费几十个 token 塞一段占位符。
User Pain Point:: Embedding full skill definitions inflates prompts dramatically;developers see latency spikes without understanding ***.
最终一层是运行时信息——MCP 工具清单按需注入到这一轮该有的位置。说起来,MCP是接外部工具的标准协议,这块第 篇详细讲过这里不展开。
buildSystemPrompt: string {
const key = `${channel}:${this._fingerprint}`
const cached = this.cache.get
if return cached // 命中 → 零拼接
const prompt = this._assembleSystemPrompt
this.cache.set
return prompt
}
关键是 `_fingerprint` 怎么算——它把所有 *可能影响程序提示词内容* 的文件 **mtimeMs** 串成一个字符串:四个引导文件、全局记忆、项目记忆、技能目录指纹,再加上工作区方法,用 `\` 拼起来。不过,
-
*User Pain Point*: 每次请求重新读取全部文件导致 I/O 瓶颈与延迟;指纹缓存一次读取后即可复用,明显提高响应速度。
从细节二来看,运行时信息为什么不放程序提示词
你可能注意到了:**当前时间**,**channel** 等运行时信息,catbuddy **没有** 放进程序提示词,而是拼在 **第一条 user 消息** 的末尾:
const textWithCtx = runtimeCtx
${opts.currentMessage}
: opts.currentMessage
messages.push
User Pain Point:: If volatile data sits in cached system prompts。every tiny change invalidates cache causing unnecessary recomputation and possible timeouts.
…
But due to length constraints we stop here.
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback