前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >AI超级智能体教程(五)---自定义advisor扩展+结构化json输出

AI超级智能体教程(五)---自定义advisor扩展+结构化json输出

作者头像
阑梦清川
发布于 2025-05-04 02:23:55
发布于 2025-05-04 02:23:55
1290
举报
文章被收录于专栏:学习成长指南学习成长指南

1.自定义拦截器

1.2自定义Advisor

spring里面的这个默认的是SimpleloggerAdvisor,但是这个默认的但因的日志级别是debug级别的,正常情况下,我们是看不到的,我们可以在源码里面去看一下:

为了方便我们快速地定位这个源码里面去:我们可以使用这个new的方法,然后右键选择goto这样的方法进行跳转

image-20250502142854478
image-20250502142854478

可以看到这个拦截器默认的日志级别就是debug级别的,也就是我们默认情况下是无法输出的:

image-20250502143245056
image-20250502143245056

如果你想要改变这个默认输出级别,这个也是有方法的,在这个配置文件里面进行指定就可以了:

image-20250502143330867
image-20250502143330867

如果你想要看到这个.java文件,因为我们自己去实现的时候需要在这个原来的官方实现的基础上面去进行修改,因此这个时候我们需要找到原来的这个java文件,我自己点击去之后发现是class文件,显然不是我们想要的:

image-20250502144812618
image-20250502144812618

这个时候的做法就是选择上面的蓝色框里面的download resource这个选项,就可以把这个对应的java文件进行下载了;

下载之后的这个文件就是我们的官方是如何实现这个simpleadvisor的相关的方法的,这个时候我们直接把这个里面的所有的代码复制到我们的包包下面,然后再官方的基础上面进行整合和修改即可:

首先我们需要不同的方法之间的调用关系,before就是我们上面说的这个拦截器,对于这个用户的输入进行处理after就是对于响应的处理,因此这个方法需要保留,原来的这个log事debug模式的,现在我们自定义他成为info格式的,方便我们的后续的输出查看效果;

image-20250502150409421
image-20250502150409421

其次就是这个里面的两个方法了:流式调用和非流式调用的两个方法:非流式调用就是下面的这个aroundcall这个方法,流式调用就是下面的这个stream方法,stream在英文里面的解释就是小溪,小河的意思,这个也是很容易理解的;

每一个方法里面的都有这个next方法,也就是继续往这个下面去走,flux就是对于相应进行聚合处理,方便我们对于整个响应进行观察和处理;

image-20250502150617022
image-20250502150617022

这个时候,大家就可以看到这个打印的日志和我们自定义的advisor输出的这个内容了,都是使用的这个requst和response这个样子的格式书写的;

image-20250502145952295
image-20250502145952295

1.2打断点调试过程

为什么要额外的去做一下这个部分,因为对于初学者而言,通过调试能够让我们更好的理解这个调用的过程,以及我们的输入是如何被大模型进行处理的,以及这个输出是如何被得到的;

这个时候我们可以发现:系统得到了我们的用户输入的内容usertext,而这个systemytext就是我们的系统默认的预设,这个也是我们的代码里面就有设计的;

image-20250502151345845
image-20250502151345845

在这个调试的信息里面,我们可以看到我们的个人的调用大模型的设置:

image-20250502151547190
image-20250502151547190

以及我们可以看到这个messageChatMemory对应的这个优先级的信息,这个order是一个负数,这个数字越小,证明这个对应的优先级就是越高的;

image-20250502151720844
image-20250502151720844

在接下来继续执行的过程中:我们也是可以看到这个输出的内容的,也就是我们的response相关的内容,在这个调试的过程里面我们也是可以看到的;

image-20250502152059201
image-20250502152059201

1.3Re-reading Advisor自定义实现

英语学的不错的小伙伴这个时候大概也是可以猜到的,就是这个re-reading表示的就是重读,也就是把我们给的这个提示词重新复述一下,这个时候AI的回答就有可能产生不一样的这个效果;

下面的这个使用的其实是模版字符串,也就是下面的这个re2_input_query实际上是把我们的用户的输入整成一个模版,放到我们的文本信息里面去;

下面的这个代码来自于官方文档,主要是了解这个特性,实际上我们不会经常使用,因为这个重述的操作是消耗了2倍的这个token的,因此我们只会在特定的场景下面进行使用;

image-20250503174731704
image-20250503174731704

这个是重读,所以这个代码里面的aroundcall和aroundstream没有进行其他的处理,直接返回即可;

2.恋爱报告开发–json结构化输出

2.1原理介绍

这个事我们的恋爱报告开发里面的很重要的一个步骤,就是理解什么是结构化输出??

通过下面的这个图片,希望可以帮助大家去更好的理解什么是结构化输出:实际上就是交给大模型处理之前进行相关的设置,例如,告诉这个大模型我们需要以json格式进行格式化输出,输出的结果啥的最后经过机构化转换器的处理,把原始的文本处理成为结构化的输出内容,这个过程里面结构化转换器发挥了一个非常重要的作用;

