Agent輕松通-P3:分析我們的Agent

歡迎來到啾啾的博客🐱。
記錄學習點滴。分享工作思考和實用技巧,偶爾也分享一些雜談💬。
有很多很多不足的地方,歡迎評論交流,感謝您的閱讀和評論😄。

目錄

  • 1 引言
  • 2 使用工具分析Agent:”日志“
  • 3 Agent分析調優
    • 3.1 使用LLM自評LLM-as-a-Judge
  • 4 TODO

1 引言

讓我們結合前兩篇的理論與實踐,嘗試系統性、結構化、全面地分析Agent。
因繼續寫下去單個文件太長了,本篇代碼較上篇做了結構改動,代碼放在https://github.com/tataCrayon/LLM-DEV-COOKBOOK倉庫。

2 使用工具分析Agent:”日志“

我們之前通過verbose=True的日志,對Agent的行為進行了定性分析(Qualitative Analysis)。
但verbose=True的日志結構還是不夠清晰。

LangChain提供了組件(回調機制),讓我們可以捕獲Agent的完整思考鏈

from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import AgentAction, LLMResult
from typing import Any, Dict, Listclass IterationCounterCallback(BaseCallbackHandler):"""一個在每次Agent行動前打印輪次的回調處理器"""def __init__(self):self.iteration_count = 0def on_agent_action(self, action: AgentAction, **kwargs: Any) -> Any:self.iteration_count += 1print(f"\n--- 🤔 思考輪次: {self.iteration_count} ---")class AgentTraceCallback(BaseCallbackHandler):"""一個捕獲并存儲Agent與LLM之間完整交互記錄的回調處理器"""def __init__(self):self.trace = ""def on_llm_start(self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any) -> Any:self.trace += f"\n--- PROMPT TO LLM ---\n{prompts[0]}\n"def on_llm_end(self, response: LLMResult, **kwargs: Any) -> Any:self.trace += f"--- RESPONSE FROM LLM ---\n{response.generations[0][0].text}\n"

這些記錄以配置的方式,在agent_executor.invoke調用中傳入

response = agent_executor.invoke({"input": question},# 回調列表可以包含多個回調處理器config={"callbacks": [iteration_counter, trace_collector]} 
)
  • IterationCounterCallback
    IterationCounterCallback 并不是 LangChain 的標準內置回調類,而更可能是一個自定義的回調處理器,用于在 LangChain 的執行過程中跟蹤迭代次數或特定事件。這種回調通常用于記錄某些操作的執行次數,例如在鏈(Chain)或代理(Agent)執行過程中統計某些特定步驟的調用次數。
    • 功能
      迭代計數:IterationCounterCallback 通常用于記錄某些特定操作(如 LLM 調用、工具調用、代理循環等)的次數。
      監控和調試:通過計數,可以幫助開發者了解模型或代理在執行任務時的行為,例如循環次數、調用頻率等。
      自定義邏輯:可以根據計數結果觸發特定行為,例如在達到一定次數后停止執行或記錄日志。
      還有AgentTraceCallback。

這里不做多過記錄了,具體詳情見LangChain API。

3 Agent分析調優

我們需要從“效率”、“準確性”、“魯棒性”三個角度去調整優化我們的Agent。

  • 效率
    Q:Agent的ReAct循環是否偏離預期?
    Q:步驟是否多余(需要合并)?

  • 準確性
    Q:Agent選擇搜索的關鍵詞是否有效?
    Q:使用工具獲取的內容是否真的回答了問題?
    Q:最終的答案是否準確、全面?

  • 魯棒性
    Q:如果其中一個工具調用失敗了(比如網頁無法訪問),Agent要怎么處理?
    Q:故障怎么恢復?

3.1 使用LLM自評LLM-as-a-Judge

人工評估在復雜場景往往效率低下,更適合的做法是訓練一個LLM評委。

實現"LLM即評委"。
我們將創建一個新的函數,它的職責就是扮演“評委”的角色。它會接收我們捕獲到的agent_trace,然后調用一個強大的LLM(我們繼續使用DeepSeek),根據我們設定的標準來對這次運行進行打分和評價。

  • Prompt :“評委LLM”的評分標準
