前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >已完结,已上线,Java 生产应用级项目!

已完结,已上线,Java 生产应用级项目!

作者头像
小傅哥
发布2024-05-28 10:53:40
1490
发布2024-05-28 10:53:40
举报

持续坚持原创输出,点击蓝字关注我吧

作者:小傅哥 博客:https://bugstack.cn

❝沉淀、分享、成长,让自己和他人都能有所收获!😜 ❞

大家好,我是技术UP主小傅哥。今天来带大家体验一下 Spring AI 的 Easy 开发!

现在的 OpenAI 对接开发真的是越来越容易了,直接引入 Spring AI 这个组件包,配置上可调用的 ApiHost、ApiKey 就可以完成对 OpenAI(ChatGPT)接口的调用。在此之前也有那么多各类的接口服务,还没有像 OpenAI 这样,被 Spring 如此重视,直接提供专属的 SDK 包,封装所有大模型(暂无国内的)。这也说明 OpenAI 的趋势力量多么庞大!

OpenAI 结合业务才更有价值

虽然 OpenAI 的接口对接是越来越简单了,但我们要知道,一个实际的项目就不只是对接 OpenAI 接口,还需要完成一系列的业务流程封装。就比如目前我们看到国内的各类套壳或自研类的 OpenAI 服务,都会包括;用户鉴权账户支付场景等,一套东西来支撑整个流程跑通,同时还有系统工程背后的舆情监控敏感词过滤数据存储行为分析等各类操作。这些东西也就是常说的,不能只会一个技术点,而是要结合场景,用技术支撑业务落地。

接下来,小傅哥会分享 Spring AI + Gpt-4o 的对接使用,以及介绍如何开发应用级的 OpenAI 项目。

文末提供了 OpenAI 应用级实战项目地址,今天加入的伙伴都送 50万 Token Gpt-4o APIKey,对接学习使用。

一、简单介绍

Spring AI 项目,是为开发 AI 应用程序提供了 Spring 友好的 API 和抽象。所有的大模型对接(OpenAI、Ollama、Azure OpenAI、Amazon Bedrock、HuggingFace、Google VertexAI、Mistral AI)都以一种统一标准的形式进行。这样就减少了大家再额外开发对接的成本了,也不用维护和兼容各个 OpenAI 的接口迭代。

  • 官网:https://docs.spring.io/spring-ai/reference/index.html
  • 文档:https://docs.spring.io/spring-ai/reference/1.0-SNAPSHOT/index.html
  • 源码:https://github.com/spring-projects/spring-ai

二、工程对接

1. 工程说明

  • 环境:JDK 17、SpringBoot 3.2.3、spring-ai 0.8.0
  • 源码:xfg-dev-tech-spring-ai - https://gitcode.net/KnowledgePlanet/road-map/xfg-dev-tech-spring-ai

在此工程中完成了 SpringAI 模块的引入,以及使用提供的 API 接口,完成同步应答、流式应答、图片绘制功能。

2. 引入模块

代码语言:javascript
复制
 <dependency>
     <groupId>org.springframework.ai</groupId>
     <artifactId>spring-ai-bom</artifactId>
     <version>0.8.0</version>
     <type>pom</type>
     <scope>import</scope>
 </dependency>
 
 <dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
  • spring-ai 也在不断的发展,2024年5月22日 发布了 1.0.0 M1 并对代码做了一些调整。在生产级别使用需要注意📢版本的迭代。

2. 接口对接

测试之前需要在 application-dev.yml 配置对接的信息。

代码语言:javascript
复制
spring:
  ai:
    openai:
      base-url: https://api.aws-*****/
      api-key: sk-oLkakcax33mJl628D3A533Fd67A24602Ac37D6*****

注意 spring-ai 提供了各类大模型的对接,都可以按需配置到这里。在它的源码 autoConfig 类里会有要配置参数的名称,可以参考。

2.1 功能测试
代码语言:javascript
复制
@Resource
private OpenAiChatClient chatClient;
@Resource
private OpenAiImageClient openaiImageClient;

