如何快速在项目中集成AI功能:AI信箱工具使用
AI的使用目前已经非常普遍了,那么作为程序员的我们,改如何在自己的项目中集成AI相关的功能呢?
1. 获取apikey和baseurl
想要完成一次AI的api调用,我们必须要在官网中获取身份认证信息apikey和请求的url,这里更推荐阿里云百炼平台,不仅包含阿里自己研发的通义千问大模型,还包括很多其他模型的调用。尤其是在deepseek官网api目前不够稳定的情况下,阿里云百炼还能稳定的提供deepseek相关的模型调用接口。最重要的是新人开通免费给大量的使用token,非常适合新人学习或尝鲜。
1.1 首先进入阿里云官网(https://www.aliyun.com/),登录账号,完成个人认证。
1.2 在产品中选择百炼,进入百炼平台
点击管理控制台进入
1.3 开通阿里云百炼
新人右下角应该有开通提示,或者其他地方有提示,记不清了,反正只要完成个人认证,就能进行开通,获取大量的试用token
1.4 获取baseurl
在模型广场中有api调用示例,可以在其中获取baseurl
1.5 获取apikey
点击右上角用户图标,进入apikey界面
选择创建我的apikey,即可获取
2. 使用AI信箱工具,完成AI调用
在获取了请求地址和apikey之后,就可以开始调用AI接口了,不过AI接口调用的请求体和请求头的组装,以及AI信息的管理,都非常繁琐,这里我推荐使用AI信箱工具来完成这一过程。
AI信箱致力于封装复杂,但逻辑基本重复的AI调用功能以及对于AI交互信息的管理功能,让程序开发者能够像AI使用者一样,只需要向API发送一句话,即可以得到根据上下文信息推演的AI回答。AI信箱主要向调用者提供两个功能:
- 对多AI的访问接口维护,只需要通过简单的配置和方法调用,即可完成对多种AI接口的一次完整调用。
- 是对用户和AI交互信息的维护。
2.1 调用前准备
- 在pom文件中添加如下依赖
<dependency><groupId>io.gitee.du-xiuhuan</groupId><artifactId>ai-mailbox</artifactId><version>1.0.1</version>
</dependency>
- 在springboot主类上引入启动类
//通过import注解引入MailBoxStarter启动类
@Import(MailBoxStarter.class)
@SpringBootApplication(scanBasePackages = "com.mailbox")
public class BaichuanAiServerApplication {public static void main(String[] args) {SpringApplication.run(BaichuanAiServerApplication.class, args);}}
- 添加相关配置
# datasource
spring.datasource.url=jdbc:postgresql://127.0.0.1:/mailbox
spring.datasource.username=
spring.datasource.password=
spring.datasource.driver-class-name=org.postgresql.Driver#apikeyList记录了所有模型请求时所对应的apikey,需要自行从官网,获取。AI信箱获取apikey的逻辑是;分割多个对应关系,:分割对应关系的左右两侧。所有队对于某些提供了多AI接口调用的平台(如阿里云百炼),可以将多个AI写入:左侧,然后只提供一个apikey即可。
mailbox.apikeyList=deepseek-r1,deepseek-v3,qwen-plus,qwen-max,qwen-turbo,qwen-long:sk-447fdcdhasacuaewnicwcaooica3fbbb87b;
#原理同上,记录了对应模型需要请求的url
mailbox.urlList=deepseek-r1,deepseek-v3,qwen-plus,qwen-max,qwen-turbo,qwen-long:https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions;
#不同的接口提供防,虽然提供的请求体参数类似,但是请求体中消息的排列顺序却有不同。默认以阿里云百炼提供的为准,也就是时间正序排列,新发的消息在下面,对于一些相反的平台(如deepseek官网),可以将这个参数设置为true,反转消息顺序。
mailbox.build-request-body.is-reserver=false
2.2 使用AI信箱发起AI调用
AI信箱对AI的接口调用逻辑进行了封装,这使得开发者只需要调用简单的方法调用即可完成一次Ai接口调用,实例如下:
import io.gitee.duxiuhuan.mailbox.outter.TalkWithAIUtils;
import io.gitee.duxiuhuan.mailbox.service.entries.QuestionResult;
import io.gitee.duxiuhuan.mailbox.utils.IdUtils;
import io.gitee.duxiuhuan.mailbox.service.entries.QuestionResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;@Service
public class QuestionServiceimpl implements QuestionService {//引入AI信箱的AI对话工具类@AutowiredTalkWithAIUtils talkWithAIUtils;@Overridepublic QuestionResult question(String message, Long userId, Long sessionId, String model) {if (sessionId == null ){sessionId = IdUtils.generateId();}//直接调用question方法,传入用户说的话,用户id,当前用户对话所在的会话id,想要交流的模型,以及表id(对于AI的信息管理需要分表,实例中是基于用户分表,具体分表后面会说)Long tableId = userId;return talkWithAIUtils.question(message, userId, sessionId, model, tableId);}@Overridepublic StreamingResponseBody questionStream(String message, Long userId, Long sessionId, String model) {if (sessionId == null ){sessionId = IdUtils.generateId();}//调用questionStream方法可以调用AI对话的流式接口,该方法返回了一个StreamingResponseBody类型实例,这是Springmvc提供的流式接口方案,直接将返回的StreamingResponseBody类型实例响应给客户端,即可实现逐字返回给客户端,当然你也可以对其进行封装,具体需要了解springmvc的相关知识。Long tableId = userId;return talkWithAIUtils.questionStream(message, userId, sessionId, model, tableId);}
}
通常AI接口调用需要将上下文信息全部传入,维护,查询,使用这些信息都相当麻烦。AI信箱内部对这些信息进行了管理,并且在调用时自动查询相关上下文,组成请求体,这使得开发者只需要传入最新的对话,既可以得到关联上下文的AI推演结果。一条完整的信息结构如下:
public class MessageInfo {//信息id(唯一)private Long id;//当前信息的所属用户id(AI调用时不发挥作用)private Long userId;//会话id(可以自定义概念,比如说你想要在聊天室中加入AI,可以一个聊天室作为一个sessionId)private Long sessionId;//判断当前信息是用户还是AI发出的private Integer userOrSystem;//是哪个模型的回答private String model;//具体信息内容private String content;//创建时间private Date createTime;
}
除此之外,对于大量的信息,不能单单只靠一张数据库表来进行处理,不同情况下,需要不同的分表来提供更良好的查询性能,开发者需要自行管理分表逻辑,并给每个逻辑单元对应一条表ID(就是AI交互功能是传入的最后一个参数)。AI信息会基于这个ID去创建对应的表。(注意,分表的最小单元是sessionId,也就是相同的sessionId不能被分到不同的表中);
AI信箱提供统一工具类来让开发者可以灵活的使用这些信息,实例如下:
import io.gitee.duxiuhuan.mailbox.database.entries.MessageInfo;
import io.gitee.duxiuhuan.mailbox.outter.MessageManagerUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;@Service
public class SessionServiceimpl {//引入消息管理工具类@AutowiredMessageManagerUtils messageManagerUtils;public List<MessageInfo> getContent(Long userId, Long sessionId) {//组成messageInfo实例,用来进行查询MessageInfo messageInfo = new MessageInfo();messageInfo.setSessionId(sessionId);//调用selectMessage方法,传入表名和messageInfo实例Long tableId = userId;List<MessageInfo> messageInfos = messageManagerUtils.selectMessage(tableId, messageInfo);return messageInfos;}}
除此之外,还提供对信息的增删功能,都是MessageManagerUtils工具类的方法,示例如下:
package com.mailbox.server.service.impl;import io.gitee.duxiuhuan.mailbox.database.entries.MessageInfo;
import io.gitee.duxiuhuan.mailbox.outter.MessageManagerUtils;
import com.mailbox.server.database.SessionMapper;
import com.mailbox.server.database.entries.Session;
import com.mailbox.server.service.SessionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.*;@Service
public class SessionServiceimpl extends ServiceImpl<SessionMapper, Session> implements SessionService {@AutowiredMessageManagerUtils messageManagerUtils;@Overridepublic List<MessageInfo> getContent(Long userId, Long sessionId) {//根据会话id查询会话表内容MessageInfo messageInfo = new MessageInfo();messageInfo.setSessionId(sessionId);Long tableId = userId;//传入表ID,以及按照MessageInfo类的属性组成查询信息,即可获取对应的消息列表List<MessageInfo> messageInfos = messageManagerUtils.selectMessage(tableId, messageInfo);return messageInfos;}}
AI信息也提供QueryTableUtils工具类,用来对表的增删改查,推荐开发者在表逻辑单元创建时调用对应方法生成表,不过即使你不这样做,AI信箱也会在发现表不存在时尝试创建它。
3. 结语
AI信箱gitee地址:https://gitee.com/du-xiuhuan/ai-mailbox
如果感觉好用,麻烦点一个star;
如果在使用中遇到什么问题,可以在当前帖子进行评论,或在gitee中提出issue,问题会尽量在一周内解决;