同步效果就不展示了,这里展示更常用的异步,多轮异步流式效果展示如下:
第一轮回答,此时没有会话id,需要雪花算法生成插入数据库
第二轮问题以及结果内容组合
1、同步版本环境准备以及代码
需要开通阿里大模型服务,如果没有开通服务,单独的去生成 key 是无效的。
阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
生成你需要的 key
1、maven 准备
<!--阿里巴巴大模型-->
<!-- https://mvnrepository.com/artifact/com.alibaba/dashscope-sdk-java -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dashscope-sdk-java</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
2、application.yml 配置
redis一般默认有16个数据库,这里使用第三个。这个自定义。
#Redis
spring:
data:
redis:
host: localhost
port: 6379
database: 3
zm:
ali:
api-key: "你的keyid"
app-id: "你的appid"
3、实体类准备
主要是封装了一次,获取到 yml 的配置信息
@Configuration
@Data
public class AliKey {
@Value("${zm.ali.api-key}")
private String ApiKey;
@Value("${zm.ali.host}")
private String host;
}
redis工厂化工具类
/*
* @Author 落梨
* @Date 2024-09-15 10:04
* @Description: Redis模板生产工具
**/
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setValueSerializer(serializer);
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}
4、controller 层
注意这里的回复类 使用的是官方提供,也就是 引入 maven 依赖,不是自己创建的
/**
* @author 落梨
* @description 发送信息
*
**/
@PostMapping("/chat")
public ResultResponse getChat(String conversationId,String prompt) throws NoApiKeyException, InputRequiredException {
//这个generationResult是阿里的模型引入的回复类 不需要自己创建,引入即可
GenerationResult generationResult = conversationService.qianWenChat(conversationId,prompt);
return ResultResponse.success(generationResult);
}
5、service 层以及实现层
Flowable<ApplicationResult> qianWenChat(String conversationId, String prompt) throws NoApiKeyException, InputRequiredException;
@Override
public Flowable<ApplicationResult> qianWenChat(String conversationId, String prompt) throws NoApiKeyException, InputRequiredException {
//如果会话id是空,表示新建立一个会话id 调用雪花id
if (conversationId.equals("")) {
conversationId= String.valueOf(snowFlakeGenerateIdWorker.nextId());
}
try {
return qianWenChatController.callWithMessage(conversationId,prompt);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
雪花工具类
package com.zm.naviTech.utils;
import org.springframework.stereotype.Component;
/*
* @Author 落梨
* @Date 2024-09-14 11:07
* @Description: 雪花算法 工具类
**/
@Component
public class SnowFlakeGenerateIdWorker {
// 起始的时间戳
private final static long START_TIMESTAMP = 1480166465631L;
// 每一部分占用的位数,符号位不算在内
private final static long SEQUENCE_BIT = 12; // 序列号占用的位数
private final