news 2026/4/16 9:19:38

自己构建一个Agent?Agent到底再干嘛?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自己构建一个Agent?Agent到底再干嘛?

一 前言

Agent 翻译成中文就是智能体,现在所谓的智能体其实还没有一个完全统一的定义,但是可以被称为智能体的东西,其必须具有感知外部环境的能力,并依据外部环境的变换做出对应的决策。

我心中的智能体:


对于对话式 Chat AI来说,如果我输入一句:

我女朋友下周过生日,好烦啊。

Chat AI 很可能会给出一段回复:
包含一些情绪安慰的话,比如“能理解你的纠结”,再给出若干建议,比如“可以一起吃饭、送礼物、安排一次小旅行”等。在某些人的定义里,这已经算是“足够智能”了,它能理解你的烦恼,也能给出看起来合理的建议。但本质上,它的输出始终只是一段静态文本。目前的 Chat AI并不具备感知外部环境的能力,也无法真正参与到问题的解决过程中。它只能“说”,却不能“做”。而在Agent的语境下,事情会完全不同。对于一个 Agent 来说,它要做的并不只是生成一段回复,而是推动一个完整决策过程的完成。假设这个 Agent 通过长期与你的交互,已经逐步了解了你的:

  • 消费观念

  • 消费水平

  • 偏好(比如是否喜欢仪式感、是否在意性价比等)

当你再次输入:

我女朋友下周过生日,好烦啊。

Agent 的行为不再是简单地安慰你,而是可能按如下流程展开:

  1. 情绪层面:先给予必要的情绪回应,确认你的困扰

  2. 决策层面:基于已有的用户画像,给出可执行的选项

    • 比如建议“过生日一起吃一顿正式的晚餐”

  3. 行动层面

    • 自动上网搜索(具备工具调用能力)

    • 筛选出符合你消费水平、你可能会喜欢的餐厅

  4. 交互确认

    • 将候选餐厅呈现给你

    • 询问你的选择或偏好

  5. 执行动作

    • 当你点击同意后

    • Agent 自动帮你发送邮件或调用接口完成餐厅预约

更关键的是Agent 需要能够感知外部环境的变化。例如:

  • 商家回复:该时间段不可预约

  • Agent 接收到这一外部反馈后

  • 自动重新筛选其他合适的餐厅

  • 再次向你提供新的可选方案

如此循环,直到这个决策被真正完成。这才是 Agent 与传统 Chat AI 的核心差异:

Chat AI 停留在“给建议”,
而 Agent 负责“把事情做完”

所以总结来看

大模型 擅长回答问题,但是却无法感知和改变外部环境。

Agent可感知外部环境的变化,并根据外部环境的不同做出相应的动作。

二 Chat AI向Agent出发

为了让 Chat AI 能够感知外部环境,我们可以为大模型装上工具,而这些工具就像是大模型的感官和四肢,就可以感知外部环境的变化,并对所处环境做出相应的动作。

大模型就可以自己查询环境中已有的环境,对环境中的内容进行相应内容的写入,可以在此环境在书写终端命令(可以写终端命令了,其实可操作空间就很大了);对应我心中的 Agent,为此我们就可以为大模型加上使用搜索引擎的工具,来完成搜索餐厅的信息。

将这样一堆工具和大模型组合起来变成一个能感知外部环境的智能程序就可以被称为Agent了。

三 常见的Agent

第一个 大名鼎鼎的Agent -------- Cursor

对于cursor来说,输入实现贪吃蛇游戏的代码结构,采用js html css 来实现,Cursor干的事情不再是将代码通过聊天窗口输出,而是能够知道现在所处的代母运行环境(哪个文件夹下),能够新建文件并在对应文件中写入对应的内容。

第二个是名声大躁一时的Agent -------- Manus

让其帮忙比较手机之间的性能和拍照之间的能力。

Manus 为了回答用户这个问题,它首先是制定了详细执行步骤,然后浏览相关网页,最后整体成一个完整的报告直接输出。Manus使用大模型和一些工具就可以完全的解决用户的问题。

当然为了构建一个 Agent ,还需要了解一些基础实现手法。

四 Agent 运行模式 ------- ReAct 模式

ReAct 运行你模型是 Reasoning and Acting ,ReAct 运行模式是当前使用最为广泛的模型,该模式来自于一篇论文,如下所示。