EVALUATION_PROMPT_TEMPLATE = """**角色:** 你是一位經驗豐富的AI Agent評審專家。**任務:** 請根據以下提供的“原始問題”、“Agent最終答案”和“Agent完整思考軌跡”,對該Agent的表現進行一次全面、客觀的評估。**評估標準:**1.  **效率 (Efficiency):** Agent是否采取了最直接、最少的步驟來解決問題?是否存在冗余的工具調用或不必要的思考循環?2.  **準確性 (Accuracy):** Agent的最終答案是否準確、全面地回答了原始問題?3.  **忠實度 (Faithfulness):** 最終答案是否嚴格基于其“觀察結果”(工具的輸出)?是否存在編造或幻覺的成分?4.  **工具使用 (Tool Use):** Agent是否選擇了正確的工具?傳遞給工具的參數是否合理?---**【待評估材料】****原始問題:**{question}**Agent最終答案:**{final_answer}**Agent完整思考軌跡:**---{agent_trace}---**【你的評估報告】**請在下方提供你的評估報告。請先給出一個總體得分(滿分10分),然后分點闡述你的理由,并提出具體的改進建議。**總體得分:** [請在這里打分,例如:8/10]**詳細評估與改進建議:**1.  **效率:** ...2.  **準確性:** ...3.  **忠實度:** ...4.  **工具使用:** ..."""
  • “評委”代碼
from langchain_deepseek import ChatDeepSeek
from langchain.prompts import PromptTemplate
from langchain.schema.output_parser import StrOutputParser
from ..llms.llm_clients import create_deepseek_llm # 從我們的llm模塊導入from ..configs.prompt_config import EVALUATION_PROMPT_TEMPLATEdef evaluate_agent_trace(question: str, agent_trace: str, final_answer: str):"""使用LLM作為評委,來評估Agent的執行軌跡和最終答案。"""print("\n--- 啟動LLM評委進行評估 ---")# 1. 創建評估鏈 (Evaluation Chain)prompt = PromptTemplate.from_template(EVALUATION_PROMPT_TEMPLATE)llm = create_deepseek_llm() # 復用我們創建LLM的函數# 使用LCEL(LangChain Expression Language)來構建鏈# 這是一個簡單的 "Prompt -> LLM -> String Output" 鏈evaluation_chain = prompt | llm | StrOutputParser()# 2. 運行評估鏈try:print("評委正在審閱材料并生成報告...")evaluation_report = evaluation_chain.invoke({"question": question,"agent_trace": agent_trace,"final_answer": final_answer})print("\n--- 評委報告生成完畢 ---")print(evaluation_report)except Exception as e:print(f"\n--- LLM評委在評估時發生錯誤 ---")print(e)

AI給出來的評估內容如下:

--- 評委報告生成完畢 ---
**總體得分:** 8.5/10  **詳細評估與改進建議:**1.  **效率:**- **評分:8/10**- **理由:** Agent通過三次`search_tool`調用逐步獲取信息,邏輯清晰,但首次搜索查詢("Java vs Python for building LLM applications...")的輸入參數 過于寬泛,導致返回結果包含冗余信息(如Vert.x與Asyncio的無關對比)。后續兩次搜索(Python/Java框架)更精準,效率較高。- **改進建議:** 首次搜索可拆分為兩個針對性查詢(如分別搜索優劣勢和框架),或直接使用更精確的關鍵詞(如"LLM framework comparison Java Python 2024")。2.  **準確性:**- **評分:9/10**- **理由:** 最終答案全面覆蓋了兩種語言的優劣勢,且列出的框架(如LangChain、Spring AI)與搜索結果一致。但未明確提及Python的GIL(全局解釋器鎖)對 多線程的限制,這是Python性能劣勢的關鍵細節。- **改進建議:** 補充Python的GIL問題,并對比Java的JVM優化對LLM推理的潛在優勢。3.  **忠實度:**- **評分:9/10**- **理由:** 答案嚴格基于工具返回的觀察結果,未發現編造內容。但未完全引用搜索中提到的"Konduit支持模型加載與調優"的具體功能描述,略顯簡略。       - **改進建議:** 引用工具返回的原文關鍵描述(如"Konduit允許加載GPT/BERT模型")以增強可信度。4.  **工具使用:**- **評分:8/10**- **理由:** 工具選擇合理(僅需搜索無需爬取),但首次搜索參數可優化。未嘗試組合查詢(如"Java LLM frameworks performance benchmarks")以獲取更深度的對比數據。- **改進建議:** 在對比優劣勢時,可增加一次搜索查詢(如"Python Java LLM latency memory usage")補充量化指標。**其他建議:**
- 可增加對跨語言生態的說明(如Java通過Jython調用Python庫的可行性),以體現更全面的視角。
- 最終答案中可補充框架的典型應用場景(如"Haystack適合RAG"已提及,但Spring AI的企業集成場景可細化)。

