文章目录
- 1.自定义拦截器
- 1.2自定义Advisor
- 1.2打断点调试过程
- 1.3Re-reading Advisor自定义实现
- 2.恋爱报告开发--json结构化输出
- 2.1原理介绍
- 2.1代码实现
- 2.3编写测试用例
- 2.4结构化输出效果
1.自定义拦截器
1.2自定义Advisor
spring里面的这个默认的是SimpleloggerAdvisor,但是这个默认的但因的日志级别是debug级别的,正常情况下,我们是看不到的,我们可以在源码里面去看一下:
为了方便我们快速地定位这个源码里面去:我们可以使用这个new的方法,然后右键选择goto这样的方法进行跳转
可以看到这个拦截器默认的日志级别就是debug级别的,也就是我们默认情况下是无法输出的:
如果你想要改变这个默认输出级别,这个也是有方法的,在这个配置文件里面进行指定就可以了:
如果你想要看到这个.java文件,因为我们自己去实现的时候需要在这个原来的官方实现的基础上面去进行修改,因此这个时候我们需要找到原来的这个java文件,我自己点击去之后发现是class文件,显然不是我们想要的:
这个时候的做法就是选择上面的蓝色框里面的download resource这个选项,就可以把这个对应的java文件进行下载了;
下载之后的这个文件就是我们的官方是如何实现这个simpleadvisor的相关的方法的,这个时候我们直接把这个里面的所有的代码复制到我们的包包下面,然后再官方的基础上面进行整合和修改即可:
首先我们需要不同的方法之间的调用关系,before就是我们上面说的这个拦截器,对于这个用户的输入进行处理after就是对于响应的处理,因此这个方法需要保留,原来的这个log事debug模式的,现在我们自定义他成为info格式的,方便我们的后续的输出查看效果;
其次就是这个里面的两个方法了:流式调用和非流式调用的两个方法:非流式调用就是下面的这个aroundcall这个方法,流式调用就是下面的这个stream方法,stream在英文里面的解释就是小溪,小河的意思,这个也是很容易理解的;
每一个方法里面的都有这个next方法,也就是继续往这个下面去走,flux就是对于相应进行聚合处理,方便我们对于整个响应进行观察和处理;
这个时候,大家就可以看到这个打印的日志和我们自定义的advisor输出的这个内容了,都是使用的这个requst和response这个样子的格式书写的;
1.2打断点调试过程
为什么要额外的去做一下这个部分,因为对于初学者而言,通过调试能够让我们更好的理解这个调用的过程,以及我们的输入是如何被大模型进行处理的,以及这个输出是如何被得到的;
这个时候我们可以发现:系统得到了我们的用户输入的内容usertext,而这个systemytext就是我们的系统默认的预设,这个也是我们的代码里面就有设计的;
在这个调试的信息里面,我们可以看到我们的个人的调用大模型的设置:
以及我们可以看到这个messageChatMemory对应的这个优先级的信息,这个order是一个负数,这个数字越小,证明这个对应的优先级就是越高的;
在接下来继续执行的过程中:我们也是可以看到这个输出的内容的,也就是我们的response相关的内容,在这个调试的过程里面我们也是可以看到的;
1.3Re-reading Advisor自定义实现
英语学的不错的小伙伴这个时候大概也是可以猜到的,就是这个re-reading表示的就是重读,也就是把我们给的这个提示词重新复述一下,这个时候AI的回答就有可能产生不一样的这个效果;
下面的这个使用的其实是模版字符串,也就是下面的这个re2_input_query实际上是把我们的用户的输入整成一个模版,放到我们的文本信息里面去;
下面的这个代码来自于官方文档,主要是了解这个特性,实际上我们不会经常使用,因为这个重述的操作是消耗了2倍的这个token的,因此我们只会在特定的场景下面进行使用;
这个是重读,所以这个代码里面的aroundcall和aroundstream没有进行其他的处理,直接返回即可;
2.恋爱报告开发–json结构化输出
2.1原理介绍
这个事我们的恋爱报告开发里面的很重要的一个步骤,就是理解什么是结构化输出??
通过下面的这个图片,希望可以帮助大家去更好的理解什么是结构化输出:实际上就是交给大模型处理之前进行相关的设置,例如,告诉这个大模型我们需要以json格式进行格式化输出,输出的结果啥的最后经过机构化转换器的处理,把原始的文本处理成为结构化的输出内容,这个过程里面结构化转换器发挥了一个非常重要的作用;
2.1代码实现
接下来,我们需要去实现一下这个结构化输出的特性:
首先,我们在原来的这个基础上面去cv代码,大部分框架都是不变的,我们把这个名字修改一下,可以看到这个prompy每次用户的输入之后都会加上图示里面的“内容建议为列表”,这个实际上就是结构化输出的prompt,相当于针对用户输入,进行额外的处理,然后在发送到这个大模型那边去;
其中这个结构化输出的方法里面添加了这个entity,里面的参数是我们的record,实际上这个就是我们的title和suggestions,这个实际上是我们的结构化输出里面的标题和json内容,在下面的调试过程里面你就会看到;
2.3编写测试用例
测试里面就是调用上面写的这个方法,看看这个结构化输出的结果,其他的都是保持不变的,我们的这个message直接使用上面的提示词也是没有问题的;
2.4结构化输出效果
如何看到这个结构化输出的结果,我们可以使用断点调试的方式对于这个过程进行监控和处理:然后就可以在断点里面看到这个过程里面的非常详细的这个数据了;可以看到这个就是使用json的格式进行输出的;
为什么要达到这个结构化输出的目的,这个实际上是为了下面的持久化保存进行铺垫的,因为结构化输出的这个数据方便我们进行这个保存之类的,诸如放到这个数据库里面,非常的方便,普通的原始文本不具备这样的特性,当然,这都是后话了;
数据方便我们进行这个保存之类的,诸如放到这个数据库里面,非常的方便,普通的原始文本不具备这样的特性,当然,这都是后话了;
[外链图片转存中…(img-cqkgzaVB-1746270376115)]