Agent智能体介绍

智能体(Agent) 是一种能够自主规划、决策、执行任务的组件,核心是让大语言模型(LLM)根据任务需求,选择并调用工具,完成单靠模型自身无法解决的复杂问题。

  • 没有Agent时,LLM 只能基于自身训练数据回答问题,遇到需要实时数据、复杂计算、外部工具调用的场景就会卡壳。
  • 有了Agent后,LLM 就像一个"指挥官",能思考任务步骤选择合适工具执行工具调用>根据结果调整策略,直到完成任务。

需求 -> 规划 -> 选择工具(提供行动力) (整个流程中,会保存记忆)
在这里插入图片描述
核心特点:

  • 目标驱动:围绕用户的具体任务目标展开工作。
  • 工具调用能力:能连接外部工具,弥补LLM 的局限性。
  • 自主决策与迭代:不需要人工干预,能根据工具返回的结果,判断是否需要继续调用工具,或直接生成最终答案。

Agent的作用——例子

在这里插入图片描述

与chain对比:
在这里插入图片描述

Agent智能体=大语言模型(大脑)+工具集(手脚)+决策逻辑(思维),是让LLM从"只会回答"升级为"会做事(影响现实世界)"的智能助手。

Agent智能体初体验

核心功能:工具调用

比如设计一个天气查询工具,让大模型有回答天气的能力。

from langchain.agents import create_agent
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.tools import tool

@tool(description="查询天气")
def get_weather() -> str:
    return '晴天'

agent = create_agent(
    model=ChatTongyi(model="qwen3-max"), # 智能体的大脑
    tools=[get_weather], # 向智能体提供 工具列表
    system_prompt="你是一个聊天助手,可以回答用户问题"
)

res = agent.invoke(
    {
        "messages": [
            {"role": "user", "content": "明天北京的天气怎么样?"},
        ]
    }
)
for msg in res["messages"]:
    print(type(msg).__name__, msg.content)

基于外部工具的提供,就让大模型拥有了:感知外部世界并影响现实的能力。

  • 丰富的工具集将极大提升大模型的工作性能和业务范畴。
  • 工具越多,Agent 能覆盖的业务场景就越广(从客服问答到库存管理,再到自动
    化运营
    ),性能和实用性自然会大幅提升。

Agent的流式输出

通过create_agent方法可以创建Agent对象,其也是Runnable接口的子类实现,所以也拥有:

  • invoke,执行,一次性得到完整结果
  • stream,执行,流式得到结果
from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
from langchain_core.tools import tool


# 获取股票价格
@tool(description="获取股价,传入股票名称,返回字符串信息")
def get_price(name):
    return f"股票{name}的价格是 20元"

@tool(description="获取股票信息,传入股票名称,返回字符串信息")
def get_info(name):
    return f"股票{name},是一家A股上市公司,专注于IT职业教育"

agent = create_agent(
    model=ChatTongyi(model="qwen3-max"),
    tools=[get_price, get_info],
    system_prompt="你是一个智能助手,可以回答股票相关问题,记住请告诉我思考过程,让我知道你为什么调用某个工具"
)

for chunk in agent.stream(
    {"messages": [{"role": 'user', "content": '传智教育股价多少,并介绍一下'}]},
    stream_mode="values"
):
    latest_message = chunk["messages"][-1]
    # print(latest_message)
    if latest_message.content:
        print(type(latest_message).__name__, latest_message.content)
    try:
        # 用户的消息没有tool_calls,会报错AttributeError
        if latest_message.tool_calls:
            print(f"工具调用:{[tc['name'] for tc in latest_message.tool_calls]}")
    except AttributeError as e:
        pass

Agent的ReAct行动框架

Agent ReAct 是大模型智能体的核心思考与行动框架,全称Reasoning+Acting(推理+行动),是让Agent 像人类一样「思考问题>制定策略>执行行动>验证结果」的关键逻辑。

简单来说:ReAct让Agent不再是“直接回答问题”,而是通过“自然语言思考过程”指导工具调用,一步步解决复杂问题,完美适配需要多步推理、工具协作的场景(如智能客服、报告生成、任务规划等)。

在这里插入图片描述

LangChain的Agent对象遵循ReAct框架要求,在执行的过程中会持续的自我思考、自我行动、自我观察。(LangChain可并行使用工具)

一个典型的ReAct案例如下:(调用 获取身高 和 获取体重 的工具 来计算BMI)

from langchain.agents import create_agent
from langchain_community.chat_models import ChatTongyi
from langchain_core.tools import tool


@tool(description="获取体重,返回整数,单位千克")
def get_weight():
    return 90

@tool(description="获取身高,返回整数,单位厘米")
def get_height():
    return 170

agent = create_agent(
    model=ChatTongyi(model="qwen3-max"),
    tools=[get_weight, get_height],
    system_prompt="""你是一个严格遵守ReAct框架的智能体,必须按[思考->行动->观察->在思考]的流程解决问题
    且**每轮仅能思考并调用1个工具**,禁止单次调用多个工具。
    并告知我你的思考过程,工具的调用原因,按思考、行动、观察三个结构告知我""",
)