@Test
public void test_generate() {
    ChatResponse chatResponse = chatClient.call(
            new Prompt(
                    "1+1",
                    OpenAiChatOptions.builder()
                            .withModel("gpt-4o")
                            .build()
            ));
    log.info("测试结果:{}", JSON.toJSONString(chatResponse));
}

@Test
public void test_generate_stream() throws InterruptedException {
    CountDownLatch countDownLatch = new CountDownLatch(1);
    Flux<ChatResponse> stream = chatClient.stream(new Prompt("1+1"));
    stream.subscribe(
            chatResponse -> {
                AssistantMessage output = chatResponse.getResult().getOutput();
                log.info("测试结果: {}", JSON.toJSONString(output));
            },
            Throwable::printStackTrace,
            () -> {
                countDownLatch.countDown();
                System.out.println("Stream completed");
            }
    );
    countDownLatch.await();
}

@Test
public void test_generate_image() {
    ImageResponse imageResponse = openaiImageClient.call(
            new ImagePrompt("画个小狗",
                    OpenAiImageOptions.builder()
                            .withModel("dall-e-3")
                            .withQuality("hd")
                            .withN(1)
                            .withHeight(1024)
                            .withWidth(1024)
                            .build()
            )
    );
    log.info("测试结果: {}", JSON.toJSONString(imageResponse));
}

测试结果

代码语言:javascript
复制
24-05-26.16:46:46.287 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.288 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.289 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"1","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.289 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"+","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.289 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"1","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.289 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":" equals","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.289 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":" ","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.290 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"2","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
24-05-26.16:46:46.290 [ForkJoinPool.commonPool-worker-1] INFO  OpenAITest             - 测试结果: {"content":"","messageType":"ASSISTANT","properties":{"role":"ASSISTANT"}}
Stream completed
  • 测试结果为 test_generate_stream 流式返回 1+1 的应答结果。
2.2 接口服务
代码语言:javascript
复制
@RestController()
@CrossOrigin("*")
@RequestMapping("/api/v1/openai/")
public class OpenAiController {

    @Resource
    private OpenAiChatClient chatClient;

    /**
     * curl http://localhost:8090/api/v1/openai/generate?message=1+1
     */
    @RequestMapping(value = "generate", method = RequestMethod.GET)
    public ChatResponse generate(@RequestParam String message) {
        return chatClient.call(
                new Prompt(
                        message,
                        OpenAiChatOptions.builder()
                                .withModel("gpt-4o")
                                .build()
                ));
    }

    /**
     * curl http://localhost:8090/api/v1/openai/generate_stream?message=1+1
     */
    @RequestMapping(value = "generate_stream", method = RequestMethod.GET)
    public Flux<ChatResponse> generateStream(@RequestParam String message) {
        return chatClient.stream(new Prompt(message));
    }

}

在 OpenAiController 中提供了对接两个接口的方法,以及同步和流式返回。流式返回还可以使用 ResponseBodyEmitter 进行流式返回

Spring AI 提供的 OpenAI 大模型对接是 Easy 的很,减去了自己开发代码对接大模型。但仅仅是这样一个简单还不够,我们还需要学习积累的更多!如;微信鉴权登录怎么做、支付怎么对接、账户额度怎么扣减、限流熔断怎么操作等等,实际场景问题才是有价值的核心内容,所以,咱们要上个大菜!

三、实战项目

OpenAI 应用项目已全部完结,并上线部署给伙伴们体验http://gaga.plus - 下面的内容会告诉你,你能学习到多少实战经验!

1. 能学到啥

