深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点
今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。
好了,接下来我们就开始深入了解这个话题。
模型对接
我们首先需要找到关键的 model 类,所有的具体逻辑实际上都集中在这里。从这部分代码入手,我们可以对比一下两者之间的差异。通过观察,我们会发现,实际上这段代码的结构和写法几乎是固定的,遵循了一定的模式。所有的对接解析逻辑都封装在那些被折叠的部分中。如图所示:

OpenAI方法中的第二个参数实际上也是自适应的,主要用于其内部实现,具体细节将在后续内容中进一步讲解。需要强调的是,这个参数并非强制性的,是否使用取决于具体接口的需求和实现方式。至于流式处理,它与其他常见方法基本相似,具体实现细节可以参照以下示意图:

这段代码的主要目的是通过 OpenAI API 进行聊天请求,处理响应并构建最终的 ChatResponse 对象。它还包含了对工具调用的处理逻辑,允许递归调用以处理复杂的对话场景。
参数解析
可以看到方法内部还是有很多参数的,我们简单看下。
- prompt:这个并不是我们常说的一段人设文本,而是外层Chatclient带回来的参数封装成了prompt对象而已。
- PROVIDER_NAME:模型公司的名字,一个字符串,如:openai、ollama、moonshot等
- CHAT_MODEL_OPERATION:一个枚举类主要用来实现接口的默认方法。通过记录一些信息帮助开发者分析和监控聊天模型的行为。
- observationConvention:客户自定义的观测数据,这里默认为DEFAULT_OBSERVATION_CONVENTION。
- observationContext:用于存储和管理聊天模型交换的元数据
- observationRegistry:和观察相关,但默认是不观察。
剩下的基本都是很简单的理解了。和工具调用有关,暂时不分析。
详细说下DEFAULT_OBSERVATION_CONVENTION类,它主要用于为聊天模型操作生成观测数据(如名称、低基数和高基数键值对)。具体功能如下:
- 获取观测名称:返回默认的观测名称。
- 生成上下文名称:根据请求模型生成上下文名称。
- 生成低基数键值对:包括AI操作类型、提供者、请求模型和响应模型。
- 生成高基数键值对:包括请求和响应的各种参数,如频率惩罚、最大令牌数等。
总结
通过对OpenAI与《月之暗面》中Moonshot案例的对比,我们可以清晰地看到,尽管每个业务对接的实现有所不同,但其整体框架和逻辑结构却高度相似。无论是在模型选择、参数解析,还是流式处理的实现上,都遵循了相同的基本模式。这些对接过程中的每一个小细节,虽然看似琐碎,但它们在整个系统中发挥着至关重要的作用。
我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。
想把我在技术路上走过的弯路和经验全都分享出来,给你们的学习和成长带来点启发,帮一把。
欢迎关注努力的小雨,咱一块儿进步!
深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点的更多相关文章
- Spring Boot 系列教程11-html页面解析-jsoup
需求 需要对一个页面进行数据抓取,并导出doc文档 html解析器 jsoup 可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操 ...
- Spring Boot系列(三):Spring Boot整合Mybatis源码解析
一.Mybatis回顾 1.MyBatis介绍 Mybatis是一个半ORM框架,它使用简单的 XML 或注解用于配置和原始映射,将接口和Java的POJOs(普通的Java 对象)映射成数据库中的记 ...
- Spring Boot系列(四):Spring Boot源码解析
一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...
- Spring Cloud系列(三):Eureka源码解析之服务端
一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-starter-netflix-eureka-ser ...
- Spring Cloud系列(四):Eureka源码解析之客户端
一.自动装配 1.根据自动装配原理(详见:Spring Boot系列(二):Spring Boot自动装配原理解析),找到spring-cloud-netflix-eureka-client.jar的 ...
- Spring Boot 系列教程8-EasyUI-edatagrid扩展
edatagrid扩展组件 edatagrid组件是datagrid的扩展组件,增加了统一处理CRUD的功能,可以用在数据比较简单的页面. 使用的时候需要额外引入jquery.edatagrid.js ...
- Spring Boot 系列教程7-EasyUI-datagrid
jQueryEasyUI jQuery EasyUI是一组基于jQuery的UI插件集合体,而jQuery EasyUI的目标就是帮助web开发者更轻松的打造出功能丰富并且美观的UI界面.开发者不需要 ...
- Spring mvc系列一之 Spring mvc简单配置
Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...
- Spring基础系列-AOP源码分析
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html 一.概述 Spring的两大特性:IOC和AOP. AOP是面向切 ...
- spring boot系列(五)spring boot 配置spring data jpa (查询方法)
接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnb ...
随机推荐
- 如何解决PL/SQL Developer过期的情况
方法一:删除注册信息(文后有彩蛋) 原文出自度娘:https://jingyan.baidu.com/article/ce43664911c5303773afd38b.html 在此我仅作为记录,以便 ...
- 腾讯云禁止root用户登录
背景 买了腾讯云的云主机服务,装的 OpenCloudOS 系统,结果没几天就提示异常登录和恶意文件.结果还改了我的密码,导致我xshell登陆不了,通过腾讯云后台登进去发现有挖矿病毒,但还没完全跑起 ...
- Redis示例配置文件
# 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1m => # 1kb => 1024 by ...
- end.jenkins的备份和迁移
数据备份: 进入安装目录 cd /var/lib/jenkins 进入到主目录下,可以看到很多文件,是否需要全部打包呢?其实我们只需要打包4个文件就可以了. 如上图所示分别是 config.xml ...
- 小米R3G刷了padavan后时间不同步和定时关闭外网(wan)端口
怎么刷openwrt或者padavan请见我2022年3月份的帖子 https://www.cnblogs.com/jar/p/15954037.html 最近遇到个新环境,遂拿出来用用 有1个问题和 ...
- 内衣 ERP 系统 (Delphi)
服装行业ERP系统,当时从开始实施推行,最后二次开发,源代码交接... 发几个截图看看 可配置的查询 这个功能几乎被我全改过... 后台报表配置 欢迎微信搜一搜 IT软件部落 关注公众号,你可以了解更 ...
- 【一步步开发AI运动小程序】七、进行运动计时、计数
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- ABP实践(5)-abp前端vue框架之IView实现三级菜单(博友需要特此分享)
为响应博友想要知道三级菜单怎么实现本篇文章先介绍三级菜单的实现,后续再分享其他部分内容 1 修改菜单组件sidebarMenu.vue 图为原代码和修改后代码比对 修改前后的源码如下 <styl ...
- gitlab之配置文件.gitlab-ci.yml
自动化部署給我们带来的好处 自动化部署的好处体现在几个方面 1.提高前端的开发效率和开发测试之间的协调效率 Before 如果按照传统的流程,在项目上线前的测试阶段,前端同学修复bug之后,要手动把代 ...
- Codeforces Round #826 (Div
Codeforces Round #826 (Div. 3) Minimize the Thickness 给定数组a,要求将数组a分成若干个子序列,并且使得每个子序列中的元素和都相等,设这些子序列中 ...