DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现

Agent核心接口-Agent是怎么干活的

本文助你理解三个问题:

  • Agent是什么(接口定义)
  • Agent怎么处理一个任务(Turn-step模型)
  • 怎么中途干预Agent(Inbox机制)

什么是Agent

上一节我们知道了:插件通过ctx找到服务

现在进阶:Agent本身就是一个服务,通过ctx.agent管理

类比:

概念 类比
ctx.agents 公司里的"员工花名册"
一个 Agent 实例 一个员工
agent.id 员工工号
agent.status 员工状态(空闲/忙碌/已离职)
agent.session 员工的工作档案(记忆)
agent.inbox 员工的任务收件夹
java 复制代码
// 创建 Agent = 招一个员工
const handle = await ctx.agents.create({
  name: 'my-agent',
  model: 'deepseek-chat',
  // ...
})

const agent = handle.agent  // 拿到 Agent 句柄

// 查看状态
agent.status  // 'idle' | 'running'

// 销毁 Agent = 辞退员工
await handle.dispose()

Turn-Step模型(核心)

Agent运转的基本单元。用餐厅点餐类比:

Turn(轮次)= 从"收到消息"到"没有更多事要做"

Step(步骤)= 一次 LLM 调用 + 它触发的所有工具调用

场景:用户说"帮我查天气,然后根据天气推荐穿搭"

这不是一个简单的问答,而是:

Step 1: LLM 决定调用"查天气"工具 → 工具返回"北京 25°C 晴"

Step 2: LLM 拿到结果,决定调用"推荐穿搭"工具 → 返回"穿T恤+薄外套"

Step 3: LLM 觉得任务完成了,不再调用工具 → Turn 结束

一个 Turn 里有 3 个 Step

Inbox(收件夹)

Agent怎么知道有新任务,通过Inbox

三种往 Inbox 塞消息的方式:

  1. followup();排队,唤醒处理;
  2. steer();排队,立即处理;
  3. inject();排队,不唤醒;

两类事件

dsh中有两类时间,作用不同:

  • 持久化事件:写入日志,永久保存;可以重播、分叉;模型可见 ⟺ 已记录
  • 实时事件:不写入日志,只在内存中;用于实时协调;模型不可见

Session Events = 历史记录(发生了什么)

Agent Events = 实时控制(正在发生什么)

核心变量不变

DSH有一个非常重要的设计原则:模型能看到的东西,必须能从日志重播得到

如果 LLM 看到了某个信息,但没有记录到日志:

→ 系统重启后,LLM 就不记得这个信息了

→ 无法重现之前的对话

→ 无法审计 Agent 为什么做了某个决定

所以:任何到达 LLM 的内容,必须写入 Session Log

学习感悟

我们常说的Agent loop循环,在dsh中就是Step循环

"Agent 的核心公式是 LLM + Tools + Planning + Memory。LLM 是大脑,Tools 是手脚,Planning 是决策循环,Memory 是记忆。

我研究过 DeepSeek Harness 的实现,它把这个公式落地成了一个 Turn-Step 模型:

Turn 是一次完整对话

Step 是 LLM 的一次决策+工具调用

多个 Step 串起来就是一个 Agent Loop,LLM 反复决策直到任务完成

它在八股的基础上还加了几个生产级特性:

Inbox 机制:可以中途给 Agent 塞新任务或紧急指令

Session Log 持久化:所有模型可见内容都记录日志,支持重播和分叉

工具执行管道:工具调用不是直接执行,而是经过多层审批/拦截"

总结

一句话概括

Agent 是有状态的工作单元,通过 Turn-Step 模型驱动 LLM 循环决策,支持中途干预。

核心知识点

  1. Agent 是什么

Agent = 有 ID、状态、收件夹的工作单元

ctx.agents = Agent 注册表(员工花名册)

  1. Turn-Step 模型

Turn(轮次)= 从收到消息到没有更多事要做

Step(步骤)= 一次 LLM 调用 + 它触发的工具调用

一个 Turn 可以包含多个 Step(LLM 反复决策直到完成)

  1. Inbox 三种干预方式
方式 效果 场景
followup() 排队,唤醒处理 普通新任务
steer() 排队,紧急处理 立即打断
inject() 排队,不唤醒 注入上下文
  1. 两类事件

Session Events(持久化):turn/start, step/end, tool/call, tool/result...

→ 写入日志,可重播、可审计

Agent Events(实时):agent/created, agent/pre-step, agent/status...

→ 内存中,用于实时协调

  1. 核心不变量

"Model-visible means logged"

LLM 看到的任何内容,必须能从 Session Log 重播得到

面试怎么答

"dsh 用 Turn-Step 模型驱动 Agent:Turn 是一次完整对话,Step 是一次 LLM 调用+工具调用,多个 Step 串起来就是 Agent Loop。支持三种中途干预------followup 排队、steer 紧急插入、inject 静默注入。设计不变量是'模型可见即日志记录'------LLM 看到的必须写入 Session Log,保证可重播可审计。"

一页速记

Agent:有 ID / status / inbox / session 的工作单元

Turn-Step:Turn = 完整对话,Step = LLM调用 + 工具调用

Inbox:followup(排队) / steer(紧急) / inject(静默)

事件:Session Events(持久) / Agent Events(实时)

不变量:Model-visible ⟺ Logged

相关推荐
侧耳倾听1111 小时前
jwt使用简介
java·jwt
顶点多余1 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神2 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066492 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
yaoxin5211233 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F3 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
HugoStudio_SWAN4 小时前
【擦除重绘】C++ 控制台动画:弹跳 Logo DVD 屏保效果
开发语言·c++·学习·程序人生
2601_962072214 小时前
SpringMVC进阶(自定义拦截器以及异常处理)
java