首页 > 其他分享 >深入解析 Spring AI 系列:解析OpenAI接口对接

深入解析 Spring AI 系列:解析OpenAI接口对接

时间:2025-01-14 10:33:20浏览次数:1  
标签:String AI Spring 接口 private 解析 final WebClient 请求

今天我们将主要探讨OpenAI是如何进行接口对接的,虽然我们不打算深入细节,但会对整体流程进行一个大概的了解。后续会逐步分析其中的具体细节,大家可以耐心等待,逐步展开。好的,现在让我们开始,下面是我简单绘制的一张图示,旨在帮助大家更好地理解接下来的分析流程。

image

OpenAiApi

我们第一步将直接查看 OpenAIApi 类,这是与接口最为密切相关的核心类。首先,我们会关注它的构造器部分,因为在构造器中,基本包含了与接口交互所需的最主要依赖和配置信息。通过这段代码,我们可以了解该类如何初始化并准备好与 OpenAI 接口进行通信。接下来,大家可以看到下面这段代码:

public OpenAiApi(String baseUrl, String apiKey, MultiValueMap<String, String> headers, String completionsPath,
    String embeddingsPath, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder,
    ResponseErrorHandler responseErrorHandler) {

this.completionsPath = completionsPath;
this.embeddingsPath = embeddingsPath; 
Consumer<HttpHeaders> finalHeaders = h -> {
    h.setBearerAuth(apiKey);
    h.setContentType(MediaType.APPLICATION_JSON);
    h.addAll(headers);
};
this.restClient = restClientBuilder.baseUrl(baseUrl)
    .defaultHeaders(finalHeaders)
    .defaultStatusHandler(responseErrorHandler)
    .build();

this.webClient = webClientBuilder
    .baseUrl(baseUrl)
    .defaultHeaders(finalHeaders)
.build(); 
}

这段构造函数代码相对简单,主要负责创建一个包含认证信息和内容类型的HTTP头配置,并通过这些配置初始化RestClient和WebClient,从而为后续的网络请求提供基础支持。

RestClient

RestClient主要用于处理非流式的请求和响应,代码如下:

public ResponseEntity<ChatCompletion> chatCompletionEntity(ChatCompletionRequest chatRequest,
        MultiValueMap<String, String> additionalHttpHeader) {

    return this.restClient.post()
        .uri(this.completionsPath)
        .headers(headers -> headers.addAll(additionalHttpHeader))
        .body(chatRequest)
        .retrieve()
        .toEntity(ChatCompletion.class);
}

WebClient

