随着大型语言模型技术的飞速发展,以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系统(智能体系统)

  1. 工作流作为智能体的“骨架”:为了避免智能体的行为不可控,可以用工作流来约束其核心逻辑。例如,一个客服智能体,其整体服务流程(接待-问题分类-处理-结束)可以由工作流定义,但在“处理”这个节点上,交由智能体根据具体问题动态决策是查询知识库、调用工具还是转接人工。
  2. 智能体赋能工作流:传统工作流中的“智能节点”可以由AI能力增强。例如,在合同审批流中,“合规性检查”节点不再是简单的规则匹配,而是由一个AI智能体进行语义分析和风险评估。
  3. 以智能体为核心的动态编排:出现了更高级的“编排者(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) - 体验壮丽的自然风光。这些景点在晴天都非常适合游览,祝您旅途愉快!
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