万字长文深度剖析 Harness Engineering 案例完全指南:从 while True 到驾驭生产级 Agent 的 20 层架构演进

全彩6D激光雷达原生RGB-D感知架构深度解析 多传感器冗余融合定义智驾感知新范式 全彩6D激光雷达的诞生,代表智驾行业的感知硬件演进从“追求看得更远、点云更密”的单点性能竞赛,进入了“信息原生对齐、感知端到端融合”的全新发展阶段。它的价值从来不是替代摄像头,而是彻底打通空间深度信息和色彩语义信息的底层关联通道,大幅降低多源数据关联的复杂度。高清摄像头承载的高密度纹理细节、高动态色彩范围、长距离小目标识别能力,是任何激光雷达短期内都无法完全覆盖的能力边界。 阅读详情

第一章:范式革命 – 从"造智能"到"造世界"

1.1 被滥用的"Agent"概念

2024-2025年,“Agent"这个词被彻底滥用了。拖拽式工作流构建器、无代码"AI Agent"平台、Prompt 链编排库……它们共享一个致命幻觉:把 LLM API 调用用 if-else 分支、节点图和硬编码路由逻辑串起来,就是在"构建 Agent”。

learn-claude-code 仓库开篇就给了这个行业一记响亮的耳光:

“You cannot brute-force intelligence by stacking procedural logic… Agency is learned, not coded.”(你无法通过堆叠过程逻辑来暴力生成智能……智能是被学出来的,不是被编码出来的。)

这不是一个教你如何"写智能"的教程。恰恰相反,它教你的是:放弃幻想,回归工程本质,你不是在造大脑,你是在造让大脑发挥作用的"身体"和"环境"。

1.2 核心公式:Agent = Model + Harness

仓库建立了一个极其清晰的认知框架:

Agent = Model(模型) + Harness(驾驭层)
  • Model(模型):是"智能"本身。它通过数十亿次梯度更新,在感知、推理、行动的序列中被训练出来。Claude、GPT、Gemini 的"智能"不是 harness 代码赋予的,而是训练赋予的。
  • Harness(驾驭层):是"环境"和"身体"。它提供工具、知识、观察接口、行动接口和权限边界。模型是司机,套具是车辆。

这个区分直接否定了当前市场上 90% 的"Agent 框架",那些本质上只是"带 LLM 的 shell 脚本"的 Rube Goldberg 机器(过度工程化的脆弱规则管道)。

1.3 历史铁证:智能来自训练,不是代码

年份里程碑核心事实
2013DeepMind DQN 玩 Atari单一神经网络,接收原始像素和分数,学会 49 款游戏,超越人类专家
2019OpenAI Five 征服 Dota 25 个神经网络自我对弈 45,000 年,击败 TI8 世界冠军 OG
2019DeepMind AlphaStar 掌握星际争霸 II达到欧服 Grandmaster(前 0.15%),无脚本策略
2019腾讯绝悟统治王者荣耀1v1 模式下职业玩家 15 场仅赢 1 场,一天训练 = 440 人类年
2024-25LLM Coding AgentsClaude、GPT、Gemini 作为编码 Agent,读取代码库、编写实现、调试失败

每一个里程碑都指向同一个事实:智能是训练出来的,不是代码堆出来的。

1.4 Harness 的六大组件

Harness = Tools + Knowledge + Observation + Action Interfaces + Permissions
Tools:          文件 I/O、Shell、网络、数据库、浏览器
Knowledge:      产品文档、领域参考、API 规范、风格指南
Observation:    Git diff、错误日志、浏览器状态、传感器数据
Action:         CLI 命令、API 调用、UI 交互
Permissions:    沙箱隔离、审批工作流、信任边界

作为 Harness Engineer,你的实际工作是:

  • 实现工具:给 Agent 手。文件读写、Shell 执行、API 调用、浏览器控制。每个工具都是原子化、可组合、描述清晰的。
  • 策展知识:给 Agent 领域 expertise。按需加载,而非一次性灌入。
  • 管理上下文:给 Agent 干净的记忆。子 Agent 隔离防止噪声泄漏,上下文压缩防止历史淹没当下,任务系统让目标超越单轮对话。
  • 控制权限:给 Agent 边界。沙箱文件访问、破坏性操作需审批、信任边界强制执行。
  • 收集轨迹数据:每个动作序列都是训练信号,是下一代 Agent 模型的微调原料。

“You are not writing intelligence. You are building the world that intelligence inhabits.”(你不是在编写智能,你是在构建智能栖息的世界。)

第二章:核心模式 – 一个永不变的循环(s01)

2.1 30 行代码的宇宙

整个仓库的教学围绕一个极简但永恒的模式:

THE AGENT PATTERN
=================
User --> messages[] --> LLM --> response
|
stop_reason == "tool_use"?
/                          \
yes                           no
|                             |
execute tools                    return text
append results
loop back -----------------> messages[]

代码实现只有 20 行:

def agent_loop(messages):
while True:
response = client.messages.create(
model=MODEL, system=SYSTEM,
messages=messages, tools=TOOLS,
max_tokens=8000,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return
results = []
for block in response.content:
if block.type == "tool_use":
output = TOOL_HANDLERS[block.name](**block.input)
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
})
messages.append({"role": "user", "content": results})

不到 30 行,这就是最小可运行的 Agent Harness 内核。它不是智能本身,而是让模型能持续行动的最小运行框架。模型负责决策(要不要调工具、调哪个),Harness 负责执行(调了就跑、结果喂回去)。

2.2 与 Claude Code 源码的精确对照

教学版的 30 行while True就是 Claude Code 1729 行query.ts的核心。CC 的复杂性不是"另一个 agent 大脑",而是生产级保护机制:

一、循环结构差异

教学版检查 response.stop_reason。CC 不把它作为循环继续的唯一依据,流式响应中 stop_reason 可能还没更新但内容里已经有 tool_use 块了。CC 用 needsFollowUp 标志:

// query.ts:554-558
// stop_reason === 'tool_use' is unreliable.
// Set during streaming whenever a tool_use block arrives.
let needsFollowUp = false

二、State 对象的 10 个字段

#字段用途对应章节
1messages当前迭代的消息数组s01
2toolUseContext工具、信号、权限上下文s02
3autoCompactTracking压缩状态追踪s08
4maxOutputTokensRecoveryCounttoken 恢复尝试次数(上限 3)s11
5hasAttemptedReactiveCompact本轮是否已尝试响应式压缩s08
6maxOutputTokensOverride8K→64K 的升级覆盖s11
7pendingToolUseSummary后台 Haiku 生成的 tool use 摘要s08
8stopHookActive停止钩子是否产生阻塞错误s04
9turnCount轮次计数(maxTurns 检查)s01
10transition上一次继续原因s11

三、多条退出和继续路径

教学版只有 1 条退出路径(模型不调工具就结束)。生产版有多条退出和继续路径,覆盖 blocking limit、prompt too long、model error、abort、hook stop、max turns、token budget continuation、reactive compact retry 等场景。每种场景都有对应的恢复或退出策略。

四、流式工具执行

CC 的StreamingToolExecutor让工具在模型还在生成时就开始并行执行(根据工具是否 concurrency-safe 决定并发或独占)。教学版不实现这些:目标是概念清晰,不是性能极致。

一句话总结:1729 行的 query.ts 核心就是 30 行 while True。所有复杂字段和退出路径都是保护机制。先理解核心循环,后面的一切自然展开。

第三章:工具分发 – 从 1 个工具到 5 个工具(s02)

3.1 问题:只有 Bash 的局限

s01 的 Agent 只有一个 bash 工具。读文件要cat,写文件要 echo “…” > file.py,改文件要sed。模型想的是"读这个文件",却要拼出cat path/to/file。多了一层翻译,浪费 token,还容易拼错。

3.2 解决方案:TOOL_HANDLERS 查表分发

s01 的循环完全保留。唯一的变动在工具执行那 1 行:run_bash() 替换为 TOOL_HANDLERSblock.name 查表分发。