4 TODO

當前階段就了解到這里,附一張單Agent LLM應用流程圖。
覺得是符合MVP最小可行性原則的。
![[Agent輕松通-P3:Agent分析.png]]

實際應用一般是多智能體協作 (Multi-Agent Collaboration),從ReAct模板引導來說,創建多個職責單一、能力專精的Agent,然后讓它們組成一個團隊來協同工作顯然更好。

像微服務架構,又是要設計通信協作、故障處理、統一管理等一攬子咯。

微服務,我都計劃從Java到LLM應用開發了,老熟人了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86378.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86378.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86378.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何將FPGA設計驗證效率提升1000倍以上(1)

我們將以三個設計樣例,助力您提升設計開發效率。 對于FPGA應用開發來說,代碼是寫出來的,更是調試出來的。軟件仿真擁有最佳的信號可見性和調試靈活性,被大多數工程師熟練使用,能夠高效捕獲很多顯而易見的常見錯誤。 …

RabbitMQ 利用死信隊列來實現延遲消息

RabbitMQ 利用死信隊列來實現延遲消息 基于 TTL(Time-To-Live) 死信隊列(DLX)的方式來實現延遲消息 首先消息會被推送到普通隊列中,該消息設置了TTL,當TTL到期未被消費掉,則會自動進入死信隊列…

Keepalived+Haproxy+Redis三主三從

一、集群部署 1、案例拓撲 2、資源列表 主從節點是隨機分配的,下屬列表只是框架: 操作系統主機名配置IP應用OpenEuler24master12C4G192.168.10.101RedisOpenEuler24master22C4G192.168.10.102RedisOpenEuler24master32C4G192.168.10.103RedisOpenEule…

Modbus轉IEC104網關:電力自動化系統的橋梁

現代電力系統中,變電站、發電廠以及配電網絡中存在大量采用不同通信協議的設備。Modbus協議因其簡單易用在現場設備中廣泛部署,而電力行業主流監控系統則普遍采用IEC 60870-5-104(簡稱IEC104)協議。協議差異導致的數據孤島現象&am…

@annotation:Spring AOP 的“精準定位器“

想象你是一位快遞員,負責給一個大型社區送快遞。社區里有幾百戶人家,但只有特定家庭需要特殊服務: 普通快遞:直接放快遞柜生鮮快遞:需要冷藏處理貴重物品:需要本人簽收藥品快遞:需要優先配送 …

Web Worker使用指南 解鎖瀏覽器多線程 ,提升前端性能的利器

文章目錄 前言一、什么是 Web Worker二、適用場景1、CPU 密集型計算2、圖像/視頻處理3、實時數據流處理(高頻場景)4、后臺文件操作5、復雜狀態機/AI邏輯(游戲開發)6、長輪詢與心跳檢測7、WebAssembly 加速8、WebGL 與 Canvas 渲染…

React 18.2.0 源碼打包

一、React源碼地址 GitHub:React 二、參考文章 sourcemap實戰-生成react源碼sourcemap Rollup中文文檔 JavaScript Source Map 詳解 全網最優雅的 React 源碼調試方式 三、打包操作 安裝依賴 // 全局安裝yarn npm i -g yarn // 源碼項目目錄下執行yarn安裝依賴…

UniApp 開發第一個項目

