欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • 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。高频率调用会…