基于 DeepSeek V3.2 的 Native Agent 实践指南,真香

基于 DeepSeek V3.2 的 Native Agent 实践指南,真香

前言

DeepSeek V3.2 发布了,除了模型能力本身的提升之外,最值得关注的是原生支持的"思考时调用工具"的机制。DeepSeek 体现了非常好的工程师审美,对于"思考时调用工具"的 API 设计是非常优雅的。

这也意味着我们可以非常简洁的实现原生的 ReAct Agent 逻辑。

所以我花了半天时间,手搓了一个纯原生的 Python Agent 示例。没有 LangChain,没有复杂的依赖,核心代码也就 100 来行。

项目开源了,欢迎围观: 传送门

为什么优雅?

传统方案

考虑下要实现一个 ReAct Agent,核心是要区分 Reasoning , Acting 和 Observation ,来构建一个 Loop 对吧?

那传统上我们通过指令要求模型做一个结构化输出,通过字段来区分,比如这样子:

json 复制代码
{
  "thought": "思考过程",
  "action": {"name": "工具名", "args": {"参数1": "值1"}},
  "observation": "工具返回最新结果和之前的思考过程等上下文"
}

当然我们还需要做上下文的管理,涉及多轮调用我们得把上下文合并起来放到 Observation 里。

最后当整个 ReAct Loop 结束跳出循环的时候,我们还得让模型输出最终答案,举个例子可能是这样:

json 复制代码
            {
            "final_answer": "最终答案"
            }

Model As Agent

DeepSeek V3.2 的方案,我觉得是典型的模型即 Agent(Model As Agent)的设计范式。这其实是非常符合第一性原理的,模型输出的结构本来就是经过规范化处理的。为什么不让接口响应直接包含 ReAct 的全部逻辑呢?

所以现在我们来看基于 DeepSeek V3.2 的实现逻辑:

处理模型响应的时候: Reasoning 部分,读取接口响应里的 reasoning_content 字段就好了,这里就是模型的思考过程,打印出来完事。 Acting 部分,读取接口响应里的 tool_calls 字段就好了,有 tool_calls 就说明模型想调用工具,得去 call 工具。 Final Answer 部分,读取接口响应里的 content 字段就好了,content 里有东西了,说明模型想清楚了,可以出 Loop 了,收工。

发送请求的时候: 思考部分的上下文,我们只需要把之前的 reasoning_content 传回去就好了,保持思维连续性。 工具调用的结构,我们直接把 tool_calls 加上工具响应的内容作为 content 传回去呗。

所以在这个机制下,Agent 的实现逻辑就是一个非常简单的 Loop ,加载了 tools,处理下工具调用然后循环 Call 就完事了。

我这个 demo 里面的核心代码也就 100 来行,非常简洁。

一个例子

我在 demo 里给了3个例子,其中第三个例子是一个模拟人类的网页浏览行为。问题是一个典型的多跳问题,AI 需要像人一样从华东师范大学的首页开始,一边观察网站上的内容,一边思考,逐步找到计算机系的成立年份,然后计算明年是成立多少周年。此时还需要通过计算器工具来准确地计算周年数,通过时间获取工具来获取当前时间。整体是一个非常有综合性的任务。

为了让大家直观感受 DeepSeek V3.2 的思考能力,我没有对日志做任何删减,大家可以感受下它像人类一样"碎碎念"的思考过程。

以下是实际运行的日志:

text 复制代码
==================== Starting Web Research Task ====================
Task Goal: 明年是计算机系成立多少周年?
[*] Agent started with model: deepseek-v32

--- Turn 1 ---
[Thinking Process]:
我需要找出华东师范大学计算机系成立于哪一年,然后计算明年(2025年)是它成立的多少周年。首先,我得获取当前年份,然 
后寻找计算机系的成立年份。                                                                                       
让我先获取当前日期。
[Tool Call]: get_current_time({})
[Tool Result]:
2025-12-05 12:19:45

