第22章 从零构建 Mini-Harness —— Agent Loop 的最小实现
目录
上一篇我们了解了 Agent 间通信协议。本章我们从零构建一个 Mini-Harness——Agent Loop 的最小实现。
Mini-Harness 是什么
一句话定义:Agent Loop 的最小实现——observe→think→act→feedback 的核心循环。
Mini-Harness = 最小 Agent Loop 实现 定位:理解 Harness 核心的最佳实践项目
图表
代码
graph LR
Init[初始化] --> Loop[Agent Loop
核心循环]
Loop -->|observe→think→act→feedback| Loop
Loop -->|end_turn| Complete[完成]
Mini-Harness[最简实现
理解核心]graph LR
Init[初始化] --> Loop[Agent Loop
核心循环]
Loop -->|observe→think→act→feedback| Loop
Loop -->|end_turn| Complete[完成]
Mini-Harness[最简实现
理解核心]graph LR
Init[初始化] --> Loop[Agent Loop
核心循环]
Loop -->|observe→think→act→feedback| Loop
Loop -->|end_turn| Complete[完成]
Mini-Harness[最简实现
理解核心]graph LR
Init[初始化] --> Loop[Agent Loop<br/>核心循环]
Loop -->|observe→think→act→feedback| Loop
Loop -->|end_turn| Complete[完成]
Mini-Harness[最简实现<br/>理解核心]核心功能:
- 初始化:接收 prompt,构建 messages
- Agent Loop:observe→think→act→feedback 循环
- 完成:end_turn 返回结果
- 错误处理:处理执行错误
不包含功能(后续添加):
- 权限系统
- 上下文压缩
- MCP 集成
- Skills 加载
- 多 Agent 协作
Mini-Harness 架构
最小架构
图表
代码
graph TB
subgraph MiniHarness["Mini-Harness 架构"]
Init[初始化
prompt → messages]
Loop[Agent Loop
核心循环]
Tools[基本工具
Read/Write/Bash]
Complete[完成
end_turn]
end
Init --> Loop --> Complete
Loop -->|tool_use| Tools -->|返回| Loopgraph TB
subgraph MiniHarness["Mini-Harness 架构"]
Init[初始化
prompt → messages]
Loop[Agent Loop
核心循环]
Tools[基本工具
Read/Write/Bash]
Complete[完成
end_turn]
end
Init --> Loop --> Complete
Loop -->|tool_use| Tools -->|返回| Loopgraph TB
subgraph MiniHarness["Mini-Harness 架构"]
Init[初始化
prompt → messages]
Loop[Agent Loop
核心循环]
Tools[基本工具
Read/Write/Bash]
Complete[完成
end_turn]
end
Init --> Loop --> Complete
Loop -->|tool_use| Tools -->|返回| Loopgraph TB
subgraph MiniHarness["Mini-Harness 架构"]
Init[初始化<br/>prompt → messages]
Loop[Agent Loop<br/>核心循环]
Tools[基本工具<br/>Read/Write/Bash]
Complete[完成<br/>end_turn]
end
Init --> Loop --> Complete
Loop -->|tool_use| Tools -->|返回| Loop核心组件
| 组件 | 功能 | 实现 |
|---|---|---|
| 初始化模块 | 接收 prompt,构建 messages | initialize() 函数 |
| Agent Loop | 核心循环 | agent_loop() 函数 |
| 工具系统(最小) | Read、Write、Bash | execute_tool() 函数 |
| 完成处理 | end_turn 返回结果 | handle_end_turn() 函数 |
Step 1:初始化模块
实现目标
一句话定义:接收用户 prompt,构建初始 messages 数组。
图表
代码
graph LR
Prompt[用户 prompt] --> Build[构建 messages]
Build --> System[System Prompt
基础约束]
Build --> User[User Message
任务描述]
System + User --> Messages[messages 数组]graph LR
Prompt[用户 prompt] --> Build[构建 messages]
Build --> System[System Prompt
基础约束]
Build --> User[User Message
任务描述]
System + User --> Messages[messages 数组]graph LR
Prompt[用户 prompt] --> Build[构建 messages]
Build --> System[System Prompt
基础约束]
Build --> User[User Message
任务描述]
System + User --> Messages[messages 数组]graph LR
Prompt[用户 prompt] --> Build[构建 messages]
Build --> System[System Prompt<br/>基础约束]
Build --> User[User Message<br/>任务描述]
System + User --> Messages[messages 数组]实现代码
# Mini-Harness 初始化模块
def initialize(prompt, system_prompt=None):
"""
初始化 Mini-Harness
参数:
prompt: 用户任务描述
system_prompt: 系统提示词(可选)
返回:
state: 包含 messages 数组的状态
"""
# 1. 默认 System Prompt
if system_prompt is None:
system_prompt = """
你是代码助手 Agent。你可以使用以下工具:
工具列表:
- Read: 读取文件
- Write: 写入文件
- Bash: 执行命令
约束:
- 每次只调用一个工具
- 工具调用后等待结果
- 完成任务后返回 end_turn
"""
# 2. 构建初始 messages
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": prompt}
]
# 3. 初始化状态
state = {
"messages": messages,
"loops": 0,
"tool_calls": 0,
"current_tool": None,
"last_result": None
}
return state
# 测试初始化
def test_initialize():
prompt = "读取 app.ts 文件,分析代码结构"
state = initialize(prompt)
print("初始化完成:")
print(f"- messages 数量: {len(state['messages'])}")
print(f"- loops: {state['loops']}")
print(f"- tool_calls: {state['tool_calls']}")
return state
# 运行测试
test_initialize()输出结果
初始化完成:
- messages 数量: 2
- loops: 0
- tool_calls: 0Step 2:Agent Loop 核心循环
实现目标
一句话定义:observe→think→act→feedback 的持续循环。
图表
代码
graph LR
Observe[observe
接收 messages] --> Think[think
Model 推理]
Think --> Decide{决策}
Decide -->|tool_use| Act[act
执行工具]
Act --> Feedback[feedback
追加结果]
Feedback --> Observe
Decide -->|end_turn| End[结束对话]graph LR
Observe[observe
接收 messages] --> Think[think
Model 推理]
Think --> Decide{决策}
Decide -->|tool_use| Act[act
执行工具]
Act --> Feedback[feedback
追加结果]
Feedback --> Observe
Decide -->|end_turn| End[结束对话]graph LR
Observe[observe
接收 messages] --> Think[think
Model 推理]
Think --> Decide{决策}
Decide -->|tool_use| Act[act
执行工具]
Act --> Feedback[feedback
追加结果]
Feedback --> Observe
Decide -->|end_turn| End[结束对话]graph LR
Observe[observe<br/>接收 messages] --> Think[think<br/>Model 推理]
Think --> Decide{决策}
Decide -->|tool_use| Act[act<br/>执行工具]
Act --> Feedback[feedback<br/>追加结果]
Feedback --> Observe
Decide -->|end_turn| End[结束对话]实现代码
# Mini-Harness Agent Loop
def agent_loop(state, model_api, tools):
"""
Agent Loop 核心循环
参数:
state: 包含 messages 的状态
model_api: Model API 接口
tools: 工具执行函数映射
返回:
state: 更新后的状态
response: Model 的最终响应
"""
while True:
# 1. observe: 接收 messages
messages = state["messages"]
# 2. think: Model 推理
response = model_api(messages)
# 3. 提取 stop_reason
stop_reason = response.get("stop_reason", "end_turn")
# 4. decide: 决策下一步
if stop_reason == "end_turn":
# end_turn: 结束对话
return state, response
elif stop_reason == "tool_use":
# tool_use: 执行工具
tool_use = extract_tool_use(response)
# 5. act: 执行工具
tool_name = tool_use["name"]
tool_params = tool_use["parameters"]
if tool_name in tools:
tool_result = tools[tool_name](tool_params)
else:
tool_result = f"错误:工具 {tool_name} 不存在"
# 6. feedback: 追加结果
state["messages"].append({
"role": "assistant",
"content": response["content"],
"tool_use": tool_use
})
state["messages"].append({
"role": "user",
"content": tool_result
})
# 7. 更新状态
state["loops"] += 1
state["tool_calls"] += 1
state["current_tool"] = tool_name
state["last_result"] = tool_result
# 8. 循环限制(防止无限循环)
if state["loops"] > 20:
print("警告:循环超过 20 次,强制结束")
return state, response
def extract_tool_use(response):
"""
从 Model 响应中提取 tool_use
参数:
response: Model 响应
返回:
tool_use: 工具调用信息
"""
content = response.get("content", "")
# 简化版:假设 Model 返回格式为 JSON
# 实际情况需要解析 Model 的具体输出格式
import json
import re
# 尻找 JSON 格式的 tool_use
json_match = re.search(r'\{[^}]+\}', content)
if json_match:
tool_info = json.loads(json_match.group())
return {
"name": tool_info.get("tool", "unknown"),
"parameters": tool_info.get("params", {})
}
return {"name": "unknown", "parameters": {}}循环流程说明
| 循环步骤 | 动作 | 实现函数 |
|---|---|---|
| observe | 接收 messages 数组 | messages = state["messages"] |
| think | Model 推理 | response = model_api(messages) |
| decide | 判断 stop_reason | if stop_reason == "end_turn" |
| act | 执行工具 | tools[tool_name](tool_params) |
| feedback | 追加结果 | state["messages"].append() |
Step 3:基本工具系统(最小)
实现目标
一句话定义:实现 Read、Write、Bash 三个基本工具。
图表
代码
graph TB
subgraph BasicTools["基本工具"]
Read[Read
读取文件]
Write[Write
写入文件]
Bash[Bash
执行命令]
endgraph TB
subgraph BasicTools["基本工具"]
Read[Read
读取文件]
Write[Write
写入文件]
Bash[Bash
执行命令]
endgraph TB
subgraph BasicTools["基本工具"]
Read[Read
读取文件]
Write[Write
写入文件]
Bash[Bash
执行命令]
endgraph TB
subgraph BasicTools["基本工具"]
Read[Read<br/>读取文件]
Write[Write<br/>写入文件]
Bash[Bash<br/>执行命令]
end实现代码
# Mini-Harness 基本工具系统
import os
import subprocess
def tool_read(params):
"""
Read 工具:读取文件
参数:
params: {"file_path": "/path/to/file"}
返回:
文件内容
"""
file_path = params.get("file_path")
if not file_path:
return "错误:缺少 file_path 参数"
if not os.path.exists(file_path):
return f"错误:文件 {file_path} 不存在"
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return f"文件内容:\n{content}"
except Exception as e:
return f"错误:读取文件失败 - {str(e)}"
def tool_write(params):
"""
Write 工具:写入文件
参数:
params: {"file_path": "/path/to/file", "content": "file content"}
返回:
写入结果
"""
file_path = params.get("file_path")
content = params.get("content")
if not file_path or not content:
return "错误:缺少 file_path 或 content 参数"
try:
# 创建目录(如果不存在)
os.makedirs(os.path.dirname(file_path), exist_ok=True)
# 写入文件
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return f"成功:文件 {file_path} 已写入"
except Exception as e:
return f"错误:写入文件失败 - {str(e)}"
def tool_bash(params):
"""
Bash 工具:执行命令
参数:
params: {"command": "ls -la"}
返回:
命令输出
"""
command = params.get("command")
if not command:
return "错误:缺少 command 参数"
try:
# 执行命令
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
timeout=30
)
# 返回输出
if result.returncode == 0:
return f"命令输出:\n{result.stdout}"
else:
return f"错误:命令执行失败\n{result.stderr}"
except subprocess.TimeoutExpired:
return "错误:命令执行超时(30秒)"
except Exception as e:
return f"错误:执行命令失败 - {str(e)}"
# 创建工具映射
tools = {
"Read": tool_read,
"Write": tool_write,
"Bash": tool_bash
}
# 测试工具
def test_tools():
# 测试 Read
result = tool_read({"file_path": "/tmp/test.txt"})
print(f"Read 结果:\n{result}\n")
# 测试 Write
result = tool_write({"file_path": "/tmp/test.txt", "content": "Hello Mini-Harness"})
print(f"Write 结果:\n{result}\n")
# 测试 Bash
result = tool_bash({"command": "ls /tmp"})
print(f"Bash 结果:\n{result}\n")
# 运行测试
test_tools()工具实现要点
| 工具 | 参数 | 错误处理 | 安全检查 |
|---|---|---|---|
| Read | file_path | 文件不存在、读取失败 | ❌ Mini-Harness 不做安全检查 |
| Write | file_path, content | 目录创建、写入失败 | ❌ 后续添加权限系统 |
| Bash | command | 命令失败、超时 | ❌ 后续添加危险命令检查 |
注意:Mini-Harness 是最小实现,暂不包含安全检查。后续章节会添加权限系统。
Step 4:Model API 接口
实现目标
一句话定义:Model API 的简化接口——接收 messages,返回响应。
实现代码
# Mini-Harness Model API 接口(简化版)
def model_api(messages):
"""
Model API 接口(简化版)
参数:
messages: messages 数组
返回:
response: Model 响应
"""
# 简化版:模拟 Model 响应
# 实际情况需要调用真实的 Model API
last_message = messages[-1]["content"]
# 简化版决策逻辑
if "读取" in last_message or "查看" in last_message:
# 决定调用 Read 工具
return {
"content": "决定读取文件。{\"tool\": \"Read\", \"params\": {\"file_path\": \"app.ts\"}}",
"stop_reason": "tool_use"
}
elif "写入" in last_message or "创建" in last_message:
# 决定调用 Write 工具
return {
"content": "决定写入文件。{\"tool\": \"Write\", \"params\": {\"file_path\": \"output.txt\", \"content\": \"result\"}}",
"stop_reason": "tool_use"
}
elif "执行" in last_message or "运行" in last_message:
# 决定调用 Bash 工具
return {
"content": "决定执行命令。{\"tool\": \"Bash\", \"params\": {\"command\": \"npm test\"}}",
"stop_reason": "tool_use"
}
else:
# end_turn: 结束对话
return {
"content": "任务已完成。",
"stop_reason": "end_turn"
}
# 实际 Model API 调用示例(伪代码)
def real_model_api(messages):
"""
实际 Model API 调用(伪代码)
实际情况需要:
1. 调用 Anthropic API 或其他 Model API
2. 处理 API 认证
3. 处理 API 响应格式
"""
import anthropic
client = anthropic.Anthropic(api_key="YOUR_API_KEY")
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
messages=messages
)
return {
"content": response.content[0].text,
"stop_reason": response.stop_reason
}Model API 要点
| 要点 | 说明 | Mini-Harness 实现 |
|---|---|---|
| API 调用 | 调用 Model API | 简化版模拟响应 |
| 认证处理 | API Key 等 | ❌ 简化版暂不处理 |
| 响应格式 | content + stop_reason | ✅ 包含基本格式 |
| 错误处理 | API 错误 | ❌ 简化版暂不处理 |
Step 5:完整 Mini-Harness
完整实现
# Mini-Harness 完整实现
class MiniHarness:
"""
Mini-Harness: Agent Loop 的最小实现
"""
def __init__(self, system_prompt=None):
"""
初始化 Mini-Harness
参数:
system_prompt: 系统提示词(可选)
"""
self.system_prompt = system_prompt or self.default_system_prompt()
self.tools = self.create_tools()
self.state = None
def default_system_prompt(self):
"""默认 System Prompt"""
return """
你是代码助手 Agent。你可以使用以下工具:
工具列表:
- Read: 读取文件(参数:file_path)
- Write: 写入文件(参数:file_path, content)
- Bash: 执行命令(参数:command)
约束:
- 每次只调用一个工具
- 工具调用后等待结果
- 完成任务后返回 end_turn
"""
def create_tools(self):
"""创建工具映射"""
return {
"Read": self.tool_read,
"Write": self.tool_write,
"Bash": self.tool_bash
}
def tool_read(self, params):
"""Read 工具"""
file_path = params.get("file_path")
if not file_path:
return "错误:缺少 file_path 参数"
if not os.path.exists(file_path):
return f"错误:文件 {file_path} 不存在"
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
return f"文件内容:\n{content}"
except Exception as e:
return f"错误:读取文件失败 - {str(e)}"
def tool_write(self, params):
"""Write 工具"""
file_path = params.get("file_path")
content = params.get("content")
if not file_path or not content:
return "错误:缺少 file_path 或 content 参数"
try:
os.makedirs(os.path.dirname(file_path), exist_ok=True)
with open(file_path, 'w', encoding='utf-8') as f:
f.write(content)
return f"成功:文件 {file_path} 已写入"
except Exception as e:
return f"错误:写入文件失败 - {str(e)}"
def tool_bash(self, params):
"""Bash 工具"""
command = params.get("command")
if not command:
return "错误:缺少 command 参数"
try:
result = subprocess.run(
command,
shell=True,
capture_output=True,
text=True,
timeout=30
)
if result.returncode == 0:
return f"命令输出:\n{result.stdout}"
else:
return f"错误:命令执行失败\n{result.stderr}"
except subprocess.TimeoutExpired:
return "错误:命令执行超时(30秒)"
except Exception as e:
return f"错误:执行命令失败 - {str(e)}"
def initialize(self, prompt):
"""初始化"""
self.state = {
"messages": [
{"role": "system", "content": self.system_prompt},
{"role": "user", "content": prompt}
],
"loops": 0,
"tool_calls": 0
}
return self.state
def agent_loop(self, model_api):
"""Agent Loop"""
while True:
messages = self.state["messages"]
# Model 推理
response = model_api(messages)
stop_reason = response.get("stop_reason", "end_turn")
if stop_reason == "end_turn":
return response
elif stop_reason == "tool_use":
tool_use = self.extract_tool_use(response)
tool_name = tool_use["name"]
tool_params = tool_use["parameters"]
if tool_name in self.tools:
tool_result = self.tools[tool_name](tool_params)
else:
tool_result = f"错误:工具 {tool_name} 不存在"
# 追加结果
self.state["messages"].append({
"role": "assistant",
"content": response["content"]
})
self.state["messages"].append({
"role": "user",
"content": tool_result
})
# 更新状态
self.state["loops"] += 1
self.state["tool_calls"] += 1
# 循环限制
if self.state["loops"] > 20:
print("警告:循环超过 20 次,强制结束")
return response
def extract_tool_use(self, response):
"""提取 tool_use"""
content = response.get("content", "")
import json
import re
json_match = re.search(r'\{[^}]+\}', content)
if json_match:
tool_info = json.loads(json_match.group())
return {
"name": tool_info.get("tool", "unknown"),
"parameters": tool_info.get("params", {})
}
return {"name": "unknown", "parameters": {}}
def run(self, prompt, model_api):
"""完整运行"""
# 1. 初始化
self.initialize(prompt)
# 2. Agent Loop
response = self.agent_loop(model_api)
# 3. 返回结果
return {
"response": response,
"loops": self.state["loops"],
"tool_calls": self.state["tool_calls"],
"messages": self.state["messages"]
}
# 测试 Mini-Harness
def test_mini_harness():
harness = MiniHarness()
prompt = "读取 /tmp/test.txt 文件"
result = harness.run(prompt, model_api)
print("运行完成:")
print(f"- 循环次数: {result['loops']}")
print(f"- 工具调用次数: {result['tool_calls']}")
print(f"- 最终响应: {result['response']['content']}")
# 运行测试
test_mini_harness()测试输出
运行完成:
- 循环次数: 1
- 工具调用次数: 1
- 最终响应: 任务已完成。Mini-Harness 的局限性
不包含功能
图表
代码
graph TB
subgraph NotIncluded["Mini-Harness 不包含"]
N1[权限系统
无安全检查]
N2[上下文压缩
无压缩机制]
N3[MCP 集成
无外部连接]
N4[Skills 加载
无领域知识]
N5[多 Agent
无子 Agent]
end
style NotIncluded fill:#FFE0E0graph TB
subgraph NotIncluded["Mini-Harness 不包含"]
N1[权限系统
无安全检查]
N2[上下文压缩
无压缩机制]
N3[MCP 集成
无外部连接]
N4[Skills 加载
无领域知识]
N5[多 Agent
无子 Agent]
end
style NotIncluded fill:#FFE0E0graph TB
subgraph NotIncluded["Mini-Harness 不包含"]
N1[权限系统
无安全检查]
N2[上下文压缩
无压缩机制]
N3[MCP 集成
无外部连接]
N4[Skills 加载
无领域知识]
N5[多 Agent
无子 Agent]
end
style NotIncluded fill:#FFE0E0graph TB
subgraph NotIncluded["Mini-Harness 不包含"]
N1[权限系统<br/>无安全检查]
N2[上下文压缩<br/>无压缩机制]
N3[MCP 集成<br/>无外部连接]
N4[Skills 加载<br/>无领域知识]
N5[多 Agent<br/>无子 Agent]
end
style NotIncluded fill:#FFE0E0| 不包含功能 | 说明 | 后续章节 |
|---|---|---|
| 权限系统 | 无安全检查,所有操作自动执行 | 第二十三章添加 |
| 上下文压缩 | 无压缩机制,messages 可能溢出 | 第二十三章添加 |
| MCP 集成 | 无外部系统连接 | 第二十四章添加 |
| Skills 加载 | 无领域知识注入 | 第二十四章添加 |
| 多 Agent 协作 | 无子 Agent 派发 | 第二十四章添加 |
安全风险
Mini-Harness 的安全风险:
| 风险 | 说明 | 后续解决 |
|---|---|---|
| 无权限检查 | 所有操作自动执行 | 添加权限系统 |
| 危险命令执行 | Bash 可执行任意命令 | 添加 deny/ask/allow |
| 文件覆盖 | Write 可覆盖任意文件 | 添加路径限制 |
| 上下文溢出 | messages 无限制增长 | 添加压缩机制 |
Mini-Harness 的价值
学习价值
图表
代码
graph TB
subgraph LearningValue["学习价值"]
V1[理解核心
Agent Loop 核心]
V2[动手实践
代码实现]
V3[最小实现
去除复杂细节]
V4[渐进扩展
逐步添加功能]
end
style LearningValue fill:#E0FFE0graph TB
subgraph LearningValue["学习价值"]
V1[理解核心
Agent Loop 核心]
V2[动手实践
代码实现]
V3[最小实现
去除复杂细节]
V4[渐进扩展
逐步添加功能]
end
style LearningValue fill:#E0FFE0graph TB
subgraph LearningValue["学习价值"]
V1[理解核心
Agent Loop 核心]
V2[动手实践
代码实现]
V3[最小实现
去除复杂细节]
V4[渐进扩展
逐步添加功能]
end
style LearningValue fill:#E0FFE0graph TB
subgraph LearningValue["学习价值"]
V1[理解核心<br/>Agent Loop 核心]
V2[动手实践<br/>代码实现]
V3[最小实现<br/>去除复杂细节]
V4[渐进扩展<br/>逐步添加功能]
end
style LearningValue fill:#E0FFE0| 价值 | 说明 | 重要性 |
|---|---|---|
| 理解核心 | 通过代码理解 Agent Loop | ⭐⭐⭐⭐⭐ |
| 动手实践 | 实际编码实现 | ⭐⭐⭐⭐⭐ |
| 最小实现 | 去除复杂细节,聚焦核心 | ⭐⭐⭐⭐ |
| 渐进扩展 | 逐步添加功能,深入理解 | ⭐⭐⭐⭐ |
本章小结
- Mini-Harness 定义:Agent Loop 的最小实现——observe→think→act→feedback
- 核心功能:初始化、Agent Loop、基本工具(Read/Write/Bash)、完成处理
- 不包含功能:权限系统、上下文压缩、MCP、Skills、多 Agent
- 初始化模块:接收 prompt,构建 messages 数组
- Agent Loop:observe→think→decide→act→feedback 循环
- 基本工具:Read(读取)、Write(写入)、Bash(执行)
- Model API:接收 messages,返回响应(content + stop_reason)
- 完整实现:MiniHarness 类,包含初始化、Loop、工具、运行
- 局限性:无安全检查、无压缩、无扩展
- 安全风险:无权限、危险命令、文件覆盖、上下文溢出
- 学习价值:理解核心、动手实践、最小实现、渐进扩展
预告:下一篇我们添加工具系统与权限控制,增强 Mini-Harness 的安全性。
相关内容
- 第01章 Agent 的 70 年简史 —— 从符号推理到深度学习
- 第02章 LLM 时代的 Agent 革命 —— 2023-2026 爆发期
- 第03章 Harness 概念溯源 —— "模型是大脑,Harness是身体"
- 第04章 Harness 核心架构 —— 四层模型详解
- 第05章 Harness vs Agent vs Model —— 三者关系辨析
收录于 合集・01-AI 工具与智能体/07-Harness 27
如果这篇文章对你有帮助,欢迎请我喝杯咖啡 ☕
支付宝
微信