for chunk in agent.stream(
    {"messages": [{"role": 'user', "content": '计算我的BMI'}]},
    stream_mode="values"
):
    latest_message = chunk["messages"][-1]
    # print(latest_message)
    if latest_message.content:
        print(type(latest_message).__name__, latest_message.content)
    try:
        # 用户的消息没有tool_calls,会报错AttributeError
        if latest_message.tool_calls:
            print(f"工具调用:{[tc['name'] for tc in latest_message.tool_calls]}")
    except AttributeError as e:
        pass

输出:

HumanMessage 计算我的BMI
AIMessage [思考]  
要计算BMI(身体质量指数),需要知道体重(千克)和身高(米)。公式为:  
**BMI = 体重(kg) / (身高(m))^2**  

目前我没有用户的体重和身高数据,因此需要先获取这两个数值。按照ReAct框架,每轮只能调用一个工具,所以我先获取体重。

[行动]  

工具调用:['get_weight']
ToolMessage 90
AIMessage [观察]  
获取到用户的体重为 **90 千克**。

[思考]  
现在我已经有了体重数据,接下来需要获取身高(厘米),然后将其转换为米,用于计算BMI。按照ReAct框架,每轮只能调用一个工具,因此下一步我将调用 `get_height` 来获取身高。

[行动]  


工具调用:['get_height']
ToolMessage 170
AIMessage [观察]  
获取到用户的身高为 **170 厘米**,即 **1.70 米**。

[思考]  
现在我已经获取了计算BMI所需的全部数据:  
- 体重 = 90 千克  
- 身高 = 1.70 米  

可以计算BMI:  
**BMI = 90 / (1.70)^2 ≈ 31.14**  

根据世界卫生组织(WHO)的标准:  
- BMI < 18.5 → 体重过轻  
- 18.5 ≤ BMI < 24.9 → 正常范围  
- 25 ≤ BMI < 29.9 → 超重  
- BMI ≥ 30 → 肥胖  

该用户的BMI ≈ **31.14**,属于 **肥胖** 范围。  

现在可以给出最终答案。

ReAct是一种工作范式,定义了大模型的工作流程。

  • 思考:分析需求,考虑下一步
  • 行动:工具调用获取信息
  • 观察:分析获取的信息

思考 -> 行动 -> 观察 -> 思考 -> … -> … ->结束;

LangChain的Agent对象,就是按ReAct模式运行。

Agent的middleware中间件

中间件的作用是对智能体的每一步工作进行控制和自定义的执行
作用场景:

  • 日志记录、分析、调试
  • 转换提示词、工具选择
  • 重试、备用、提前终止等逻辑控制
  • 安全防护、个人身份检测等

在这里插入图片描述
LangChain中内置了一些基础的中间件,参见: [https://docs.langchain.com/oss/python/langchain/middleware/built-in]
中间件通过Hooks钩子来实现拦截,自定义中间件可以简单的使用装饰器来定义。

节点式钩子(执行点顺序拦截):

  • before_agent:agent执行之前拦截
  • after_agent:agent执行后拦截
  • before_model:模型执行前拦截
  • after_model:模型执行后拦截

针对工具和模型的包装式钩子:

  • wrap_model_call:每个模型调用时候拦截
  • wrap_tool_call:每个工具调用时候拦截

下面是一个 演示代码,真实场景中根据具体任务调用

from langchain.agents import create_agent, AgentState
from langchain.agents.middleware import before_agent, after_agent, before_model, after_model, wrap_model_call, \
    wrap_tool_call
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.tools import tool
from langgraph.runtime import Runtime

@tool(description="查询天气, 传入城市名称,返回字符串天气信息")
def get_weather(city: str) -> str:
    return f"{city}天气:晴天"
"""
agent执行前
agent执行后
model执行前
model执行后
工具执行中
模型执行中
"""

@before_agent
def log_before_agent(state: AgentState, runtime: Runtime) -> None:
    # agent执行前会调用这个函数,并传入state和runtime两个对象
    print(f"【before agent】agent启动,并附带{len(state['messages'])}消息")

@after_agent
def log_after_agent(state: AgentState, runtime: Runtime) -> None:
    print(f"【before agent】agent结束,并附带{len(state['messages'])}消息")

@before_model
def log_before_model(state: AgentState, runtime: Runtime) -> None:
    print(f"【before model】model即将调用,并附带{len(state['messages'])}消息")

@after_model
def log_after_model(state: AgentState, runtime: Runtime) -> None:
    print(f"【after model】model调用结束,并附带{len(state['messages'])}消息")

@wrap_model_call
def model_call_hook(request, handler):
    print("模型调用中")
    return handler(request)

@wrap_tool_call
def monitor_tool(request, handler):
    print(f"工具执行:{request.tool_call['name']}")
    print(f"工具执行传入参数{request.tool_call['args']}")
    # 原本的请求 返回
    return handler(request)

agent = create_agent(
    model=ChatTongyi(model="qwen3-max"),
    tools=[get_weather],
    middleware=[log_before_agent, log_after_agent, log_before_model, log_after_model, model_call_hook, monitor_tool],
)

res = agent.invoke({"messages": [{"role": "user", "content": "北京天气如何?"}]})
print("**********\n", res)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