Spring AI 集成【千帆 QianFan】大模型

Spring 源码系列

1、Spring 学习之扩展点总结之后置处理器(一)
2、Spring 学习之扩展点总结之后置处理器(二)
3、Spring 学习之扩展点总结之自定义事件(三)
4、Spring 学习之扩展点总结之内置事件(四)
5、Spring 学习之扩展点总结之@Import(五)
6、Spring 学习之AOP总结之基础介绍(六)
7、Spring 学习之AOP总结之实现代理(七)
8、SpringBoot 学习之自动配置基本原理(八)
9、SpringBoot 学习之启动原理(九)
10、ElasticSearch学习随笔之SpringBoot Starter 操作
11、图数据库 Neo4j 学习之SpringBoot整合
12、SpringBoot 学习之常用 Filter / Advice 总结
13、SpringBoot+FastJson 优雅的过滤 Response Body
14、Spring Security + Oauth2 认证授权
15、Spring AI 集成【千帆 QianFan】大模型

前言

了解 AI,学习 AI,拥抱 AI !
自 2022年11月30日 ChatGPT(全名:Chat Generative Pre-trained Transformer)发布,人工智能已正式以产品化的形式出现在大众面前,也迅速累计了大量用户,仅仅 5 天时间就破了百万用户,ChatGPT 的问世可谓是百年一遇的 “奇异点”。

而如今,被称之为是大模型时代,人工智能领域的产品层出不穷,各个大厂也是争先恐后有自己的大模型应用,百度有文心一言,阿里有通义千问,还有昆仑万维的天工,月之暗面的 Kimi,抖音的豆包等好多大模型应用,而且都在不断升级,对生成内容的精确度、生成速度等也是不断优化。

当然其中有些则是通过在网络上检索再进行整理,有些则是真正的生产,还有些是生成 + 检索整理形式的,比较训练大模型用的数据都不是最新的。

不止 Spring AI,当然还有其他的框架能很高效的和 AI 来集成,比如:Longchain(基于 python),Longchain4j(基于 Java)。

那身处在互联网领域的我们来说,应该是要积极去了解 AI,学习 AI,拥抱 AI。这不,在我们开发中最常用的 Spring 系列框架也出了 Spring AI,这就使得我们很好的在项目中接入 AI 为我们的项目去使用了,话不多说,来看看使用案例吧。

1. Spring AI 简介

首先来看看官网是怎么说的。
官网描述
翻译如下

Spring AI 是为 AI 工程 发的一款应用框架,它的目标是将 Spring 生态系统设计原则应用到 AI 领域,如移植和模块化设计,并推广使用 POJO 作为 AI 领域应用程序的构建模块。

也就是说,在我们的 Spring 项目中,你可以定义自己的 POJO 来和 AI 进行调用,来训练 AI 和调用 AI 接口,当然如何调用在框架中已经封装好了,我们可以上手就用。

可移植的 API 访问 AI,支持 聊天、文生图 和 嵌入式的模型,支持同步的和流式 API。而且 Spring 还在积极的进行纳入更多的 Model,上一次看仅仅支持几个模型,今天看加了好多模型进去,包括 QianFan、ZhiPu AI 等。

那现在 Spring AI 支持的大模型如下;

  1. Meta’s LLama
  2. Amazon’s Titan
  3. Azure Open AI
  4. Google Vertex AI
  5. Ollama - run AI models on your local machine
  6. OpenAI
  7. QianFan
  8. ZhiPu AI
  9. Watsonx.AI
    等等等等,我并没有列举出全部,想了解更多我觉得还是到官网系统性的品读一下,不过需要有足够的时间和

2. 亲试 Spring AI

官网链接:https://docs.spring.io/spring-ai/reference/getting-started.html
此篇就先用百度的 QianFan 大模型来尝试对接,咱一起来学学如何对接大模型,如何使用大模型。

2.1 生成千帆 API Key

2.1.1 注册 QianFan【千帆】

根据 Spring AI 官方文档的步骤,需要到 千帆大模型平台注册页 来注册,那有百度账号的则跳过此步骤。

2.1.2 生成 API Key

要想调用 千帆大模型的 API 那就必须要有你自己在 千帆大模型 生成的 Key 来通过大模型的认证,我们去千帆大模型生成页生成一个 Key。
我们通过 创建应用 来创建一个应用:
创建应用
创建好之后会发现,我们需要的 API key 和 Secret Key 需要到旧版创建。
创建应用
切换到旧版之后再进行创建

3. 调用测试

码云地址:https://gitee.com/stephen_cai/aidemos

3.1 千帆 SDK 调用

github:【很少打开】 https://github.com/baidubce/bce-qianfan-sdk

千帆官网提供了初学者视频讲解 https://cloud.baidu.com/doc/API/index.html

3.1.1 pom 依赖
<dependency>
    <groupId>com.baidubce</groupId>
    <artifactId>qianfan</artifactId>
    <version>0.1.1</version>
</dependency>
3.1.2 对话Chat

对话方式调用就是大模型 API 会生成好一段文字一次性返回给我们,我们拿到结果后再进行后续业务的处理,也可以直接把文字返回给前端进行展示,这样的好处就是我们处理方便,但是如果模型 API 返回的内容较多的情况下我们就需要等待,这样对我们后台业务的处理速度就会产生了影响,显得后台系统很慢。
以下是一个比较简单的示例:

@GetMapping("/ai/generate")
public String chatAI(@RequestParam(value = "message", defaultValue = "请给我讲一个笑话") String message){
    Qianfan qianfan = new Qianfan(Auth.TYPE_OAUTH,accessKey, secretKey);
    ChatResponse chatResponse = qianfan.chatCompletion().model("ERNIE-4.0-8K")
            .addMessage("user", message)
            .temperature(0.7)
            .topP(0.9)
            .execute();
    return chatResponse.getResult();
}

