• 正文
  • 相关推荐
申请入驻 产业图谱

智能体(Agent)到底是什么?50行代码带你彻底搞懂!

07/16 13:18
172
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

01、一个让人emo的深夜

SCENE · 一次深夜的追问

先说个场景。

晚上十一点,你让 ChatGPT帮你查一下“北京到上海高铁最早一班是几点”。它回答得很流畅,甚至还贴心地提醒你“具体时刻表建议以12306为准”。

你心里咯噔一下:

它其实不知道答案,它只是知道该怎么说话得体

这就是绝大多数人对大模型的第一印象——一个很会说话、但手脚被绑住的“嘴替”。它能陪你聊天、帮你写文案、给你出主意,但你让它“帮我订一张明天早上的高铁票”,它做不到。它没有手,摸不到12306的网站,也没法替你点下“支付”按钮。

而“智能体“(Agent),说白了,就是给这张嘴装上一双手。

今天这篇文章,我们就来彻底搞清楚:智能体和普通聊天机器人,到底差在哪一步?以及,怎么用不到50行代码,亲手搭出你的第一个“有手有脚”的智能体。

02、Chat 和 Agent,一字之差,天壤之别

DEFINITION · 从对话到闭环

我们平时用的 ChatGPT、文心一言这种对话产品,本质上是这样一个流程:

你输入文字 → 模型理解 → 模型生成文字 → 输出给你

它是一个纯粹的“信息加工厂”。输入是文字,输出还是文字。它无论多聪明,都被锁死在“文字进、文字出”这个牢笼里。你问它今天天气怎么样,它给不出准确答案,因为它的世界里没有“今天”这个概念,它活在训练数据的那个时间切片里,像一个被冰冻在琥珀里的智者——学识渊博,但与外界彻底隔绝。

而智能体,是打破这个牢笼的东西。它的流程变成了这样:

你输入需求 → 模型思考“我该做什么” → 模型调用外部工具(查天气、搜网页、执行代码…) → 拿到工具返回的真实结果 → 模型基于真实结果继续思考 → ……如此循环 → 最终给你答案或完成任务

看出区别了吗?关键的变化不是模型变聪明了,模型可能还是同一个模型,关键变化是它多了一个“闭环”:它可以主动伸手去摸一下真实世界,看看外面到底发生了什么,然后根据这个反馈调整自己接下来要做的事。

打个比方最贴切:

普通对话模型像一个被关在密室里的顾问,你隔着门缝递纸条问问题,他凭脑子里的知识给你写回信。

智能体则像是给了这个顾问一部手机、一台电脑、还有出门的钥匙。他可以打电话核实信息、上网查资料、甚至亲自出门帮你办事,办完事再回来告诉你结果。

这就是从“Chat”到“Agent”最本质的跃迁:

从纯语言生成,变成了“感知世界—做出决策—采取行动”的闭环

03、感知-决策-行动:智能体的“呼吸节奏”

THE LOOP · 感知思考行动

学术上给这个循环起了个名字,叫 Perceive-Think-Act(感知-思考-行动),有的资料里也叫 Sense-Plan-Act。名字不重要,重要的是理解这个节奏——它其实就是我们人类做事的方式,只不过被搬到了模型身上。

我们拆开来看这三步:

1. 感知(Perceive)

智能体获取当前的信息。这可能是用户的提问,也可能是上一步工具调用返回的结果。比如你问“帮我查下明天上海天气,如果下雨提醒我带伞”,第一次的“感知”就是这句话本身。

2. 决策(Think)

模型根据当前信息,判断“我现在该做什么”。是直接回答?还是需要先调用一个工具去获取信息?这一步是纯粹的“内心戏”,模型在心里盘算:“用户要知道明天天气,但我脑子里没有明天的天气数据,所以我得调用一个查天气的工具。”

3. 行动(Act)

模型把决策付诸实践——调用某个具体的工具/函数,比如 get_weather(“上海”, “明天”)。

行动执行完,工具会返回一个结果,比如 {“weather”: “小雨”, “temp”: “18-24℃”}。这个结果又变成了下一轮的“感知”输入,模型再看一眼这个结果,继续“思考”:现在有天气数据了,是不是该提醒用户带伞?于是它生成最终回复:“明天上海有小雨,记得带伞哦~”

这个循环可能只转一圈就结束(简单任务),也可能要转十几圈才能完成(复杂任务,比如“帮我调研一下新能源汽车电池技术的最新进展并写一份报告”,这背后可能要经历“搜索—筛选—再搜索—总结—校验”好几轮循环)。

智能体和普通对话最大的分水岭,就在于它有没有能力“多转几圈”这个循环,而不是一次性把话说完

04、亲手搭一个“最小可用”的智能体

HANDS-ON · 50行代码实战