--- Turn 2 ---
[Thinking Process]:
现在是2025年12月5日。明年是2026年。所以我需要计算计算机系到2026年成立多少周年。这需要找到成立年份。
首先访问华东师范大学主页寻找相关信息。
[Tool Call]: visit_page({"url": "https://www.ecnu.edu.cn/"})
[Tool Result]: 华东师范大学 language [English](http://english.ecnu.edu.cn/) [Français](http://french.ecnu.edu.cn/
) [Русский](https://russian.ecnu.edu.cn) 网站菜单 [学校概况](https://www.ecnu.edu.cn/wzcd/xxgk.htm) [学校章程](https://w...
...(content truncated)...

--- Turn 3 ---
[Thinking Process]:
主页上有很多信息,但我需要找到计算机系。可能"计算机系"指的是"计算机科学与技术学院"或"软件工程学院"。华东师大可能 
有一个"计算机科学与技术学院"或者"信息学部"。让我看看"院系设置"的链接。主页上有一个"院系设置"的链接。点进去看看。 
[Tool Call]: visit_page({"url": "https://www.ecnu.edu.cn/wzcd/xxgk/yxsz.htm"})
[Tool Result]: 院系设置-华东师范大学 中文 [English](https://english.ecnu.edu.cn/) [Français](https://french.ecnu.
edu.cn/) [Русский](https://russian.ecnu.edu.cn/) [首页](https://www.ecnu.edu.cn/index.htm) [学校概况](https://www.ecnu.e...
...(content truncated)...

--- Turn 4 ---
[Thinking Process]:
我看到有"计算机科学与技术学院"和"软件工程学院"。问题中提到"计算机系",这可能指的是"计算机科学与技术学院"。我需要 
找到该学院的成立年份。最好访问计算机科学与技术学院的网站,那里可能会有"学院简介"或"历史沿革"页面。点进去看看。   
[Tool Call]: visit_page({"url": "https://cs.ecnu.edu.cn/"})
[Tool Result]: 华东师范大学计算机科学与技术学院 [EN](https://cs.ecnu.edu.cn/) [首页](http://cs.ecnu.edu.cn/main.h
tm) [学院概况](https://cs.ecnu.edu.cn/xygk/list.htm) [学院简介](https://cs.ecnu.edu.cn/xyjj/list.htm) [历史沿革](https://cs.ecnu.edu...
...(content truncated)...

--- Turn 5 ---
[Thinking Process]:
在导航栏中,我看到了"历史沿革"的链接。这很可能包含成立年份。点开看看。
[Tool Call]: visit_page({"url": "https://cs.ecnu.edu.cn/lsyg/list.htm"})
[Tool Result]: 历史沿革 [EN](https://cs.ecnu.edu.cn/lsyg/list.htm) [首页](http://cs.ecnu.edu.cn/main.htm) [学院概
况](https://cs.ecnu.edu.cn/xygk/list.htm) [学院简介](https://cs.ecnu.edu.cn/xyjj/list.htm) [历史沿革](https://cs.ecnu.ed...
...(content truncated)...

--- Turn 6 ---
[Thinking Process]:
太好了!历史沿革页面显示:"1979年5月7日,建立华东师范大学计算机科学系"。所以计算机系成立于1979年。
现在我们需要计算明年(2026年)是成立多少周年。2026年减去1979年等于47年。不过我们需要确认,周年纪念日是否按年份差 
计算,还是需要具体到日期?题目是"明年是计算机系成立多少周年?"。由于明年是2026年,而成立年份是1979年,那么2026 - 1979 = 47。但我们需要考虑,如果明年(2026年)的周年纪念日是在5月7日之后,那么就是47周年。然而,题目可能只要求给出年份差。通常来说,"多少周年"指的是从成立起到明年所经过的整年数。既然明年是2026年,那么就是47周年。               
但为了更精确,我们最好确认一下当前日期。今天是2025年12月5日。明年是2026年。到2026年5月7日,计算机系将成立47周年。
因为从1979年5月7日到2026年5月7日是47年。                                                                         
所以答案是:明年(2026年)是计算机系成立47周年。
不过,我们也可以引用历史沿革页面中的描述。我会据此给出答案。
让我们再检查一下页面,看看是否有其他相关信息。也许有关于"计算机建系40周年特辑"的链接,这暗示着40周年纪念。但既然 
页面提到了"计算机建系40周年特辑",那可能指的是2019年(1979年+40年=2019年)。这表明2019年是40周年纪念。那么到2026 年就是47周年。这没问题。                                                                                         
因此,答案是:明年(2026年)是计算机系成立47周年。
现在,我需要用中文给出答案。提供解释和引用来源。
接下来,我将使用计算工具来确认一下计算。
[Tool Call]: calculate({"num1": 2026, "num2": 1979, "operator": "-"})
[Tool Result]: 47.0

--- Turn 7 ---
[Thinking Process]:
好的。
现在给出最终答案。
[Final Content]:
根据华东师范大学计算机科学与技术学院官网的"历史沿革"页面记载,**华东师范大学计算机科学系成立于1979年5月7日**。   
- 成立年份:1979年
- 明年年份:2026年(当前为2025年12月)
- 周年计算:2026年 - 1979年 = 47周年
因此,**明年(2026年)将是计算机系成立47周年**。
> 参考资料:华东师范大学计算机科学与技术学院《历史沿革》页面(https://cs.ecnu.edu.cn/lsyg/list.htm)中明确写道:"
1979年5月7日,建立华东师范大学计算机科学系"。

写在最后

我个人觉得 Model As Agent 是一种非常自然且高效的开发范式。我们不再需要被复杂的框架束缚,回归到最朴素的模型调用,反而能更清晰地掌控 AI 的每一次思考和行动。

我相信这个方案会和之前的 reasoning_content 一样,被快速跟进并成为 Agent 时代的 LLM API 标准。

以上

相关推荐
浔川python社1 小时前
浔川社团:技术创作与社区运营的双重成功
人工智能
LUU_791 小时前
Day27 机器学习管道pipeline
人工智能·机器学习
亚马逊云开发者1 小时前
利用Amazon Bedrock构建智能报告生成Agent
人工智能
孟祥_成都2 小时前
Prompt 还能哄女朋友!你真的知道如何问 ai 问题吗?
前端·人工智能
小马爱打代码2 小时前
Spring AI:提示词工程 - Prompt 角色分类(系统角色与用户角色)
人工智能·spring·prompt
Ttang232 小时前
【AI学习1】了解开源大模型
人工智能·学习·开源
小马爱打代码2 小时前
Spring AI:多模态 AI 大模型
java·人工智能·spring
测试开发技术2 小时前
Agent自动化工作流:n8n、dify、coze,谁更强?
ai·自动化·agent·dify·智能体·coze·n8n
johnny2332 小时前
蚂蚁百灵研发助手CodeFuse介绍
人工智能