image-20250503185443384
image-20250503185443384

2.1代码实现

接下来,我们需要去实现一下这个结构化输出的特性:

首先,我们在原来的这个基础上面去cv代码,大部分框架都是不变的,我们把这个名字修改一下,可以看到这个prompy每次用户的输入之后都会加上图示里面的“内容建议为列表”,这个实际上就是结构化输出的prompt,相当于针对用户输入,进行额外的处理,然后在发送到这个大模型那边去;

其中这个结构化输出的方法里面添加了这个entity,里面的参数是我们的record,实际上这个就是我们的title和suggestions,这个实际上是我们的结构化输出里面的标题和json内容,在下面的调试过程里面你就会看到;

image-20250503190023415
image-20250503190023415

2.3编写测试用例

测试里面就是调用上面写的这个方法,看看这个结构化输出的结果,其他的都是保持不变的,我们的这个message直接使用上面的提示词也是没有问题的;

image-20250503190351478
image-20250503190351478

2.4结构化输出效果

如何看到这个结构化输出的结果,我们可以使用断点调试的方式对于这个过程进行监控和处理:然后就可以在断点里面看到这个过程里面的非常详细的这个数据了;可以看到这个就是使用json的格式进行输出的;

为什么要达到这个结构化输出的目的,这个实际上是为了下面的持久化保存进行铺垫的,因为结构化输出的这个数据方便我们进行这个保存之类的,诸如放到这个数据库里面,非常的方便,普通的原始文本不具备这样的特性,当然,这都是后话了;

image-20250503185650060
image-20250503185650060

