LLM Agent System — Agent System Design
Starting from the perceive–decide–act–observe loop, this breaks down the essence of an agent: state, tools, and stopping conditions.
Agent 的本质
Agent 是一个能够自主决策和行动的系统。它通过感知环境、分析信息、制定计划并执行任务来实现特定目标。Agent 可以是软件程序、机器人或任何能够与环境交互的实体。是一个会持续感知、决策、执行、再感知的系统。
Agent = LLM + 状态 + 工具 + 执行循环 + 停止条件
目标 Goal
↓
当前状态 State
↓
LLM 决策 Decide
↓
调用工具 Act
↓
获得结果 Observe
↓
更新状态 Update
↓
是否完成?
├─ 否:继续循环
└─ 是:结束
tool_call
tool_call 是 Agent 在执行过程中调用外部工具的能力。它允许 Agent 利用各种工具来获取信息、处理数据或执行特定任务,从而增强其功能和适应性。通过 tool_call,Agent 可以访问数据库、调用 API、执行计算等,以更有效地完成目标。
tool_call = 调用外部工具 + 获取结果 + 更新状态
Agent 决定调用工具
↓
调用外部工具(如 API、数据库查询等)
↓
获取工具的结果
↓
更新 Agent 的状态
包含了: CLI(本地命令行工具), HTTP API(远程服务), MCP(远程工具协议), DB/SDK
Memory
Memory 是 Agent 用来存储和管理信息的能力。它允许 Agent 记住过去的经验、当前的环境状态以及与用户的交互历史,从而更好地理解上下文并做出更智能的决策。Memory 可以分为短期记忆和长期记忆,短期记忆用于存储当前任务相关的信息,而长期记忆则用于积累经验和知识。
Memory = 存储信息 + 管理信息 + 利用信息, 让 agent 能跨步骤、跨时间记住信息
Agent 感知环境
↓
将感知到的信息存储在 Memory 中
↓
在决策过程中,Agent 从 Memory 中获取相关信息
↓
Agent 根据 Memory 中的信息做出决策
短期记忆
用于存储当前任务相关的信息,例如用户输入、当前状态等。这些信息在任务完成后可能会被清除。
// 短期记忆示例
const shortTermMemory: string[] = [];
长期记忆
用于积累经验和知识,例如用户的偏好、历史交互记录等。这些信息可以在多个任务之间保留,以帮助 Agent 更好地理解用户和环境。
// 长期记忆示例
// 可以使用数据库或文件系统来存储长期记忆
vectorDB.save('user_preferences', { theme: 'dark', language: 'en' });
KV Cache
KV Cache 是一种特殊类型的 Memory,用于存储键值对数据。它允许 Agent 快速访问和更新特定的信息,例如用户的偏好设置、环境变量等。KV Cache 可以被视为一个高效的缓存系统,帮助 Agent 在决策过程中快速获取所需的信息。
本质是 Transformer 推理优化(attention cache)
// KV Cache 示例
const kvCache: Record<string, any> = {};
// 存储键值对
// 例如:kvCache['user_preferences'] = { theme: 'dark', language: 'en' };
本质
在 Transformer 里,每一层都有:
- Q(Query)
- K(Key)
- V(Value)
KV cache = 模型对“过去内容的压缩记忆”
作用
- 推理加速(最重要)
- 有 cache, 1000 tokens → 线性增长;
- 没有 cache, 1000 tokens → 二次增长
- Streaming
- 有 cache, 可以边生成边输出;
- 没有 cache, 只能等生成完了才能输出;
- 长对话
- 有 cache, 可以记住之前的对话内容;
- 没有 cache, 只能记住有限的上下文;
KV cache 的成本
- 内存占用:KV Cache 需要占用额外的内存来存储键值对数据,尤其是在处理大量信息时,可能会导致内存压力增大。
- 性能开销:虽然 KV Cache 可以加速访问特定信息,但在某些情况下,频繁的读写操作可能会引入性能开销,尤其是在高并发环境下
工程实现
- Prefix Cache(前缀复用): 在多轮对话中,前缀部分的输入(如用户的历史对话)可以被缓存起来,避免每次都重新计算,从而加速推理过程。
- Cache Eviction(缓存淘汰): 实现一个缓存淘汰策略,根据使用频率、时间戳或其他指标来决定何时清除不再需要的键值对数据,以优化内存使用。
- KV Cache Compression(缓存压缩): 采用压缩算法来减少 KV Cache 的内存占用,例如使用量化、稀疏表示等技术来压缩键值对数据,同时保持足够的访问效率。
- Multi-query Attention Cache(多查询注意力缓存): 在 Transformer 中实现多查询注意力机制,允许同时缓存多个查询的键值对数据,以支持更复杂的推理场景和更长的上下文。
- Layer-wise Cache(层级缓存): 在 Transformer 的每一层都可以实现 KV Cache,存储每层的键值对数据,以便在后续的推理过程中快速访问。
- Dynamic Cache Management(动态缓存管理): 实现一个动态的缓存管理系统,根据当前的任务需求和内存限制来调整 KV Cache 的大小和内容,以优化性能和内存使用。
KV cache = Transformer 的“计算缓存”,不是你的“记忆系统”
进阶
- context window 控制
- memory 压缩
- subagent 分裂
- streaming pipeline
Agent Memory
Agent Memory 是 Agent 用来存储和管理信息的能力。它允许 Agent 记住过去的经验、当前的环境状态以及与用户的交互历史,从而更好地理解上下文并做出更智能的决策。Agent Memory 可以分为短期记忆和长期记忆,短期记忆用于存储当前任务相关的信息,而长期记忆则用于积累经验和知识。
Memory(逻辑层)
├─ short-term(当前对话)
├─ long-term(知识/历史)
├─ structured(状态)
KV Cache(底层)
└─ 模型推理优化(attention cache)
多 Agent Memory 如何协调
在多 Agent 系统中,每个 Agent 都可能有自己的 Memory 来存储和管理信息。
多个 agent = 多个“脑子”
为了协调这些 Memory,可以采用以下策略:
- 共享 Memory:多个 Agent 可以共享一个公共的 Memory,以便它们可以访问和更新相同的信息。这种方式适用于需要频繁交互和协作的 Agent。
- 独立 Memory(消息传递):每个 Agent 都有自己的独立 Memory,只在需要时通过工具调用或消息传递来共享信息。这种方式适用于相对独立的 Agent,减少了耦合。
- 混合 Memory:结合共享 Memory 和独立 Memory 的策略,根据具体需求选择性地共享信息。这种方式适用于既需要协作又需要独立操作的 Agent。
- Memory 同步机制:建立一个机制来同步不同 Agent 之间的 Memory,例如通过消息队列、事件系统或定期同步等方式,确保各个 Agent 都能及时获取最新的信息。
- Blackboard 模式:使用一个中央的“黑板”作为共享 Memory,所有 Agent 都可以读取和写入这个黑板上的信息。这种方式适用于需要高度协作的 Agent 系统。
SubAgent
SubAgent 是 Agent 系统中的一个子模块,负责处理特定的任务或功能。它可以被主 Agent 调用来完成特定的子任务,从而实现更复杂的功能。SubAgent 可以是一个独立的 Agent,也可以是一个专门的工具,负责处理特定类型的输入或执行特定的操作。 SubAgent 的引入可以帮助主 Agent 更好地组织和管理复杂的任务,提高系统的可维护性和扩展性。
Subagent = 把复杂任务拆给“另一个 agent loop”去做
主 Agent 接收用户输入
↓
主 Agent 分析输入并决定需要调用 SubAgent 来处理特定任务
↓
主 Agent 调用 SubAgent 并传递相关信息
↓
SubAgent 处理任务并返回结果给主 Agent
↓
主 Agent 根据 SubAgent 的结果继续执行后续操作
主 agent = CTO, subagent = 各个部门的负责人,tool_call = 各个部门的工具,memory = 各个部门的记录和经验
Harness Engineering
Harness Engineering 是一种设计和构建 Agent 系统的工程方法,旨在创建一个高效、可扩展和可靠的 Agent 系统。它涉及到系统架构设计、工具集成、Memory 管理、SubAgent 协调等多个方面,以确保 Agent 系统能够有效地完成预定的任务和目标。Harness Engineering 强调模块化设计、灵活性和可维护性,使得 Agent 系统能够适应不断变化的需求和环境。
本质: 控制多个 agent + tool + memory 的执行流程
Harness = 调度系统
Agent = Worker
Tool = 外部服务
Memory = 状态存储
Harness
├─ planner agent
├─ executor agent
├─ reviewer agent
├─ memory store
├─ retry / eval
GAN
GAN(Generative Adversarial Network)是一种深度学习模型,由两个神经网络组成:生成器(Generator)和判别器(Discriminator)。生成器负责生成新的数据样本,而判别器则负责区分生成的样本和真实的样本。通过不断地对抗训练,生成器逐渐学会生成更逼真的数据样本,从而提高了模型的生成能力。GAN 在图像生成、文本生成等领域有广泛的应用。
GAN = Generator + Discriminator
生成器 Generator
↓
生成新的数据样本
↓
判别器 Discriminator
↓
区分生成的样本和真实的样本
↓
对抗训练
↓
生成器逐渐学会生成更逼真的数据样本
Agent 系统不是对抗, Agent 是 协作 + 分工 + orchestration
高并发 Agent 系统的 KV Cache 优化架构
架构:
客户端 / API
↓
任务调度层
↓
Agent Orchestrator
↓
Memory / State 层
↓
LLM Runtime 层
↓
Tool / Executor 层
Agent Orchestrator
这是 harness 的核心。
负责:
- 任务拆分
- agent 选择
- subagent 分配
- retry
- evaluator
- 结束条件
这一层要尽量少带上下文,主要带:
- task id
- structured state pointer
- 当前阶段
不要把完整历史都塞进 orchestrator prompt。
Memory / State 层
不要把 memory 理解成“把所有历史文本塞回去”。
要拆成 4 类:
A. Session short state
当前轮最小状态:
{
taskId,
phase,
lastToolResult,
currentPlanStep
}
B. Structured state
结构化状态,存在 Redis / Postgres / KV store:
{
orderId,
signalId,
exposure,
currentModelStatus,
objectList,
exportPath
}
C. Summarized memory
摘要过的历史,而不是完整对话:
{
summary: "已经完成 submit.ts 修复,测试仍失败于 retry path"
}
D. Artifact memory
大文本、大日志、大截图、大 JSON 不进 prompt,只存引用:
{
buildLogRef: "s3://...",
renderImageRef: "...",
backtestResultRef: "..."
}
LLM Runtime 层
这里是推理服务:
- OpenAI / Claude / 自建推理
- vLLM / TGI / TensorRT-LLM 之类运行时
- KV cache 管理
- prefix cache
- batching
这一层只负责:
- 接收最小 prompt
- 生成下一步动作 / 结构化输出
Tool / Executor 层
这里是真正干活的地方:
trading:
- market data
- exchange API
- order submitter
- risk engine
- pnl query
blender:
- blender CLI
- Python runner
- render
- export glb/usd/fbx
- topology checker