基于数据库的多Key轮询
在之前的文章中我们所使用的Key都是一个,但事实上,官方对Key会有一定的请求限制,在实际业务场景下,我们也不可能通过一个Key来保证我们的系统稳定运行,因为一旦超过请求限制,就会出现无法请求AI的情况,这时,就需要考虑实现一种多Key轮询进行请求,从而保证我们的系统不会出现因为达到请求限制而无法运行的情况。
可惜的是,Spring AI目前还不支持多Key轮询的方式来调用大语言模型,因此需要我们自己实现。本篇将结合我对Spring AI的源码理解,来实现一个基于数据库的多Key轮询的接口。
6.1 核心类 OpenAiApi
实现多Key轮询的方式并不难,我们将API和Key的信息存储在数据库中,每次发起请求时,通过向数据库中查询API和Key的数据,手动构建一个ChatClient或StreamChatClient进行调用即可。拿OpenAI为例,就是要手动构建OpenAiChatClient
对象,因为OpenAiChatClient
实现了ChatClient
和StreamChatClient
接口。
通过观察OpenAiChatClient的构造方法,发现有一个核心类:OpenAiApi
,该类的对象创建恰好就需要API和Key。
因此我们很容易想通创建OpenAiChatClient的流程:
- 从数据库中查询API和Key的信息;
- 利用API和Key构建OpenAiApi对象;
- 通过OpenAiApi对象再构建OpenAiChatClient;
- 再根据实际业务场景选择ChatClient和StreamChatClient进行调用;
6.2 环境准备
为便于演示,我新建了一个spring-ai-key-polling-demo
的模块。
- 数据库使用的是Pgvector,它是Postgresql的扩展,可作为向量数据库,当然,本节还未涉及到向量数据库的使用,因此可以根据自己的喜好选择一个数据库;
- ORM框架:Spring Data JPA,演示起来比较方便,可根据喜好选择一款ORM框架
核心依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
目录结构如下:
6.3 多Key轮询的基本实现
(1) 定义实体类
这里我定义了一个KeyInfo用来存储我们的Key和API信息,属性较为简单,实际项目中需要结合实际的业务场景添加一些额外的属性,如是否禁用、创建时间等等。
package com.ningning0111