Langchain4j-1-流式输出

流式输出
参考文档:

前置准备

  1. 导入响应式编程依赖包:
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-reactor</artifactId>
    <version>1.0.0-beta3</version>
</dependency>
  1. 配置文件设置字符集:
# 设置响应的字符编码,避免流式返回输出乱码  
server.servlet.encoding.charset=utf-8  
server.servlet.encoding.enabled=true  
server.servlet.encoding.force=true
  1. StreamingChatResponseHandler 处理流式事件:
public interface StreamingChatResponseHandler {

    void onPartialResponse(String partialResponse);

    void onCompleteResponse(ChatResponse completeResponse);

    void onError(Throwable error);
}

通过实现 StreamingChatResponseHandler,可以为以下事件定义操作:

  • 当生成下一个部分响应时:调用 onPartialResponse(String partialResponse)。可以在标记可用时立即将其发送到 UI。
  • 当 LLM 完成生成时:调用 onCompleteResponse(ChatResponse completeResponse)。 ChatResponse 对象包含完整的响应(AiMessage)以及 ChatResponseMetadata
  • 当发生错误时:调用 onError(Throwable error)

原生使用

  • LanguageModel -> StreamingLanguageModel
  • ChatLanguageModel -> StreamingChatLanguageModel
// Config.java
@Configuration  
public class LLMConfig  
{
	// 流式对话接口 StreamingChatModel  
	@Bean  
	public StreamingChatModel streamingChatModel(){  
	    return OpenAiStreamingChatModel.builder()  
	                .apiKey(System.getenv("ALIQWEN_API"))  
	                .modelName("qwen-plus")  
	                .baseUrl("https://dashscope.aliyuncs.com/compatible-mode/v1")  
	            .build();  
	}
}

// Controller.java
@RestController  
@Slf4j  
public class StreamingChatModelController  
{  
    @Resource //直接使用 low-level LLM API    
    private StreamingChatModel streamingChatLanguageModel;  
  
    // http://localhost:9007/chatstream/chat?prompt=天津有什么好吃的  
    @GetMapping(value = "/chatstream/chat")  
    public Flux<String> chat(@RequestParam("prompt") String prompt)  
    {  
        System.out.println("---come in chat");  
  
        return Flux.create(emitter -> {  
            streamingChatLanguageModel.chat(prompt, new StreamingChatResponseHandler()  
            {  
                @Override  
                public void onPartialResponse(String partialResponse)  
                {  
                    emitter.next(partialResponse);  
                }  
  
                @Override  
                public void onCompleteResponse(ChatResponse completeResponse)  
                {  
                    emitter.complete();  
                }  
  
                @Override  
                public void onError(Throwable throwable)  
                {  
                    emitter.error(throwable);  
                }  
            });  
        });  
    }

AI Services 使用

  • 接口签名为:Flux<String> chatFlux(String prompt);
  • 传递 streamingChatModel 创建
// ChatAssistant.java
public interface ChatAssistant  
{  
    String chat(String prompt);  
  
    Flux<String> chatFlux(String prompt);  
}

// Config.java
@Configuration
public class LLMConfig  
{
	@Bean  
	public ChatAssistant chatAssistant(StreamingChatModel streamingChatModel){  
	    return AiServices.create(ChatAssistant.class, streamingChatModel);  
	}
}
posted @ 2025-08-17 18:03  Miaops  阅读(241)  评论(0)    收藏  举报