用 DeepSeek Harness 手搓一个自己的 Agent

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 应用。

相关推荐
笨小孩@GF 知行合一2 小时前
易语言-高级应用
数据库·编程·易语言·中文编程
KaiwuDB3 小时前
KaiwuDB 运维实战04:DRBD + KaiwuDB——物联网场景下的低成本数据库高可用方案
运维·数据库·物联网·时序数据库·kaiwudb·aiot·多模数据库
夜雪一千4 小时前
MySQL外键彻底入门:是什么、怎么用、什么时候不该用
数据库·mysql
qq_334466864 小时前
删除SSMS的历史登录记录
数据库·sql
zl_dfq5 小时前
Redis 之 【常见面试题总结】(从数据类型到高可用、缓存一致性全解析)
数据库·redis
龙亘川5 小时前
铭记英烈守初心,数字强基促服务:亘川智城退役军人服务系统的实践与价值
java·数据库·人工智能
kv1106 小时前
Android studio国内开发有关
java·数据库·android studio
哭泣方源炼蛊6 小时前
正则表达式c++内容汇集
数据库·c++·mysql·正则表达式
余槐i6 小时前
EXPLAIN 显示走了索引查询仍慢:回表与选择性在 500 万行表上拉开 10 倍耗时
数据库·postgresql·性能优化·vacuum·explain