注意:本篇文章建立在官方文档的理解上,文章会围绕官方文档去书写,博主会根据对框架的理解去动态修改文章内容,由于该框架的官方文档写的并不是很详细,市面上也没有特别详细的教程,所以博主也不能很全面的理解整个框架,但是对于入门来说,已经足够了,如果有看不懂的地方建议把全部文章都阅读一遍后再回顾会有不同的理解。
响应流(Response Streaming)
如果大家使用过AI工具,会发现AI工具在回答时是实时输出内容的,而不是我们上面那样一下就把内容全部返回,如果要实现流式输出就要用到本节的流式接口。
由于 LLMs 是逐个生成令牌(Token)的,因此许多 LLM 提供商支持令牌流式传输,以便响应可以逐步传递给用户,而不必等待完整内容生成完成。流式响应显著提升用户体验,因为用户可以即时读取 AI 的部分生成内容。
流式接口:StreamingChatLanguageModel 和 StreamingLanguageModel
在 ChatLanguageModel 和 LanguageModel 基础接口上,LangChain4j 提供了支持流式响应的 StreamingChatLanguageModel 和 StreamingLanguageModel 接口。这些接口的 API 类似,但可以实时接收生成的内容。
流式接口接受 StreamingResponseHandler 实现作为参数,定义了流式生成内容的处理方式:
public interface StreamingResponseHandler<T> {
void onNext(String token); // 每生成一个令牌时调用
default void onComplete(Response<T> response) {} // 完成生成时调用
void onError(Throwable error); // 发生错误时调用
}
StreamingResponseHandler 的使用
实现 StreamingResponseHandler 可实现以下操作:
- 生成下一个 Token 时:
onNext(String token),例如,将每个生成的令牌逐步传递到 UI。 - 当 LLM 完成生成时:
onComplete(Response<T> response)在 LLM 完成生成后调用,T对于StreamingChatLanguageModel是AiMessage,对于StreamingLanguageModel是String。Response包含完整的生成内容。 - 出错处理:
onError(Throwable error)在生成过程中出错时调用。
示例:使用 StreamingChatLanguageModel 实现流式响应
以下示例使用了 阿里云百炼 的 API Key,因为流式模型不支持测试key,并且在国内使用 OpenAI 接口时,需要进行代理,不然会报错 java.net.ConnectException: Failed to connect to api.openai.com/108.160.166.62:443。
public static void main(String[] args) {
// 创建一个 OpenAiStreamingChatModel 实例,这是 StreamingChatLanguageModel 的子类实现。
// 支持流式响应,即逐步接收和处理 AI 的生成内容
StreamingChatLanguageModel model = OpenAiStreamingChatModel.builder()
.apiKey("sk-xxx") // 设置 API 密钥,sk-xxx 是你的阿里百炼密钥,用于身份验证
.modelName("qwen-turbo") // 设置模型名称
.baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1") // 设置模型服务的 API 地址,此 URL 适用于阿里云百炼的兼容模式
.build(); // 构建模型实例
String userMessage = "给我讲一个笑话";
// 调用模型的 generate 方法,传入用户消息和一个 StreamingResponseHandler。
// StreamingResponseHandler 用于处理生成内容的流式响应。
model.generate(userMessage, new StreamingResponseHandler<AiMessage>() {
// onNext 方法会在每次接收到新的生成内容时被调用,这里的 token 是 AI 生成的每一部分内容。
@Override
public void onNext(String token) {
System.out.println("onNext: " + token); // 输出每个生成的内容片段
}
// onComplete 方法在生成完整的响应后被调用,response 包含完整的 AiMessage 对象。
@Override
public void onComplete(Response<AiMessage> response) {
System.out.println("onComplete: " + response); // 输出完整的生成内容
}
// onError 方法在生成过程中遇到错误时被调用,并输出错误堆栈信息。
@Override
public void onError(Throwable error) {
error.printStackTrace(); // 打印错误信息
}
});
}
baseUrl:该字段指定模型服务的网络访问点或 API 地址。它是访问服务所需的 URL。当你使用 OpenAI 兼容接口访问阿里云百炼时,需要配置baseUrl,以确保正确与服务交互。
更简洁的流式响应处理:LambdaStreamingResponseHandler
LambdaStreamingResponseHandler 允许通过 lambda 表达式处理响应流,进一步简化代码。
示例:仅处理 onNext
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNext;
String userMessage = "给我讲一个笑话";
model.generate(userMessage, onNext(System.out::print)); // 逐步打印生成内容
示例:处理 onNext 和 onError
onNextAndError() 方法允许你为 onNext() 和 onError() 事件定义操作:
import static dev.langchain4j.model.LambdaStreamingResponseHandler.onNextAndError;
String userMessage = "给我讲一个笑话";
model.generate(userMessage, onNextAndError(System.out::print, Throwable::printStackTrace)); // 逐步打印内容,并在出错时打印堆栈信息
LambdaStreamingResponseHandler 提供了一种便捷方式,可以通过 lambda 表达式直接指定如何处理生成的内容和错误,使代码更加简洁易读。
响应流&spm=1001.2101.3001.5002&articleId=144531460&d=1&t=3&u=f936530abdc24f71b693a5be7161f2f2)
923

被折叠的 条评论
为什么被折叠?