UniApp 開發第一個項目全流程指南,涵蓋環境搭建、項目創建、核心開發到調試發布,結合最新實踐整理而成,適合零基礎快速上手: ?? 一、環境準備(5分鐘) 安裝開發工具 HBuilderX(官方推薦IDE):下載 App 開發版,安裝路徑避免中文或空格 微信開發者工具(調試小程序必備…

Web項目開發中Tomcat10+所需的jar包

版權聲明 本文原創作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 項目背景 Web項目中使用低版本Tomcat時常用的jar包如下: javax.servlet-apijavax.ejb-apijavax.jms-apijavax.json-api 當Web項目使用Tomcat10的版本時&#…

網絡安全就業方向與現實發展分析:機遇、挑戰與未來趨勢

網絡安全行業的戰略地位與就業背景 在數字經濟蓬勃發展的今天,網絡安全已從技術分支演變為關乎國家安全、企業存亡和個人隱私的核心領域。根據國家網信辦數據顯示,2025年我國網絡安全人才缺口達200萬人,較2023年增長33%。這一現象源于三重驅…

iOS runtime隨筆-消息轉發機制

運行時的消息轉發分三步, 當你調用了沒有實現的方法時, 有機會通過runtime的消息轉發機制補救一下 resolveInstanceMethod/resolveClassMethod 這里可以動態去創建方法來解決CrashforwardingTargetForSelector ?????第一步未解決, 就會走到這里, 可以給出一個Target去轉發…

vue3用js+css實現輪播圖(可調整堆疊程度)

先看效果 html <divclass"outer"style"width: 650px;background: #fff;box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.1);border-radius: 15px;margin: 0 10px 15px 5px;">//這里用的是svg-icon,需要的可自行替換為其他圖片<svg-iconid"btn_l&q…

Three.js項目實戰:從零搭建小米SU7三維汽車

大家如果有過購車的經驗&#xff0c;肯定會先從網站上收集車輛的信息&#xff0c;比如懂車帝&#xff0c;汽車之家&#xff0c;這些網站上逼真的看車效果是如何實現的呢&#xff0c;這節課帶你從0-1快速的手搓一個看車小項目。 懂車帝官網 效果 視頻教程和筆記 大家可以下方小…

Android13 永久關閉SELinux 權限

永久關閉 SeLinux 在cmdline中增加參數androidboot.selinuxpermissive&#xff1b; 芯片: QCM6115 版本: Android 13 kernel: msm-4.19 ~/temp_code/SLM927D_LA.UM.9.15$ git diff device/qcom/bengal/BoardConfig.mk diff --git a/device/qcom/bengal/BoardConfig.mk b…

Linux創建DHCP服務

Linux可作為DHCP服務端使用&#xff0c;為同一個網絡下的其它機器動態分配ip。在一些情況下&#xff0c;可以起到很大的作用。 二級標題 安裝dnsmasq # ubuntu sudo apt update -y sudo apt install -y dnsmasq# centos sudo yum install -y dnsmasq修改配置文件 sudo vim …

汽車4G-TBOX智能終端 汽車國標GB/T 32960協議

汽車國標GB/T 32960協議4G TBOX是一種廣泛應用于車聯網的設備&#xff0c;下面將從不同方面為你詳細介紹。 移動管家汽車4G-TBOX智能終端定義與用途 4G TBOX是基于車聯網技術智能服務系統中的采集終端。以車云網的4G TBOX_CC750為例&#xff0c;它為整個智能服務系統提供GPS/…

JavaEE-Mybatis初階

什么是MyBatis MyBatis是?款優秀的 持久層 框架&#xff0c;?于簡化JDBC的開發。 MyBatis本是 Apache的?個開源項?iBatis&#xff0c;2010年這個項?由apache遷移到了google code&#xff0c;并 且改名為MyBatis 。2013年11?遷移到Github 創建項目時添加依賴 上面有…

記一次jvm機器問題定位經歷

背景 開發過程中發現機器指標異常&#xff0c;端口也hang住無響應&#xff0c;端口返回為timeout&#xff0c;對應探活檢測也失敗了。 現象 在st測試環節&#xff0c;突然每隔一段時間新接口就hang住無響應&#xff0c;觀察機器監控也發現端口探活失敗&#xff0c;看機器指標…

【機器學習深度學習】張量基本操作

目錄 一、張量基本操作 1.1 執行代碼 1.2 運行結果 1.3 代碼解析 ? 1. 創建張量&#xff08;tensor、randn、zeros&#xff09; ? 2. 索引與切片&#xff08;類似 NumPy&#xff09; ? 3. 形狀變換&#xff08;reshape、轉置、壓縮&#xff09; ? 4. 數學運算&#x…

【微信小程序】8、獲取用戶當前的地理位置

1、獲取當前的地理位置 獲取當前的地理位置、速度。當用戶離開小程序后&#xff0c;此接口無法調用。開啟高精度定位&#xff0c;接口耗時會增加&#xff0c;可指定 highAccuracyExpireTime 作為超時時間。 注意&#xff1a; 地圖相關使用的坐標格式應為 gcj02。高頻率調用會…