】Agent 智能體)
文章目錄1. Agent2. 基礎(chǔ)使用3. 流式輸出4. ReAct 介紹5. middleware 中間件使用系列文章【agent 開發(fā)】agent 開發(fā)學(xué)習(xí) - LangChain1【agent 開發(fā)】agent 開發(fā)學(xué)習(xí) - LangChain2【agent 開發(fā)】agent 開發(fā)學(xué)習(xí) - LangChain3前置介紹避免老年人跟不上時(shí)代也是時(shí)候開始學(xué)習(xí) agent 相關(guān)的知識(shí)還是經(jīng)典的黑馬程序員教程開始學(xué)習(xí)。1. Agent前面學(xué)習(xí)的都是普通的調(diào)用鏈 chain也就是固定好每一步要做什么而 Agent 與普通的調(diào)用鏈有著本質(zhì)的區(qū)別區(qū)別在于誰來決定執(zhí)行步驟調(diào)用鏈?zhǔn)怯砷_發(fā)者預(yù)先定義好的固定路徑而 Agent 則是由大語言模型LLM根據(jù)任務(wù)動(dòng)態(tài)決定的執(zhí)行路徑。Agent 并不會(huì)遵循嚴(yán)格的腳本而是通過推理行動(dòng)來自主決定下一步該做什么然后不斷循環(huán)思考 → 行動(dòng) → 觀察 → 再思考的過程直到收集到足夠信息并完成任務(wù)。2. 基礎(chǔ)使用Langchain 中通過create_agent就可以創(chuàng)建出一個(gè) Agent同時(shí)可以將工具給智能體傳入使用的工具但是在執(zhí)行代碼之前更新下版本pip install -U langgraph langchain langchain-core langchain-community --force-reinstall不然會(huì)報(bào)錯(cuò)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你是一個(gè)聊天助手可以回答用戶問題。,)resagent.invoke({messages:[{role:user,content:明天深圳的天氣如何},]})formsg in res[messages]:print(type(msg).__name__,msg.content)上面就是整體的代碼下面來看下輸出。HumanMessage 明天深圳的天氣如何 AIMessage ToolMessage 晴天 AIMessage 明天深圳的天氣是晴天適合外出活動(dòng)記得做好防曬哦可以看到HumanMessage 下面的 AIMessage 是空也就是說大模型并沒有思考回復(fù)只是做了一個(gè)決策要用我們提供的工具get_weather來判斷明天深圳的天氣是什么接下來獲取到天氣之后再思考返回最終的 AIMessage。3. 流式輸出from langchain.agentsimportcreate_agent from langchain_community.chat_models.tongyiimportChatTongyi from langchain_core.toolsimporttool tool(description獲取股價(jià)傳入股票名稱返回字符串信息)defget_price(name:str)-str:returnf股票{name}的價(jià)格是20元tool(description獲取股票信息傳入股票名稱返回字符串信息)defget_info(name:str)-str:returnf股票{name}是一家A股上市公司專注于IT職業(yè)教育。agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_price,get_info],system_prompt你是一個(gè)智能助手可以回答股票相關(guān)問題記住請(qǐng)告知我思考過程讓我知道你為什么調(diào)用某個(gè)工具)forchunk in agent.stream({messages:[{role:user,content:傳智教育股價(jià)多少并介紹一下}]},stream_modevalues):latest_messagechunk[messages][-1]# 如果有內(nèi)容,就打印 AI 返回的回復(fù)iflatest_message.content:print(type(latest_message).__name__,latest_message.content)try:# 打印工具調(diào)用情況iflatest_message.tool_calls:print(f工具調(diào)用: {[tc[name] for tc in latest_message.tool_calls]})except AttributeError as e:pass輸出如下HumanMessage 傳智教育股價(jià)多少并介紹一下 工具調(diào)用:[get_price,get_info]ToolMessage 股票傳智教育是一家A股上市公司專注于IT職業(yè)教育。 AIMessage 傳智教育的當(dāng)前股價(jià)是20元。這是一家A股上市公司專注于IT職業(yè)教育領(lǐng)域。如果您對(duì)該公司或其業(yè)務(wù)有更多具體問題可以隨時(shí)告訴我4. ReAct 介紹ReActReasoning Acting是一種讓大語言模型LLM通過思考-行動(dòng)-觀察動(dòng)態(tài)循環(huán)實(shí)現(xiàn)自主決策的智能體框架其核心在于交替生成推理步驟與具體行動(dòng)并依賴環(huán)境反饋持續(xù)修正策略而非僅依賴內(nèi)部知識(shí)完成任務(wù)。核心流程如下思考ThoughtLLM 分析當(dāng)前任務(wù)生成可解釋的推理步驟明確下一步行動(dòng)目標(biāo)也就是是否需要調(diào)用外部工具來獲取更多信息。行動(dòng)Action基于推理結(jié)果調(diào)用外部工具如搜索API、數(shù)據(jù)庫查詢執(zhí)行具體操作而非僅依賴模型內(nèi)部知識(shí)。觀察Observation獲取上面第二步行動(dòng)的結(jié)果提取出有效信息也就是獲取工具返回值判斷工具是否正常工作為下一輪大模型思考提供有效的信息。循環(huán)迭代LLM 根據(jù)觀察結(jié)果重新推理重復(fù)上述過程直至任務(wù)完成。上面幾個(gè)步驟的好處就是實(shí)時(shí)調(diào)整策略如果工具返回結(jié)果矛盾或缺失比如說搜索失敗根據(jù)觀察步驟Agent 可以立即更換關(guān)鍵詞或工具。決策過程比較透明因?yàn)樯厦娴牧鞒瘫容^標(biāo)準(zhǔn)化所以可以追溯 AI 的每一次思考決定調(diào)用什么工具依此來去 debug。內(nèi)外部知識(shí)融合上面的流程里面 AI 身份變成了決策者很多情況下都是決定要用什么工具而這些工具可以是我們自己提供這樣我們就可以把一些內(nèi)部的資料或者一些實(shí)時(shí)的資料比如天氣也返回給 AI讓 AI 額外獲得實(shí)時(shí)查詢的能力。下面來看下演示代碼。from langchain.agentsimportcreate_agent from langchain_community.chat_models.tongyiimportChatTongyi from langchain_core.toolsimporttool tool(description獲取體重返回值是整數(shù)單位千克)defget_weight()-int:return90tool(description獲取身高返回值是整數(shù)單位厘米)defget_height()-int:return172agentcreate_agent(modelChatTongyi(modelqwen3-max),tools[get_weight,get_height],system_prompt你是嚴(yán)格遵循ReAct框架的智能體必須按「思考→行動(dòng)→觀察→再思考」的流程解決問題 且**每輪僅能思考并調(diào)用1個(gè)工具**禁止單次調(diào)用多個(gè)工具。 并告知我你的思考過程工具的調(diào)用原因按思考、行動(dòng)、觀察三個(gè)結(jié)構(gòu)告知我,)forchunk in agent.stream({messages:[{role:user,content:計(jì)算我的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工具調(diào)用 { [tc[name] for tc in latest_message.tool_calls] })except AttributeError as e:pass然后就是輸出情況。HumanMessage 計(jì)算我的BMI AIMessage**思考**計(jì)算BMI需要體重千克和身高厘米兩個(gè)數(shù)據(jù)當(dāng)前兩者均未知。根據(jù)ReAct框架需分步獲取優(yōu)先獲取體重。**行動(dòng)**調(diào)用get_weight工具獲取體重?cái)?shù)據(jù)。 工具調(diào)用[get_weight]ToolMessage90AIMessage**觀察**獲取到體重為90千克。**思考**已獲得體重?cái)?shù)據(jù)下一步需要獲取身高數(shù)據(jù)才能計(jì)算BMI。根據(jù)ReAct框架現(xiàn)在應(yīng)調(diào)用獲取身高的工具。**行動(dòng)**調(diào)用get_height工具獲取身高數(shù)據(jù)。 工具調(diào)用[get_height]ToolMessage172AIMessage**觀察**獲取到身高為172厘米。**思考**現(xiàn)在已獲得計(jì)算BMI所需的全部數(shù)據(jù)體重90千克身高172厘米。根據(jù)BMI公式體重(kg)/(身高(m))2可直接計(jì)算結(jié)果無需進(jìn)一步調(diào)用工具。**行動(dòng)**無工具調(diào)用直接計(jì)算并返回結(jié)果。 計(jì)算過程 身高轉(zhuǎn)換為米172cm1.72m BMI90/(1.72×1.72)≈90/2.9584≈30.4您的BMI約為30.4屬于肥胖范圍BMI ≥30??梢钥吹降氖沁@里面每一次 AI 調(diào)用都是調(diào)用一個(gè)那是因?yàn)槲覀冊(cè)谔崾驹~里面強(qiáng)制每次只調(diào)用一個(gè)工具方便查看調(diào)用過程。從上面過程也可以看到整體流程大概就是用戶輸入問題。模型思考需要獲取體重和身高由于用戶沒有傳因此從工具列表中先調(diào)用get_weight獲取體重。模型調(diào)用工具獲取到體重繼續(xù)新一輪思考判斷出還缺少身高于是從工具列表中通過get_height獲取身高。模型調(diào)用工具獲取到身高最后計(jì)算 BMI 返回。5. middleware 中間件使用中間件就是夾在【大模型 LLM思考層】和【外部工具 / 業(yè)務(wù)系統(tǒng)Action 執(zhí)行層】之間的一層軟件服務(wù)可以做翻譯、調(diào)度、管控、適配等工具其實(shí)就相當(dāng)于攔截器了一些比較重要的場(chǎng)景如下日志記錄、分析、調(diào)試提示詞轉(zhuǎn)換工具選擇重試、備用、提前終止等邏輯控制安全防護(hù)、個(gè)人身份檢測(cè)下面是代碼的使用其實(shí)整體看起來感覺跟 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執(zhí)行前 2. agent執(zhí)行后 3. model執(zhí)行前 4. model執(zhí)行后 5. 工具執(zhí)行中 6. 模型執(zhí)行中 before_agentdeflog_before_agent(state:AgentState,runtime:Runtime)-None:# agent執(zhí)行前會(huì)調(diào)用這個(gè)函數(shù)并傳入state和runtime兩個(gè)對(duì)象print(f[before agent]agent啟動(dòng)并附帶{len(state[messages])}消息)after_agentdeflog_after_agent(state:AgentState,runtime:Runtime)-None:print(f[after agent]agent結(jié)束并附帶{len(state[messages])}消息)before_modeldeflog_before_model(state:AgentState,runtime:Runtime)-None:print(f[before_model]模型即將調(diào)用并附帶{len(state[messages])}消息)after_modeldeflog_after_model(state:AgentState,runtime:Runtime)-None:print(f[after_model]模型調(diào)用結(jié)束并附帶{len(state[messages])}消息)wrap_model_calldefmodel_call_hook(request,handler):print(模型調(diào)用啦)returnhandler(request)wrap_tool_calldefmonitor_tool(request,handler):print(f工具執(zhí)行{request.tool_call[name]})print(f工具執(zhí)行傳入?yún)?shù){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)上面我們定義了幾個(gè) AOP 方法。before_agent在 Agent 執(zhí)行前調(diào)用這個(gè)函數(shù)參數(shù)是AgentState和Runtime。after_agent在 Agent 執(zhí)行結(jié)束調(diào)用這個(gè)函數(shù)參數(shù)是AgentState和Runtime。before_model在 model 執(zhí)行前調(diào)用這個(gè)函數(shù)參數(shù)是AgentState和Runtime。after_model在 model 執(zhí)行結(jié)束調(diào)用這個(gè)函數(shù)參數(shù)是AgentState和Runtime。wrap_model_call在模型調(diào)用的時(shí)候會(huì)回調(diào)這個(gè)方法參數(shù)是request和handler。wrap_tool_call在工具調(diào)用的時(shí)候會(huì)回調(diào)這個(gè)方法參數(shù)是request和handler。接下來在create_agent創(chuàng)建 Agent 的時(shí)候?qū)⑦@幾個(gè)方法作為中間件傳進(jìn)去運(yùn)行的時(shí)候就會(huì)被攔截然后執(zhí)行對(duì)應(yīng)的邏輯了下面看下最后的輸出結(jié)果。[before agent]agent啟動(dòng)并附帶1消息[before_model]模型即將調(diào)用并附帶1消息 模型調(diào)用啦[after_model]模型調(diào)用結(jié)束并附帶2消息 工具執(zhí)行g(shù)et_weather 工具執(zhí)行傳入?yún)?shù){city:深圳}[before_model]模型即將調(diào)用并附帶3消息 模型調(diào)用啦[after_model]模型調(diào)用結(jié)束并附帶4消息[after agent]agent結(jié)束并附帶4消息 HumanMessage 深圳今天的天氣如何呀如何穿衣 AIMessage ToolMessage 深圳天氣晴天 AIMessage 深圳今天是晴天陽光明媚建議穿著輕便、透氣的衣物比如短袖T恤、薄款長褲或短褲。同時(shí)注意防曬可以戴帽子、太陽鏡并涂抹防曬霜哦可以看到執(zhí)行的順序就是Agent 開始 - model1 - tool - model2 - Agent 結(jié)束。如有錯(cuò)誤歡迎指出