WebClient主要就是处理流式的请求和响应,代码看下:

    public Flux<ChatCompletionChunk> chatCompletionStream(ChatCompletionRequest chatRequest,
            MultiValueMap<String, String> additionalHttpHeader) {

        AtomicBoolean isInsideTool = new AtomicBoolean(false);

        return this.webClient.post()
            .uri(this.completionsPath)
            //此处省略部分代码

这部分代码参数很多,我们就看下核心逻辑即可。

类属性

这样,在理解了主要流程之后,你就能更清晰地理解每个参数在具体实现中的角色,以及它们如何影响整体功能的执行。接下来,我们来一起看一下这段关键代码:

public static final OpenAiApi.ChatModel DEFAULT_CHAT_MODEL = ChatModel.GPT_4_O;
public static final String DEFAULT_EMBEDDING_MODEL = EmbeddingModel.TEXT_EMBEDDING_ADA_002.getValue();
private static final Predicate<String> SSE_DONE_PREDICATE = "[DONE]"::equals;
private final String completionsPath;
private final String embeddingsPath;
private final RestClient restClient;
private final WebClient webClient;
private OpenAiStreamFunctionCallingHelper chunkMerger = new OpenAiStreamFunctionCallingHelper();

在去掉了向量的相关属性之后,剩下的部分就是chunkMerger,不过这个部分涉及的是处理流式响应的逻辑,暂时我们可以先不关注它。为了简化分析,当前我们主要关注的是最基本的、正常的阻塞式请求处理流程,因为这种模式更加直观易懂,便于我们理解和调试。

ChatCompletionRequest

接下来,我们将继续深入分析之前提到的阻塞请求 chatCompletionEntity。该请求的参数包括一个 ChatCompletionRequest 对象和一个包含额外头信息的 Map 结构。由于我们关注的重点是请求的核心内容,因此我们将主要分析 ChatCompletionRequest 的实现。

image

这部分内容相信大家一定很熟悉,它实际上就是接口请求的参数部分。具体来说,它是一个记录类,用于封装接口请求所需的各项信息。通过查看原有接口平台上展示的参数列表,我们可以很清楚地看到这个记录类是如何映射到实际接口请求中的各个字段的。如图所示:

image

ChatCompletion

他的返回参数是ResponseEntity,他会将返回信息包装成一个ChatCompletion实体,猜一下也是接口返回相关的参数封装。如图所示:

image

image

usage

在之前我们说过usage这个类,他其实就是计算token用的。如果不看统计类的信息,也没啥大用。

image

这里就不拿官方接口做对比了,结果是一样的。

总结

通过今天的分析,我们初步了解了OpenAI接口对接的整体流程。虽然我们没有深入细节,但通过对OpenAiApi类、RestClient、WebClient及相关请求参数的分析,大家应该对接口的工作原理有了一个大致的认识。后续,我们将继续细化具体实现,逐步揭示每个部分的功能与逻辑。希望大家耐心等待,跟随我们一起深入探索更多的技术细节。这一过程将帮助我们更好地理解如何与OpenAI的接口进行高效对接与交互。


我是努力的小雨,一个正经的 Java 东北服务端开发,整天琢磨着 AI 技术这块儿的奥秘。特爱跟人交流技术,喜欢把自己的心得和大家分享。还当上了腾讯云创作之星,阿里云专家博主,华为云云享专家,掘金优秀作者。各种征文、开源比赛的牌子也拿了。

标签:String,AI,Spring,接口,private,解析,final,WebClient,请求
From: https://www.cnblogs.com/guoxiaoyu/p/18665146

相关文章

  • 计算机毕业设计—311017 spring boot酒店预定系统(源码免费领)
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对酒店客房预定等问题,对酒店信息管理进行研究分析,然后开发设计出酒店预订系统以解决问题。......
  • 记一次springcloud gateway记录日志响应结果乱码问题
    前言最近团队的网关日志发现有不少响应结果记录,出现形如下的乱码�V*.I,IU�JK�)N�Q�M-.NL�^�m�?��(�钍/�,}�����]O7L|���ŲƧ�MϦnP�Q*K�)*�+���QJ-*�/r�O� ��{�@8���一开始感觉是不是中文乱码,但是后面发现有些日志不是中文,也是乱码,而有些记录的日志又能正常显示。于是搜索了一圈,在https://blog.csdn.net/......
  • 英伟达即将压缩AI模型的成本
    在CES上,英伟达展示了一些有趣的新产品,其中最亮眼的是黄仁勋的新皮夹克。我的意思是,看看那件夹克:这是技术发布会还是时尚秀?你不觉得惊艳吗?说实话,我有点惊讶为什么更多人没有提到这个。这是黄仁勋迄今为止最棒的皮夹克。当然,还有其他东西,比如全新的RTX50系列。令人惊讶的是,大多......
  • 基于 springboot 中小型医院网站 毕业论文+开题报告+项目源码及数据库文件
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!! ......
  • springboot宠物领养网站-计算机设计毕业源码83525
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3国内外研究现状1.3论文结构与章节安排2 宠物领养网站系统分析2.1可行性分析2.1.1技术可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分析3.......
  • springboot宠物用品商城系统-计算机设计毕业源码74346
    摘要基于微信小程序的宠物用品商城系统是一个集商品展示、在线购物、支付结算、用户管理等功能于一体的综合性电商平台。该系统充分利用微信小程序的便捷性和用户基础,为宠物爱好者提供了一个方便、快捷的购物体验。同时,该系统还具备完善的用户管理功能,包括用户注册、登录、......
  • Spring AOP
    AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存、权限控制、限流等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。AOP专业术语切面(Aspect):切面是增强和切点......
  • 2025年35+程序员,是否有机会转型 AI 大模型应用开发?
    对于35岁以上的程序员来说,转型到AI大模型应用开发领域不仅是可能的,而且在很多方面还具有独特的优势。随着人工智能技术的发展,特别是大规模预训练模型(如GPT系列、LLaMA系列等)的应用日益广泛,AI行业迎来了新的发展机遇。对于希望在这个新领域寻找职业发展的成熟程序员而言,这是......
  • chainlit 2.0 发布了
    chainlit2.0就在最近已经发布了,支持了不少新特性,比如一些ui的重写,减少代码量,同时添加了对于sqlite的支持,还有不少bug的修复说明后边有空了尝试下新功能以及新版本,尤其是对于sqlite的支持,可以简化我们对于数据持久化配置的使用(以前必须依赖pg数据库,对于小型系统并不是很方......
  • 深入解析太空探索与卫星技术如何改变我们的生活
    在HTML中创建较长的内容需要多步构建,并且受限于只提供一种线性结构。这里,我会试图遵循这样的方式去展示和构建一篇题为《深入解析太空探索与卫星技术如何改变我们的生活》的文章提纲:```html 深入解析太空探索与卫星技术如何改变我们的生活  您可以点击下列链接跳转到不......