该项目是当下最火的 OpenAI 场景应用项目,也是各个互联网大厂都开始深入折腾,并在自身业务中逐步应用的技术。你也会渐渐的看到,在招聘要求中有一条是会 ChatGPT 开发。因为本项目是前后端+Dev-Ops的全栈式编程,所以这一些列内容你都可以学习到,包括;

  • 【前端】熟练使用 Next.js 构建的 React、Typescript 语言,构建的前端工程。
  • 【前端】熟练使用 React Route 路由子页面的开发技术,以及相应的信息传递。
  • 【前端】熟练掌握,跨域接口的对接使用,以及本地 json 数据加载。
  • 【前端】熟练使用本地浏览器内存,存储 Token、配置、对话等信息。
  • 【前端】熟练掌握前端页面数据的存放、使用以及和后端接口的交互方式。
  • 【后端】熟练构建 DDD 工程架构,分层模块,职责体系。并掌握 DDD 架构的开发模式以及微服务设计思想。
  • 【后端】熟练掌握 Spring、SpringBoot、MyBatis 等开发框架技术,并对其使用源码所提供的接口、类、SPI标准开发各类组件,有一定的设计思路和落地能力。—— 因为这里包含了 SDK 的设计、开发和使用。
  • 【后端】熟练使用多种设计模式、设计原则,对各类场景的方案设计和落地能力,深度提高自身编码思维和开发技术能力。—— 同时包括非常重要的会话模型SDK的架构设计。
  • 【后端】熟练对接微信公众号 SDK,属性验签流程和对话流程。以及完成 JWT Token 的生成和校验。
  • 【后端】熟练掌握 Nginx Auth 验证模块的开发和使用,以用于对接口的校验和拦截。
  • 【后端】熟练使用流式异步响应式框架开发应答接口,完成前端动态展示应答数据。
  • 【后端】熟练使用 okhttp3、retrofit2 框架,对接 ChatGPT 完成通用 SDK 的开发。有了这项技能,以后你可以方便的对接任何一个 HTTP 请求服务。
  • 【后端】熟练掌握异常、枚举、错误码的定义和使用,并学习如何合理打印服务日志,便于问题排查。
  • 【运维】熟练使用 Docker 在本地和服务端的配置和部署应用,以及在本地构建前后端镜像。
  • 【运维】熟练掌握 Git、GitCode,对工程代码的管理,推送、拉取、切换分支、合并代码等操作。
  • 【运维】熟练申请和使用 SSL 配置 Nginx 域名 HTTPS 服务。

此外,小傅哥对于每个章节还讲解了章节的诉求、流程的设计,之后再到方案实现和功能验证。并在每个章节留有作业让大家练习。当然这还没有完,你知道小傅哥这个架构师画图还是非常牛逼的,所以你还能看到各种画图的技巧,耳濡目染的把这些东西学习成自己的本事!~

2. 项目介绍

本次项目是一个包括前后端 + Dev-Ops,全栈式编程,的硬核项目!基于 React + SpringBoot + Nginx + Docker 云服务部署的 OpenAI 应用项目。并且是能上线对外提供服务使用的项目!不同于一些开源项目,本项目具备完整的前后端开发和实施部署方案。

如果你使用过任何一款 OpenAI 产品,那么就会对这样一个业务场景非常熟悉,但对于产品之下的技术实现可能并不清楚。它是怎么做的异步应答,它是怎么对接的服务接口,它是怎么做的关联上下文数据处理。而这些都是小傅哥要在这次项目里给大家讲解的内容。

1. 应用部署

2. 项目演示

3. 数据监控(百度统计)

4. 热力展示(百度统计)

5. 项目流程(核心链路)

6. 细节设计(流程举例)

对项目感兴趣的伙伴,也可以先免费看看其中的课程视频 https://b23.tv/OjYftBl

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 bugstack虫洞栈 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 持续坚持原创输出,点击蓝字关注我吧
  • 一、简单介绍
  • 二、工程对接
    • 1. 工程说明
      • 2. 引入模块
        • 2. 接口对接
          • 2.1 功能测试
          • 2.2 接口服务
      • 三、实战项目
        • 1. 能学到啥
          • 2. 项目介绍
            • 1. 应用部署
              • 2. 项目演示
                • 3. 数据监控(百度统计)
                  • 4. 热力展示(百度统计)
                    • 5. 项目流程(核心链路)
                      • 6. 细节设计(流程举例)
                      相关产品与服务
                      腾讯云服务器利旧
                      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档