Spring AI从入门到放弃(2)

1. 进入正题

目前spring-ai的版本是1.0.0-SNAPSHOT,以下的使用,如果没有特殊指出,使用的AI模型都是OpenAI。

<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>
    </dependencies>
</dependencyManagement>

引入Spring AI Starter:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>

application.yml增加配置

spring:
  ai:
    openai:
      # 这里就是上文提到的Token,是与money挂钩的,注意别暴露给别人,使用是收费滴
      api-key: ${OPNEAI-TOkEN}
      base-url: ${OPNEAI-URL}

使用国外的AI Model需要魔法,可以自行去淘宝啥的买一个,注意由于是https请求,会找不到证书,把第三方平台的证书下载后放到java的信任目录下即可。

keytool -import -alias apikey -file "path\cert" -keystore "path\cacerts" -storepass changeit

2. Chat Client API

Chat Client提供了一组Fluent API,用于与模型进行通信,同时支持同步与响应式编程。
Fluent API具有构建Prompt功能的方法,包含指导模型的输出和行为的说明文本,从API的角度可以讲Prompt理解为消息集合。
AI 模型的消息主要有两种类型:

  1. 用户消息:来自用户端直接输入;
  2. 系统消息:系统生成以指导对话。

这些消息通常使用占位符,在运行的时候根据用户的输入进行替换,以自定义AI模型对用户输入的响应。还可以指定提示选项,比如使用AI模型的名称,和控制所生成的输出的随机性创造性的设置等。

Chat Client API可以理解为Spring AI提供的一套通用的AI API。

2.1 创建Chat Client

Spring AI提供了多种Chat Client的创建方式,其都是通过ChatClient.Builder创建的,但是可以通过不同的方式进行创建。

1. 使用自动配置的ChatClient.Builder

@RestController
@RequestMapping("/ai")
public class AiController {
   

    private final ChatClient chatClient;

    public AiController(ChatClient.Builder chatClientBuilder) {
   
        // 使用ChatClient.Builder进行创建
        this.chatClient = chatClientBuilder.build();
    }

    @GetMapping("/chat01")
    public String chat01(@RequestParam("message") String message) {
   
        return this.chatClient.prompt()
                // 用户输入的内容
                .user(message)
                // 向AI Model发送请求
                .call()
                // 将AI返回的结果输出为String
                .content();
    }

}

这只是一个简单的示例,使用ChatClient.Builder创建的ChatClient是通过自动装配进行Builder的,该方式不利于一个多同时使用多个聊天模型。
通过查看ChatClient.Builder.builder()可以发现其也是通过创建一个ChatModel后进行注入的。

class Builder {
   

    private final ChatClientRequest defaultRequest;

    private final ChatModel chatModel;
    
    // ....
    public ChatClient build() {
   
        return new DefaultChatClient(this.chatModel, this.defaultRequest);
    }
    // ...
}

因此我们也可以自行通过ChatModel进行创建。

2. 通过ChatModel创建ChatClient

使用该种方式首先要在application.yml中增加属性spring.ai.chat.client.enabled=false禁用自动配置

@GetMapping("/chat02")
public String chat02(@RequestParam("message") String message) {
    String url = "https://api.openai.com";
    String token = "sk-*************************";
    ChatModel chatModel = new OpenAiChatModel(new OpenAiApi(url, token));

    //
    ChatClient.Builder builder = ChatClient.builder(chatModel);
    ChatClient chatClientByBuilder = builder.build();

    // 使用ChatClient.create()创建
    // ChatClient chatClientByCreate = ChatClient.create(chatModel);

    return chatClientByBuilder.prompt()
            .user(message)
            .call()
            .content();
}

2.2 响应

ChatClient提供了多种方式进行格式化AI的输出。

1. 返回ChatResponse

上文中的chatClientByBuilder.prompt().user(message).call().content()返回的是一个String,我们可以到content()方法中看一下:

public String content() {
   
    return doGetChatResponse().getResult().getOutput().getContent();
}
private ChatResponse doGetChatResponse() {
    return this.doGetChatResponse(this.request, "");
}

我们可以发现其就是通过返回ChatResponse之后获取的。
ChatResponse定义了丰富的结构,包括如何生成响应的元数据,还可以包含多个相应,每个响应都有自己的元数据。元数据包含用于创建响应的Tokens。
可以直接调用chatResponse()来获取ChatResponse对象。

@GetMapping("/chat02")
public ChatResponse  chat02(@RequestParam("message") String message) {
   
    return this.chatClient.prompt()
            .user(message)
            .call()
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值