说了这么多概念,咱们来点真的。这一节我们不依赖任何 Agent 框架(LangChain之类的后面会讲,但第一篇我们要“祛魅”,看清楚底层到底发生了什么),纯手写 Python,用 OpenAI 兼容的 API,做一个能查天气的最简智能体。

思路很简单:

1、定义一个“工具”(一个普通的 Python 函数);

2、把这个工具的说明书(名字、参数、用途)用 JSON 的格式告诉模型;

3、模型看到用户问题后,判断要不要调用这个工具,如果要调用,它会返回一个“我要调用xxx工具,参数是xxx”的结构化信息,而不是直接生成大白话;

4、我们的代码检测到这个信息,真正去执行那个 Python 函数,拿到结果;

5、把结果喂回给模型,让它生成最终的自然语言回答。

代码如下:

...python

import json

from openai import OpenAI

 

client = OpenAI() # 假设已配置好 API Key

 

# 第一步:定义一个真实可执行的工具函数

def get_weather(city: str) -> str:

"""假装调用了天气API,实际项目里这里应该是真实的网络请求"""

fake_weather_db = {

"上海": "小雨,18-24℃",

"北京": "晴,20-28℃",

}

return fake_weather_db.get(city, "暂无该城市天气数据")

 

# 第二步:把工具的"说明书"写成模型能理解的格式

tools = [

{

"type": "function",

"function": {

"name": "get_weather",

"description": "查询指定城市的实时天气情况",

"parameters": {

"type": "object",

"properties": {

"city": {"type": "string", "description": "城市名称,例如'上海'"}

},

"required": ["city"],

},

},

}

]

 

def run_agent(user_input: str):

messages = [{"role": "user", "content": user_input}]

 

# 第三步:把用户问题连同"工具箱"一起交给模型,让它自己判断要不要用工具

response = client.chat.completions.create(

model="gpt-5",

messages=messages,

tools=tools,

)

reply = response.choices[0].message

 

# 第四步:检查模型是不是决定要调用工具

if reply.tool_calls:

messages.append(reply) # 把模型的"调用请求"存进对话历史

 

for call in reply.tool_calls:

args = json.loads(call.function.arguments)

# 真正去执行那个 Python 函数——这就是智能体"伸手摸世界"的瞬间

result = get_weather(**args)

 

# 把工具执行的真实结果,作为新的一条消息,喂回给模型

messages.append({

"role": "tool",

"tool_call_id": call.id,

"content": result,

})

 

# 第五步:模型拿到真实数据后,重新生成一句人话回复给用户

second_response = client.chat.completions.create(

model="gpt-5",

messages=messages,

)

return second_response.choices[0].message.content

 

# 如果模型觉得不需要工具,直接回答

return reply.content

 

 

if __name__ == "__main__":

answer = run_agent("上海明天要下雨吗?需要带伞吗?")

print(answer)

运行一下,你大概会得到类似这样的输出:

output

上海明天是小雨天气,气温18-24℃,建议出门带把伞~

看似简单,但这短短几十行代码,已经完整跑通了一个“智能体”的全部核心要素:它自己判断了需要查天气(决策),真的去执行了一个函数拿到了外部世界的真实数据(行动+感知),然后基于真实数据组织语言回答你(再决策)

这就是所有智能体系统——不管后面套了多复杂的框架、多花哨的名字——最底层都在做的事情。LangChain、AutoGPT、各种Agent框架,说到底都是在这个基础循环上面,做了更多的封装和增强。

这个“毛坯房”缺了什么?

写在最后

跑通这个最小例子后,你可能已经能感觉到一些明显的短板了。别急,这些正是我们接下来几篇要一个个解决的问题:

记忆

它只能记住这一轮对话。你下一次再问它“那后天呢?”,它压根不知道你在说上海。第4篇会讲。

ReAct 推理范式

它只会一步到位地调用工具,不会“多想几步”。如果任务需要先搜索、再根据结果决定下一步查什么,现在这个简单结构就不够用了。第3篇见。

错误处理与自我纠正

如果工具调用失败了怎么办?比如天气API超时,或者返回了一个模型解析不了的怪格式,现在这段代码是直接崩掉的。第7篇专门讲。

任务规划(Planning)

复杂任务需要拆解成多个步骤统一规划,而不是走一步看一步。第5篇见。

不用担心,这些能力我们会在接下来的文章里,一块一块地垒上去,最终拼出一个真正能干活、能兜底、能上生产环境的智能体系统。

这一篇的目标只有一个

让你亲手感受到,智能体没有那么玄乎,它的核心就是“给LLM的嘴装上手”

剩下的一切复杂设计,都是为了让这只手伸得更准、走得更稳、摔倒了还能爬起来。

下一篇,我们正式拆解这只“手”是怎么运作的——Function Calling 的底层机制,以及当模型输出格式抽风时你该怎么兜底。我们不见不散。

我是写代码的中年人,写代码,也写技术;研究 AI,也分享实践,希望让复杂技术变得简单。

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录