现在的 AI 编程工具,大多数时候还是在“聊天框里帮你改文件”,你给它一个明确指令,它给你一段代码或一次补全。但一旦任务变成“先拉取数据,再做清洗,然后改动三个模块,最后跑测试输出报告”,普通对话式 AI 很快就会顾此失彼:上下文记不住,工具不会用,执行到一半就开始胡编路径。最近社区里频繁出现的 DeepSeek、Harness、DeepAgent、MCP、ClaudeCode 这几个词,本质上都在回答同一个问题:怎么把大模型从“会说话的编辑器”变成“能干活的项目成员”。
这篇教程不追热点,而是把这条链路拆开讲清楚。你会理解 Harness 到底是什么,MCP 为什么值得学,DeepSeek API 怎么快速接起来,以及 ClaudeCode 这类终端 Agent 在整个架构里的位置。读完之后,你能自己搭一个最小的“模型调度工具”示例,并且知道后续往工程化方向走,应该从哪里入手。
1. 这篇文章真正要解决的问题
先说痛点。你现在用 AI 编程,大概率遇到过这几个问题。
第一是“一次性对话”困局。模型能帮你写一个函数,却很难帮你完成一个跨文件、跨步骤的改造任务。因为大模型本身没有“记忆硬盘”,每次调用都是独立的,靠把历史消息重新拼进上下文来维持连续性,对话一长,成本高、效果差。
第二是“工具隔离”问题。你的项目里有 Git、构建脚本、测试框架、数据库、浏览器调试工具,每个都要单独配置、单独授权。模型再强,也碰不到这些工具,除非你用代码去调。于是 AI 只能“建议你手动执行”,而不是“替你执行”。
第三是“不可复用”问题。今天让 AI 帮忙做个事,看似很方便,但你是靠一段很长的临时提示词完成的。换一个项目、换一个模型、换一台机器,这套东西就废了。真正的工程化,应该像写代码一样,把 AI 的执行流程固化成可复用、可调试、可回滚的组件。
Harness 解决的正是这些问题的中间层。它不是一个单独的模型,而是一层“约束与调度设施”,让模型在明确规则下调用工具、执行任务、返回结果。MCP 则是这层设施里“模型如何发现并调用工具”的通信标准。DeepAgent 和 ClaudeCode,是这种理念下的两种具体形态。DeepSeek,则是当前性价比很高、接入成本很低的模型内核。
这篇文章的定位是“主线串讲 + 最小实践”:用 DeepSeek API 跑通一个真实调用,用手写代码演示 Harness 的调度思想,再把 MCP 和 ClaudeCode 放进同一张架构图里讲清楚。这样你再看网上零散的安装教程、插件推荐,就不会晕。
2. 基础概念与核心原理
2.1 模型层:DeepSeek
DeepSeek 是深度求索公司推出的大语言模型系列,最近热度的核心原因有两点:一是模型能力已经能胜任编码、分析、工具调用等任务;二是 API 计价非常友好,特别适合用来做 Agent 类应用的“模型内核”。如果你跑自动化任务,每天会发起大量模型请求,成本就会成为决定性因素,DeepSeek 在这里优势明显。
DeepSeek 的 API 兼容 OpenAI 的接口风格,所以你在很多工具里通过改base_url就能接进来。这是它被大量社区项目选用的原因之一。具体的模型名目前常见的有deepseek-chat和deepseek-reasoner两种,前者适合通用对话和工具调用,后者侧重推理。真实的模型名以官方文档为准,但 API 调用范式基本不变。
2.2 Agent:从“生成”到“执行”
Agent(智能体)不是一个严格的学术概念,可以理解为“能感知环境、做出决策、并采取行动的 AI 程序”。放到开发场景里,就是一个能自己决定调用哪个工具、执行哪条命令、读取哪个文件,并且根据结果继续下一步的程序。
传统程序执行的路径是程序员写死的:if、else、for,每一步都确定。Agent 的路径是模型现场生成的:模型看到任务,拆解出步骤,每完成一步把新信息反馈给模型,模型再根据反馈决定下一步。因此 Agent 的不确定性高,必须靠外部框架约束,否则它可能越跑越偏。
这里要区分两个容易混的词:Agent 和 Harness。Agent 回答“谁来做”,Harness 回答“怎么让它安全地做”。Agent 是目标状态,Harness 是实现目标的一套工程设施,包括模型调度、工具注册、权限控制、日志追踪、错误恢复。网上搜“DeepAgent 学习”时,你会发现很多资料把两者混着说,但只要记住“Harness 是 Agent 的缰绳和跑道”就不会乱。
2.3 Harness:AI Agent 的约束层
我更喜欢用一个类比理解 Harness:如果把大模型比作发动机,Harness 就是发动机仓里的电控系统。发动机提供动力(生成能力),电控系统决定什么时候给油、转子转多快、温度过高怎么处理。没有电控系统,发动机也能转,但你不敢把它装到车上跑复杂路况。
Harness 在 AI Agent 里的具体职责包括:
- 定义模型的任务边界和角色,防止自由发挥。
- 维护可用工具的注册表,告诉模型“你能用什么”。
- 承担模型与工具之间的数据格式转换。
- 记录工具调用日志,出现问题时能回溯。
- 对模型输出做校验,防止无效 JSON 或危险命令继续传播。
所以“DeepSeek Harness”这个词在社区里流行,本质上不是指某一家公司发布了一个官方框架,而是指“以 DeepSeek 为模型内核、用 Harness 思路搭建的 Agent 执行框架”。这类项目通常会自带一些 Skill 定义、工具插件和部署脚本,你可以理解为一套开箱即用的电控系统。
2.4 MCP:模型上下文协议
MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 提出并开源的一套标准协议,目的是解决“模型如何与外部工具和数据源连接”的标准化问题。
在没有 MCP 之前,每接入一个工具,都要为模型定制一套调用逻辑:有的用 HTTP,有的用命令行,有的需要写 SDK。工具多起来以后,这个适配层会越来越臃肿。MCP 做的事情,是把工具调用抽象成统一格式:模型端通过 MCP Client 连接 MCP Server,Server 向外暴露工具、资源和提示词,双方用 JSON-RPC 交换信息。工具方只要实现一套 MCP Server,任何支持 MCP 的 Agent 都能调用它。
你可以类比 USB 接口:鼠标、键盘、硬盘各有各的驱动,但 USB 接口统一之后,插上就能用。MCP 就是 AI 工具世界的 USB。最近热词里出现“Playwright MCP”“Chrome DevTools MCP”“同花顺 MCP”等,都是把特定工具封装成 MCP Server,让 AI 直接操控。
2.5 ClaudeCode:终端里的 Agent 形态
ClaudeCode 是 Anthropic 推出的命令行编程工具,属于终端型 Agent。它不在网页里聊天,而是直接跑在终端中,可以读写项目文件、执行测试、查看错误日志,并且通过 MCP 连接外部工具。
它与 DeepSeek Harness 类框架的区别在于:ClaudeCode 更侧重于“终端交互式 Agent”,适合开发者开着终端,把写代码、改 bug、跑测试的任务交出去;而 DeepAgent 或者 Harness 工程更侧重于“自动化流程编排”,把一套可重复的任务沉淀下来,减少人工参与。两者不是取代关系,而是不同场景下的产物。
以下用表格做一个快速对比:
| 概念 | 核心定位 | 常见形态 | 典型问题 |
|---|---|---|---|
| DeepSeek | 模型内核 | API + 开源模型 | 如何低成本获得高质量生成能力 |
| Agent | 自主执行任务的程序 | 对话机器人、编码助手 | 如何让模型根据环境做决策 |
| Harness | Agent 的执行约束层 | 框架、编排器、调度器 | 如何让 Agent 稳定安全地完成复杂任务 |
| MCP | 工具连接的开放协议 | MCP Server / Client | 如何让模型调用任意外部工具 |
| ClaudeCode | 终端 Agent 产品 | CLI 工具 | 如何在命令行里完成编码任务 |
3. 核心链路拆解:一次 Agent 任务是怎么跑通的
要理解 Harness,最好的办法是看一次任务完整的流转链路。假设用户输入:“读取项目里的 README.md,统计出现的 Todos 数量,然后输出报告。”
没有 Harness 时,模型只能读取 README 内容后自己数,如果文件很大,或者需要精确统计,模型很容易出错,而且你没法复用它。
有 Harness 后,链路是这样的:
- 用户输入任务文本。
- Harness 将任务文本交给模型,并把“可用工具列表”一起发过去。工具列表里可能有
read_file、count_occurrences等。 - 模型分析任务,决定先调用
read_file获取内容,然后调用count_occurrences统计,最后输出结果。 - Harness 拦截模型输出的“工具调用意图”,解析出工具名和参数。
- Harness 在本地真实执行对应工具函数。
- 执行结果返回给 Harness,Harness 再把它塞进下一轮模型调用。
- 模型拿到工具结果后,生成最终回复。
这个循环可以绕很多次,直到任务完成。Harness 在其中最重要的工作有两个:第一,维护“当前有哪些工具可用”;第二,维护“模型和工具之间的消息历史”。没有第一点,模型不知道能做什么;没有第二点,模型做完一步就忘了之前的上下文。
传统方案里,这一步通常靠写死if/else去匹配关键词,模型说“读文件”就调用读文件,说“统计”就调用统计。这种方式在小 Demo 里能跑,但真实项目中工具可能有几十个,参数各不同,返回值格式各异,模型输出的表述略有变化就匹配失败。MCP 的出现,让工具可以按统一 Schema 暴露、按统一协议调用,Harness 不需要关心工具背后的实现细节。这就像我们不需要知道显卡内部电路,只要插上 PCIe 接口就能用。
4. 环境准备与前置条件
下面进入实操部分。为了跑通后面的示例,建议准备一个干净的开发环境。不要求特定操作系统,Windows、macOS、Linux 都可以。
需要的环境如下:
- Python 3.10 或更高版本,用于运行 API 调用示例和最小 Harness 代码。
- 一个 DeepSeek API Key。访问 DeepSeek 开放平台,创建 API Key 即可。注意 Key 是需要付费使用的,但新用户通常有一定额度,具体以平台规则为准。
- pip 安装
openai库,因为 DeepSeek API 使用 OpenAI 兼容格式,所以这个库可以作为客户端。 - 如果你后续要探究真实 MCP Server,建议安装 Node.js 18 或更高版本,因为很多 MCP Server 是基于 Node 生态构建的。
- 一个趁手的文本编辑器或 IDE。我建议直接用 VS Code,后面如果接 ClaudeCode 也可以在同一终端里操作。
安装依赖的命令:
pip install openai版本无需刻意追求最新,能正常发起 HTTPS 请求即可。如果你在内网环境部署,还需要确认网络可以访问api.deepseek.com,这一点看起来是废话,但实际排查时最容易忽略。
这里强调一个原则:不要在生产环境中把 API Key 硬编码在代码里。建议使用环境变量或本地配置文件,并且加入.gitignore,避免误提交。
5. DeepSeek API 最小调用示例
先从最底层的模型调用开始。下面这段代码,会向 DeepSeek 发起一次聊天补全请求,这是后面所有 Agent 功能的基础。
# 文件路径:deepseek_basic_demo.py import os from openai import OpenAI client = OpenAI( api_key=os.environ.get("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com" ) response = client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一个熟悉 Python 的编程助手。"}, {"role": "user", "content": "用一句话解释什么是 Harness。"} ], temperature=0.7, max_tokens=1024 ) print(response.choices[0].message.content)运行前设置环境变量:
export DEEPSEEK_API_KEY=你的Key python deepseek_basic_demo.pyWindows 用户可以用set DEEPSEEK_API_KEY=你的Key。
代码逻辑很简单:用OpenAI客户端指定base_url指向 DeepSeek,然后调用chat.completions.create。关键点有两个。
第一,model参数要写实际存在的模型名,否则会报模型不存在。如果你不清楚当前有哪些模型名,先去官方文档查一下。
第二,messages列表里的消息顺序会直接影响输出质量。系统消息定义角色,用户消息给出任务,后续如果要加入工具结果,也是通过往messages里追加消息来实现。
预期输出是一段中文解释,内容不固定。只要没有抛异常,说明 API Key、网络、模型名都通了。
如果这一步失败,最常见原因是 API Key 无效、网络无法访问、模型名错误。可以先检查环境变量是否真的传进去了,也可以在代码里加一句话打印 Key 的前几位,但不要在日志里打印完整 Key。
6. MCP 工具描述:把函数变成模型可理解的语言
模型本身不会“看见”你的 Python 函数。要让模型知道存在一个工具,并且知道怎么调用它,必须把工具描述成机器可读的结构。MCP 协议中,工具描述使用 JSON Schema 格式,下面是一个求两个整数和的工具描述示例。
{ "name": "calculator_add", "description": "计算两个整数的和", "inputSchema": { "type": "object", "properties": { "a": { "type": "integer", "description": "第一个加数" }, "b": { "type": "integer", "description": "第二个加数" } }, "required": ["a", "b"] } }这个 JSON 里,name是工具名,description是给模型看的“说明书”,inputSchema决定了模型要传什么参数。模型会在生成回复时参考这份描述,决定“该不该调用工具”以及“参数怎么填”。
在实际 MCP Server 中,类似的描述会被放在“工具列表”接口里。MCP Server 启动后,会向客户端暴露一组能力,通常包括:
tools/list:返回当前可用的所有工具及其 Schema。tools/call:由客户端发起,携带工具名和参数,Server 执行后返回结果。
这套设计可以理解为:工具的“接口文档”和“实现”分开了。模型关心“接口文档”,Harness 关心“去调用实现”。所以当你自己给 Agent 写工具时,最重要的不是代码写得多快,而是工具描述是否清晰。描述写得含糊,模型就不会调用,或者调用时填错参数。
写工具描述有三个建议:
- 尽量在
description中写明使用场景,比如“当用户要求打开浏览器访问某个网址时使用”。 - 参数必须有类型,尽量给取值范围或格式说明。
- 不要把一个功能拆成细碎的工具,也不要让一个工具承担太多职责。一个工具只做一件事,模型更好理解。
7. 徒手实现一个最小 Harness 调度器
理解了模型调用和工具描述之后,可以亲手写一个最简版的 Harness。为了不依赖特定第三方框架,这里采用“约定式 JSON 协议”:模型输出一个 JSON 字符串,里面包含action和args,程序解析后执行对应函数,再把结果回填给模型。
这个 Demo 没有实现完整的 MCP 通信,但它的执行链路和真实 Harness 是一致的:注册工具、模型决策、执行工具、结果回填。
# 文件路径:minimal_harness.py import json import os from openai import OpenAI client = OpenAI( api_key=os.environ.get("DEEPSEEK_API_KEY"), base_url="https://api.deepseek.com" ) def calculator_add(a: int, b: int) -> int: """两个整数相加""" return a + b def calculator_multiply(a: int, b: int) -> int: """两个整数相乘""" return a * b TOOL_REGISTRY = { "calculator_add": calculator_add, "calculator_multiply": calculator_multiply, } TOOL_SCHEMAS = [ { "name": "calculator_add", "description": "计算两个整数的和,当用户需要做加法时使用", "parameters": {"a": "int", "b": "int"} }, { "name": "calculator_multiply", "description": "计算两个整数的积,当用户需要做乘法时使用", "parameters": {"a": "int", "b": "int"} }, ] SYSTEM_PROMPT = f""" 你是计算器助手。你可以使用以下工具: {json.dumps(TOOL_SCHEMAS, ensure_ascii=False, indent=2)} 当用户需要计算时,你必须输出一个 JSON,格式如下: {{"action": "工具名", "args": {{...}}}} 不要输出多余内容。 如果计算完成,根据工具结果给出最终答案。 """ def parse_model_output(text: str): """解析模型输出的 JSON 动作,兼容可能的 Markdown 代码块包裹""" text = text.strip() if text.startswith("```"): text = text.strip("`") if text.startswith("json"): text = text[4:].strip() return json.loads(text) def run_agent_once(user_input: str): messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_input} ] # 第一轮:让模型决策调用哪个工具 first_response = client.chat.completions.create( model="deepseek-chat", messages=messages, temperature=0.0, max_tokens=512 ) raw = first_response.choices[0].message.content try: action = parse_model_output(raw) except json.JSONDecodeError: return "模型没有返回有效 JSON,请调整提示词后重试。原始输出:" + raw tool_name = action.get("action") args = action.get("args", {}) if tool_name not in TOOL_REGISTRY: return f"工具 {tool_name} 不存在" # 执行工具 tool_result = TOOL_REGISTRY[tool_name](**args) # 将工具结果回填给模型 messages.append({"role": "assistant", "content": raw}) messages.append({ "role": "tool", "content": json.dumps({"result": tool_result}, ensure_ascii=False) }) # 第二轮:让模型生成最终回答 second_response = client.chat.completions.create( model="deepseek-chat", messages=messages, temperature=0.3, max_tokens=512 ) return second_response.choices[0].message.content if __name__ == "__main__": answer = run_agent_once("请计算 123 加 456 的结果,然后乘以 2") print(answer)这段代码大约 100 行,但已经具备了一个 Harness 的核心骨架:工具注册表TOOL_REGISTRY、工具SchemaTOOL_SCHEMAS、模型调度循环、工具结果回填。
运行方式:
python minimal_harness.py如果一切正常,模型应该先调用calculator_add得到 579,再调用calculator_multiply得到 1158,最终输出类似“123 加 456 的结果是 579,乘以 2 后是 1158”。但这里有个问题:当前代码只支持“一轮工具调用”,如果模型第一轮只输出一个工具动作,第二轮最终回答里没有继续调用第二个工具,任务就不完整。真实 Harness 需要循环执行,直到模型判断任务完成或达到最大轮数限制。
你可以尝试自己扩展:如果模型输出仍然是 JSON 动作,就继续回填并再次请求模型,形成一个while循环。同时要设置最大迭代次数(比如 5 次),防止模型死循环烧掉太多 token。
这个 Demo 也暴露了一个关键工程点:模型并不是总按你的要求输出纯 JSON。它可能多解释一句,也可能用 Markdown 代码块包住 JSON,所以解析时要做容错。真实框架里还会做更严格的校验,比如参数类型转换、非法工具拦截、执行超时控制。
8. ClaudeCode、DeepAgent 与 Harness 的关系
跑通上面的 Demo 后,再回来看 ClaudeCode 和 DeepAgent,就容易多了。
ClaudeCode 是终端型 Agent 的典型代表。它本质上已经把 Harness 的大部分能力内置了:能扫描项目文件、执行命令、管理多步任务,并且支持 MCP Server。你在终端里启动 ClaudeCode 后,可以把它理解成一个“住在终端里的外包程序员”。它需要频繁交互确认,是因为安全边界设计如此,尤其当它要执行可能影响文件的命令时。这种“授权提示”不是缺陷,而是对大模型不可控性的一种对冲。如果你希望它在一个很长的任务里少点几次授权,通常可以调整它的配置模式,但前提是你清楚风险。
DeepAgent 这个词在不同材料里有不同指向,但核心含义依然是“深度参与任务执行的智能体”。它可以指一个具体的开源项目、一个框架,也可以指一种工程理念:让 Agent 不止做问答,而是深度操作项目文件、调用工具、闭环交付。从网上搜索热度看,DeepAgent 的讨论往往和“学习路径”“多工具配合”绑定,说明大家更关心的是怎么搭建一套可靠流程,而不是某个孤立的工具。
如果你要选择技术路线,可以这样判断:
- 如果你想要一个开箱即用的终端编码助手,优先看 ClaudeCode 或同类产品。
- 如果你想要一套可以定制的自动化任务流,需要自己写 Harness 或使用开源 Harness 框架。
- 如果你想要协议层面的兼容性,让多种 Agent 共用一批工具,必须先学 MCP。
- DeepSeek 则作为底层模型,负责兼顾能力、成本和控制权。
一条推荐路径是:先用 DeepSeek API + 手写 Demo 理解核心链路,再找一个真实的 MCP Server(比如 Playwright MCP 或文件系统 MCP)接入,最后在 ClaudeCode 里尝试配置自定义 MCP。这个路径避开了直接啃大型框架的陡峭学习曲线,每一步的反馈都很直观。
9. 常见问题与排查思路
下面整理了这个主题下最高频的问题,尤其结合社区讨论里的“ClaudeCode 授权频繁”“Harness 加载插件失败”“MCP 连接异常”等真实反馈。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| DeepSeek API 返回 401 | API Key 错误或未设置 | 检查环境变量是否生效,确认 Key 前后无空格 | 重新生成 Key,使用环境变量传入 |
| 请求超时 | 网络受限或代理干扰 | 测试是否能访问 api.deepseek.com | 检查网络出口、防火墙和代理设置 |
| 模型返回内容不是纯 JSON | 提示词约束不够强 | 打印模型原始输出 | 在系统提示中强制“只输出 JSON”,或增加解析容错 |
| 模型不调用任何工具 | 工具描述不够清晰 | 查看工具 Schema 的 description | 在 description 中写明“当用户希望…时使用” |
| 工具调用参数类型报错 | 模型生成参数与 Schema 不匹配 | 记录模型传入的 args | 在解析后做类型转换或使用标准 function calling 机制 |
| Harness 加载插件失败 | 插件目录错误或依赖缺失 | 查看启动日志,确认插件路径 | 按框架要求重建目录结构,安装依赖 |
| MCP Server 连接不上 | 传输方式、地址或鉴权不匹配 | 单独测试 MCP Server 是否可访问 | 根据 Server 文档检查端口、路径、Token |
| ClaudeCode 频繁要求授权 | 安全策略较严格 | 查看文档了解自动授权选项 | 在可信任项目中配置对应策略,谨慎启用全自动模式 |
| 多轮任务执行到一半中断 | 上下文太长或超过最大轮次 | 查看日志和 Token 消耗 | 清理历史消息,增加任务截断和总结策略 |
| 内网环境无法访问模型 API | 网络隔离 | 确认模型服务是否部署在内网 | 使用 vLLM 等方式部署本地模型,或申请内网网关 |
这里要特别提醒一点:网上很多“教程”会教你把安全校验全部关掉,让 Agent 完全自主执行。这种做法在个人玩具项目里可能没问题,但放到真实项目或生产环境非常危险。授权频率高不是效率低,而是保险丝设计。要优化的是“如何减少无效确认”,而不是“完全不确认”。
10. 工程化落地的最佳实践
从 Demo 走向真实项目,中间隔着一堆工程细节。下面是几条比较务实的建议。
第一,工具 Schema 应该成为代码评审的一部分。工具的描述写得好不好,直接决定模型调用准确率。我见过很多项目只让人写函数,不写描述,结果模型完全不会用。建议给每个工具写清楚:用途、参数含义、典型触发场景、边界条件。这个描述值得像测试用例一样认真维护。
第二,幂等性设计。Agent 调用工具可能失败后重试,如果工具本身不是幂等的,就可能产生重复订单、重复写入、重复发消息。在设计工具时,要为关键操作增加幂等键或前置校验。尤其在自动化流程里,重试是常态,输出必须可预期。
第三,日志和追踪。每一个工具调用都应该有 trace_id,把模型输入、模型输出、工具名称、参数、执行耗时、工具输出串联起来。否则出问题时,你根本不知道是哪一轮、哪个工具、哪个参数导致的结果异常。日志不只是给程序看的,更是将来优化提示词和工具描述的数据依据。
第四,最小权限原则。不要给 Agent 一个能执行任意 shell 命令的工具,除非你明确知道风险。如果只是要读日志文件,就给一个限制路径的read_file工具;如果要操作数据库,用只读账号并限制表范围。权限给得越小,出大事的概率越低。
第五,设置执行预算。Agent 循环调用的 token 消耗会随着轮次增长,一定要设置最大调用轮数,以及单次任务最大 token 预算。否则一个没写好的循环可能让你一晚上烧掉大量额度。控制方式包括最大轮数、超时时间、结果长度截断、上下文压缩。
第六,版本与回滚。Agent 的提示词、工具体系、模型版本都应该纳入版本管理。今天跑通的任务,明天换了个模型可能就不跑了。建议把完整配置(模型名、提示词、工具版本、系统环境)固化到配置文件里,出问题可以快速回退到上一个可运行版本。
第七,明确 Agent 的失败边界。Agent 必然有失败,而且失败方式比传统程序更难预测。工程上不是要追求“永远成功”,而是追求“失败可感知、可诊断、可恢复”。好的 Harness 会在连续失败后停止,而不是越错越深。建议为 Agent 设置一个“死线”,比如连续两次工具调用结果异常就中断,并把上下文交给人工处理。
11. 总结与后续实践方向
这篇文章的核心判断是:真正让 AI 从“聊天工具”变成“项目成员”,关键不在模型选谁,而在 Harness 这层约束设施怎么设计。DeepSeek 提供了低成本、高质量的模型内核,MCP 解决了工具连接的标准化问题,ClaudeCode 和 DeepAgent 则展现出终端 Agent 的交互形态。你自己的实践,可以从一个最小模型调用开始,到手动实现工具调度循环,再到接入 MCP Server,最后形成一套可复用的 Agent 工程模板。
建议下一步做一个这样的练习:不依赖任何重型框架,自己实现一个多轮循环的最小 Agent,注册两个小工具,让模型完成一个需要分三步完成的任务。跑通之后,再加一个真实场景的工具:读取文件、调用搜索接口、操作浏览器。每一步都把结果打印出来,观察模型在不同提示词、不同工具描述下的表现差异。多体验几次,你就理解了为什么 Harness 会有那么多工程细节——不是过度设计,而是模型的不确定性逼出来的。
最后记得,无论接 DeepSeek 还是其他模型,不要在生产环境泄露 Key,不要给 Agent 过大的权限,不要在没确认安全边界时开启全自动模式。先把链路跑通,再把工程做稳。