给 Agent 加一个工具只需要做两件事:

  • 定义工具:在 TOOLS 数组里加一条描述
  • 注册处理函数:在 TOOL_HANDLERS 字典里加一个映射

3.3 从 1 个工具到 5 个工具

TOOLS = [
{"name": "bash",       "description": "Run a shell command.", ...},
{"name": "read_file",  "description": "Read file contents.",  ...},
{"name": "write_file", "description": "Write content to file.", ...},
{"name": "edit_file",  "description": "Replace text in file once.", ...},
{"name": "glob",       "description": "Find files by pattern.", ...},
]
def run_read(path, limit=None):
lines = safe_path(path).read_text().splitlines()
if limit:
lines = lines[:limit]
return "\n".join(lines)
def run_write(path, content):
safe_path(path).write_text(content)
return f"Wrote {len(content)} bytes to {path}"
def run_edit(path, old_text, new_text):
text = safe_path(path).read_text()
if old_text not in text:
return "Error: text not found"
safe_path(path).write_text(text.replace(old_text, new_text, 1))
return f"Edited {path}"
def run_glob(pattern):
import glob as g
return "\n".join(g.glob(pattern, root_dir=WORKDIR))
TOOL_HANDLERS = {
"bash":       run_bash,
"read_file":  run_read,
"write_file": run_write,
"edit_file":  run_edit,
"glob":       run_glob,
}

加一个工具 = 在 TOOLS 数组加一条 + 在 TOOL_HANDLERS 字典加一行。循环不变。

3.4 与 CC 源码的精确对照

一、工具定义方式

教学版:TOOLS 数组 +TOOL_HANDLERS 字典,定义和实现分开。 CC:每个工具是 buildTool() 创建的独立对象,包含 schema、验证、权限、执行。getAllBaseTools() 汇总所有工具。

二、并发安全判断:isConcurrencySafe()

教学版按原始顺序逐个执行,不做并发。CC 用 isConcurrencySafe(input) 判断能否并发,注意这不是简单的"只读 vs 写",而是按具体输入判断:

工具isReadOnlyisConcurrencySafe
FileReadtruetrue
Globtruetrue
Bash lstruetrue ← 关键差异
Bash rmfalsefalse
TaskCreatefalsetrue ← 改状态但可并发

三、分区算法

CC 的partitionToolCalls() 不是分两组,而是把工具调用按连续块分批:

[read A, read B, glob *.py, bash "rm x", read C]
→ batch1(并发): [read A, read B, glob *.py]
→ batch2(串行): [bash "rm x"]
→ batch3(并发): [read C]

并发安全的连续块编入同一个 batch,batch 内真正并发执行。遇到非并发安全的就开新 batch 串行执行。batch 之间严格顺序。

四、验证管线

CC 的每个工具调用经过严格的 5 步验证:

  • Zod schema 验证(参数类型/结构检查)
  • 工具级 validateInput()(参数值验证,如路径是否在工作区内)
  • PreToolUse hooks(钩子可以返回消息、修改输入、阻止执行)
  • 权限检查(canUseTool+checkPermissions→ allow/deny/ask)
  • 执行 tool.call()

五、工具结果持久化

每个工具有一个maxResultSizeChars字段。结果超过这个值就落盘,模型看到的是预览 + 文件路径。FileRead 特殊,设为 Infinity,防止读文件的输出又被当成文件落盘,导致无限循环(读文件 → 落盘 → 再读 → 再落盘 → …)。

第四章:权限系统 – 三道闸门(s03)

4.1 问题:安全不能靠信任模型

s02 的 Agent 有 5 个工具。file tools 受safe_path保护,但 bash 不受限制。让它"清理一下项目",可能执行 rm -rf /。

安全不能靠信任模型,要靠代码,在工具执行之前做判断。

4.2 三道闸门管线

┌─────────────────────────────────────────────────────────┐
│工具调用 → 闸门1: 硬拒绝 → 闸门2: 规则匹配 → 闸门3: 用户审批  │
│          (deny list)    (permission rules)   (ask user) │
└─────────────────────────────────────────────────────────┘

闸门 1:硬拒绝表

DENY_LIST = [
"rm -rf /", "sudo", "shutdown", "reboot",
"mkfs", "dd if=", "> /dev/sda",
]
def check_deny_list(command: str) -> str | None:
for pattern in DENY_LIST:
if pattern in command:
return f"Blocked: '{pattern}' is on the deny list"
return None

闸门 2:规则匹配

PERMISSION_RULES = [
{
"tools": ["write_file", "edit_file"],
"check": lambda args: not (WORKDIR / args.get("path", "")).resolve().is_relative_to(WORKDIR),
"message": "Writing outside workspace",
},
{
"tools": ["bash"],
"check": lambda args: any(kw in args.get("command", "") for kw in ["rm ", "> /etc/", "chmod 777"]),
"message": "Potentially destructive command",
},
]
def check_rules(tool_name: str, args: dict) -> str | None:
for rule in PERMISSION_RULES:
if tool_name in rule["tools"] and rule["check"](args):
return rule["message"]
return None

闸门 3:用户审批

def ask_user(tool_name: str, args: dict, reason: str) -> str:
print(f"\n⚠  {reason}")
print(f"   Tool: {tool_name}({args})")
choice = input("   Allow? [y/N] ").strip().lower()
return "allow" if choice in ("y", "yes") else "deny"

三道闸门串在一起,插在工具执行之前:

def check_permission(block) -> bool:
# 闸门 1: 硬拒绝
if block.name == "bash":
reason = check_deny_list(block.input.get("command", ""))
if reason:
print(f"\n⛔ {reason}")
return False
# 闸门 2 + 3: 规则匹配 → 用户审批
reason = check_rules(block.name, block.input)
if reason:
decision = ask_user(block.name, block.input, reason)
if decision == "deny":
return False
return True
# 在 agent_loop 中——s02 的循环只加了一行:
for block in response.content:
if block.type == "tool_use":
if not check_permission(block):           # ← 新增
results.append({... "content": "Permission denied."})
continue
output = TOOL_HANDLERS[block.name](**block.input)
results.append(...)

4.3 与 CC 源码的精确对照

一、PermissionResult:不是 3 种,是 4 种

教学版的三道闸门(deny → ask → allow)和 CC 不完全对应。CC 的PermissionResult有 4 个 behavior:

behavior含义教学版对应
allow直接允许闸门 3 通过
deny直接拒绝闸门 1 命中
ask弹出对话框问用户闸门 2 命中
passthrough工具不表态,交给通用管线决定教学版无

二、生产版的验证阶段

CC 的工具调用不是经过三道闸门,而是经过多个阶段:

  • Zod schema 验证— 参数类型检查
  • validateInput()— 工具级语义验证
  • backfillObservableInput()— 补全遗留字段
  • PreToolUse hooks— 钩子可以返回 allow/deny/ask
  • resolveHookPermissionDecision()— 协调钩子+管线决策
  • hasPermissionsToUseToolInner()— 多层规则检查:
  • 整个工具被 deny rule 禁用 → deny
  • 整个工具被 ask rule 标记 → ask
  • tool.checkPermissions() 工具自己的判断
  • 工具自己返回 deny → deny
  • requiresUserInteraction() → ask
  • 内容相关的 ask 规则 → ask(不可绕过)
  • 安全检查违规 → ask(不可绕过)
  • bypassPermissions 模式 → allow
  • 整个工具被 allow rule 放行 → allow
  • passthrough → 转为 ask

三、拒绝列表:不是一个文件,是 8 个来源

CC 没有单一的 deny list。权限规则来自 8 个来源:

来源配置位置
userSettings~/.claude/settings.json
projectSettings.claude/settings.json
localSettingssettings.local.json
flagSettingsFeature flags
policySettings企业管理策略
cliArg--allowedTools / --deniedTools
command内联命令
session会话内临时授权

每条规则格式:{ toolName: “Bash”, ruleBehavior: “deny”, ruleContent: “npm publish:*” }。多个来源的规则合并,高优先级来源覆盖低优先级。

四、YoloClassifier(自动审批)

