零基础入门 AI Agent Harness 开发实战
零基础入门 AI Agent Harness 开发实战
作者:15年经验资深架构师 | 首发于技术博客
阅读时间:约45分钟 | 代码可直接运行 | 适合所有对AI Agent开发感兴趣的零基础开发者
开篇:为什么你需要AI Agent Harness?
最近两年AI Agent的火爆程度不用我多说:从AutoGPT到GPT-Engineer,从企业智能客服到个人AI助理,几乎所有AI应用都在往Agent化的方向演进。但很多零基础开发者尝试做Agent的时候都会遇到一模一样的痛点:
- 要对接不同大模型的API,OpenAI、通义千问、文心一言的接口格式不统一,每次换模型都要重写一半代码
- 工具调用逻辑要自己写:参数解析、错误重试、权限控制,全是重复劳动
- 记忆管理头疼:短上下文窗口不够用,长记忆容易乱,还要处理截断、去重、检索
- 调试难:Agent为什么调用错工具?为什么记不住之前的对话?没有观测工具根本查不出来
- 部署麻烦:写完的Agent怎么对接飞书/微信/公众号?怎么扩容?怎么监控?
而AI Agent Harness就是为了解决这些痛点诞生的:它是一套专门用来开发、测试、运行、部署AI Agent的开发框架,把所有Agent通用的能力(大模型适配、工具调度、记忆管理、观测、部署)都封装好了,你只需要写自己的业务逻辑,就能快速上线一个生产可用的AI Agent。
今天这篇文章我们就从零基础开始,从核心概念到原理,再到完整的项目实战,手把手带你写出第一个属于自己的AI Agent,学完就能用在工作和个人项目里。
一、核心概念与问题背景
1.1 基础概念拆解
我们先把几个核心概念讲透,零基础也能100%理解:
| 概念 | 通俗解释 | 核心作用 |
|---|---|---|
| AI Agent | 具备自主决策能力的AI程序,能根据用户需求,自己决定什么时候调用工具、什么时候回复用户,不需要人工一步步指令 | 代替人完成复杂的、多步骤的任务 |
| Harness | 原意指“马具、安全带”,在技术领域指把零散组件组装成完整系统的框架 | 把大模型、工具、记忆这些零散组件组装成一个可用的Agent |
| AI Agent Harness | 专门用来开发、运行AI Agent的框架,封装了所有Agent通用的底层能力 | 降低Agent开发门槛,让开发者只关注业务逻辑 |
1.2 问题背景:Agent开发的三座大山
在没有Agent Harness的时代,开发一个Agent要翻越三座大山:
(1)重复造轮子成本极高
一个最基础的Agent至少需要5个模块:大模型调用层、工具调度层、记忆管理层、逻辑控制层、输出层。每个模块从零写至少要几千行代码,而且90%的逻辑是所有Agent通用的,每个项目重复写一遍浪费大量时间。
(2)能力适配复杂度高
不同大模型的Function Calling格式不一样,不同工具的接口规范不一样,不同部署环境的要求不一样,每次换模型、换工具、换部署环境都要重写大量适配代码。
(3)观测与调试几乎不可能
Agent的决策过程是黑盒:为什么调用错工具?为什么忘记了用户之前说的话?为什么返回的结果不对?没有专门的观测工具的话,根本无法定位问题。
而Agent Harness就是专门来搬掉这三座大山的:通用能力它帮你写,适配层它帮你做,观测调试工具它自带,你只需要写业务相关的自定义工具和提示词就行。
1.3 核心要素组成
一个标准的AI Agent Harness包含7个核心模块:
1.4 常见Agent Harness框架对比
目前市面上主流的Agent Harness框架有很多,我们整理了一个对比表,方便你根据需求选择:
| 框架 | 开发厂商 | 学习曲线 | 扩展性 | 核心优势 | 适用场景 |
|---|---|---|---|---|---|
| OpenAI Agents SDK | OpenAI | 低 | 高 | 官方出品,和OpenAI生态深度集成,支持自动规划 | 基于OpenAI模型的Agent开发 |
| LangChain Agents | LangChain | 中 | 极高 | 生态最完善,支持几乎所有大模型和工具 | 复杂企业级Agent开发 |
| LlamaIndex Agent Runner | LlamaIndex | 中 | 高 | 和RAG能力深度集成 | 知识库类Agent开发 |
| Dify Agent | 言知科技 | 极低 | 中 | 可视化拖拽开发,低代码,自带部署 | 零基础快速上线Agent |
| AutoGPT Harness | Significant Gravitas | 中 | 高 | 支持完全自主的长任务规划 | 复杂自主任务Agent开发 |
1.5 边界与外延
我们要明确Agent Harness的能力边界,避免误用:
✅ 适合的场景:多轮交互任务、需要调用多个工具的任务、需要上下文记忆的任务、需要快速迭代的Agent项目
❌ 不适合的场景:简单单轮问答(用普通大模型API就行,用Harness反而过重)、对响应速度要求极高的场景(Harness有额外的调度开销)
注意:Agent Harness不是银弹,它不能解决大模型本身的推理误差问题,只能通过流程控制和错误重试降低误差的影响。
二、数学模型与核心原理
AI Agent的决策过程本质上是一个马尔可夫决策过程(MDP),我们可以用数学公式来精准描述:
2.1 Agent决策的数学模型
Agent(St)=argmaxAt∈AE[∑k=0∞γkR(St+k,At+k)∣St]\text{Agent}(S_t) = \arg\max_{A_t \in \mathcal{A}} \mathbb{E}\left[\sum_{k=0}^{\infty} \gamma^k R(S_{t+k}, A_{t+k}) \mid S_t\right]Agent(St)=argAt∈AmaxE[k=0∑∞γkR(St+k,At+k)∣St]
我们来拆解每个变量的含义,零基础也能看懂:
- StS_tSt:t时刻的状态,包括当前用户输入、历史对话记忆、工具返回结果、系统提示词
- AtA_tAt:t时刻Agent可以选择的动作,包括「直接回复用户」、「调用工具A」、「调用工具B」、「更新记忆」等
- A\mathcal{A}A:所有可选动作的集合
- R(S,A)R(S,A)R(S,A):奖励函数,用来评估在状态S下执行动作A的收益,比如正确调用工具得+2分,调用错工具得-1分,返回正确结果得+3分,泄露用户信息得-10分
- γ\gammaγ:折扣因子,取值0~1,代表未来的奖励相对于当前奖励的权重,越接近1越看重长期收益
- E\mathbb{E}E:期望,代表Agent要选择让未来总奖励期望最大的动作
而Agent Harness的核心作用就是把这个MDP的通用部分全部实现了:状态管理、动作调度、奖励计算、错误处理,开发者只需要定义两个东西:
- 自定义的动作(也就是工具)
- 适合自己业务的奖励函数(或者通过提示词隐式定义)
2.2 Agent Harness运行流程
我们用流程图来直观展示Harness的运行逻辑:
这个流程里所有的步骤都是Harness帮你实现的,你不需要写一行调度逻辑,只需要注册工具、写提示词就行。
三、从零实现一个极简Agent Harness
为了让你彻底理解Harness不是黑盒,我们用Python写一个不到200行的极简Agent Harness,功能完整,可直接运行。
3.1 开发环境准备
首先你需要准备:
- Python 3.10+ 版本
- 大模型API Key:我们推荐用阿里云通义千问的免费额度,不需要翻墙,新用户有100万token的免费额度,申请地址:https://dashscope.console.aliyun.com/
- 依赖包:
openai(兼容OpenAI格式的大模型调用)、python-dotenv(环境变量管理)、requests(HTTP请求)
安装依赖:
pip install openai python-dotenv requests
3.2 极简Harness代码实现
import os
import json
import requests
from openai import OpenAI
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
class SimpleAgentHarness:
def __init__(self,
model="qwen-plus",
temperature=0.1,
system_prompt="你是一个有用的助手。",
max_steps=5):
"""
初始化Agent Harness
:param model: 大模型名称,默认用通义千问plus
:param temperature: 温度参数,越低越稳定
:param system_prompt: 系统提示词,定义Agent的角色
:param max_steps: 最大运行步数,防止死循环
"""
# 初始化大模型客户端,这里用通义千问的兼容OpenAI格式的接口
self.client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
self.model = model
self.temperature = temperature
self.system_prompt = system_prompt
self.max_steps = max_steps
# 初始化工具存储:key是工具名,value是(工具定义, 实现函数)
self.tools = []
self.tool_impls = {}
# 初始化记忆:第一条是系统提示词
self.memory = [{"role": "system", "content": system_prompt}]
def register_tool(self, tool_def: dict, tool_impl: callable):
"""
注册自定义工具到Harness
:param tool_def: 符合OpenAI Function Calling格式的工具定义
:param tool_impl: 工具的实现函数,参数要和tool_def里的参数定义一致
"""
self.tools.append({"type": "function", "function": tool_def})
self.tool_impls[tool_def["name"]] = tool_impl
def _add_memory(self, role: str, content: str):
"""
私有方法:添加内容到记忆,自动截断超过20条的历史消息,避免上下文溢出
"""
self.memory.append({"role": role, "content": content})
if len(self.memory) > 20:
# 保留系统提示词,截断最早的19条历史
self.memory = [self.memory[0]] + self.memory[-19:]
def run(self, user_query: str) -> str:
"""
运行Agent处理用户查询
:param user_query: 用户输入的问题
:return: Agent的回复
"""
# 添加用户查询到记忆
self._add_memory("user", user_query)
current_step = 0
while current_step < self.max_steps:
current_step += 1
print(f"[调试信息] 第{current_step}步运行中...")
# 1. 调用大模型生成决策
response = self.client.chat.completions.create(
model=self.model,
messages=self.memory,
tools=self.tools if len(self.tools) > 0 else None,
tool_choice="auto" if len(self.tools) > 0 else None,
temperature=self.temperature
)
message = response.choices[0].message
# 2. 判断是否需要调用工具
if not message.tool_calls:
# 不需要调用工具,直接返回结果
self._add_memory("assistant", message.content)
return message.content
# 3. 需要调用工具,先把模型的决策存到记忆
self._add_memory("assistant", json.dumps(message.model_dump()))
# 4. 遍历所有工具调用,逐个执行
for tool_call in message.tool_calls:
tool_name = tool_call.function.name
try:
tool_args = json.loads(tool_call.function.arguments)
print(f"[调试信息] 调用工具:{tool_name},参数:{tool_args}")
except Exception as e:
tool_result = f"参数解析错误:{str(e)}"
self._add_memory("tool", json.dumps({
"tool_call_id": tool_call.id,
"name": tool_name,
"content": tool_result
}))
continue
# 5. 执行工具,捕获异常
try:
tool_result = self.tool_impls[tool_name](**tool_args)
except KeyError:
tool_result = f"错误:不存在名为{tool_name}的工具"
except TypeError as e:
tool_result = f"参数错误:{str(e)},请检查参数是否正确"
except Exception as e:
tool_result = f"工具执行出错:{str(e)}"
# 6. 把工具返回结果存到记忆,给大模型下一步决策用
self._add_memory("tool", json.dumps({
"tool_call_id": tool_call.id,
"name": tool_name,
"content": str(tool_result)
}))
# 超过最大步数,返回超时提示
return "抱歉,我尝试了多次还是无法解决你的问题,请换个方式提问或者提供更多信息。"
3.3 代码解读
这个极简Harness已经实现了所有核心功能:
- 大模型适配:用兼容OpenAI格式的接口,只要改base_url和model参数就能切换几乎所有主流大模型
- 工具注册与调度:自动解析大模型的工具调用请求,执行工具,处理异常
- 记忆管理:自动维护对话历史,超过长度自动截断,避免上下文溢出
- 防死循环:最大步数限制,避免Agent无限调用工具
- 错误处理:参数解析错误、工具不存在、执行错误都会自动捕获,返回给大模型做纠错
四、项目实战:开发个人生活助理Agent
我们用刚才写的极简Harness来开发一个完整的个人生活助理Agent,具备以下功能:
✅ 查询指定城市指定日期的天气
✅ 管理个人待办事项(添加、查询、删除)
✅ 查询快递物流信息
✅ 自然语言交互,支持多轮对话
4.1 前置准备
申请几个免费的API:
- 通义千问API Key:https://dashscope.console.aliyun.com/
- 和风天气API Key(免费额度足够个人使用):https://dev.qweather.com/
- 快递100免费API:https://api.kuaidi100.com/
在项目根目录新建.env文件,填入你的API Key:
DASHSCOPE_API_KEY=你的通义千问API Key
WEATHER_API_KEY=你的和风天气API Key
EXPRESS_API_KEY=你的快递100API Key
4.2 实现自定义工具
(1)天气查询工具
# 天气查询工具定义
WEATHER_TOOL_DEF = {
"name": "get_weather",
"description": "查询指定城市指定日期的天气情况,最多支持查询未来3天的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "要查询的城市中文名称,比如北京、上海、广州、深圳"
},
"date": {
"type": "string",
"description": "要查询的日期,格式为YYYY-MM-DD,比如2024-06-01,不填默认是今天"
}
},
"required": ["city"]
}
}
# 天气查询工具实现
def get_weather(city: str, date: str = None) -> str:
api_key = os.getenv("WEATHER_API_KEY")
# 第一步:查询城市的location ID
geo_url = f"https://geoapi.qweather.com/v2/city/lookup?location={city}&key={api_key}"
geo_resp = requests.get(geo_url).json()
if geo_resp["code"] != "200":
return f"查询城市{city}失败:{geo_resp.get('message', '未知错误')}"
location_id = geo_resp["location"][0]["id"]
# 第二步:查询3天天气预报
weather_url = f"https://devapi.qweather.com/v7/weather/3d?location={location_id}&key={api_key}"
weather_resp = requests.get(weather_url).json()
if weather_resp["code"] != "200":
return f"查询天气失败:{weather_resp.get('message', '未知错误')}"
# 第三步:匹配日期
daily_weather = weather_resp["daily"]
if not date:
# 默认返回今天的天气
weather = daily_weather[0]
else:
for day in daily_weather:
if day["fxDate"] == date:
weather = day
break
else:
return f"无法查询{date}的天气,最多支持查询未来3天的天气"
return f"{city}{weather['fxDate']}的天气是{weather['textDay']},气温{weather['tempMin']}℃~{weather['tempMax']}℃,风向{weather['windDirDay']},风力{weather['windScaleDay']}级,紫外线强度{weather['uvIndex']}。"
(2)待办管理工具
# 全局待办存储,生产环境可以换成数据库
TODO_LIST = []
# 待办管理工具定义
TODO_TOOL_DEF = {
"name": "manage_todo",
"description": "管理用户的待办事项,支持添加、查询、删除待办",
"parameters": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["add", "query", "delete"],
"description": "操作类型:add=添加待办,query=查询待办,delete=删除待办"
},
"content": {
"type": "string",
"description": "待办内容,添加的时候必填"
},
"time": {
"type": "string",
"description": "待办时间,格式为YYYY-MM-DD HH:MM,添加的时候必填"
},
"todo_id": {
"type": "integer",
"description": "待办ID,删除的时候必填"
}
},
"required": ["action"]
}
}
# 待办管理工具实现
def manage_todo(action: str, content: str = None, time: str = None, todo_id: int = None) -> str:
global TODO_LIST
if action == "add":
if not content or not time:
return "添加待办失败:请提供待办内容和时间"
todo = {"id": len(TODO_LIST) + 1, "content": content, "time": time, "status": "未完成"}
TODO_LIST.append(todo)
return f"添加待办成功:ID={todo['id']},内容={content},时间={time}"
elif action == "query":
if not TODO_LIST:
return "你目前没有待办事项"
res = "你的待办事项如下:\n"
for todo in TODO_LIST:
res += f"ID={todo['id']} | 时间={todo['time']} | 内容={todo['content']} | 状态={todo['status']}\n"
return res
elif action == "delete":
if not todo_id:
return "删除待办失败:请提供要删除的待办ID"
for i, todo in enumerate(TODO_LIST):
if todo["id"] == todo_id:
del TODO_LIST[i]
return f"删除待办成功:ID={todo_id}"
return f"删除待办失败:不存在ID为{todo_id}的待办"
else:
return f"不支持的操作类型:{action},支持的操作有add、query、delete"
(3)快递查询工具
# 快递查询工具定义
EXPRESS_TOOL_DEF = {
"name": "query_express",
"description": "查询快递单号的物流信息",
"parameters": {
"type": "object",
"properties": {
"express_no": {
"type": "string",
"description": "要查询的快递单号"
},
"company_code": {
"type": "string",
"description": "快递公司编码,比如顺丰=SF,圆通=YTO,中通=ZTO,不知道可以不填,会自动识别"
}
},
"required": ["express_no"]
}
}
# 快递查询工具实现
def query_express(express_no: str, company_code: str = None) -> str:
api_key = os.getenv("EXPRESS_API_KEY")
url = "https://api.kuaidi100.com/api"
params = {
"id": api_key,
"com": company_code if company_code else "auto",
"nu": express_no,
"show": "0",
"muti": "1",
"order": "desc"
}
resp = requests.get(url, params=params).json()
if resp["status"] != "200":
return f"查询快递失败:{resp['message']}"
res = f"快递单号{express_no}的物流信息如下:\n"
for item in resp["data"]:
res += f"{item['time']} | {item['context']}\n"
return res
4.3 组装并运行Agent
if __name__ == "__main__":
# 初始化Harness,定义Agent的角色
harness = SimpleAgentHarness(
system_prompt="""你是一个贴心的个人生活助理,你可以帮用户查询天气、管理待办、查询快递。
规则:
1. 调用工具前必须确认参数是否完整,如果用户没有提供必要的参数,一定要先询问用户。
2. 不要编造信息,不知道的信息就调用工具查询。
3. 回复要简洁明了,符合口语习惯,不要暴露你调用工具的过程。
"""
)
# 注册所有工具
harness.register_tool(WEATHER_TOOL_DEF, get_weather)
harness.register_tool(TODO_TOOL_DEF, manage_todo)
harness.register_tool(EXPRESS_TOOL_DEF, query_express)
# 启动对话
print("🤖 个人生活助理已启动,输入'退出'即可结束对话")
while True:
user_input = input("你:")
if user_input in ["退出", "exit", "quit"]:
print("🤖 再见,有需要随时找我!")
break
response = harness.run(user_input)
print(f"🤖 助理:{response}")
4.4 测试效果
运行代码后你可以测试以下对话:
你:明天北京天气怎么样?
[调试信息] 第1步运行中...
[调试信息] 调用工具:get_weather,参数:{'city': '北京', 'date': '2024-06-01'}
🤖 助理:北京2024-06-01的天气是晴,气温18℃~30℃,风向南风,风力3级,紫外线强度中等,出门记得涂防晒霜哦。
你:帮我记一下后天下午3点要和产品部开需求评审会。
[调试信息] 第1步运行中...
[调试信息] 调用工具:manage_todo,参数:{'action': 'add', 'content': '和产品部开需求评审会', 'time': '2024-06-02 15:00'}
🤖 助理:好的,已经帮你记下了,后天下午3点和产品部开需求评审会。
你:我下周有什么待办?
[调试信息] 第1步运行中...
[调试信息] 调用工具:manage_todo,参数:{'action': 'query'}
🤖 助理:你下周的待办只有1条:6月2日下午3点和产品部开需求评审会。
你:帮我查一下快递单号123456789到哪了?
[调试信息] 第1步运行中...
[调试信息] 调用工具:query_express,参数:{'express_no': '123456789'}
🤖 助理:这个快递目前已经到达北京朝阳网点,正在派件中,预计今天下午就能送到哦。
可以看到,Agent会自动判断什么时候需要调用工具,自动解析参数,执行工具,然后整合结果返回给用户,完全不需要你写任何调度逻辑。
五、最佳实践与踩坑指南
5.1 工具开发最佳实践
- 工具描述要尽可能详细:大模型是根据工具描述来判断什么时候调用工具的,描述越清晰,调用准确率越高。比如不要只写“查询天气”,要写“查询指定城市指定日期的天气情况,最多支持查询未来3天的天气”。
- 参数定义要加枚举限制:如果参数的取值是固定的,一定要加enum限制,比如待办管理的action参数只有add/query/delete三个取值,加了枚举之后大模型不会传错值。
- 工具返回结果要简洁:工具返回的结果不要太长,最好控制在500字以内,否则会占用太多上下文窗口,导致大模型推理错误。如果结果太长,可以做摘要,只保留关键信息。
- 加参数校验:在工具实现里一定要加参数校验,比如日期格式是否正确,参数是否缺失,避免工具执行出错。
5.2 提示词优化最佳实践
- 明确规则,越具体越好:比如“不要编造信息”、“调用工具前要确认参数”、“回复要简洁”这些规则一定要写在系统提示词里,大模型会严格遵守。
- 给例子:如果你的业务逻辑比较复杂,可以在系统提示词里给几个正确的例子,比如“比如用户问‘明天北京天气’,你应该调用get_weather工具,参数city=北京,date=明天的日期”。
- 限制输出格式:如果需要大模型返回特定格式的内容,比如JSON,一定要明确说明格式要求,最好给个示例。
5.3 常见踩坑解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 大模型不调用工具,直接编造结果 | 工具描述不清晰,或者提示词没有要求调用工具 | 优化工具描述,在提示词里明确要求“不知道的信息必须调用工具查询,不能编造” |
| 大模型调用工具的参数错误 | 参数定义不清晰,或者没有加枚举限制 | 优化参数描述,添加枚举限制,在工具实现里加参数校验,出错后返回给大模型重新生成 |
| 上下文溢出,大模型忘记之前的对话 | 记忆太长,超过了大模型的上下文窗口 | 优化记忆截断逻辑,用向量数据库做长期记忆,只把相关的历史消息放到上下文里 |
| Agent无限调用工具,进入死循环 | 工具返回的结果有问题,或者大模型的决策逻辑出错 | 增加最大步数限制,在工具返回结果里明确告诉大模型是否已经得到了足够的信息 |
六、行业发展与未来趋势
我们整理了AI Agent Harness的发展时间线:
| 时间 | 发展阶段 | 核心事件 | 特点 |
|---|---|---|---|
| 2022年及以前 | 萌芽期 | 没有通用的Agent Harness,所有Agent都是定制开发 | 开发成本极高,只有大厂能做 |
| 2023年上半年 | 爆发期 | AutoGPT带火Agent概念,LangChain推出Agent模块 | 开始出现通用Harness,但是生态不完善,学习曲线陡峭 |
| 2023年下半年 | 成长期 | OpenAI推出Function Calling,LlamaIndex、Dify等多个Harness框架涌现 | 生态快速完善,工具链逐渐成熟 |
| 2024年 | 普及期 | OpenAI推出Agents SDK,阿里云、腾讯云等云厂商推出托管Agent服务 | 低代码/无代码Harness普及,零基础也能开发Agent |
| 2025-2026年 | 成熟期 | Harness集成多模态、端侧部署、自动优化能力 | 成为AI应用的标准基础设施,80%的AI应用都会基于Agent Harness开发 |
未来Agent Harness的发展方向主要有几个:
- 低代码/可视化:不需要写代码,拖拽就能组装Agent,适合非技术人员使用
- 多模态支持:支持文本、图片、音频、视频等多模态输入输出,Agent能处理更复杂的任务
- 端云协同:部分能力放在端侧运行,保护用户隐私,降低延迟
- 自动优化:Harness自动优化提示词、选择最优大模型、调整工具参数,不需要人工调优
- 标准化:Agent的接口、工具格式、部署规范会逐渐标准化,不同厂商的Agent可以互相调用
七、工具和资源推荐
7.1 学习资源
- DeepLearning.AI《AI Agent开发专项课程》:https://www.deeplearning.ai/courses/ai-agentic-design-patterns-with-langchain/ (免费,英文有字幕)
- OpenAI Agents SDK官方文档:https://github.com/openai/openai-agents-python (官方出品,最新最权威)
- LangChain Agent官方文档:https://python.langchain.com/docs/modules/agents/ (生态最完善,适合复杂场景)
- Dify官方文档:https://docs.dify.ai/ (低代码,适合零基础快速上线)
7.2 优秀开源项目
- AutoGPT:https://github.com/Significant-Gravitas/AutoGPT (最知名的开源Agent,自带完善的Harness)
- GPT-Engineer:https://github.com/gpt-engineer-org/gpt-engineer (代码生成Agent,适合开发人员使用)
- OpenInterpreter:https://github.com/OpenInterpreter/open-interpreter (能在本地运行代码的Agent,自带Harness)
7.3 实用工具
- LangSmith:https://www.langchain.com/langsmith (Agent调试观测工具,能看到Agent的每一步决策过程)
- LangFuse:https://langfuse.com/ (开源的LLM和Agent观测工具,适合自建)
- Helicone:https://www.helicone.ai/ (大模型调用日志和监控工具,能统计Agent的成本和成功率)
本章小结
今天我们从零基础开始,完整学习了AI Agent Harness的核心概念、原理,从零实现了一个极简的Harness,并且用它开发了一个完整的个人生活助理Agent。你现在应该已经掌握了Agent开发的核心逻辑,能独立开发简单的Agent应用了。
下一步你可以尝试:
- 给我们的生活助理添加更多工具,比如查询火车票、翻译、生成PPT等
- 用成熟的Harness框架比如OpenAI Agents SDK或者LangChain开发更复杂的Agent
- 把你开发的Agent部署成API,对接飞书、微信、企业微信等平台
- 用观测工具调试优化你的Agent,提升任务成功率
AI Agent是未来AI应用的主流形态,而Agent Harness是开发Agent的必备工具,现在入门正好赶上行业爆发的红利期。如果你在开发过程中有任何问题,欢迎在评论区留言,我会一一解答。
本文所有代码都可以在我的GitHub仓库获取:https://github.com/yourname/agent-harness-tutorial ,欢迎Star和Fork。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)