【AI大模型第12集】什么是AI Agent?如何快速搭建一个AI智能体
摘要: 智能体(Agent)是以大语言模型(LLM)为核心,具备自主感知、决策与行动能力的AI实体,其运行机制遵循“感知-思考-行动-观测”闭环。智能体通过记忆模块(短期/长期)、感知模块(多模态输入)、工具模块(扩展能力)和规划模块(任务拆解与反思)协同工作,实现动态决策。与固定流程的工作流不同,智能体具有高度灵活性和目标导向性,擅长处理复杂多变的任务。未来,智能体与工作流将深度融合,形成更强大
文章目录
随着大型语言模型技术的飞速发展,以LLM为核心的智能体已成为人工智能领域的新范式。它不仅能够理解和生成人类语言,更重要的是,能够通过与环境的交互,自主地感知、规划、决策和执行任务。
一、什么是智能体?
Agent(智能体)是一种能够感知环境、基于自身知识与目标进行自主决策,并采取行动以实现特定目标的实体。它既可以是物理实体(如具备自主移动能力的机器人),也可以是软件程序(如在网络环境中自动完成信息收集、数据分析等任务的程序)。
Agent最核心的特征是自主性(Autonomy)。与传统AI应用(如图像识别、机器翻译)不同,Agent不完全依赖人类的逐步指令,而是能够在没有人类直接干预的情况下,根据预设的目标或规则,独立地进行思考、规划和行动。
通俗的讲,Agent 就是以大语言模型为“大脑”,结合外部工具、记忆、知识库和环境反馈,形成“感知-决策-行动-观测”闭环的自主决策系统。
二、智能体的运行机制
智能体并非一次性完成任务,而是通过一个持续的循环与环境进行交互,这个核心机制被称为智能体循环 (Agent Loop),通过循环的交互过程,就构成了智能体的自主决策行为。
这个智能体循环主要包含以下几个相互关联的阶段:
- 感知 (Perception):这是循环的起点。智能体通过其传感器(例如,API 的监听端口、用户输入接口)接收来自环境的输入信息。这些信息,即观察 (Observation),既可以是用户的初始指令,也可以是上一步行动所导致的环境状态变化反馈。
- 思考 (Thought):接收到观察信息后,智能体进入其核心决策阶段。对于 LLM 智能体而言,这通常是由大语言模型驱动的内部推理过程。如图所示,“思考”阶段可进一步细分为两个关键环节:
- 规划 (Planning):智能体基于当前的观察和其内部记忆,更新对任务和环境的理解,并制定或调整一个行动计划。这可能涉及将复杂目标分解为一系列更具体的子任务。
- 工具选择 (Tool Selection):根据当前计划,智能体从其可用的工具库中,选择最适合执行下一步骤的工具,并确定调用该工具所需的具体参数。
- 行动 (Action):决策完成后,智能体通过其执行器(Actuators)执行具体的行动。这通常表现为调用一个选定的工具(如代码解释器、搜索引擎 API),从而对环境施加影响,意图改变环境的状态。
行动并非循环的终点,而是新一轮感知的起点。智能体的行动会触发环境的状态迁移(State Transition),环境随之反馈新的观测值(Observation)。这一反馈信号随即被智能体的感知模块捕获,从而构建起一个持续迭代的“感知-决策-行动-观测”闭环。正是通过这一闭环的不断驱动,智能体得以从初始状态出发,逐步逼近并最终达成目标状态。
三、智能体的技术架构
Agent作为智能体,其核心架构由多个关键模块构成,这些模块协同工作,使Agent能够实现“感知-决策-行动-观测”的完整闭环。根据最新技术发展和行业实践,Agent的核心模块可分为以下六大系统化组件:
1. 大脑 (The Brain) —— 决策中枢
- 核心组件:大语言模型 (LLM),如 GPT-4, Claude 3, Llama 3 等。
- 功能:
- 推理与规划:理解用户意图,将模糊的目标(如“帮我策划一场发布会”)拆解为具体的步骤(查场地、做预算、写文案)。
- 决策:在面对多种工具或路径时,判断哪一个最优。
- 生成:输出文本、代码或指令。
- 关键点:LLM是Agent的“认知上限”,模型越强,Agent解决复杂问题的能力越强。
2. 记忆 (Memory) —— 知识库与上下文
Agent不能像传统软件一样“无状态”,它需要记住过去。记忆通常分为两类:
- 短期记忆 (Short-term Memory):
- 作用:维护当前的对话上下文、任务进度和临时变量。
- 技术:通常直接保存在Prompt的上下文窗口(Context Window)中,或者使用变量管理器。
- 长期记忆 (Long-term Memory):
- 作用:存储海量的历史经验、专业知识库、用户偏好,甚至跨任务的记忆。
- 技术:向量数据库 (VectorDB)(如Pinecone, Milvus)。通过Embedding技术将文本转化为向量,实现快速的语义检索(RAG技术)。
- 例子:Agent记得你去年喜欢去海边度假,今年推荐目的地时会优先考虑海岛。
3. 感知 (Perception) —— 感官系统
- 功能:接收并解析来自环境的多模态输入。
- 输入形式:
- 文本:用户的指令、聊天记录。
- 视觉:截图、图片、视频流(通过多模态大模型LMM处理)。
- 听觉:语音指令(通过ASR语音转文字)。
- 结构化数据:API返回的JSON、数据库查询结果、传感器数据。
- 关键点:感知模块负责将非结构化的环境信息“翻译”成大脑(LLM)能理解的格式。
4. 工具 (Tools) —— 能力扩展包
这是Agent区别于普通聊天机器人的核心。LLM本身只有“知识”,没有“能力”(如上网、发邮件、执行代码)。工具赋予了Agent“手和脚”。
- 常见工具类型:
- 信息获取:Google Search, Wikipedia API, 数据库查询 (SQL)。
- 计算与执行:Python解释器 (Code Interpreter), 计算器。
- 交互操作:发送邮件 (SMTP), 调用第三方API (如Slack, Jira, GitHub), 浏览器自动化 (Selenium)。
- Agent间通信:A2A (Agent-to-Agent) 协议,让不同Agent协作。
- 工作流:大脑生成工具调用指令 → \rightarrow → 执行器运行工具 → \rightarrow → 返回结果给大脑。
5. 规划 (Planning) —— 任务拆解器
面对复杂目标,Agent不能盲目行动,需要“三思而后行”。
- 任务分解:将大目标拆解为子任务链(Chain of Thought)。
- 例:目标“写一篇关于AI的文章” → \rightarrow → 拆解为“搜索AI新闻” → \rightarrow → “总结关键点” → \rightarrow → “生成大纲” → \rightarrow → “撰写正文”。
- 自我反思 (Self-Reflection):这是高级Agent的标志。在行动后,Agent会复盘:“刚才的代码报错了,原因是库没安装,下一步应该先安装库”。
- 技术:ReAct (Reasoning + Acting), ToT (Tree of Thoughts), CoT (Chain of Thought)。
6. 行动 (Action) —— 执行器
- 功能:将大脑的决策转化为具体的输出信号。
- 分类:
- 数字行动:点击按钮、调用API、生成文件、修改数据库记录。
- 物理行动(具身智能):控制机器人的电机、机械臂移动、自动驾驶的方向盘控制。
- 反馈机制:行动不是终点,行动会改变环境状态,产生新的Observation(观察结果),重新输入给感知模块,形成闭环。
四、智能体(Agent)与工作流(Workflow)的区别
智能体(Agent)与工作流(Workflow)是当前人工智能应用落地中两个核心但又截然不同的概念。简单来说,如果把一个业务流程比作一条生产线,工作流就是预先设计好的、固定的传送带和工序,而智能体则是能够自主思考、灵活决策的“数字员工”。
概念区别
- 工作流 (Workflow):是一种预定义的、线性的任务执行流程。它将一个复杂的业务过程分解为一系列明确的步骤,每个步骤都有固定的输入、输出和处理规则,并按照预设的顺序和逻辑自动执行。
- 比喻:就像工厂的流水线。从原料进入,经过冲压、焊接、喷漆、组装等固定工序,最终产出成品。每个环节做什么、怎么做、顺序如何,都已被严格规定,确保了高效和标准化。
- 核心:确定性、规则驱动、过程自动化。
- 智能体 (Agent):是一种能够感知环境、自主决策并执行动作的智能实体。它以大语言模型(LLM)为“大脑”,具备感知、规划、记忆和使用工具的能力,能够根据环境变化和目标,动态地调整行为以完成任务。
- 比喻:就像一位经验丰富的项目经理或数字员工。你给他一个目标(例如“策划一次成功的团队建设活动”),他会自主地去分析需求、查询信息、制定方案、预订场地、协调人员,并根据突发情况(如下雨、某家餐厅关门)灵活调整计划。
- 核心:自主性、目标导向、动态决策。
关键差异对比
| 维度 | 工作流 (Workflow) | 智能体 (Agent) |
|---|---|---|
| 控制核心 | 流程驱动:由预设的规则和路径控制,流程是静态的。 | 目标/模型驱动:由大模型和目标控制,行为路径是动态生成的。 |
| 灵活性 | 低:流程一旦设定,修改成本较高,难以应对未预料的情况。 | 高:能根据环境反馈和实时信息,自主调整策略和执行路径。 |
| 决策能力 | 弱:仅能基于简单的条件判断(如if-else)进行路由,无真正“思考”能力。 | 强:具备推理、规划、风险评估和长期规划能力,能处理复杂模糊的任务。 |
| 核心能力 | 任务编排与自动化:擅长将固定步骤串联起来,实现高效流转。 | 感知-决策-执行闭环:擅长理解意图、拆解任务、调用工具、并从反馈中学习。 |
| 可预测性 | 高:执行过程和结果高度可预测,便于审计和追踪。 | 相对较低:由于其自主性,输出可能存在一定不确定性,需要评估和约束机制。 |
| 适用场景 | 规则明确、流程固定的任务,如审批、报销、数据清洗、订单处理。 | 场景多变、需要主观判断和复杂决策的任务,如客户服务、市场分析、代码编写。 |
融合发展趋势
工作流和智能体并非对立,而是互补的。在现代AI应用中,它们正在深度融合,形成更强大的 Agentic系统(智能体系统)。
- 工作流作为智能体的“骨架”:为了避免智能体的行为不可控,可以用工作流来约束其核心逻辑。例如,一个客服智能体,其整体服务流程(接待-问题分类-处理-结束)可以由工作流定义,但在“处理”这个节点上,交由智能体根据具体问题动态决策是查询知识库、调用工具还是转接人工。
- 智能体赋能工作流:传统工作流中的“智能节点”可以由AI能力增强。例如,在合同审批流中,“合规性检查”节点不再是简单的规则匹配,而是由一个AI智能体进行语义分析和风险评估。
- 以智能体为核心的动态编排:出现了更高级的“编排者(Orchestrator)”模式。一个中心智能体(Orchestrator)接收任务后,动态地创建和分配子任务给不同的专用智能体(Worker),整个过程就像一个临时组建的虚拟团队,任务完成后即解散。这种模式兼具了工作流的结构感和智能体的灵活性。
对于大多数复杂的企业级应用,最佳实践是将两者结合:利用工作流保证核心业务流程的稳定和合规,在关键节点上嵌入智能体来处理需要认知和决策的复杂任务,从而在“效率”与“智能”之间取得最佳平衡。
五、搭建一个简单的智能体
需求目标:构建一个能处理分步任务的智能旅行助手。
用户提问:“你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。”
需求分析:要完成这个任务,智能体必须展现出清晰的逻辑规划能力。它需要先调用天气查询工具,并将获得的观察结果作为下一步的依据。在下一轮循环中,它再调用景点推荐工具,从而得出最终建议。
代码示例:
import os
import requests
from tavily import TavilyClient
from openai import OpenAI
import re
## 这里我读的是配好的系统环境变量,你们可以替换成自己的模型相关信息
BASE_URL=os.getenv("DASHSCOPE_BASE_URL")
API_KEY=os.getenv("DASHSCOPE_API_KEY")
LLM_MODEL=os.getenv("DASHSCOPE_LLM_MODEL")
# Tavily Search 是一个强大的AI搜索API客户端,用于获取实时的网络搜索结果。
# 官方网站:https://app.tavily.com
# 每月免费提供 1,000 个 API 信用点
TAVILY_API_KEY=os.getenv("TAVILY_API_KEY")
# 构建LLM客户端
class OpenAICompatibleClient:
"""
一个用于调用任何兼容OpenAI接口的LLM服务的客户端。
"""
def __init__(self, model: str, api_key: str, base_url: str):
self.model = model
self.client = OpenAI(api_key=api_key, base_url=base_url)
def generate(self, prompt: str, system_prompt: str) -> str:
"""调用LLM API来生成回应。"""
print("正在调用大语言模型...")
try:
messages = [
{'role': 'system', 'content': system_prompt},
{'role': 'user', 'content': prompt}
]
response = self.client.chat.completions.create(
model=self.model,
messages=messages,
stream=False
)
answer = response.choices[0].message.content
print("大语言模型响应成功。")
return answer
except Exception as e:
print(f"调用LLM API时发生错误: {e}")
return "错误:调用语言模型服务时出错。"
# 工具 1:查询真实天气
def get_weather(city: str) -> str:
"""
通过调用 wttr.in API 查询真实的天气信息。
"""
# API端点,我们请求JSON格式的数据
url = f"https://wttr.in/{city}?format=j1"
try:
# 发起网络请求
response = requests.get(url)
# 检查响应状态码是否为200 (成功)
response.raise_for_status()
# 解析返回的JSON数据
data = response.json()
# 提取当前天气状况
current_condition = data['current_condition'][0]
weather_desc = current_condition['weatherDesc'][0]['value']
temp_c = current_condition['temp_C']
# 格式化成自然语言返回
return f"{city}当前天气:{weather_desc},气温{temp_c}摄氏度"
except requests.exceptions.RequestException as e:
# 处理网络错误
return f"错误:查询天气时遇到网络问题 - {e}"
except (KeyError, IndexError) as e:
# 处理数据解析错误
return f"错误:解析天气数据失败,可能是城市名称无效 - {e}"
# 工具 2:搜索并推荐旅游景点
def get_attraction(city: str, weather: str) -> str:
"""
根据城市和天气,使用Tavily Search API搜索并返回优化后的景点推荐。
"""
# 1. 从环境变量中读取API密钥
api_key = os.environ.get("TAVILY_API_KEY")
if not api_key:
return "错误:未配置TAVILY_API_KEY环境变量。"
# 2. 初始化Tavily客户端
tavily = TavilyClient(api_key=api_key)
# 3. 构造一个精确的查询
query = f"'{city}' 在'{weather}'天气下最值得去的旅游景点推荐及理由"
try:
# 4. 调用API,include_answer=True会返回一个综合性的回答
response = tavily.search(query=query, search_depth="basic", include_answer=True)
# 5. Tavily返回的结果已经非常干净,可以直接使用
# response['answer'] 是一个基于所有搜索结果的总结性回答
if response.get("answer"):
return response["answer"]
# 如果没有综合性回答,则格式化原始结果
formatted_results = []
for result in response.get("results", []):
formatted_results.append(f"- {result['title']}: {result['content']}")
if not formatted_results:
return "抱歉,没有找到相关的旅游景点推荐。"
return "根据搜索,为您找到以下信息:\n" + "\n".join(formatted_results)
except Exception as e:
return f"错误:执行Tavily搜索时出现问题 - {e}"
# 将所有工具函数放入一个字典,方便后续调用
available_tools = {
"get_weather": get_weather,
"get_attraction": get_attraction,
}
# 构建提示词模板
AGENT_SYSTEM_PROMPT = """
你是一个智能旅行助手。你的任务是分析用户的请求,并使用可用工具一步步地解决问题。
# 可用工具:
- `get_weather(city: str)`: 查询指定城市的实时天气。
- `get_attraction(city: str, weather: str)`: 根据城市和天气搜索推荐的旅游景点。
# 输出格式要求:
你的每次回复必须严格遵循以下格式,包含一对Thought和Action:
Thought: [你的思考过程和下一步计划]
Action: [你要执行的具体行动]
Action的格式必须是以下之一:
1. 调用工具:function_name(arg_name="arg_value")
2. 结束任务:Finish[最终答案]
# 重要提示:
- 每次只输出一对Thought-Action
- Action必须在同一行,不要换行
- 当收集到足够信息可以回答用户问题时,必须使用 Action: Finish[最终答案] 格式结束
请开始吧!
"""
# --- 1. 配置LLM客户端 ---
# 请根据您使用的服务,将这里替换成对应的凭证和地址
llm = OpenAICompatibleClient(
model=LLM_MODEL,
api_key=API_KEY,
base_url=BASE_URL
)
# --- 2. 初始化 ---
user_prompt = "你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。"
prompt_history = [f"用户请求: {user_prompt}"]
print(f"用户输入: {user_prompt}\n" + "="*40)
# --- 3. 运行主循环 ---
for i in range(5): # 设置最大循环次数
print(f"--- 循环 {i+1} ---\n")
# 3.1. 构建Prompt
full_prompt = "\n".join(prompt_history)
# 3.2. 调用LLM进行思考
llm_output = llm.generate(full_prompt, system_prompt=AGENT_SYSTEM_PROMPT)
# 模型可能会输出多余的Thought-Action,需要截断
match = re.search(r'(Thought:.*?Action:.*?)(?=\n\s*(?:Thought:|Action:|Observation:)|\Z)', llm_output, re.DOTALL)
if match:
truncated = match.group(1).strip()
if truncated != llm_output.strip():
llm_output = truncated
print("已截断多余的 Thought-Action 对")
print(f"模型输出:\n{llm_output}\n")
prompt_history.append(llm_output)
# 3.3. 解析并执行行动
action_match = re.search(r"Action: (.*)", llm_output, re.DOTALL)
if not action_match:
observation = "错误: 未能解析到 Action 字段。请确保你的回复严格遵循 'Thought: ... Action: ...' 的格式。"
observation_str = f"Observation: {observation}"
print(f"{observation_str}\n" + "="*40)
prompt_history.append(observation_str)
continue
action_str = action_match.group(1).strip()
if action_str.startswith("Finish"):
final_answer = re.match(r"Finish\[(.*)\]", action_str).group(1)
print(f"任务完成,最终答案: {final_answer}")
break
tool_name = re.search(r"(\w+)\(", action_str).group(1)
args_str = re.search(r"\((.*)\)", action_str).group(1)
kwargs = dict(re.findall(r'(\w+)="([^"]*)"', args_str))
if tool_name in available_tools:
observation = available_tools[tool_name](**kwargs)
else:
observation = f"错误:未定义的工具 '{tool_name}'"
# 3.4. 记录观察结果
observation_str = f"Observation: {observation}"
print(f"{observation_str}\n" + "="*40)
prompt_history.append(observation_str)
返回结果:
用户输入: 你好,请帮我查询一下今天北京的天气,然后根据天气推荐一个合适的旅游景点。
========================================
--- 循环 1 ---
正在调用大语言模型...
大语言模型响应成功。
模型输出:
Thought: 用户需要查询北京今天的天气,然后根据天气推荐旅游景点。我需要先调用get_weather工具查询北京的天气情况。
Action: get_weather(city="北京")
Observation: 北京当前天气:Sunny,气温4摄氏度
========================================
--- 循环 2 ---
正在调用大语言模型...
大语言模型响应成功。
模型输出:
Thought: 已获取北京天气为晴朗,现在需要根据晴天条件调用景点推荐工具。
Action: get_attraction(city="北京", weather="Sunny")
Observation: Under sunny weather, the Forbidden City, Temple of Heaven, and Great Wall are top Beijing attractions. These sites offer rich history and scenic views.
========================================
--- 循环 3 ---
正在调用大语言模型...
大语言模型响应成功。
模型输出:
Thought: 我已经获取了北京的天气信息(晴朗,4摄氏度)以及根据晴天推荐的旅游景点(故宫、天坛、长城)。现在我有足够的信息来回答用户的问题,可以结束任务。
Action: Finish[北京今天天气晴朗,气温4摄氏度。根据这样的天气条件,我为您推荐以下景点:1. 故宫(Forbidden City) - 感受丰富的历史文化;2. 天坛(Temple of Heaven) - 欣赏古建筑与美景;3. 长城(Great Wall) - 体验壮丽的自然风光。这些景点在晴天都非常适合游览,祝您旅途愉快!]
任务完成,最终答案: 北京今天天气晴朗,气温4摄氏度。根据这样的天气条件,我为您推荐以下景点:1. 故宫(Forbidden City) - 感受丰富的历史文化;2. 天坛(Temple of Heaven) - 欣赏古建筑与美景;3. 长城(Great Wall) - 体验壮丽的自然风光。这些景点在晴天都非常适合游览,祝您旅途愉快!
更多推荐


所有评论(0)