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


所有评论(0)