1. 引言
大模型应用开发中,Agent 是当前最热门的落地形态之一。很多人以为 Agent 必须依赖 LangChain、AutoGen 这类重量级框架,其实只要掌握核心思路,用 DeepSeek Harness 这样轻量的工具,也能手搓出一个可用的 Agent。本文从零开始,带你一步步搭建属于自己的 Agent。
2. 什么是 DeepSeek Harness
DeepSeek Harness 是一个面向大模型应用的轻量级编排工具,它把「模型调用、工具注册、任务循环」这几个 Agent 核心环节封装成简洁的接口,让开发者可以专注于业务逻辑,而不是重复造轮子。
它的核心设计理念是「约定优于配置」:你只需要定义好工具函数和提示词,Harness 会自动完成模型调用、结果解析和循环控制。
3. 环境准备
在开始之前,需要先安装依赖并准备好 API Key。
bash
pip install deepseek-harness
安装完成后,在环境变量中配置你的 DeepSeek API Key:
bash
export DEEPSEEK_API_KEY="sk-你的密钥"
4. 核心概念
在动手写代码之前,先理解 Harness 的三个核心概念:
- 工具(Tool):Agent 可以调用的外部能力,比如搜索、计算、读写文件。
- 任务循环(Loop):Agent 反复执行「思考---调用工具---观察结果」的过程,直到完成任务。
- 提示词模板(Prompt Template):定义 Agent 的角色、目标和行为约束。
5. 手搓一个最小 Agent
下面我们实现一个最简单的 Agent:它能根据用户的问题,决定是否调用「当前时间查询」工具,并给出回答。
python
from deepseek_harness import Agent, Tool
from datetime import datetime
1. 定义一个工具
def get_current_time() -> str:
"""返回当前时间"""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
time_tool = Tool(
name="get_current_time",
description="获取当前日期和时间",
func=get_current_time
)
2. 创建 Agent
agent = Agent(
model="deepseek-chat",
tools=[time_tool],
system_prompt="你是一个智能助手,当用户询问时间时,调用 get_current_time 工具获取答案。"
)
3. 运行
result = agent.run("现在几点了?")
print(result)
运行这段代码,Agent 会自动识别用户意图,调用时间工具,并组织语言返回结果。
6. 让 Agent 学会多步推理
真实场景中,Agent 往往需要多步推理。比如「帮我查一下北京和上海的时差,并告诉我现在上海几点」。这需要 Agent 连续调用多个工具。
python
from deepseek_harness import Agent, Tool
def get_city_time(city: str) -> str:
"""获取指定城市的当前时间"""
# 这里简化处理,实际可接入时区 API
timezones = {"北京": "Asia/Shanghai", "上海": "Asia/Shanghai", "东京": "Asia/Tokyo"}
tz = timezones.get(city, "Asia/Shanghai")
from zoneinfo import ZoneInfo
from datetime import datetime
return datetime.now(ZoneInfo(tz)).strftime("%Y-%m-%d %H:%M:%S")
agent = Agent(
model="deepseek-chat",
tools=[Tool(name="get_city_time", description="获取指定城市当前时间", func=get_city_time)],
system_prompt="你是时间助手,用户询问任何城市时间时,请调用工具获取。"
)
result = agent.run("现在东京几点了?和北京差几个小时?")
print(result)
Harness 的任务循环会自动处理多步调用:先查东京时间,再查北京时间,最后对比输出。
7. 接入自定义业务工具
实际项目中,你往往需要接入自己的业务系统。比如让 Agent 查询订单状态:
python
def query_order(order_id: str) -> str:
"""根据订单号查询订单状态"""
# 这里替换为真实的数据库或 API 调用
mock_db = {"A1001": "已发货", "A1002": "待支付"}
return mock_db.get(order_id, "订单不存在")
agent = Agent(
model="deepseek-chat",
tools=[Tool(name="query_order", description="查询订单状态", func=query_order)],
system_prompt="你是电商客服助手,用户提供订单号时,调用 query_order 查询状态并友好回复。"
)
print(agent.run("帮我查一下订单 A1001 到哪了?"))
8. 常见问题与优化建议
- 工具描述要写清楚:模型靠描述决定是否调用工具,描述越准确,调用越可靠。
- 控制循环次数:给 Agent 设置最大迭代次数,避免死循环。
- 错误处理:工具内部要捕获异常,返回友好错误信息,让 Agent 能继续尝试。
- 日志观察:开启 Harness 的日志模式,观察每一步的思考和工具调用,便于调试。
9. 总结
通过 DeepSeek Harness,我们只用了不到 50 行代码就实现了一个具备工具调用能力的 Agent。核心要点就三个:定义工具、配置提示词、交给 Harness 跑循环。掌握了这套思路,你完全可以在此基础上扩展出搜索、写作、数据分析等更复杂的 Agent 应用。