数据方便我们进行这个保存之类的,诸如放到这个数据库里面,非常的方便,普通的原始文本不具备这样的特性,当然,这都是后话了;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
AI超级智能体教程(四)---多轮对话机制的原理和实现
MVP最小可行性产品的策略—先设计最小的产品原型可以满足基本的功能,查看一下是不是可以满足用户的需求,如果可以,我们在这个基础上面进行完善和开发;
阑梦清川
2025/05/03
2810
AI超级智能体教程(四)---多轮对话机制的原理和实现
AI超级智能体教程(七)---RAG实战本地知识库和云端知识库
基于我们的知识库进行问答:我们的prompt+拦截器从向量数据库里面找到的上下文,两个组合在一起,发给我们的AI大模型,这个是大致的流程;
阑梦清川
2025/05/05
2250
AI超级智能体教程(七)---RAG实战本地知识库和云端知识库
鱼皮的 AI 超级智能体项目,新鲜出炉!
这次的项目将以 AI 为核心,讲解一系列当下最流行的新技术知识,项目体量适中,我会争取带大家快速搞定,能够作为简历上的亮眼项目,应对社招和秋招提前批!
程序员鱼皮
2025/04/26
2920
鱼皮的 AI 超级智能体项目,新鲜出炉!
AI超级智能体教程(六)---自定义文件持久化+RAG中文档的加载和读取
原理的话,就是我们的持久化存储,也就是说,我们需要把消息保存到文件或者是数据库里面,之前我们都是基于内存的操作,但是内存这个东西一断电就没有了,显然是不可取的,因此我们需要一个更加高效的方案进行相关的设计;
阑梦清川
2025/05/05
1430
AI超级智能体教程(六)---自定义文件持久化+RAG中文档的加载和读取
用结构化数据自定义搜索结果摘要
你听说过可以自定义搜索结果页摘要吗?此讲告诉你用结构化数据标志可以轻松自定义搜索结果页面的摘要,了解如何自定义谷歌搜索结果中显示的简要文本。在搜索结果中,谷歌将确定网页中最相关的文本,并在链接下方向用户显示该文本。要在搜索结果页中显示自定义的摘要片段,必须要把结构化数据添加到网页中。
林雍岷
2019/07/03
1.4K0
CefSharp请求资源拦截及自定义处理
在CefSharp中,我们不仅可以使用Chromium浏览器内核,还可以通过Cef暴露出来的各种Handler来实现我们自己的资源请求处理。
w4ngzhen
2023/10/18
1.5K0
CefSharp请求资源拦截及自定义处理
【课堂笔记】VB 自定义过程sub,消息窗体的输入输出,断点调试方法
案例:防止误操作关闭窗体,通过该事件来进行控制。设置参数cancel的值为-1即可停止退出。
刘金玉编程
2020/09/10
1.4K0
Groovy里自定义JSON输出-JsonGenerator
Groovy 2.5.0增加了通过JsonGenerator实例自定义JSON输出。 将对象转换为JSON字符串值的最简单方法是通过JsonOutput.toJson。 此方法使用默认的JsonGenerator,其JSON输出具有合理的默认值。 但是我们可以使用自定义生成器并创建JSON输出。 要创建自定义生成器,我们使用可通过JsonGenerator.Options访问的构建器。 通过流式的API,我们可以例如忽略输出中带有null值的字段,更改日期的日期格式,并按名称或值的类型忽略字段。 我们可以通过将转换的实现添加为Closure或者实现JsonGenerator.Converter接口来为类型添加自定义转换器。 要获取JSON字符串,我们只需调用生成器的toJson方法。
白石
2019/08/23
2.4K0
@JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,更多的内容我会写成一个系列,5-10篇文章,请您继续关注我。
字母哥博客
2020/09/24
4.6K0
@JsonCreator自定义反序列化函数-JSON框架Jackson精解第5篇
深入分析 Spring 基于注解的 AOP 实现原理
整个 AOP 要想起作用,必须加上 @EnableAspectJAutoProxy 注解,这个注解的作用是什么呢?
wsuo
2020/07/31
9840
深入分析 Spring 基于注解的 AOP 实现原理
自定义注解(拦截器实现)
拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制
Java king
2023/02/21
6390
自定义配置拦截器
很多时候security默认提供的拦截器往往不够用于我们的日常开发,所以我们经常需要自己重写某些拦截器,达到实现开发的需求
用户11097514
2024/05/30
1880
AIOps入门之路:自定义日志或非结构文本的轻松ETL
在上一篇文章中,我们说过,随着企业数字化发展,AIOps作为企业数字化转型关键支撑力,AIOps不仅仅关注异常检测、根因分析的情况,还包括行为分析、客户参与和识别潜在机会。并且会需要和NLP进行结合。
点火三周
2022/03/07
2.7K0
AIOps入门之路:自定义日志或非结构文本的轻松ETL
OpenAI 结构化输出:开发者指南
学习如何使用 Open AI API 生成与您的 JSON 模式完全匹配的模型输出,从而获得一致、结构化的数据格式。
云云众生s
2024/09/30
8600
Go语言结构化日志:深入了解日志的力量与魔法
结构化日志包括定义良好的格式(通常是 JSON)生成日志记录,这为应用程序日志添加了一定程度的组织和一致性,使它们更容易处理。这种日志记录由键-值对组成,它们捕获关于正在记录的事件的相关上下文信息,例如严重级别、时间戳、源代码位置、用户 ID 或任何其他相关元数据。
公众号: 云原生生态圈
2023/08/23
1.1K0
Go语言结构化日志:深入了解日志的力量与魔法
Go 语言中的自定义结构体转换 JSON
在 Go 语言中,对结构体进行 JSON 编解码是非常常见的操作。不过有时候,我们可能会遇到一些特殊的需求,比如要将切片转换为逗号分隔的字符串。这时候,我们可以通过自定义结构体的 JSON 转换方法来实现。以下将详细讲解这个技术。
运维开发王义杰
2023/08/21
3460
Go 语言中的自定义结构体转换 JSON
[ SSH框架 ] Struts2框架学习之四(自定义拦截器)
一、Struts2的拦截器 1.1 拦截器概述    拦截器,在AOP( Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。   在 Webwork的中文文档的解释为—拦截器是动态拦截 Action调用的对象。它提供了一种机制可以使开发者可以定义在一个 action执行的前后执行的代码,也可以在一个 action执行前阻止其执行。同时也是提供了一种可以提取 action中可重用的部分的方式。   谈到拦
Kevin_Zhang
2018/05/22
1.3K0
【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解
书接上文,我们掌握了Feign的基本使用、核心原理,以及Spring Cloud Alibaba如何快速整合Feign,真的太简单了!你是不是觉得这样就够了?但在实际项目使用OpenFeign时,我们常常会遇到各种需求,需要用到它提供的扩展,例如日志分析、自定义统一拦截器、客户端组件配置、GZIP压缩等等,这也正是我接下来在本文中分享的内容:首先我会从原生Feign扩展点配置入手,然后进行OpenFeign扩展点配置实战,最后对OpenFeign是如何实现的进行了源码解读,内容很详细,Let’s go!
天罡gg
2023/03/01
2.1K0
【Spring Cloud Alibaba】(三)OpenFeign扩展点实战 + 源码详解
OpenAI的结构化浅析
  OpenAI于2024年8月6日在其新模型gpt-4o-2024-08-06上推出了结构化输出功能(Structured Outputs)。截至本文撰写日期(2024年8月25日),gpt-4o仍指向上一版本gpt-4o-2024-05-13,尚不支持结构化输出。有趣的是,gpt-4o-mini反而已经支持了这一功能,这点值得大家注意。那么,结构化输出究竟是什么?为什么OpenAI要专门发布一篇博客来详细介绍它呢?接下来,让我们一起深入了解这个话题。
xindoo
2024/10/29
2350
OpenAI的结构化浅析
写一个无配置格式统一的日志
大量项目在使用logback记日志,有部分项目使用日志混乱,格式不统一,多数人搞不懂配置文件,导致配置错误,现在需要开发一套统一的、少配置的日志组件,使用方便
宜信技术学院
2019/06/28
2.1K0
推荐阅读
相关推荐
AI超级智能体教程(四)---多轮对话机制的原理和实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档