调用结果:
调用结果
在以上的这段代码中,有几个地方需要说明一下:

  1. .temperature(0.7) 该参数用于调整生成文本的随机性,值越高,生成的文本越多样化和创新,但也可能更不连贯或者离题,值越低,生成的文本越保守, 0.7 是在创造性和连贯性中间找到一个平衡。
  2. .topP(0.9) 该参数是介于 0 - 1 之间,表示在生成每个词时,只考虑概率最高的前p%的词汇。
3.1.2 续写Completions

续写方式则是大模型一边生成一边就会给我们返回结果,这样我们也可以不断地返回给前端进行展示,效果自然是比对话的方式要好,但是对我们的业务处理时会更复杂。
注意: 续写所用的模型和对话的不一样,有的模型不支持续写。

@GetMapping("/ai/stream")
public void chatStreamAI(@RequestParam(value = "message", defaultValue = "请给我讲一个笑话") String message, HttpServletResponse servletResponse) throws IOException {
     PrintWriter writer = servletResponse.getWriter();
     try(StreamIterator<CompletionResponse> response = new Qianfan(Auth.TYPE_OAUTH, accessKey, secretKey)
             .completion().model("CodeLlama-7b-Instruct").prompt(message)
             .executeStream()
     ){
         while (response.hasNext()){
             String result = response.next().getResult();
             System.out.println(result);
             System.out.println("==================");
             writer.write(result);
         }
     }
 }

页面展示结果:
调用结果
后台生成过程:
生成过程
从后台可以看出,续写方式不是一次性返回的,而是生成一段返回一段。

3.2 Spring AI 调用

3.2.1 pom 依赖

在引入依赖的时候,用 dependencyManagement 来管理版本,我用的是官方推荐的版本 1.0.0-SNAPSHOT,这是一个官网文档中的版本。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.2.4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baidubce</groupId>
        <artifactId>qianfan</artifactId>
        <version>0.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-qianfan-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-tracing</artifactId>
    </dependency>
</dependencies>

注意:我添加了 micrometer-tracing 依赖,这个是干什么的呢?Micrometer是一个用于监控JVM和应用程序的度量库,它提供了丰富的度量类型和灵活的标签系统,使得开发者可以轻松地收集、聚合和报告应用程序的各种指标。而Micrometer Tracing则进一步扩展了Micrometer的功能,使得它可以自动收集和报告分布式请求的跨度信息,包括服务调用关系、耗时、请求状态等。

3.2.1 application.yml 配置
spring:
spring:
  ai:
    retry:
      max-attempts: 3
      backoff:
        initial-interval: 5000ms
        multiplier: 5
        max-interval: 180000ms
      on-client-errors: true
    qianfan:
      #base-url: api.qianfan.chat 这里使用默认的地址
      api-key: fPBzv0lbRVlsaPfHsPjHKixY
      secret-key: 0jvguEhHDHUadidESY1I1iW00j0W5cqE
      chat:
        enabled: true
        options:
          temperature: 0.7
          top-p: 0.9

注意:base-url 配置使用默认配置就可以了,一开始我使用了官网的 default 配置,遗憾无法使用,翻看源代码,发现 QianFanConnectionProperties 中指定了 DEFAULT_BASE_URL,而其值则是通过 ApiUtils 的 DEFAULT_BASE_URL 指定,所以不需要指定 base-url 配置了。

源码如下:
源码

3.2.2 call 调用

通过调用 call 方法来发送最简单的文本,获取到的也是文本,这就是对话方式调用。

@GetMapping("spring/ai/generate")
public String springChatAI(@RequestParam(value = "message", defaultValue = "请给我讲一个笑话") String message){
    Prompt prompt = new Prompt(message);
    ChatResponse response = chatClient.call(prompt);
    Generation result = response.getResult();
    String content = result.getOutput().getContent();
    return content;
}

调用结果:
调用结果

3.2.3 stream 调用

stream 调用则直接调用 stream 方法就可以获得流式结果,通过 stream 提供的方法进行对结果的操作就行。

@GetMapping("spring/ai/stream")
    public void chatStreamAI(@RequestParam(value = "message", defaultValue = "请给我讲一个笑话") String message, HttpServletResponse servletResponse) throws IOException {
        // 设置响应的内容类型并指定字符编码
        servletResponse.setContentType("text/html;charset=UTF-8");
        // 显式设置字符编码
        servletResponse.setCharacterEncoding("UTF-8");
        PrintWriter writer = servletResponse.getWriter();
        Prompt prompt = new Prompt(message);
        Stream<ChatResponse> chatResponseStream = chatClient.stream(prompt).toStream();
        chatResponseStream.forEach(chatResponse -> {
            Generation result = chatResponse.getResult();
            String content = result.getOutput().getContent();
            System.out.println(content);
            System.out.println("================");
            writer.write(content);
        });
    }

后台打印效果:
后台打印效果
可以看到,我循环输出了模型生成的文本,是一段一段返回的。

3. 小结

开篇说到,了解 AI,学习 AI,拥抱 AI ,AI 现在正是风口浪尖的话题,各个大厂也有自己的大模型和应用,各个公司也是积极的引入大模型到自己的产品中,AI 的出世确实对所有行业有一定的影响和打击,这必将是未来趋势,所以我们必须要了解一点,从使用开始,先学学如何调用大模型 API 以及如何使用开始。
后续再深入学习大模型,最好在企业内用到,也可以用 AI 服务与个人,AI 很牛,但本身并不会直接产生价值,只有很好的使用起来这个工具对我们的产品和技术等各个方面起到作用才是价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值