langChain4j 入门

72 阅读2分钟

一、导入依赖

<!--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();  
}  
}