ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

【agent 开发】Agent 智能体

【agent 开发】Agent 智能体 文章目录1. Agent2. 基础使用3. 流式输出4. ReAct 介绍5. middleware 中间件使用系列文章【agent 开发】agent 开发学习 - LangChain1【agent 开发】agent 开发学习 - LangChain2【agent 开发】agent 开发学习 - LangChain3前置介绍避免老年人跟不上时代也是时候开始学习 agent 相关的知识还是经典的黑马程序员教程开始学习。1. Agent前面学习的都是普通的调用链 chain也就是固定好每一步要做什么而 Agent 与普通的调用链有着本质的区别区别在于谁来决定执行步骤调用链是由开发者预先定义好的固定路径而 Agent 则是由大语言模型LLM根据任务动态决定的执行路径。Agent 并不会遵循严格的脚本而是通过推理行动来自主决定下一步该做什么然后不断循环思考 → 行动 → 观察 → 再思考的过程直到收集到足够信息并完成任务。2. 基础使用Langchain 中通过create_agent就可以创建出一个 Agent同时可以将工具给智能体传入使用的工具但是在执行代码之前更新下版本pip install -U langgraph langchain langchain-core langchain-community --force-reinstall不然会报错cannot import name ‘ExecutionInfo’ from ‘langgraph.runtime’问 AI 说是版本过低了。from langchain.agentsimportcreate_agent from langchain_community.chat_models.tongyiimportChatTongyi from langchain_core.toolsimporttool tool(description查询天气)defget_weather()-str:return晴天agentcreate_agent(modelChatTongyi(modelqwen3-max),# 智能体的大脑LLM tools[get_weather],# 向智能体提供工具列表 system_prompt你是一个聊天助手可以回答用户问题。,)resagent.invoke({messages:[{role:user,content:明天深圳的天气如何},]})formsg in res[messages]:print(type(msg).__name__,msg.content)上面就是整体的代码下面来看下输出。HumanMessage 明天深圳的天气如何 AIMessage ToolMessage 晴天 AIMessage 明天深圳的天气是晴天适合外出活动记得做好防晒哦可以看到HumanMessage 下面的 AIMessage 是空也就是说大模型并没有思考回复只是做了一个决策要用我们提供的工具get_weather来判断明天深圳的天气是什么接下来获取到天气之后再思考返回最终的 AIMessage。3. 流式输出from langchain.agentsimportcreate_agent from langchain_community.chat_models.tongyiimportChatTongyi from langchain_core.toolsimporttool tool(description获取股价传入股票名称返回字符串信息)defget_price(name:str)-str:returnf股票{name}的价格是20元tool(description获取股票信息传入股票名称返回字符串信息)defget_info(name:str)-str:returnf股票{name}是一家A股上市公司专注于IT职业教育。agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_price,get_info],system_prompt你是一个智能助手可以回答股票相关问题记住请告知我思考过程让我知道你为什么调用某个工具)forchunk in agent.stream({messages:[{role:user,content:传智教育股价多少并介绍一下}]},stream_modevalues):latest_messagechunk[messages][-1]# 如果有内容,就打印 AI 返回的回复iflatest_message.content:print(type(latest_message).__name__,latest_message.content)try:# 打印工具调用情况iflatest_message.tool_calls:print(f工具调用: {[tc[name] for tc in latest_message.tool_calls]})except AttributeError as e:pass输出如下HumanMessage 传智教育股价多少并介绍一下 工具调用:[get_price,get_info]ToolMessage 股票传智教育是一家A股上市公司专注于IT职业教育。 AIMessage 传智教育的当前股价是20元。这是一家A股上市公司专注于IT职业教育领域。如果您对该公司或其业务有更多具体问题可以随时告诉我4. ReAct 介绍ReActReasoning Acting是一种让大语言模型LLM通过思考-行动-观察动态循环实现自主决策的智能体框架其核心在于交替生成推理步骤与具体行动并依赖环境反馈持续修正策略而非仅依赖内部知识完成任务。核心流程如下思考ThoughtLLM 分析当前任务生成可解释的推理步骤明确下一步行动目标也就是是否需要调用外部工具来获取更多信息。行动Action基于推理结果调用外部工具如搜索API、数据库查询执行具体操作而非仅依赖模型内部知识。观察Observation获取上面第二步行动的结果提取出有效信息也就是获取工具返回值判断工具是否正常工作为下一轮大模型思考提供有效的信息。循环迭代LLM 根据观察结果重新推理重复上述过程直至任务完成。上面几个步骤的好处就是实时调整策略如果工具返回结果矛盾或缺失比如说搜索失败根据观察步骤Agent 可以立即更换关键词或工具。决策过程比较透明因为上面的流程比较标准化所以可以追溯 AI 的每一次思考决定调用什么工具依此来去 debug。内外部知识融合上面的流程里面 AI 身份变成了决策者很多情况下都是决定要用什么工具而这些工具可以是我们自己提供这样我们就可以把一些内部的资料或者一些实时的资料比如天气也返回给 AI让 AI 额外获得实时查询的能力。下面来看下演示代码。from langchain.agentsimportcreate_agent from langchain_community.chat_models.tongyiimportChatTongyi from langchain_core.toolsimporttool tool(description获取体重返回值是整数单位千克)defget_weight()-int:return90tool(description获取身高返回值是整数单位厘米)defget_height()-int:return172agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_weight,get_height],system_prompt你是严格遵循ReAct框架的智能体必须按「思考→行动→观察→再思考」的流程解决问题 且**每轮仅能思考并调用1个工具**禁止单次调用多个工具。 并告知我你的思考过程工具的调用原因按思考、行动、观察三个结构告知我,)forchunk in agent.stream({messages:[{role:user,content:计算我的BMI}]},stream_modevalues):latest_messagechunk[messages][-1]iflatest_message.content:print(type(latest_message).__name__,latest_message.content)try:iflatest_message.tool_calls:print(f工具调用 { [tc[name] for tc in latest_message.tool_calls] })except AttributeError as e:pass然后就是输出情况。HumanMessage 计算我的BMI AIMessage**思考**计算BMI需要体重千克和身高厘米两个数据当前两者均未知。根据ReAct框架需分步获取优先获取体重。**行动**调用get_weight工具获取体重数据。 工具调用[get_weight]ToolMessage90AIMessage**观察**获取到体重为90千克。**思考**已获得体重数据下一步需要获取身高数据才能计算BMI。根据ReAct框架现在应调用获取身高的工具。**行动**调用get_height工具获取身高数据。 工具调用[get_height]ToolMessage172AIMessage**观察**获取到身高为172厘米。**思考**现在已获得计算BMI所需的全部数据体重90千克身高172厘米。根据BMI公式体重(kg)/(身高(m))²可直接计算结果无需进一步调用工具。**行动**无工具调用直接计算并返回结果。 计算过程 身高转换为米172cm1.72m BMI90/(1.72×1.72)≈90/2.9584≈30.4您的BMI约为30.4属于肥胖范围BMI ≥30。可以看到的是这里面每一次 AI 调用都是调用一个那是因为我们在提示词里面强制每次只调用一个工具方便查看调用过程。从上面过程也可以看到整体流程大概就是用户输入问题。模型思考需要获取体重和身高由于用户没有传因此从工具列表中先调用get_weight获取体重。模型调用工具获取到体重继续新一轮思考判断出还缺少身高于是从工具列表中通过get_height获取身高。模型调用工具获取到身高最后计算 BMI 返回。5. middleware 中间件使用中间件就是夹在【大模型 LLM思考层】和【外部工具 / 业务系统Action 执行层】之间的一层软件服务可以做翻译、调度、管控、适配等工具其实就相当于拦截器了一些比较重要的场景如下日志记录、分析、调试提示词转换工具选择重试、备用、提前终止等逻辑控制安全防护、个人身份检测下面是代码的使用其实整体看起来感觉跟 Java 的 AOP 差不多。fromlangchain.agentsimportcreate_agent,AgentStatefromlangchain.agents.middlewareimportbefore_agent,after_agent,before_model,after_model,wrap_model_call,\ wrap_tool_callfromlangchain_community.chat_models.tongyiimportChatTongyifromlangchain_core.toolsimporttoolfromlanggraph.runtimeimportRuntimetool(description查询天气传入城市名称字符串返回字符串天气信息)defget_weather(city:str)-str:returnf{city}天气晴天 1. agent执行前 2. agent执行后 3. model执行前 4. model执行后 5. 工具执行中 6. 模型执行中 before_agentdeflog_before_agent(state:AgentState,runtime:Runtime)-None:# agent执行前会调用这个函数并传入state和runtime两个对象print(f[before agent]agent启动并附带{len(state[messages])}消息)after_agentdeflog_after_agent(state:AgentState,runtime:Runtime)-None:print(f[after agent]agent结束并附带{len(state[messages])}消息)before_modeldeflog_before_model(state:AgentState,runtime:Runtime)-None:print(f[before_model]模型即将调用并附带{len(state[messages])}消息)after_modeldeflog_after_model(state:AgentState,runtime:Runtime)-None:print(f[after_model]模型调用结束并附带{len(state[messages])}消息)wrap_model_calldefmodel_call_hook(request,handler):print(模型调用啦)returnhandler(request)wrap_tool_calldefmonitor_tool(request,handler):print(f工具执行{request.tool_call[name]})print(f工具执行传入参数{request.tool_call[args]})returnhandler(request)agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_weather],middleware[log_before_agent,log_after_agent,log_before_model,log_after_model,model_call_hook,monitor_tool])resagent.invoke({messages:[{role:user,content:深圳今天的天气如何呀如何穿衣}]})formsginres[messages]:print(type(msg).__name__,msg.content)上面我们定义了几个 AOP 方法。before_agent在 Agent 执行前调用这个函数参数是AgentState和Runtime。after_agent在 Agent 执行结束调用这个函数参数是AgentState和Runtime。before_model在 model 执行前调用这个函数参数是AgentState和Runtime。after_model在 model 执行结束调用这个函数参数是AgentState和Runtime。wrap_model_call在模型调用的时候会回调这个方法参数是request和handler。wrap_tool_call在工具调用的时候会回调这个方法参数是request和handler。接下来在create_agent创建 Agent 的时候将这几个方法作为中间件传进去运行的时候就会被拦截然后执行对应的逻辑了下面看下最后的输出结果。[before agent]agent启动并附带1消息[before_model]模型即将调用并附带1消息 模型调用啦[after_model]模型调用结束并附带2消息 工具执行get_weather 工具执行传入参数{city:深圳}[before_model]模型即将调用并附带3消息 模型调用啦[after_model]模型调用结束并附带4消息[after agent]agent结束并附带4消息 HumanMessage 深圳今天的天气如何呀如何穿衣 AIMessage ToolMessage 深圳天气晴天 AIMessage 深圳今天是晴天阳光明媚建议穿着轻便、透气的衣物比如短袖T恤、薄款长裤或短裤。同时注意防晒可以戴帽子、太阳镜并涂抹防晒霜哦可以看到执行的顺序就是Agent 开始 - model1 - tool - model2 - Agent 结束。如有错误欢迎指出
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表