LangChain4j低阶+高阶Api+日志配置+监听器+重试机制+超时机制
目录
- 大模型中的token与Web开发中的token
- 环境准备
- 低阶Api
- 高阶Api
- 常用配置
- 日志配置
- 监听器
- 重试机制
- 超时机制
- 总结
大模型中的token与Web开发中的token
1. 大模型中的token
在大模型中,token 是模型用来表示自然语言文本的基本单位,用于将自然语言拆解为模型可理解的数字序列。
2. Web开发中的token
在 Web 开发中,token 是用于身份验证和授权的一种加密字符串,通常作为请求的凭证或加密数据载体。
3. 两者有什么区别
- 目的不同: 大模型中的token是为了将文本分割成可处理的单元,便于进行计算。而Web开发中的token主要用于安全传递用户身份信息。
- 生成方式不同: 大模型中的token通过特定的算法对文本进行分割得到。而Web开发中的token通常是使用加密算法生成唯一字符串。
- 应用场景不同: 大模型中的token应用于文本分析、机器翻译等任务。而Web开发中的token通常用于用户登录、API调用等领域。
环境准备
1. 引入依赖
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- LangChain4j原生 基础--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-open-ai</artifactId></dependency><!-- LangChain4j原生 高阶--><dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>
2. yml配置
server:port: 9003spring:application:name: langchain4j-low-high-api
3. 主启动类
@SpringBootApplication
public class LowHighApiLangChain4jApp {public static void main(String[] args) {SpringApplication.run(LowHighApiLangChain4jApp.class, args);}
}
低阶Api
1. 配置类 LLMConfig
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}@Bean(name = "deepseek")public ChatModel chatModelDeepSeek() {return OpenAiChatModel.builder().apiKey(System.getenv("DEEPSEEK_KEY")).modelName("deepseek-chat").baseUrl("https://api.deepseek.com/v1").build();}
}
2. 控制类 LowApiLangChain4jController
@RestController
@RequestMapping("/lowapi")
public class LowApiLangChain4jController {@Resource(name = "qwen")private ChatModel chatModelQwen;@Resource(name = "deepseek")private ChatModel chatModelDeepSeek;// 低阶api基本使用// http://localhost:9003/lowapi/qwen/chat?msg=如何学习java@GetMapping(value = "/qwen/chat")public String qwenChat(@RequestParam(value = "msg", defaultValue = "你是谁") String msg) {return chatModelQwen.chat(msg);}// http://localhost:9003/lowapi/deepseek/chat?msg=如何学习java@GetMapping(value = "/deepseek/chat")public String deepseekChat(@RequestParam(value = "msg", defaultValue = "你是谁") String msg) {return chatModelDeepSeek.chat(msg);}// token用量的底层api示例// http://localhost:9003/lowapi/qwen/test@GetMapping(value = "/qwen/test")public String QwenTest(@RequestParam(value = "msg", defaultValue = "你是谁") String msg) {ChatResponse chatResponse = chatModelQwen.chat(UserMessage.from(msg));String result = chatResponse.aiMessage().text();// token用量计算的底层apiTokenUsage tokenUsage = chatResponse.tokenUsage();return result + "\n" + tokenUsage;}
}
3. 测试
- 访问 http://localhost:9003/lowapi/qwen/test
高阶Api
本次使用LangChain4j与SpringBoot的原生整合方式,不需要标注@AiService注解。
1. 自定义高阶 ChatAssistant 接口
public interface ChatAssistant {String chat(String msg);
}
2. 配置类 LLMConfig
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").build();}@Bean(name = "deepseek")public ChatModel chatModelDeepSeek() {return OpenAiChatModel.builder().apiKey(System.getenv("DEEPSEEK_KEY")).modelName("deepseek-chat").baseUrl("https://api.deepseek.com/v1").build();}// 高阶api@Beanpublic ChatAssistant chatAssistant(@Qualifier("deepseek") ChatModel chatModelDeepSeek) {return AiServices.create(ChatAssistant.class, chatModelDeepSeek);}
}
3. 控制类 HighApiLangChain4jController
@RestController
@RequestMapping("/highapi")
public class HighApiLangChain4jController {@Resourceprivate ChatAssistant chatAssistant;// 高阶api基本使用// http://localhost:9003/highapi/chat?msg=如何学习java@GetMapping(value = "/chat")public String chat(@RequestParam(value = "msg", defaultValue = "你是谁") String msg) {return chatAssistant.chat(msg);}
}
4. 测试
- 访问 http://localhost:9003/highapi/chat?msg=如何学习java
常用配置
日志配置
只有日志级别为DEBUG,同时配置上langchain4j的日志输出开关才有效
logging:level:dev:langchain4j: DEBUG
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").logRequests(true) // 日志级别设置为DEBUG才有效.logResponses(true) // 日志级别设置为DEBUG才有效.build();}
}
监听器
@Slf4j
public class MyChatModelListener implements ChatModelListener {@Overridepublic void onRequest(ChatModelRequestContext requestContext) {String uuid = UUID.randomUUID().toString();requestContext.attributes().put("uuid", uuid);log.info("请求参数requestContext: " + requestContext + "\t" + uuid);}@Overridepublic void onResponse(ChatModelResponseContext responseContext) {Object uuid = responseContext.attributes().get("uuid");log.info("返回结果responseContext: " + responseContext + "\t" + uuid);}@Overridepublic void onError(ChatModelErrorContext errorContext) {log.info("请求异常errorContext: " + errorContext);}
}
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").listeners(List.of(new MyChatModelListener())) // 监听器.build();}
}
重试机制
默认重试3次
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").maxRetries(2) // 重试机制.build();}
}
超时机制
@Configuration
public class LLMConfig {@Bean(name = "qwen")public ChatModel chatModelQwen() {return OpenAiChatModel.builder().apiKey(System.getenv("ALIYUN_KEY")).modelName("qwen-plus").baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1").timeout(Duration.ofSeconds(5)) // 向大模型发送请求时,如在指定时间内没有收到响应,该请求将被中断并报request timed out.build();}
}
总结
以上主要介绍了 LangChain4j 低阶和高阶Api、日志配置、监听器、重试机制、超时机制相关知识,想了解更多 LangChain4j 知识的小伙伴请参考 LangChain4j 官网 进行学习,学习更多 LangChain4j 实战实用技巧的小伙伴,请关注后期发布的文章,认真看完一定能让你有所收获。