当前位置: 首页 > news >正文

ai-agent框架spring ai/alibaba原理源码分析(八)观测II spring ai观测 ChatClient

简介

saa是java的ai agent框架,本系列将深入剖析 Spring AI Alibaba 的源码实现与核心原理,不仅可以指导agent的开发,更可以改造框架,增加新特性

系列内容:

系列(一)架构完成

系列(三)调用

I工具完成

II MCP

1 MCP MCP能力,工具,资源,Prompts,sampling,。。。;springboot自动配置完成

2分布式 MCP

3 MCP security

III skills完成

系列(四) RAG完成

I知识库,文档读取,分块;嵌入,向量store

II检索,增强生成,模块化;混合检索,融合重排

系列(二) I模型 model模型 chat模型,chat client,advisor组件

系列(五) graph

I图结构,节点和边;StateGraph;外部介入完成

推理框架 graph映射: ReAct,relection,CoT,Plan-And-Execute

II图编译 CompiledGraph,扁平化图结构,邻接表结构完成

III图执行,检查点,回溯/回放,中断和恢复,容错

系列(六) agent及组件 ReactAgent,AgentLlmNode,AgentToolNode,钩子和拦截器,记忆,结构化输出完成

系列(七) MAS

I MAS模式 flow模式编排器-子智能体,智能体团队;简单了解 agentic模式消息总线,共享状态;数据交接

II分布式MAS,远程通讯,负载均衡,注册发现,容错

系列(八)观测

I观测组件(micrometer-observation), langfuse

II spring ai观测,观测组件,ChatClient,ChatModel

III spring ai alibaba观测图观测

系列(九)评估 langfuse

本文分析spring ai观测,以chatclient观测为例,langfuse观测平台

based spring ai v1.1.1.2

关键词

