文章目录
- 一、理解Agents
- 什么是Agent?
- Agent的核心组件
- Agent创建与调用
- 二、Agent的基本用法1:模型的传入方式
- 举例:
- 三、Agent的基本用法2:如何调用Agent
- 举例
- 四、Agent的基本用法3:绑定工具
- 基本用法
- 举例1:绑定一个工具
- 举例2:接入内置工具
- 举例3:绑定多个工具
- 工具调用流程分析
- 举例:用户问题:“找出当前最流行的无线耳机并检查库存”的任务
- 重试机制
- 常见问题
- 问题1:Agent 如何选择工具?
- 问题2:Agent 为什么没有调用工具?
- 问题3:Agent 选错工具?
- 问题4:如何知道 Agent 何时完成?
- 问题5:Agent 可以调用多少次工具?
- 问题6:如何限制工具调用次数?
- 五、Agent的高级用法1:设置Agent名称
- 用法
- 经典使用场景
- 1. 流式输出归因
- 2. 消息身份标记
- 3. 调试与trace可读性
- 4. 组件化封装
- 5. 前端展示与运行态可观测性
- 6. 作为稳定的运行时身份标识
- 六、Agent的高级用法2:系统提示词
- 七、Agent的高级用法3:结构化输出
- 模型 vs Agent的结构化输出对比
- 结构化输出的4种策略
- ProviderStrategy
- ToolStrategy
- type / AutoStrategy
- None
- 总结:
- ToolStrategy使用详解
- 结构化输出:schema参数
- 输出模式1:Pydantic类型
- 输出模式2:TypedDict类型
- 输出模式3:JsonSchema类型
- 输出模式4:@dataclass类型
- 多schema联合模式
- 自定义工具消息:tool_message_content参数
- 错误处理:handle_errors参数
- 情况1:设置为True/False/固定字符串
- handle_errors设置为True
- handle_errors设置为False
- handle_errors设置为“请检查输入数据”
- 情况2:设置为指定异常类型
- 情况3:设置为自定义错误处理函数
- 八、Agent的高级用法4:流式输出及模式
- 流式输出的说明
- 具体的输出模式
- values输出模式
- updates输出模式
- messages输出模式
- tasks输出模式
- debug输出模式
- checkpoints输出模式
- custom输出模式
- 流式输出模式总结
- 参考视频
一、理解Agents
通用人工智能(AGI)将是 AI的终极形态 ,几乎已成为业界共识。同样,构建智能体(Agent)则是AI工程应用 当下的“终极形态” ,即Agent是大模型应用开发的核心。
什么是Agent?
Agent的核心组件
Agent创建与调用
二、Agent的基本用法1:模型的传入方式
create_agent 完整参数:
agent=create_agent(model:str|BaseChatModel,# 必需:聊天模型tools:List[BaseTool],# 必需:工具列表system_prompt:str="",# 系统提示词middleware:Seguence[AgentMiddleware[StateT_co,ContextT]]=()# 中间件interrupt_before:List[str]=None,# 在某些工具前暂停(人机协作)interrupt_after:List[str]=None,# 在某些工具后暂停debug:bool=False# 调试模式name:str丨None=None,# 设置模型名称)更多参数参考:https://reference.langchain.com/python/langchain/agents/factory/create_agent
举例:
fromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv(override=True)DASHSCOPE_API_KEY=os.getenv("DASHSCOPE_API_KEY")DASHSCOPE_BASE_URL=os.getenv("DASHSCOPE_BASE_URL")model=init_chat_model(model="openai:qwen-plus",# 底层调用的是ChatOpenAIapi_key=DASHSCOPE_API_KEY,base_url=DASHSCOPE_BASE_URL)fromlangchain.agentsimportcreate_agent agent=create_agent(model)print(type(agent))fromIPython.displayimportImage,display# 显示agent的图结构display(Image(agent.get_graph().draw_mermaid_png()))
由上可知,agent本质上是LangGraph的CompiledStateGraph实例,底层实现是一个图结构。
三、Agent的基本用法2:如何调用Agent
举例
fromrichimportprintasrprint agent=create_agent(model=model)resp=agent.invoke({"messages":[{"role":"system","content":"你是一个小学数学老师,耐心,幽默,讲解深入浅出"},{"role":"user","content":"100加上50等于多少?"}]})rprint(resp)四、Agent的基本用法3:绑定工具
LangChain内置工具列表:https://docs.langchain.com/oss/python/integrations/tools
其中典型的工具如下:
基本用法
Agents支持绑定一或多个工具。
举例1:绑定一个工具
举例2:接入内置工具
绑定内置的TavilySearch搜索工具,可以借助Tavily进行网络搜索和信息爬取。
这里我们需要先在tavily官网注册并获得API-KEY(每月有免费额度):https://www.tavily.com/。
然后将API-KEY写到本地.env中的 TAVILY_API_KEY 变量中,即可进行调用了
举例3:绑定多个工具
注意:只给 Agent 需要的工具,工具太多会混淆。一般2-5 个工具最佳
工具调用流程分析
LangChain 的 Agent 会将 模型 与 工具 结合起来,在实现上由一个基于 LangGraph 的图结构来编排执行流程,如下所示。
这与前文得到的 Agent 图结构是一致的,本质上就是经典的 ReAct 结构:一个具备“ 思考-行动-观察 ”不断循环的自主工作者。
用户问题 → AI 思考 → 调用工具 → 观察结果 → 继续思考 → … → 最终答案
当用户提出一个复杂需求时,Agent会像人类一样,先理解任务、规划步骤、使用合适的工具(如搜索网络、查询数据库、执行计算)获取信息,Agent 会在一个循环中 反复调用模型和工具 ,直到某次模型输出中 不再包含工具调用 则结束,最后综合所有信息给出最终答案。
完整流程:
举例:用户问题:“找出当前最流行的无线耳机并检查库存”的任务
重试机制
Agent可以在工具调用结果不满足要求时,自主重试。
常见问题
问题1:Agent 如何选择工具?
依据 :工具的 docstring
问题2:Agent 为什么没有调用工具?
问题3:Agent 选错工具?
问题4:如何知道 Agent 何时完成?
当 AIMessage 不包含 tool_calls 时:
formsginresponse['messages']:ifisinstance(msg,AIMessage):ifhasattr(msg,'tool_calls')andmsg.tool_calls:print("还在调用工具...")else:print("完成!最终答案:",msg.content)问题5:Agent 可以调用多少次工具?
问题6:如何限制工具调用次数?
五、Agent的高级用法1:设置Agent名称
用法
经典使用场景
1. 流式输出归因
2. 消息身份标记
3. 调试与trace可读性
4. 组件化封装
5. 前端展示与运行态可观测性
6. 作为稳定的运行时身份标识
六、Agent的高级用法2:系统提示词
使用 create_agent 创建 Agent 时,需传入 模型 和 工具 、可选地传入 系统提示词 。提示词为Agent提供了任务背景、行为准则和操作指南。
系统指令,即SystemMessage,通过 system_prompt 设置,定义 Agent 行为。这This parameter can be either astror aSystemMessagetype.
七、Agent的高级用法3:结构化输出
模型 vs Agent的结构化输出对比
结构化输出的4种策略
LangChain的create_agent()函数自动处理结构化输出的全过程。用户只需通过 “response_format”参数 设置期望的输出模式(Schema)。
当模型生成结构化数据时,系统会自动捕获、验证并将结果存储在Agent状态的 structured_response键中。
ProviderStrategy
使用模型提供商的 原生结构化输出功能 实现结构化输出。
ToolStrategy
type / AutoStrategy
None
默认配置,表示不以结构化输出,以 自然语言 响应用户问题。
总结:
在实际大模型Agent开发场景中,如果使用到了结构化输出,推荐使用 “ToolStrategy”策略 ,所以后续重点介绍这种策略方式结构化输出。
ToolStrategy使用详解
结构化输出:schema参数
输出模式1:Pydantic类型
Pydantic类型的Schema支持数据验证,是优先推荐使用的方式。
fromlangchain.chat_modelsimportinit_chat_modelfromdotenvimportload_dotenvimportos load_dotenv(override=True)DASHSCOPE_API_KEY=os.getenv("DASHSCOPE_API_KEY")DASHSCOPE_BASE_URL=os.getenv("DASHSCOPE_BASE_URL")model=init_chat_model(model="openai:qwen-plus",# 底层调用的是ChatOpenAIapi_key=DASHSCOPE_API_KEY,base_url=DASHSCOPE_BASE_URL)frompydanticimportBaseModel,Fieldfromlangchain.agents.structured_outputimportToolStrategyfromlangchain.agentsimportcreate_agentfromlangchain.messagesimportHumanMessageclassContactInfo(BaseModel):"""用户的联系方式"""name:str=Field(description="用户姓名")email:str=Field(description="用户邮箱地址")phone:str=Field(description="用户的手机号")agent=create_agent(model=model,response_format=ToolStrategy(ContactInfo))response=agent.invoke({"messages":[HumanMessage("从这段话中抽取结构化信息:小明的邮箱地址为:songhk@atguigu.com,手机号:12345678912")]})formsginresponse["messages"]:msg.pretty_print()
观察日志可知,这种方式将结构化信息作为 伪工具传递 ,显然使用了Function Calling方法。
注意:
- 如果是结构化输出,在系统提示词中最后提示结构化输出结果,如果提示词中先结构化输出结果(Agent已经执行完成),可能会导致一些工具不会再被调用。
- 系统提示词中最后加入“未找到用户”时的处理提示,避免程序一直调用工具尝试查找对应用户信息。
输出模式2:TypedDict类型
输出模式3:JsonSchema类型
输出模式4:@dataclass类型
@dataclass是Python 3.7引入的一个装饰器,用于简化数据存储类的定义。
多schema联合模式
自定义工具消息:tool_message_content参数
错误处理:handle_errors参数
情况1:设置为True/False/固定字符串
handle_errors设置为True
handle_errors设置为False
handle_errors设置为“请检查输入数据”
情况2:设置为指定异常类型
情况3:设置为自定义错误处理函数
frompydanticimportBaseModel,FieldfromtypingimportUnionfromlangchain.agentsimportcreate_agentfromlangchain.agents.structured_outputimportToolStrategy,StructuredOutputValidationError,MultipleStructuredOutputsErrorfromrichimportprintasrprint# 自定义错误处理函数defcustom_error_handler(error:Exception)->str:"""自定义错误处理器"""error_str=str(error)print(f"捕获到错误类型:{type(error).__name__}")print(f"错误详情:{error_str}")ifisinstance(error,StructuredOutputValidationError):return"数据格式有误,请检查字段是否符合要求。"elifisinstance(error,MultipleStructuredOutputsError):return"检测到多个响应,请选择最相关的一个进行返回。"else:returnf"Error:{error_str}"classContactInfo(BaseModel):"""个人联系信息"""name:str=Field(description="姓名")email:str=Field(description="电子邮箱")classEventDetails(BaseModel):"""活动详情"""event_name:str=Field(description="活动名称")date:str=Field(description="活动日期")agent=create_agent(model=model,response_format=ToolStrategy(Union[ContactInfo,EventDetails],tool_message_content="提取完成!",handle_errors=custom_error_handler))result=agent.invoke({"messages":[{"role":"user","content":f"请提取以下文本中内容:姓名:张三,电子邮箱:zhang3@atguigu.com,活动名称:公司年会,活动日期:2026-07-15"}]})rprint(result)八、Agent的高级用法4:流式输出及模式
流式输出的说明
具体的输出模式
values输出模式
updates输出模式
messages输出模式
该模式中会输出流式返回的Token以及相关的元数据(如:来自哪个节点),可以用在实现类似ChatGPT 的打字机效果场景,为聊天机器人等交互式应用提供最佳的实时体验。
tasks输出模式
该模式会输出当前task任务开始和结束的时间,包含任务的结果和错误信息,该模式用于监控任务的生命周期
debug输出模式
该模式与tasks模式类似,比task模式多输出任务步骤、时间戳、task类型(task/task_result),该模式用于调试、监控task任务的生命周期。
checkpoints输出模式
该模式中,每当检查点(checkpoint)被创建时会触发输出,输出包含检查点中的状态,用于需要状态持久化、工作流恢复或分布式执行跟踪的高级场景。
custom输出模式
开发者通过 get_stream_writer 在工具或节点内部 自定义发送的数据 ,用于 输出 业务逻辑相关的进度信息(如“已处理10/100条记录”)、自定义日志或指标。
流式输出模式总结
我们可以根据不同的目标来选择不同的输出模式。例如:
- 实现 实时对话交互 ,优先选择messages模式;
- 观察Agent的 思考与执行步骤 ,优先选择updates模式;
- 需要查看 每一步状态 优先选择values/tasks/debug模式;
- 在工具执行时 输出自定义业务 日志优先选择custom模式。
参考视频
https://www.bilibili.com/video/BV1rv7A6oEeP?spm_id_from=333.788.videopod.episodes&vd_source=0467ab39cc5ec5940fee22a0e7797575&p=51