一、导入依赖
<!--langChain4j起步依赖-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.0.1-beta6</version>
</dependency>
<!--langChain4j aiService工具类-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
<version>1.0.1-beta6</version>
</dependency>
<!--流式调用相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
<version>1.0.1-beta6</version>
</dependency>
二、在yml中配置相应的调用地址、apiKey、大模型版本 如果不需要流式调用可以去掉streaming-chat-model: 配置
langchain4j:
open-ai:
chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: 'sk-ee0bcad5c666475ea5f670b96291ff6f'
model-name: qwen-plus
log-requests: true
log-responses: true
streaming-chat-model:
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: 'sk-ee0bcad5c666475ea5f670b96291ff6f'
model-name: qwen-plus
log-requests: true
log-responses: true
logging:
level:
dev.langchain4j: DEBUG
spring:
data:
redis:
host: your RedisURL
port: 6379
timeout: 2000ms
三、创建代理对象 @MemoryId指定参数为会话id,@UserMessage指定参数为用户消息,@SystemMessage设置系统消息 fromResource外挂系统消息,@UserMessage可以改变用户输入的消息
@AiService(
wiringMode = AiServiceWiringMode.EXPLICIT, // 手动装配
chatModel = "openAiChatModel", // 配置模型
streamingChatModel = "openAiStreamingChatModel", 流式调用模型
chatMemory = "chatMemory", // 配置会话记忆
chatMemoryProvider = "chatMemoryProvider", // 配置会话记忆提供者对象
contentRetriever = "contentRetriever"
)
public interface ConsultantService {
// 流式调用
@SystemMessage(fromResource = "system.txt")
// @UserMessage(内容{{it}})
Flux<String> chat(@MemoryId String memoryId, @UserMessage String msg);
@SystemMessage(fromResource = "system.txt")
String chat(@MemoryId String memoryId, @UserMessage String msg);
}
四、配置会话记忆功能 新建配置类实现ChatMemoryStore接口的三个方法,这里用的是redis,可以根据业务使用不同的数据库
@Configuration
public class RedisChatMemoryStore implements ChatMemoryStore {
@Resource(name = "redisTemplate")
private RedisTemplate<String, String> redisTemplate;
// 获取消息
@Override
public List<ChatMessage> getMessages(Object memoryId) {
String messageJson = redisTemplate.opsForValue().get(memoryId);
return ChatMessageDeserializer.messagesFromJson(messageJson);
}
// 存储消息
@Override
public void updateMessages(Object memoryId, List<ChatMessage> list) {
String messagesToJson = ChatMessageSerializer.messagesToJson(list);
redisTemplate.opsForValue().set(memoryId.toString(), messagesToJson, Duration.ofDays(1));
}
// 删除消息
@Override
public void deleteMessages(Object memoryId) {
redisTemplate.delete(memoryId.toString());
}
}
五、创建配置类,配置相关信息
@Configuration
public class CommonConfig {
@Resource
private RedisChatMemoryStore redisChatMemoryStore;
/**
* 配置会话功能 最多20条
* @return
*/
@Bean
public ChatMemory chatMemory() {
return MessageWindowChatMemory.builder()
.maxMessages(20)
.build();
}
/**
* 配置会话功能 存储到redis
* @return
*/
@Bean
public ChatMemoryProvider chatMemoryProvider() {
return id -> MessageWindowChatMemory.builder()
.maxMessages(20)
.chatMemoryStore(redisChatMemoryStore)
.id(id)
.build();
}
}