低基数(Low-Cardinality标签值组合有限且数量可控的指标数据,如,HTTP方法(GET/POST/DELETE)状态码(200/404)等。

高基数(High-Cardinality标签值可能无限多的数据,比如请求ID (requestId)用户ID (userId)

缩写

spring ai缩写sa

spring ai alibaba本文缩写saa

参考资料

概览 | Spring AI Alibaba spring ai alibaba官网文档

https://docs.spring.io/spring-ai/reference/index.html spring ai官方文档

SAA概览

上图是saa原理源码分析场景视图,每个包对应着saa/sa组件或特性,是本文分析的目录

model大模型的封装,模型包括Chat,嵌入,audio,image等类型,其中chat模型包括,advisor组件,提示词,记忆等

agent/graphagent和图紧密相关,可以认为agent是一种既定的”图”形,开发人员可以使用graph底层api直接构建graph,使用agent获得既定的图形,简化agent的开发

外部调用(calling)工具,MCP,skills

RAG检索增强生成

MASMAS模式 flow模式 编排器-子智能体,智能体团队;数据交接

studio简易的agent管理工具,嵌入到agent,带有agent面板,列表agent;提供chat界面,用于调试agent,是开发agent的便利工具

admin管理台, agent的发布,列表,管理,执行;提示词工程,评估和数据集,观测

观测

微服务监控常用Prometheus + Zipkin/SkyWalking微服务与AI Agent的可观测性,相同的核心3要素, 日志,指标和链路跟踪,但ai agent的监控有其特性,langfuse 在监控维度、数据结构和工程闭环上对agent有着深度的定制与扩展

微服务监控优化的是性能与可用性系统跑得更快、更稳。

langfuse优化效率与智能,不仅要看Agent“慢不慢”,更关心它“好不好”(质量)和“贵不贵”(成本),最终目的是让这个AI系统变得越来越“聪明”, 关注agent的思考过程决策逻辑和token消耗

观测点-ChatClient

上文分析的观测组件,opentelemetry组件,组合一起的技术架构,打通观测链,本文结合源码分析使用观测组件实现chatclient观测

上图是chatclient的观测类图,基于上面micrometer-observation组件和观测技术架构设计

启动和自动配置

  • ChatClientAutoConfiguration: spirng ai的自动配置,这个类在系列-模型分析过,负责构建ChatClient,本文分析构建ChatClient的观测组件部分,创建TracingAwareLoggingObservationHandler,依赖ObservationAutoConfiguration构建的Tracer,

该类有2个实例,分别包装ChatClientCompletionObservationHandler和 ChatClientPromptContentObservationHandler,用于记录大模型返回文本和提示词日志,大模型返回文本和提示词日志内容很多,需手动设置激活:

spring.ai.chat.client.observations.log-prompt和spring.ai.chat.client.observations.log-completion

TracingAwareLoggingObservationHandler作用是在onStop时,传递tracing信息给包装的处理器使用,用于构成日志内容

观测上下文和处理

  • ChatClientObservationContext:继承Observation.Context,持有,

ChatClientRequest,ChatClientResponse ,Advisors 3个业务对象,这些都是观测处理器用来计算/获取指标

TracingAwareLoggingObservationHandler上面介绍过,还有2个默认的handler,DefaultTracingObservationHandler和TracingAwareMeterObservationHandler,技术架构介绍过,分别构建span和计算span时长

观测点key和约定

观测点可以与观测值对应

  • ChatClientObservationDocumentation:chatclient的ObservationDocumentation实现,定义了观测点的名称(Name)以及低基数(LowCardinality)和高基数(HighCardinality)的键名(Key Names),确保了监控指标命名的标准化
  • DefaultChatClientObservationConvention: ObservationConvention 实现,ObservationDocumentation定义观测key,ObservationConvention负责找到key的值,形成KeyValues。

源码分析

观测点key和约定

上图是ChatClientObservationDocumentation,实现为enum,是一种单例实现方式,上图红框展示低基/高基的key

上面两个典型的观测keyValues,上方chatclient advisors列表名称,通过上下文的advisors属性获取,下方是spring ai类型,值是枚举获取,keyValues的两种来源。

>观测handler

下面以ChatClientCompletionObservationHandler为例子,分析handler的处理原理

上图ChatClientCompletionObservationHandler在onStop生成completion日志,

接收ChatClientObservationContext参数,使用其属性ChatResponse计算大模型返回文本,ChatResponse怎么来?

DefaultCallResponseSpec doGetObservableChatClientResponse调用大模型的方法

Observation的observe调用大模型的代码,往ChatClientObservationContext set执行结果response

ChatClientCompletionObservationHandler是直接继承ObservationHandler,可归类为日志型handler

meter handler继承TracingObservationHandler,拥有有MeterRegistry属性,构建Counter,Gauge等指标,注册到MeterRegistry

tracing handler继承TracingObservationHandler,拥有Tracer属性,通常onStart创建span,onStop结束span。

spring ai的ChatModelMeterObservationHandler继承ObservationHandler,其实是meter handler,带MeterRegistry属性,负责生成Token Usage指标。

handler结构

本节分析一下观测handler结构,了解handler结构对自定制观测很重要。

agent模块,chatclient,chatmodel,advisor,tool等共用ObservationAutoConfiguration的ObservationRegistryPostProcessor和ObservationRegistry,观测handlers注册到ObservationRegistry的ObservationConfig,也就是agent全局一套观测handlers。ObservationRegistryPostProcessor用PostProcessor为ObservationRegistry注入handler,其内部的ObservationHandlerGrouping将meter和tracing类型的观测handlers分组,其他直接继承ObservationHandler不参与分组,各自独立。meter组和tracing组各使用FirstMatchingCompositeObservationHandler(实现CompositeObservationHandler接口)*包装起来作为一个handler使用,内部getFirstApplicableHandler方法选择使用那个handler,选择的依据是第一个匹配Observation.Context,结构如下图:

如上图所示,meter handler1和meter handler4可以匹配ContextA,Observation事件通知,将选出meter handler1处理

上图只有一个ObservationHandlerGrouping的情况,ObservationHandlerGrouping有多个,情况更复杂,自定义观测需要耐心规划。

*还有一个CompositeObservationHandler实现,AllMatchingCompositeObservationHandler,选择所有匹配的Observation.Context的handlers

观测示例:spring ai@ langfuse

本节演示spring ai 的langfuse观测,用debug”观测”观测组件,示例使用saa的observability-langfuse-example

下图展示handler的结构,tracing分组,meter分组,其他3个继承ObservationHandler是日志相关,tracing分组两个Propagating*,用于远程服务间调用观测的衔接

chatclient调用

上图chatclient的观测的tracing图

节点简要描述

  • Web 入口层 (http get /observability/chat):

用户发起的原始 HTTP GET 请求,Spring MVCFlux过滤器链产生的异步的观测点

  • Spring AI chatclient (spring_ai chat_client):

上图是chatclient观测

  • LLM 交互层 (call -> chat qwen-plus):

call 节点代表通用的模型调用动作, chat qwen-plus 显示具体的模型是通义千问 Plus

Token 指标: Token 消耗数据 14 -> 792 (Σ 806),这意味着本次对话输入了 14 个 Token,模型输出了 792 个 Token,总计消耗 806 个 Token,这对于成本核算和性能分析至关重要

  • 网络传输层 (http post -> POST):

chatclient调用-带工具

上图是chatclient带工具调用的观测tracing图,使用魔搭的bing 搜索mcp工具

上图是搜索工具观测,观测选项设置include-content: true,搜索的内容返回

!示例改为同步,看起来层次比较明显,原代码是用stream方式层次不明显

总结:langfuse 结合 Spring AI 的观测机制,解决 AI Agent 开发中的主要痛点:隐秘、不可控的模型思考过程、工具执行细节、Token开销,转化为了可视化、结构化、可调试的业务指标。对于AI Agent 工程化落地的开发者来说,这是必不可少的“眼睛”。

NEXT

spring ai alibaba graph 观测,langfuse实例

http://www.gsyq.cn/news/1647000.html

相关文章:

  • 机器学习项目的完整流程:从原始数据到模型预测
  • 小猿搜题 App 2021 版作弊检测机制解析:从图像识别到人工审核的 3 层防线
  • 单片机:串行接口之通信概念
  • 孜然导航系统单页配置教程
  • 6DoF运动追踪技术:从IMU到嵌入式实现
  • 如何用GEO系统解决网站流量下降?3种实战方案解析
  • 哈夫曼编码的原理和python实现(P124302064王酉辰,P124302070李佳乐)
  • 如何快速搭建企业级后台管理系统?Layui-Admin终极指南
  • Terraform 多环境管理完全指南:4种策略实现开发/测试/生产隔离部署
  • 数据分析收尾实战:基于助睿 BI 完成自媒体可视化探索与业务洞察分析
  • GB/T 7714-2015 参考文献格式:3个主流学术引擎(知网/万方/谷歌)自动导出对比与纠错
  • 可视化任务与分析(学习笔记)
  • Spring Boot Actuator 暴露 heapdump,内存里的密码可能全漏了
  • Spring Data Commons CVE-2018-1273漏洞剖析:SpEL表达式注入与RCE实战
  • 北京通州有哪些值得推荐的学画画的美术机构?
  • CloudFormation Stack 概念全解析:从资源集合到自动化编排的核心引擎
  • 万能密码漏洞:认证逻辑缺陷的深度剖析与防御实践
  • 2026年最新八字排盘应用推荐:天乙八字排盘、命枢、问真八字等怎么选?
  • 【JavaWeb】三大组件之——Servlet
  • EMA 指数移动平均 PyTorch 实现:3 种主流框架集成方案与性能开销实测
  • 类与对象:蓝图和房子的关系
  • 影刀RPA学习路线图:从小白到独立开发的完整学习路径
  • MediaCrawler-new:多平台社交媒体数据采集技术框架与自动化解决方案
  • 5分钟快速上手TEdit:泰拉瑞亚地图编辑器的终极指南
  • 《在飞机上偶遇前任后》穗雪|小说|txt下载|番外|免费阅读
  • AI生成图片文字模糊?AnyText技术原理与实战指南
  • 2026视频转文字工具选择指南:拆解免费付费坑点,看懂隐私、水印、收费套路避踩雷
  • 第48期 OpenAI的钱都花哪了?Capex支出全景调研
  • 《从 300 行到 30 万行代码,我学到的 5 个重构教训》
  • 城市违章搭建识别、棚户区语义分割与YOLO格式数据集:基于深度学习的城市治理AI实践全解析10693期