ReAct 运行模式如下图所示,当用户提交任务后,Agent 首先会进行思考(Thought),然后看完成这个任务是否需要调用工具(例如,文件查看工具?文件写入工具?是否调用搜索引擎?等等),当需要调用工具的时候,就采取行动(Action),进行使用工具;工具使用结束后,环境就会产生变化,Agent 就会观察(Observation),假设 Agent 使用了写入文件的工具,工具也许就会返回某某文件写入成功的提示,这样就会造成环境发生变化,当Agent感觉知道环境发生变化(观察到了某某文件写入成功的提示)就继续进行思考(Thought),再次看是否需要调用工具,重复N次,直到思考(Thought)显示不需要调用工具了,就可以输出最后的结果了。

直到最后就会输出最终答案(Final Answer)

ThoughtActionObservationFinal Answer

上面这四个就是 ReAct 运行模式的核心。

五 ReAct 模型如何实现

大模型如何实现 Thought --> Action --> Observation --> Final Answer,是大模型本身就是这样训练的吗,并不是,大部分的实现奥秘都是集中在系统提示词上

系统提示词会和用户提示词一起被送入大模型,但是系统提示词基本包含着定义模型的角色,运行时候的规则,以及运行环境等,而对于用户提示词来说就是用户的所需要完成的任务等。

如上面的例子所示,在系统提示词里面定义大模型回答的规范,用户问题里写用户具体的问题,然后将用户问题和系统提示词一起发给大模型,大模型再回答的时候就可以根据系统提示词定义的规则精确的按规则回答问题。

所示如果我们想让大模型的结果返回按着 ReAct 的模式返回结果,那我们就可以在系统提示词中描述清楚 ReAct 的模式,那么这样话,大模型就会按着 ReAct 模式进行返回。

以下是一个示例的ReAct提示词:

使用 prompt_template.py 进行存储

react_system_prompt_template = """ 你需要解决一个问题。为此,你需要将问题分解为多个步骤。对于每个步骤,首先使用 <thought> 思考要做什么,然后使用可用工具之一决定一个 <action>。接着,你将根据你的行动从环境/工具中收到一个 <observation>。持续这个思考和行动的过程,直到你有足够的信息来提供 <final_answer>。 所有步骤请严格使用以下 XML 标签格式输出: - <question> 用户问题 - <thought> 思考 - <action> 采取的工具操作 - <observation> 工具或环境返回的结果 - <final_answer> 最终答案 ⸻ 例子 1: <question>埃菲尔铁塔有多高?</question> <thought>我需要找到埃菲尔铁塔的高度。可以使用搜索工具。</thought> <action>get_height("埃菲尔铁塔")</action> <observation>埃菲尔铁塔的高度约为330米(包含天线)。</observation> <thought>搜索结果显示了高度。我已经得到答案了。</thought> <final_answer>埃菲尔铁塔的高度约为330米。</final_answer> ⸻ 例子 2: <question>帮我找一个简单的番茄炒蛋食谱,并看看家里的冰箱里有没有西红柿。</question> <thought>这个任务分两步。第一步,找到番茄炒蛋的食谱。第二步,检查冰箱里是否有西红柿。我先用 find_recipe 工具找食谱。</thought> <action>find_recipe(dish="番茄炒蛋")</action> <observation>简单的番茄炒蛋食谱:将2个鸡蛋打散,2个番茄切块。热油,先炒鸡蛋,盛出。再热油,炒番茄至软烂,加入鸡蛋,放盐调味即可。</observation> <thought>好的,我已经有食谱了。食谱需要西红柿。现在我需要用 check_fridge 工具看看冰箱里有没有西红柿。</thought> <action>check_fridge(item="西红柿")</action> <observation>冰箱检查结果:有3个西红柿。</observation> <thought>我找到了食谱,并且确认了冰箱里有西红柿。可以回答问题了。</thought> <final_answer>简单的番茄炒蛋食谱是:鸡蛋打散,番茄切块。先炒鸡蛋,再炒番茄,混合后加盐调味。冰箱里有3个西红柿。</final_answer> ⸻ 请严格遵守: - 你每次回答都必须包括两个标签,第一个是 <thought>,第二个是 <action> 或 <final_answer> - 输出 <action> 后立即停止生成,等待真实的 <observation>,擅自生成 <observation> 将导致错误 - 如果 <action> 中的某个工具参数有多行的话,请使用 \n 来表示,如:<action>write_to_file("/tmp/test.txt", "a\nb\nc")</action> - 工具参数中的文件路径请使用绝对路径,不要只给出一个文件名。比如要写 write_to_file("/tmp/test.txt", "内容"),而不是 write_to_file("test.txt", "内容") ⸻ 本次任务可用工具: ${tool_list} ⸻ 环境信息: 操作系统:${operating_system} 当前目录下文件列表:${file_list} """