CC 的 auto 模式下,不会每次都弹对话框。classifyYoloAction把工具调用 + 对话上下文发给一个分类器 LLM 判断是否安全。先尝试 acceptEdits 模式模拟,再查安全工具白名单,最后才调分类器。分类器连续拒绝太多次 → 回退到人工审批。

五、权限冒泡

子 Agent(通过 AgentTool fork 出来的)的permissionMode设为’bubble’。意思是权限弹窗冒泡到父 Agent 的终端,而不是在子 Agent 里静默拒绝。

第五章:Hook 系统 – 挂在循环上,不写进循环里(s04)

5.1 问题:循环膨胀症

s03 的 Agent 有权限检查了。但每次加一个新检查,比如"记录每次 bash 调用"、“操作后自动 git commit”,都要修改agent_loop函数。

循环很快就变成了这样:

def agent_loop(messages):
while True:
# ... LLM call ...
for block in response.content:
if block.type != "tool_use":
continue
log_to_file(block)          # 加一行
check_permission(block)     # 加一行
notify_slack(block)         # 又加一行
output = execute(block)
auto_git_add(block)         # 再加一行
# ... 很快循环就认不出来了

你想扩展的是 Agent 的行为,但你改的却是循环本身。循环应该是一个稳定的核心,扩展应该挂在外面。

5.2 四个事件,覆盖完整 Agent Cycle

事件触发时机典型用途
UserPromptSubmit用户输入提交后、进入 LLM 前输入验证、注入上下文
PreToolUse工具执行前权限检查、日志记录
PostToolUse工具执行后副作用(自动 git add 等)、输出检查
Stop循环即将退出时收尾清理(CC 还支持强制续跑)

5.3 Hook 注册表实现

HOOKS = {
"UserPromptSubmit": [],
"PreToolUse": [],
"PostToolUse": [],
"Stop": [],
}
def register_hook(event: str, callback):
HOOKS[event].append(callback)
def trigger_hooks(event: str, *args):
for callback in HOOKS[event]:
result = callback(*args)
if result is not None:   # 返回值 ≠ None → hook 说"停"
return result
return None

PreToolUse hook 示例(s03 的权限检查移到 hook 上):

def permission_hook(block):
if block.name == "bash":
for pattern in DENY_LIST:
if pattern in block.input.get("command", ""):
return "Permission denied by deny list"
if block.name in ("write_file", "edit_file"):
path = block.input.get("path", "")
if not (WORKDIR / path).resolve().is_relative_to(WORKDIR):
choice = input("   Allow? [y/N] ").strip().lower()
if choice not in ("y", "yes"):
return "Permission denied by user"
return None
def log_hook(block):
print(f"[HOOK] {block.name}(...)")
def large_output_hook(block, output):
if len(str(output)) > 100000:
print(f"[HOOK] ⚠ Large output from {block.name}")
register_hook("PreToolUse", permission_hook)
register_hook("PreToolUse", log_hook)
register_hook("PostToolUse", large_output_hook)

Stop hook 示例(强制续跑):

def summary_hook(messages: list) -> str | None:
tool_count = sum(1 for m in messages
for b in (m.get("content") if isinstance(m.get("content"), list) else [])
if isinstance(b, dict) and b.get("type") == "tool_result")
print(f"\033[90m[HOOK] Stop: session used {tool_count} tool calls\033[0m")
return None   # return None = allow stop, return string = force continuation
register_hook("Stop", summary_hook)

在 agent_loop 中:

if response.stop_reason != "tool_use":
force = trigger_hooks("Stop", messages)   # ← 退出之前
if force:
messages.append({"role": "user", "content": force})
continue
return

5.4 与 CC 源码的精确对照

一、Hook 事件:不止 4 个,而是 27 个

类别事件
工具相关PreToolUse , PostToolUse, PostToolUseFailure
会话相关SessionStart , SessionEnd, Stop, StopFailure, Setup
用户交互UserPromptSubmit , Notification, PermissionRequest, PermissionDenied
子 AgentSubagentStart , SubagentStop
压缩相关PreCompact , PostCompact
团队相关TeammateIdle , TaskCreated, TaskCompleted
其他Elicitation , ElicitationResult, ConfigChange, WorktreeCreate, WorktreeRemove, InstructionsLoaded, CwdChanged, FileChanged

二、HookResult 的 14 个字段

字段类型用途
messageMessage可选 UI 消息
blockingErrorHookBlockingError阻塞错误 → 注入对话让模型自纠
outcomesuccess/blocking/non_blocking_error/cancelled执行结果
preventContinuationboolean阻止后续执行
stopReasonstring停止原因描述
permissionBehaviorallow/deny/ask/passthroughhook 返回权限决策
updatedInputRecord修改工具输入
additionalContextstring附加上下文
updatedMCPToolOutputunknownMCP 工具输出修改

三、关键安全不变式:Hook ‘allow’ 不能绕过 deny/ask 规则

这是 CC 权限系统最重要的安全设计:hook 返回 allow 时,仍然要检查 settings.json 的 deny/ask 规则。即使用户的 hook 脚本说"允许",如果在 settings.json 中禁用了这个工具,操作仍然会被阻止。

四、stopHookActive防无限循环机制

当 stop hooks 产生 blockingError 时,循环带stopHookActive: true重入下一轮。后续迭代中 stop hooks 看到这个标志就不会再次触发。这防止了一个永不停机的 bug:模型自纠后 stop hook 再次报错 → 模型再自纠 → stop hook 再报错…

第六章:TodoWrite – 没有计划的 Agent 会漂移(s05)

6.1 问题:上下文淹没导致目标遗忘

给 Agent 一个复杂任务:“把所有 Python 文件改成 snake_case 命名,然后跑测试,修好失败。”

Agent 开始干活,改了 3 个文件,跑了个测试,发现 2 个失败,开始修。修着修着,它忘了最初是"改成 snake_case",测试失败把注意力全吸走了。

对话越长越严重:工具结果不断填满上下文,系统提示的影响力被稀释。一个 10 步重构,做完 1-3 步就开始即兴发挥,因为 4-10 步已经被挤出注意力了。

6.2 解决方案:todo_write 工具 + Nag Reminder

todo_write 本身不做任何实际工作,不能读文件、不能跑命令,只是让 Agent 在动手之前先理清思路。

CURRENT_TODOS: list[dict] = []
def run_todo_write(todos: list) -> str:
global CURRENT_TODOS
CURRENT_TODOS = todos
lines = ["\n## Current Tasks"]
for t in CURRENT_TODOS:
icon = {"pending": " ", "in_progress": "▸", "completed": "✓"}[t["status"]]
lines.append(f"  [{icon}] {t['content']}")
print("\n".join(lines))
return f"Updated {len(CURRENT_TODOS)} tasks"

Nag Reminder:模型连续 3 轮没调 todo_write 时,自动注入一条提醒:

if rounds_since_todo >= 3 and messages:
messages.append({
"role": "user",
"content": "<reminder>Update your todos.</reminder>",
})
rounds_since_todo = 0

关键洞察:todo_write 不给 Agent 增加任何执行能力。它增加的是规划能力。

6.3 与 CC 源码的精确对照

CC 中有两套任务系统并存:

  • TodoWrite(V1):一个简单的列表工具,数据在内存 AppState 中维护。教学版也保存在进程内存里,退出后清空
  • Task System(V2 = s12):文件持久化、依赖图、并发锁、ownership

切换由 isTodoV2Enabled() 控制。当前源码的实现逻辑:交互式会话中 V2 默认启用,非交互式会话(SDK)中 V1 默认启用。

教学版的 nag reminder(3 轮未更新就注入提醒)是教学机制。CC 源码中没有固定的"3 轮"逻辑,更接近的是当 3 个以上 todo 全部完成但没有 verification 项时,追加 verification nudge。

第七章:Subagent – 大任务拆小,干净上下文(s06)

7.1 问题:上下文污染

Agent 在修一个 bug。它读了 30 个文件来追踪调用链,中间聊了 60 轮。messages 列表涨到 120 条,其中大部分是"追踪调用链"的中间过程,和"修 bug"这个最终目标无关。

