相关依赖
1.集合工具类依赖
(1)commons-collections4
是 Apache Commons 项目中的一个组件,它提供了一系列增强的集合类和工具类,具有以下主要作用:
一、丰富的集合类
-
多态集合:提供了各种不同类型的集合实现,如
- 例如,使用
MultiMap
可以轻松地实现一个键对应多个值的存储需求,在处理一对多关系的数据时非常有用。
- 例如,使用
-
增强的迭代器:提供了功能更强大的迭代器,如
- 比如,可以使用
FilterIterator
在遍历集合时只选择满足特定条件的元素,简化了数据筛选的过程。
- 比如,可以使用
二、集合工具类
-
集合操作:提供了一系列用于集合操作的工具方法,如集合的交集、并集、差集等运算,以及集合的转换、排序、分组等功能。
- 例如,可以方便地计算两个集合的交集,快速找出共同的元素。
-
空值处理:提供了一些方法来处理集合中的空值,避免空指针异常。
- 在处理可能包含空值的集合时,可以使用这些方法来确保程序的稳定性。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
(2)commons-lang3
是 Apache Commons 项目中的一个组件,它提供了一系列实用的工具类和方法,用于处理 Java 语言中的常见任务。例如:
-
StringUtils
类提供了很多方便的方法来操作字符串,如判断字符串是否为空、是否包含特定子串、去除字符串两端的空白等。 -
ArrayUtils
可以方便地操作数组,如判断数组是否为空、合并数组等。 -
RandomStringUtils.randomNumeric(8)
可以方生成8个随机数字字符串
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.15.0</version>
</dependency>
2.测试需求依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
3.json解析依赖
- 依赖1:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.50</version>
</dependency>
使用示例
import com.alibaba.fastjson.JSON;
public class Main {
public static void main(String[] args) {
User user = new User("张三", 25);
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
}
}
- 依赖2:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
- @JsonProperty:记得搭配实现Serializable
@Data
public class ChatChoice implements Serializable {
private long index;
/** stream = true 请求参数里返回的属性是 delta */
@JsonProperty("delta")
private Message delta;
/** stream = false 请求参数里返回的属性是 message */
@JsonProperty("message")
private Message message;
@JsonProperty("finish_reason")
private String finishReason;
private String logprobs;
}
- 在对象序列化时,这个注解告诉 Jackson 库在生成 JSON 格式数据时,将被注解的属性名映射为
"message"
。例如,如果有一个 Java 对象,其中一个属性使用了这个注解,当这个对象被序列化为 JSON 时,该属性在 JSON 中的键将是"message"
而不是原来的属性名。 - 在反序列化时,Jackson 会根据这个注解将 JSON 中的
"message"
键对应的值映射到被注解的 Java 对象属性上。
- @JsonInclude(JsonInclude.Include.NON_NULL)
这个注解用于控制对象在序列化为 JSON 格式时,只包含非空属性。如果一个对象的某个属性值为 null
,那么在生成的 JSON 中,这个属性将不会被包含。
@Data
@Builder
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
/*
对话聊天,请求信息依照;OpenAI官网API构建参数;https://platform.openai.com/playground
*/
//实现了 Serializable 序列化接口,为了在网络请求的过程中将该类的对象转换为字节流进行传输。
public class ChatCompletionRequest implements Serializable {
/** 默认模型3.5*/
private String model = Model.GPT_3_5_TURBO.getCode();
/** 问题描述*/
private List<Message> messages;
/** 控制温度【随机性】;0到2之间。较高的值(如0.8)将使输出更加随机,而较低的值(如0.2)将使输出更加集中和确定 */
private double temperature = 0.2;
/** 多样性控制;使用温度采样的替代方法称为核心采样,其中模型考虑具有top_p概率质量的令牌的结果。因此,0.1 意味着只考虑包含前 10% 概率质量的代币 */
@JsonProperty("top_p")//这个注解可能与Jackson库或其他类似的JSON处理库一起使用。这样一来,在将Java对象转换为JSON字符串(序列化)或将JSON字符串转换为Java对象(反序列化)时,会使用指定的字段名称 “top_p”。
private Double topP = 1d;
/** 为每个提示生成的完成次数 */
private Integer n = 1;
/** 是否为流式输出;就是一蹦一蹦的,出来结果 */
private boolean stream = false;
/** 停止输出标识 */
private List<String> stop;
/** 输出字符串限制;0 ~ 4096 */
@JsonProperty("max_tokens")
private Integer maxTokens = 2048;
/** 频率惩罚;降低模型重复同一行的可能性 */
@JsonProperty("frequency_penalty")
private double frequencyPenalty = 0;
/** 存在惩罚;增强模型谈论新话题的可能性 */
@JsonProperty("presence_penalty")
private double presencePenalty = 0;
/** 生成多个调用结果,只显示最佳的。这样会更多的消耗你的 api token */
@JsonProperty("logit_bias")
private Map logitBias;
/** 调用标识,避免重复调用 */
private String user;
@Getter
@AllArgsConstructor
public enum Model{
/** gpt-3.5-turbo */
GPT_3_5_TURBO("gpt-3.5-turbo"),
/** GPT4.0 */
GPT_4("gpt-4"),
/** GPT4.0 超长上下文 */
GPT_4_32K("gpt-4-32k"),
;
private String code;
}
}
4.mybatis分页
<!-- MySql数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Mybatis和分页组件 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
5.springBoot配置依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.1</version>
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
</parent>
<!-- 基础框架组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
6.日志相关依赖
详情见《日志框架选型》
SpringBoot项目
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<!-- 基础框架组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
基本项目
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.22</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!-- if debug set to true, context info always print
otherwise the contex info will print when error occour -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} [%file : %line] - %msg%n</pattern>
</layout>
</appender>
<!-- 日志文件-->
<appender name="terminal" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/terminal-service.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/terminal-service.log.%d{yyyyMMddHH}</fileNamePattern>
<maxHistory>240</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="terminal-api" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/terminal-api.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/terminal-api.%d{yyyyMMddHH}.log</fileNamePattern>
<maxHistory>240</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<appender name="terminal-rmq" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/terminal-rmq.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/terminal-rmq.log.%d{yyyyMMddHH}</fileNamePattern>
<maxHistory>240</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{40} [%file : %line] - %msg%n</pattern>
</encoder>
</appender>
<!--region 埋点-->
<appender name="bigdata" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>logs/bigdata.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/bigdata.log.%d{yyyyMMddHH}</fileNamePattern>
<maxHistory>240</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="bigdataLogger" additivity="false" level="INFO">
<appender-ref ref="bigdata" />
</logger>
<logger name="rmq-logger" additivity="false" level="INFO">
<appender-ref ref="terminal-rmq" />
</logger>
<logger name="api_logger" additivity="false" level="INFO">
<appender-ref ref="terminal-api" />
</logger>
<logger name="java.sql" level="INFO" additivity="false">
<appender-ref ref="terminal" />
</logger>
<logger name="com.atomikos" additivity="false" level="ERROR">
<appender-ref ref="terminal" />
</logger>
<root level="INFO">
<appender-ref ref="terminal"/>
<appender-ref ref="CONSOLE"/>
</root>
<root level="ERROR">
<appender-ref ref="terminal"/>
<appender-ref ref="CONSOLE"/>
</root>
<root level="WARNING">
<appender-ref ref="terminal"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
使用
@Slf4j
public class Test1 {
final static Logger logger