接下去将会演示如何使用系统提示词,以及看看我们通过这个提示词构建的 ReAct 模式运行如何。我这里使用 DeepSeek 来模拟。

红框是系统提示词,绿框是用户问题,只不过这里是将系统提示词和用户问题放在了一起,但是在实际写代码的过程中,我们因该区分开来,实际最后也会将系统消息和用户消息合起来然后一起发给大模型。

可以看见 DeepSeek 首先通过 Thought 标签进行了思考,然后规划了要采取的 Action ,通过Action 标签请求调用工具,要是这是一个真实的Agent的话,其就会去调用自己的工具组件,真实的调用 write_to_file 将代码写入文件。然而这里我们模拟实现,给大模型返回write_to_file工具的返回结果输入回给大模型,我们模拟回复:

<observation>写入成功</observation>

当观察到环境发生变化,大模型进一步处理得到以下内容。

同样的进行 Thought ,然后采取行动,请求写入CSS的内容。我们继续照例回复写入成功。

可以看见DeepSeek 同样的进行 Thought ,然后采取行动,请求写入 JS 的内容。我们继续照例回复写入成功。

这个时候,同样的进行 Thought ,但是程序都写好了,这次采取行动,请求的查看写了哪些文件内容。我们回复

<observation>index.html style.css script.js<observation>

同样的进行 Thought ,然后发现不需要采取行动了,就进入了 final answer ,至此用户任务完成!这就是一个完整的ReAct模式的运行,可以看见,只要在系统提示词中规定好流程,其就会按着系统提示词依次执行,直到任务结束。系统提示词就像是给模型安排了一个迷你小剧本,模型会按着它的剧本一步一步走完,直到结束,得到 final answer。

至此我们通过DeepSeek演示了一个基于ReAct模式的Agent。

总结

根据系统提示词,然后再给大模型配上相应的工具代码,一个真实的Agent就可以被真实的搭建出来啦,下一篇文章将具体实现Agent,为大模型装上手脚。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:58:18

SpringBoot+Vue 失物招领平台管理平台源码【适合毕设/课设/学习】Java+MySQL

摘要 随着城市化进程的加速和人口流动性的增加&#xff0c;失物招领问题日益突出。传统的失物招领方式依赖线下公告栏或社区通知&#xff0c;效率低下且信息传播范围有限。在数字化时代&#xff0c;构建一个高效、便捷的失物招领平台成为解决这一问题的有效途径。该平台能够实…

作者头像 李华
网站建设 2026/4/15 16:37:48

Gemini3无法进入尝试

最考验运气的一关&#xff0c;可能秒过&#xff0c;可能卡几天。 来到 Gemini 官网&#xff0c;若能正常显示对话界面就可以无视这一步。 若显示 Something went wrong&#xff0c;或者 出了一些问题 前往 https://gemini.google.com/gems/create?hlen-US&pli1就可以到正…

作者头像 李华
网站建设 2026/4/16 14:38:19

iOS 原生 SDK 概念介绍(大白话生动有趣版):framework、xcframework、.a、Info.plist、Capabilities、链接参数、隐私权限,一次讲明白

做 Unity/跨平台游戏的同学,很多时候对 Android 还挺熟:AAR、Manifest、Gradle、依赖冲突…… 一到 iOS,画风就变了:你明明只是想接个登录、支付、推送、广告,结果对方甩给你一堆东西: xxx.framework / xxx.xcframework / libxxx.a 让你改 Info.plist 让你开 Capabilitie…

作者头像 李华
网站建设 2026/4/16 10:58:18

成功解决 RuntimeError: CUDA error: invalid device function 报错

文章目录 成功解决 RuntimeError: CUDA error: invalid device function 报错前言一、问题描述二、原因分析1. CUDA 版本与 GPU 架构不匹配2. PyTorch 与 CUDA Runtime 不匹配3. 自编译或第三方库问题4. 驱动或环境异常 三、解决方案1. 检查 GPU 架构2. 升级 NVIDIA 驱动3. 安装…

作者头像 李华
网站建设 2026/4/16 12:45:25

Flask与Flutter:无缝上传与显示文件

在现代Web应用中&#xff0c;文件上传和显示功能是常见的需求。本文将介绍如何使用Flask作为后端和Flutter作为前端来实现一个文件上传到Azure Blob Storage并在前端显示的完整流程。 环境准备 首先&#xff0c;我们需要确保以下环境配置&#xff1a; Python 3.7Flutter SDK…

作者头像 李华