这些中间过程占着上下文位置,让 Agent 越来越"健忘"。

7.2 解决方案:独立 messages[] + 只回传结论

def spawn_subagent(description: str) -> str:
# 子 Agent 的工具:基础工具,但没有 task(禁止递归)
sub_tools = [
{"name": "bash", ...}, {"name": "read_file", ...},
{"name": "write_file", ...}, {"name": "edit_file", ...},
{"name": "glob", ...},
]
messages = [{"role": "user", "content": description}]  # 全新 messages[]
for _ in range(30):  # safety limit
response = client.messages.create(
model=MODEL, system=SUB_SYSTEM,
messages=messages, tools=sub_tools, max_tokens=8000,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
break
results = []
for block in response.content:
if block.type == "tool_use":
blocked = trigger_hooks("PreToolUse", block)
if blocked:
results.append({... "content": str(blocked)})
continue
handler = SUB_HANDLERS.get(block.name)
output = handler(**block.input) if handler else f"Unknown"
trigger_hooks("PostToolUse", block, output)
results.append({... "content": output})
messages.append({"role": "user", "content": results})
# 只返回最后的文本结论,中间过程全部丢弃
return extract_text(messages[-1]["content"])

三个关键设计决策:

决策选择原因
上下文隔离全新 messages[]子 Agent 的中间过程不污染主 Agent 的上下文
只回传结论extract_text(last_message)不是回传整个 messages 列表
禁止递归子 Agent 无 task 工具防止子 Agent 再 spawn 新的子 Agent
安全策略不跳过子 Agent 工具调用也走 PreToolUse hook上下文隔离不代表权限隔离

7.3 与 CC 源码的精确对照

一、不是一种模式,是三种

模式触发条件上下文
Normal Subagent指定了 subagent_type全新 messages[],只有 prompt
Fork Subagent没指定 subagent_type,fork gate 开启通过 buildForkedMessages() 构造 cache-friendly 前缀,共享 prompt cache
General-Purpose没指定 subagent_type,fork gate 关闭同 Normal

二、Fork 模式:为了共享 Prompt Cache

Fork 模式不创建全新上下文,而是通过buildForkedMessages()构造 cache-friendly 消息前缀,保留父 assistant message 并生成 placeholder tool results。目的不是隔离,而是让 Anthropic API 的 prompt cache 命中:父子 Agent 的 system prompt、tools、messages 前缀完全一致,API 端不需要重算。

缓存命中的五个关键组件:system prompt、tools、model、messages 前缀、thinking config,必须字节级一致。

三、Context Isolation 的精确粒度

createSubagentContext()创建子 Agent 的ToolUseContext:

字段行为
abortController新的 child controller,父 abort 向下传播
setAppState默认 no-op;但 sync agent 通过 shareSetAppState 共享
readFileState从父克隆 (避免重复读相同文件)
queryTracking新 chainId,depth = parentDepth + 1

子 Agent 不是完全隔离的:文件读取状态是共享的。

四、递归 Fork 防护

教学版用"子 Agent 不给 task 工具"表达递归保护。真实实现更精细:isInForkChild()检查对话历史中是否有 FORK_BOILERPLATE_TAG,有就拒绝。但 Agent工具默认在所有 agent 的禁用集合里,针对 fork child 有专门的递归保护,teammate 场景下有特殊放行。不是简单的"禁止新的子 Agent"。

五、Permission Bubbling

Fork Agent 的 permissionMode: ‘bubble’ 意味着子 Agent 的权限弹窗冒泡到父终端,用户在主终端里审批子 Agent 的操作。

六、Async vs Sync

教学版只展示了同步子 Agent(父等着子跑完)。CC 还支持异步路径:run_in_background: true时异步启动,返回{ status: ‘async_launched’ }立即给父 Agent,子 Agent 完成后通过通知机制告知父 Agent。

第八章:Context Compact – 四层压缩策略(s08)

8.1 问题:上下文窗口是有限的

Agent 读了一个 1000 行的文件(~4000 token),又读了 30 个文件,跑了 20 条命令。每条命令的输出、每个文件的内容,全都堆在messages列表里。上下文窗口满了之后,API 直接拒绝:prompt_too_long。

8.2 核心设计:便宜的先跑,贵的后跑

┌─────────────────────────────────────────────────────────────┐
│  L1: snip_compact    → 裁掉无关的旧对话(0 API)              │
│  L2: micro_compact   → 旧工具结果占位(0 API)                │
│  L3: tool_result_budget → 大结果落盘(0 API)                 │
│  L4: compact_history → LLM 全量摘要(1 API)                  │
│  应急: reactive_compact → 更激进的裁剪(1 API)                │
└─────────────────────────────────────────────────────────────┘

8.3 L1: snip_compact 裁掉无关的旧对话

消息数超过 50 条 → 保留头部 3 条(初始上下文)和尾部 47 条(当前工作),中间裁掉。唯一额外边界条件:不能把 assistant(tool_use) 和后面的 user(tool_result) 拆开:

def snip_compact(messages, max_messages=50):
if len(messages) <= max_messages:
return messages
head_end, tail_start = 3, len(messages) - (max_messages - 3)
if head_end > 0 and _message_has_tool_use(messages[head_end - 1]):
while head_end < len(messages) and _is_tool_result_message(messages[head_end]):
head_end += 1
if (tail_start > 0 and tail_start < len(messages)
and _is_tool_result_message(messages[tail_start])
and _message_has_tool_use(messages[tail_start - 1])):
tail_start -= 1
snipped = tail_start - head_end
placeholder = {"role": "user", "content": f"[snipped {snipped} messages from conversation middle]"}
return messages[:head_end] + [placeholder] + messages[tail_start:]

8.4 L2: micro_compact — 旧工具结果占位

只保留最近 3 条tool_result的完整内容,更旧的替换为一行占位符:

KEEP_RECENT_TOOL_RESULTS = 3
def micro_compact(messages):
tool_results = collect_tool_result_blocks(messages)
if len(tool_results) <= KEEP_RECENT_TOOL_RESULTS:
return messages
for _, _, block in tool_results[:-KEEP_RECENT_TOOL_RESULTS]:
if len(block.get("content", "")) > 120:
block["content"] = "[Earlier tool result compacted. Re-run if needed.]"
return messages

8.5 L3: tool_result_budget — 大结果落盘

统计最后一条 user 消息里所有tool_result的总大小。超过 200KB → 按大小排序,从最大的开始落盘到.task_outputs/tool-results/,上下文里只留标记 + 前 2000 字符预览:

def tool_result_budget(messages, max_bytes=200_000):
last = messages[-1]
blocks = [(i, b) for i, b in enumerate(last["content"])
if b.get("type") == "tool_result"]
total = sum(len(str(b.get("content", ""))) for _, b in blocks)
if total <= max_bytes:
return messages
ranked = sorted(blocks, key=lambda p: len(str(p[1].get("content", ""))), reverse=True)
for idx, block in ranked:
if total <= max_bytes:
break
block["content"] = persist_large_output(block["tool_use_id"], str(block["content"]))
total = recalculate_total(blocks)
return messages

8.6 L4: compact_history — LLM 全量摘要

三步流程:

  • 保存 transcript:完整对话写入.transcripts/,JSONL 格式
  • LLM 生成摘要:把对话历史发给 LLM,要求保留当前目标、重要发现、已改文件、剩余工作、用户约束等关键信息
  • 替换消息列表:所有旧消息被替换为一条摘要
def compact_history(messages):
transcript_path = write_transcript(messages)  # 先保存完整对话
summary = summarize_history(messages)          # LLM 生成摘要
return [{"role": "user",
"content": f"[Compacted]\n\n{summary}"}]

熔断器:连续失败 3 次后停止重试,防止死循环浪费 API 调用。

8.7 应急: reactive_compact

API 返回 prompt_too_long(413)时触发,比 compact_history 更激进:

def reactive_compact(messages):
transcript = write_transcript(messages)
tail_start = max(0, len(messages) - 5)
if (tail_start > 0 and tail_start < len(messages)
and _is_tool_result_message(messages[tail_start])
and _message_has_tool_use(messages[tail_start - 1])):
tail_start -= 1
summary = summarize_history(messages[:tail_start])
return [{"role": "user",
"content": f"[Reactive compact]\n\n{summary}"}, *messages[tail_start:]]

8.8 完整的压缩管线

def agent_loop(messages):
reactive_retries = 0
while True:
# 三个预处理器(0 API 调用)
# 顺序:budget 先跑,确保大内容落盘后再做占位和裁剪
messages[:] = tool_result_budget(messages)    # L3: 大结果落盘
messages[:] = snip_compact(messages)          # L1: 裁中间
messages[:] = micro_compact(messages)         # L2: 旧结果占位
# 还不够?LLM 摘要(1 API 调用)
if estimate_token_count(messages) > THRESHOLD:
messages[:] = compact_history(messages)
try:
response = client.messages.create(...)
except PromptTooLongError:
if reactive_retries < MAX_REACTIVE_RETRIES:
messages[:] = reactive_compact(messages)  # 应急
reactive_retries += 1
continue
raise  # 超过重试上限,抛出异常
# ... 工具执行 ...
# compact 工具:模型主动调用时触发 compact_history
if block.name == "compact":
messages[:] = compact_history(messages)
results.append({..., "content": "[Compacted. History summarized.]"})
messages.append({"role": "user", "content": results})
break

顺序不能换。L3(budget)在 L2(micro)前面,因为 micro 会把旧的大 tool_result 替换成一行占位符,budget 必须在那之前把完整内容落盘。

8.9 与 CC 源码的精确对照

执行顺序对照:

维度教学版Claude Code
执行顺序budget → snip → micro → autobudget → snip → micro → collapse → auto
snip_compact保留头 3 + 尾 47CC 仅主线程启用;HISTORY_SNIP feature gate
micro_compact文本占位符替换两条路径:time-based 直接清内容,cached 走 API cache_edits
tool_result_budget200KB 字符200,000 字符
compact_history 阈值字符数估算精确 token:contextWindow - maxOutputTokens - 13_000
摘要要求5 类信息9 个部分 + <analysis>/<summary> 双标签
压缩 prompt简单 prompt首尾双重防呆禁止调工具
PTL retry有(简化)truncateHeadForPTLRetry() 按消息组回退
后压缩恢复无(教学版只保留摘要)自动重新读取最近文件、计划、agent/skill/tool 等
熔断器3 次3 次
reactive 重试1 次CC 有更精细的分级重试

完整常量参考:

常量值源文件
AUTOCOMPACT_BUFFER_TOKENS13,000autoCompact.ts:62
MAX_CONSECUTIVE_AUTOCOMPACT_FAILURES3autoCompact.ts:70
MAX_OUTPUT_TOKENS_FOR_SUMMARY20,000autoCompact.ts:30
POST_COMPACT_TOKEN_BUDGET50,000compact.ts:123
POST_COMPACT_MAX_FILES_TO_RESTORE5compact.ts:122
POST_COMPACT_MAX_TOKENS_PER_FILE5,000compact.ts:124
时间 micro_compact 间隔60 分钟timeBasedMCConfig.ts
MAX_COMPACT_STREAMING_RETRIES2compact.ts:131

第九章:Task System – 文件持久化的任务图(s12)

9.1 问题:TodoWrite 的局限

s05 的 TodoWrite 是当前任务的执行清单,保存在会话内存中。但"重构整个后端"涉及认证模块、数据库层、API 路由、测试,任务之间有先后依赖。需要任务系统:每个任务是一个 JSON 文件,任务之间有blockedBy依赖,跨会话持久化在磁盘上。

9.2 数据结构

@dataclass
class Task:
id: str
subject: str
description: str
status: str          # pending | in_progress | completed
owner: str | None    # Agent 名(多 Agent 场景)
blockedBy: list[str] # 依赖的任务 ID 列表

9.3 五个工具操作

create_task:创建任务,自动 save_task 到 .tasks/{id}.json

def create_task(subject: str, description: str = "",
blockedBy: list[str] | None = None) -> Task:
task = Task(
id=f"task_{int(time.time())}_{random_hex(4)}",
subject=subject, description=description,
status="pending", owner=None,
blockedBy=blockedBy or [],
)
save_task(task)
return task

can_start:依赖检查

def can_start(task_id: str) -> bool:
task = load_task(task_id)
for dep_id in task.blockedBy:
if not _task_path(dep_id).exists():
return False
dep = load_task(dep_id)
if dep.status != "completed":
return False
return True

claim_task:认领任务

def claim_task(task_id: str, owner: str = "agent") -> str:
task = load_task(task_id)
if task.status != "pending":
return f"Task {task_id} is {task.status}, cannot claim"
if not can_start(task_id):
deps = [d for d in task.blockedBy
if load_task(d).status != "completed"]
return f"Blocked by: {deps}"
task.owner = owner
task.status = "in_progress"
save_task(task)
return f"Claimed {task_id} ({task.subject})"

complete_task:完成与解锁

def complete_task(task_id: str) -> str:
task = load_task(task_id)
task.status = "completed"
save_task(task)
unblocked = [t.subject for t in list_tasks()
if t.status == "pending" and t.blockedBy
and can_start(t.id)]
msg = f"Completed {task_id} ({task.subject})"
if unblocked:
msg += f"\nUnblocked: {', '.join(unblocked)}"
return msg

状态机:

pending ──claim──→ in_progress ──complete──→ completed

9.4 与 CC 源码的精确对照

TaskRecord 的完整 9 个字段:

字段类型用途
idstring递增整数 ID
subjectstring简短标题
descriptionstring自由格式描述
activeFormstring?进行时态,in_progress 时在 spinner 显示
ownerstring?分配的 agent ID
statuspending/in_progress/completed生命周期
blocksstring[]此任务阻塞的任务 ID(下游)
blockedBystring[]阻塞此任务的任务 ID(上游)
metadataRecord?任意扩展键值对

并发认领的锁机制:

claimTask() 用双重锁防竞争:

  • 任务文件锁:proper-lockfile 锁住 {taskId}.json(最多重试 30 次,指数退避 5-100ms)。锁内重新读取任务、检查已被他人认领、检查已完成、检查上游未完成、设置 owner。
  • 列表级锁:.lock 文件,原子性扫描所有任务并检查该 agent 是否已有其他 open task。

高水位标防 ID 重用:

.highwatermark 文件记录曾分配过的最高任务 ID。即使任务被删除,ID 也不会被重用。

四个 Task 工具:

CC 的任务系统有四个工具(不是教学版的一个通用 Task 工具):TaskCreate、TaskGet、TaskUpdate、TaskList。全部设置isConcurrencySafe: true和shouldDefer: true。

第十章:Agent Teams – 多 Agent 协作(s15)

10.1 问题:单个 Agent 的注意力覆盖不了所有模块

"重构整个后端"涉及认证模块、数据库层、API 路由、测试。一个 Agent 在修 API 路由时,认证模块的细节已经不在上下文里了。

s06 的子 Agent 是临时工,叫来干一件事就走了。但有些任务需要能通信、能协作的队友。

10.2 解决方案:MessageBus + 队友线程

MessageBus:文件收件箱

class MessageBus:
def send(self, from_agent: str, to_agent: str,
content: str, msg_type: str = "message"):
msg = {"from": from_agent, "to": to_agent,
"content": content, "type": msg_type,
"ts": time.time()}
inbox = MAILBOX_DIR / f"{to_agent}.jsonl"
with open(inbox, "a") as f:
f.write(json.dumps(msg) + "\n")
def read_inbox(self, agent: str) -> list[dict]:
inbox = MAILBOX_DIR / f"{agent}.jsonl"
if not inbox.exists():
return []
msgs = [json.loads(line) for line in inbox.read_text().splitlines()]
inbox.unlink()  # 消费式:读完删除
return msgs

spawn_teammate_thread:启动队友

def spawn_teammate_thread(name: str, role: str, prompt: str) -> str:
system = f"You are '{name}', a {role}. Use tools to complete tasks."
def run():
messages = [{"role": "user", "content": prompt}]
sub_tools = [bash, read_file, write_file, send_message]
for _ in range(10):           # 最多 10 轮
inbox = BUS.read_inbox(name)
if inbox:
messages.append({"role": "user",
"content": f"<inbox>{json.dumps(inbox)}</inbox>"})
response = client.messages.create(
model=MODEL, system=system, messages=messages[-20:],
tools=sub_tools, max_tokens=8000)
# ... 执行工具、处理结果
BUS.send(name, "lead", summary, "result")
threading.Thread(target=run, daemon=True).start()

Lead 的 inbox 注入:

inbox = BUS.read_inbox("lead")
if inbox:
inbox_text = "\n".join(
f"From {m['from']}: {m['content'][:200]}" for m in inbox)
history.append({"role": "user",
"content": f"[Inbox]\n{inbox_text}"})

10.3 与 CC 源码的精确对照

15 种消息类型:

类型方向用途
plain text双向普通队友间通信
idle_notification队友→Lead队友完成一轮工作,进入空闲
permission_request队友→Lead队友需要操作审批
permission_responseLead→队友Lead 审批结果
plan_approval_request队友→Lead队友提交计划待审
plan_approval_responseLead→队友Lead 审批计划
shutdown_requestLead→队友请求体面关机
shutdown_approved队友→Lead确认关机
shutdown_rejected队友→Lead拒绝关机(附原因)
task_assignmentLead→队友分配任务
team_permission_updateLead→队友广播权限变更
mode_set_requestLead→队友修改队友的权限模式
sandbox_permission_*双向网络权限请求/回复
teammate_terminated系统队友被移除通知

权限冒泡:双向轮询

  • 队友遇到需要审批的操作 → 发 permission_request 到 Lead 的收件箱
  • Lead 的 useInboxPoller(每 1 秒轮询)检测到请求 → 路由到 ToolUseConfirmQueue
  • Lead 的 UI 显示审批对话框,带队友名字和颜色
  • 用户审批后 → Lead 发 permission_response 回队友的收件箱
  • 队友的 useSwarmPermissionPoller(每 500ms 轮询)收到回复 → 继续或拒绝执行

队友生命周期:

  • Spawn:创建 tmux 窗格(或进程内),分配颜色,写入 team config
  • Work:useInboxPoller每 1 秒检查收件箱 → 有消息就提交为新的 turn
  • Idle:Stop hook 触发 → 发idle_notification给 Lead
  • Shutdown:Lead 发shutdown_request→ 队友回复 shutdown_approved→ Lead 清理

Team Config:

{
"name": "my-team",
"leadAgentId": "lead@my-team",
"members": [{
"agentId": "researcher@my-team",
"name": "researcher",
"agentType": "general-purpose",
"color": "blue",
"isActive": true
}]
}

第十一章:Comprehensive Agent – 全部机制归位(s20)

11.1 问题:真实 Agent 不会只带一个机制运行

一个能长期工作的 coding agent 需要同时拥有:工具分发和权限边界、hooks 扩展点、todo 计划和任务图、技能、记忆、系统 prompt 组装、压缩和错误恢复、后台任务和 cron 调度、团队、协议、自治认领、worktree 隔离、MCP 外部工具接入。

难点不是把功能堆起来,而是看清楚它们都挂在循环的哪个位置。

11.2 完整的 Harness 架构

用户输入
→ UserPromptSubmit hooks
→ cron/background 通知注入
→ context compact
→ memory + skills + MCP 状态组装 system prompt
→ LLM
→ has tool_use block?
否 → Stop hooks → 返回
是 → PreToolUse hooks + permission
→ TOOL_HANDLERS / MCP handlers / background dispatch
→ PostToolUse hooks
→ tool_result / task_notification 回 messages
→ 下一轮

11.3 27 个内置工具

bash, read_file, write_file, edit_file, glob
todo_write, task, load_skill, compact
create_task, list_tasks, get_task, claim_task, complete_task
schedule_cron, list_crons, cancel_cron
spawn_teammate, send_message, check_inbox
request_shutdown, request_plan, review_plan
create_worktree, remove_worktree, keep_worktree
connect_mcp

assemble_tool_pool()每轮组装:BUILTIN_TOOLS + connected MCP tools

11.4 组件在循环中的精确位置

位置组件作用
用户输入前后UserPromptSubmit hooks记录、注入、审计用户输入
LLM 前cron queue把定时触发的 prompt 注入 messages
LLM 前background notifications后台任务完成后以 <task_notification> 注入
LLM 前compaction pipeline先压大输出,再裁历史,再压旧 tool_result,必要时摘要
LLM 前memory / skills / MCP state组装 system prompt,让模型看到当前能力和长期上下文
LLM 调用error recovery429/529 重试,max_tokens 升级,prompt too long 触发 reactive compact
工具执行前PreToolUse hooks + permission拦截危险命令、写越界、破坏性 MCP 工具
工具分发assemble_tool_pool组装内置工具和 MCP 动态工具
工具执行时background dispatch慢 bash 操作放 daemon thread,主循环先返回占位结果
工具执行后PostToolUse hooks大输出告警、日志等后处理
返回循环tool_result每个 tool_use 对应一个 tool_result,再回到下一轮
本轮没有 tool_use / 停止时Stop hooks统计、清理、审计

11.5 两层计划系统同时存在

  • todo_write:当前会话内的轻量计划,保存在内存中
  • task graph:跨会话、可依赖、可认领的任务文件,写入.tasks/task_*.json

前者帮助单个 Agent 不漂移;后者支撑团队协作。

11.6 两种 Delegation 同时存在

  • task:一次性 subagent。独立messages[],中间过程丢弃,只返回最终摘要。
  • spawn_teammate:持久队友线程。通过 MessageBus 收发消息,能 idle 轮询任务板并自动认领。

一次性 subagent 解决"上下文隔离";持久队友解决"长期并行协作"。

11.7 完整的 system prompt 组装

def assemble_system_prompt(context):
# 身份和工具说明
# workspace
# skills catalog
# .memory/MEMORY.md
# 已连接 MCP server
...

技能只在 system prompt 里放目录。完整内容通过load_skill(name)按需加载。

11.8 完整的错误恢复

  • 429:指数退避重试
  • 529:指数退避,连续失败可切 fallback model
  • max_tokens:先提高 max_tokens,再要求 continuation
  • prompt too long:reactive compact 后重试

11.9 后台与 cron

慢 bash 操作不会阻塞主循环:

should_run_background → start_background_task → placeholder tool_result
后台完成 → task_notification → 下一轮注入 messages

cron 调度器独立 daemon thread 每秒检查一次。CLI 会监听cron_queue,命中后主动把[Scheduled] …注入并运行一轮 Agent。

11.10 worktree 与 MCP

worktree 负责隔离目录:

  • create_worktree(name, task_id)创建独立分支和目录
  • task 的worktree字段绑定目录
  • 队友 claim 到带 worktree 的 task 后,bash/read/write 自动在对应目录下执行

MCP 负责外部能力:

  • connect_mcp(name) 连接 mock server
  • assemble_tool_pool() 把 MCP 工具组装进工具池
  • 工具名统一为 mcp__server__tool

第十二章:范式总结 – 从"用完即弃"到"永远在线"

仓库最后提出了一个极具前瞻性的对比:

learn-claude-code                   claw0
(Agent 套具内部机制:                 (永远在线套具:
循环、工具、规划、                    心跳、定时、IM 通道、
团队、工作树隔离)                     记忆、Soul 人格)
  • learn-claude-code 教的是"用完即弃"型驾驭层, 打开终端、给任务、做完关闭、下轮重来。Claude Code 属于此类。
  • claw0(OpenClaw)展示了另一种可能:在相同 Agent 核心上,增加Heartbeat(心跳)和 Cron(定时任务)两个驾驭层机制,让 Agent 从"戳一下动一下"变成"每 30 秒自己醒来检查工作"。

加上 IM 多通道路由(WhatsApp/Telegram/Slack/Discord 等 13+ 平台)、持久化上下文记忆、Soul 人格系统,Agent 就从一次性工具变成了永远在线的个人 AI 助手。

第十三章:结语 – 机制很多,循环一个

从 s01 到 s20,代码表面越来越复杂,但核心始终没变:

while True:
response = LLM(messages, tools)
if not has_tool_use(response.content):
return
results = execute_tools(response.content)
messages.append(tool_results)

Claude Code 的复杂性不是"另一个 agent 大脑",而是一个成熟 harness 的复杂性。模型负责判断和行动选择;harness 负责把环境、工具、权限、记忆、团队和外部能力组织好。

“Bash is all you need. Real agents are all the universe needs.”(Bash 就是你所需要的一切。真正的 Agent 是宇宙所需要的一切。)

“This is not ‘copy the source code.’ This is ‘grasp the key designs and build it yourself.’”(这不是"复制源码",这是"掌握关键设计,自己构建"。)

学AI大模型的正确顺序,千万不要搞错了

🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!

有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!

就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋

在这里插入图片描述

📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇

学习路线:

✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经

以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!

我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

【IC设计实战】去耦电容decap在电源完整性中的关键作用与选型策略 本文深入探讨了去耦电容(decap)在IC设计电源完整性中的核心作用。文章分析了decap如何通过提供本地电荷缓冲来抑制电源噪声与电压波动,并详细阐述了其选型与布局策略,包括MIM、MOM、MOS电容的特性对比,以及如何权衡峰值抑制与建立速度的矛盾,为设计稳定可靠的芯片电源系统提供实践指导。 阅读详情

相关推荐

TI DSP TMS320F280025 Note1:工程模板Template创建

该方法新建的工程支持寄存器开发,同时也支持库函数开发,新建后移动该工程也不需要重新修改路径,路径使用变量定义,使用方便、移植性能高

weixin_52849254的博客 2303

[学习笔记]超越超级大循环与原生RTOS:事件驱动架构如何改变嵌入式固件的可扩展性

RTC:事件处理器一旦开始,全部状态迁移、进出动作、输出事件必须全部执行完毕才返回;同一个组件,当前处理没结束,不会开始下一条事件。这不是架构给状态机额外施加的限制,这是UML状态图等全部状态机形式化本身固有的语义要求。如果迁移中途可以被打断,状态机会停留在未定义的中间状态。RTC保证两次事件之间,状态机永远处于明确定义的合法状态,便于分析与测试。

MiKiJT的博客 237

Spring Boot日志可视化实战:5分钟搞定Promtail采集与Grafana查询(避坑指南)

本文详细介绍了如何通过Promtail和Grafana实现Spring Boot日志的可视化查询,提供从日志采集到高效查询的全流程实战指南,重点解决部署中的常见问题。内容包括Logback配置、Promtail日志采集、Grafana的LogQL查询技巧及生产环境优化建议,帮助开发者快速定位和解决日志问题。

weixin_42526015的博客 107

源网荷储分层控制架构:从设备级到系统级的协调优化

面对分布式光伏、储能与柔性负荷大规模接入带来的运行复杂性,传统粗放管控模式已难适应高比例新能源场景。源网荷储分层控制架构通过“设备级保安全、台区级调协同、系统级统全局”的多层级协同体系,实现单体精准执行、局部动态平衡与全域优化统筹,构建自上而下指令分解、自下而上反馈闭环的精细化调控新模式,有效破解设备冲突、局部最优与全局失衡难题,推动分布式能源从“各自为战”迈向“协同共赢”,为新型电力系统安全高效运行提供核心支撑。

zhuhai_xigedian的博客 293

一种高超声速飞行器弹道的仿真方法

设计并实现了一个高超声速飞行器弹道仿真算法,并应用到基于OSGEarth的态势中。

eyepeak的博客 6542

当OTN网络遭遇LOS告警:5个运维老手才知道的故障定位技巧(含CA动作对照表)

本文深入解析OTN网络中LOS告警的实战定位技巧,涵盖光功率深度诊断、模块差异分析及核心的CA动作机制。通过逆向追踪告警流与对照速查表,帮助运维人员快速锁定故障段落,区分硬软故障,并掌握系统健康度评估方法,从而提升排障效率与网络稳定性。

weixin_29266007的博客 554

政务知识库AI架构选型:强合规约束下的架构决策与落地路径

政务知识库是典型的强合规导向场景,架构选型的第一原则是「合规一票否决」:安全优先级高于效果,可控性优先级高于体验,所有技术决策必须先通过等保、密评、信创、数据不出域四大硬性红线校验,再在此基础上优化检索准确率与用户体验。对应部署在互联网政务服务域、政务外网办公域、涉密内网核心域,三域物理隔离,数据仅能通过审批流程单向摆渡,禁止跨网调用模型与流转数据。• 放弃通用文档加载器,基于公文格式标准开发定制化结构化解析器,自动提取文号、标题、发文机关、成文日期、生效日期、密级、主题词等元数据,与分片内容绑定入库。

2401_89363342的博客 375

《QGIS空间数据处理与高级制图》【目录】

《QGIS空间数据处理与高级制图》是一本面向GIS技术人员和学生的进阶手册,重点提升数据处理效率和专业制图标准化水平。全书涵盖空间数据预处理、矢量编辑、栅格处理、坐标系统应用和符号化设计等核心内容。书中详细介绍了批量数据转换、拓扑检查、遥感影像处理、自定义坐标系创建等实用技能,并提供了模型构建器和PyQGIS脚本实现自动化操作。通过大量实战案例和问题排查指南,帮助读者从基础使用进阶到专业应用,适合测绘、规划、环保等行业的GIS从业者参考使用。

LuckyHanMo的博客 375

炜晔科技智慧断路器技术方案解析:自研架构、离线防护与波形识别

智慧断路器的技术门槛不在 "能否联网",而在采样精度、保护闭环与抗干扰设计。本文以炜晔科技 WYA1 系列为分析对象,从系统架构、计量采样链、保护控制逻辑、离线自持设计与通信组网五个层面拆解其技术方案,并给出工程选型与调试的核对要点,供配电物联网方向的开发者与工程技术人员参考。

WEIYE_Technology的博客 279

材料仿真软件:LAMMPS_(8).温度和压力控制

在 LAMMPS 中,温度和压力的控制是通过多种恒温器和恒压器实现的。Nose-Hoover 恒温器和恒压器因其准确性和广泛适用性而被经常使用,而 Berendsen 恒温器和恒压器则因其计算效率高而适用于初步仿真或粗粒化模型。温度重标和压力重标方法虽然简单,但在某些情况下可以快速调整系统的温度和压力。通过选择合适的控制方法,可以根据具体的需求和系统特性来设计和运行分子动力学仿真,从而获得准确和可靠的结果。在实际应用中,建议先进行初步的仿真以确定合适的控制参数,然后再进行细致的仿真以验证结果的稳定性。

kkchenjj的博客 1696

Windows11配置WSL2支持代理上网

说起来本来这个功能我也不需要的,只是最近突然有个需求就顺便研究了下,WSL2默认的网络方式是NAT,即WSL2的网卡本身是虚拟网卡,通过以太网或WIFI的地址转换来上互联网,我试了下是不能直接走代理的,最近比较忙没具体研究,但是我用另一种方式实现了,下面介绍给需要的人。注意:这个方法只能是WIndows11系统,WIndows10系统上的WSL2缺少了一项功能导致不可用。1、方法总体没什么难度,NAT方式暂时没研究透,后续有时间再研究2、WIndows10系统不支持mirrored,暂时需要另辟蹊径。

jiexijihe945的博客 9592

零信任架构实战:基于天远单人婚姻查询构建自动化智慧住房资格核验网关

破解公租房资格核查痛点:从传统纸质婚姻凭证抽检到权威民政数据穿透直连 在智慧城市公共租赁住房(公租房)、保障性租赁住房以及共有产权房等民生保障工程中,保障房资源的公平精准分配是住房保障管理中台的核心职责。按照现行住房保障准入政策,申请主体的家庭结构直接决定了配租资格准入与面积配给标准:单身家庭申请人通常享有特定的单人保障配额与独立的财产评估标准,要求申请人具

2501_94042197的博客 216

深度学习在传感器数据分析中的创新应用

传感器是物理世界与数字世界的“接口”,其生成的高维、时序、多源数据蕴含着设备状态、环境变化、用户行为等关键信息。传统传感器数据分析依赖手工特征工程与简单机器学习模型,难以应对复杂场景下的非线性、长程依赖与实时性需求。深度学习通过自动特征提取非线性建模与端到端学习,成为传感器数据处理的革命性工具。本文从概念基础理论框架架构设计实现机制到实际应用,系统拆解深度学习与传感器数据的融合逻辑,结合工业预测维护医疗健康监测智能交通等场景,揭示其技术边界与未来演化方向。

大数据洞察的博客 568

Qt网络编程实战指南:从底层Socket到现代异步架构的选型与避坑

本文梳理Qt网络编程的核心模块与演进路线,对比QTcpSocket与QNetworkAccessManager的使用边界,结合HTTP请求与TCP长连接的完整示例,说明信号槽、内存管理与事件循环的配合方式。重点记录连接池设计、证书校验、线程亲和性等实际开发中的关键决策点,帮助读者在C/S或跨平台项目中建立稳定的网络层基座。

2402_83344867的博客 328

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

“伪私有化”的技术甄别:模型API外调与本地推理的架构差异

企业采购AI Agent平台时,“支持私有化”几乎成了标配话术。但“私有化”三个字背后,可能藏着一条你看不见的出站链路:管理后台在你的内网,模型推理却调用了外部API。这不是私有化,是“伪私有化”。本文从网络层、进程层、数据层和审计层四个维度,拆解模型API外调与本地推理的架构差异,给出可落地的技术甄别方法,附代码示例、状态机设计和熔断机制。

2501_93684580的博客 115

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

斯坦福 AI Agent 开发课程指南:从底层架构、工程实践到自主智能体

Agent 开发正在从框架调用走向系统工程。早期学习 Agent,可能只需要掌握 Prompt Engineering、Function Calling,以及 LangChain 等框架。如何设计稳定的任务执行循环。如何管理上下文与长期记忆。如何组织工具、环境和多 Agent 协作。如何保证长时间任务执行的可靠性。如何科学评估 Agent 的效果。如何优化成本、延迟与资源利用。如何持续提升系统能力。因此,

hello! 302

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

OpenAI Control Room 架构拆解:给企业 AI Agent 加一套可审计的急停系统

OpenAI 公开了用于追踪和停止研究模型工作负载的 Control Room。本文拆解 job_id、推理前鉴权、35 秒撤销窗口与 Fail Closed 设计,并给出企业 AI Agent 急停控制面的数据模型、FastAPI 参考实现、缓存撤销策略和故障演练清单。

jerry764的博客 326

司库、共享、战略三大财务系统怎么建、怎么打通:架构分层与接口设计实践

大型央国企财务管理和监管模式已进入以数智化、穿透式为特征的新阶段。三大系统的建设顺序、边界划分与接口设计,决定了这套架构能否支撑未来五到十年的演进。当业务提出一个新的管理需求时,需要改动几个系统?如果答案是"一个",架构是健康的;如果答案是"三个以上",说明分层和收敛还没做到位。说明:本文基于公开政策文本与行业实施经验整理,写作时间为 2026 年 11 月。架构模式与接口设计为通用实践总结,具体方案需结合企业现有系统格局调整。

Yonyou_BIP的博客 222

零信任架构实战:基于海宇人脸身份证比对A构建手机银行大额转账人证强一致性校验网关

破解手机银行大额转账与高危交易核验痛点:从传统短信静态验证到人脸身份证比对A数据穿透直连 在移动互联网金融纵深演进与全渠道无感支付普及的时代浪潮下,商业银行手机银行 App 与开放银行网关已成为个人及个体工商户资金流转、财富管理及移动支付的最核心基础设施。依据中国人民银行关于金融移动支付客户端合规管理、加强支付结算管理防范电信网络新型违法犯罪以及反洗钱客户身

haiyufuwu的博客 108

智能家居全国交付中B端需求路由系统的架构设计与实现:从流量变现到交付确定性匹配

内容渠道负责需求识别与客户关系,交付基础设施负责方案设计、标准装调、全案交付、无忧交付、专家支持、现场节点服务与售后服务。需求类型分为货源需求、交付需求、方案设计需求、工具需求、专家支持需求。交付类需求进入交付链路,包括标准装调、全案交付、现场节点服务、无忧交付、售后服务。交付类需求进入交付链路,方案设计类需求进入方案设计链路,专家支持类需求进入技术专家判断链路。第七,全案交付与无忧交付。B端内容渠道通过标准化入口收集需求参数:需求类型、项目区域、生态类型、设备品类、项目规模、当前卡点。

weixin_43432501的博客 232

广州政务信息发布系统信创适配实战:多场景架构选型与踩坑记录-优胜电子

我遇到过叫号系统的消息推送在达梦上延迟从 200ms 涨到 2s 的情况,排查发现是数据库连接池配置在国产环境下需要重新调优。政务大厅的信息发布场景本身不复杂:大厅主屏放叫号和公告,窗口条屏同步状态,走廊屏放指引,户外屏做宣传,会议室屏支持应急插播。建议在正式迁移前,搭一套和目标环境一致的测试平台,把每个场景的业务流程完整跑一遍。信创验收看的是端到端链路,播放盒是国产的但屏幕驱动不兼容,验收时可能卡住。:信创迁移前,把叫号相关的 SQL 在目标数据库上跑一遍压力测试,重点看分页查询和连接池。

Tuotuo_SEO的博客 396

《PCIe + BRAM架构(一):直接把DDR换成BRAM,只有读带宽没变》

本系列用同一块 XC7K325T 板卡、同一条 XDMA 通路,对比四种 PCIe 数据搬运架构:DDR 大缓存、Streaming、BRAM 轻缓存、多通道。本篇讲第三种:BRAM 架构。上一篇《PCIe + DDR架构(二):实测——更改上位机数据处理方式,带宽从1051.4 MB/s 涨到 1926.3 MB/s》

weixin_44017370的博客 378

从 0 到 1:一个高清书法库的瓦片金字塔、静态化架构与 AI 搜索(SEO/GEO)实践

本文分享了自建书法数字资源库的技术实践:基于瓦片金字塔实现65,536px高清图流畅缩放,采用PIL切片、OpenSeadragon渲染,结合静态JSON索引与PHP路由架构,优化加载性能与内存使用。针对大图浏览、AI搜索适配及运维坑点(如递归死锁、缓存失效、防盗链调试)提出实用解决方案,全站无广告,源码透明,为古籍、文物等数字化项目提供可复用的技术参考。

daxiangxm的博客 326

【LLM推理与Serving⑪】MoE推理与MLA:DeepSeek-V3架构下的显存与通信权衡

本系列博客专注于LLM推理与Serving的核心技术,从基础概念到工程实践,循序渐进。本篇是第11篇,我们深入MoE(混合专家)模型的推理系统,结合DeepSeek-V3的架构设计,探讨专家并行、MLA(Multi-head Latent Attention)等关键技术如何在显存与通信之间找平衡。

Dawson Zhu的博客 331

零信任架构实战:基于天远新能源改表电池报告构建自动化汽车金融抵押放款核验网关

破解新能源车抵贷资产评估痛点:从传统线下验车到新能源改表电池报告数据穿透直连 在深化绿色金融创新、推动新能源汽车消费与资产证券化的大背景下,各大商业银行汽车金融事业部、持牌消费金融公司以及汽车融资租赁机构,正加速重构线上新能源车辆抵押贷款、售后回租与实时授信审批微服务架构。在新能源车抵押借款业务流转中,借款人在线提交车辆识别代号(VIN)与借款申请后,信审与

2501_94042197的博客 213
上一篇: 删掉80%的Skill,Agent反而更听话了
下一篇: 很久没读过这么通透的Agent的文章了。
Python_金钱豹
博客等级 码龄5年 1万+粉丝 2841原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值