LangChain4j 基础系列

LangChain4j 基础 01:Ollama 本地模型与流式调用

配置 Ollama 聊天模型与流式模型,了解 Spring 配置和 HTTP 调用入口。

本讲用 LangChain4j 调用 Ollama,依次配置依赖、聊天模型、流式模型和 API 入口。

Maven 核心依赖

<!-- LongChain4j Core -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j</artifactId>
    <version>1.1.0</version>
</dependency>

<!-- LongChain4j Ollama Integration -->
<dependency>
    <groupId>dev.langchain4j</groupId>
    <artifactId>langchain4j-ollama</artifactId>
    <version>1.1.0-rc1</version>
</dependency>

注入对应实例

@Configuration
public class OllamaConfig {

    @Value("${ollama.base-url:http://localhost:11434}")
    private String ollamaBaseUrl;

    @Value("${ollama.model:qwen3:0.6b}")
    private String ollamaModel;

    @Value("${ollama.timeout:60}")
    private Integer timeoutSeconds;

    /**
     * 配置Ollama聊天模型
     *
     * @return ChatLanguageModel实例
     */
    @Bean
    public ChatModel chatModel() {
        return OllamaChatModel.builder()
                .baseUrl(ollamaBaseUrl)
                .modelName(ollamaModel)
                .timeout(Duration.ofSeconds(timeoutSeconds))
                .logRequests(true)
                .logResponses(true)
                .build();
    }

    @Bean
    public StreamingChatModel streamingChatModel() {
        return OllamaStreamingChatModel.builder()
                .baseUrl(ollamaBaseUrl)
                .modelName(ollamaModel)
                .timeout(Duration.ofSeconds(timeoutSeconds))
                .logRequests(true)
                .logResponses(true)
                .build();
    }
} 

原文在当时版本下将流式接口与 Spring AI 作了比较。本例为流式响应单独配置 StreamingChatModel,调用入口见下面的 API 示例。

YAML 配置

server:
  port: 8080
  servlet:
    context-path: /

spring:
  application:
    name: longchain4j-study
  
  # 日志配置
  logging:
    level:
      com.example.longchain4jstudy: DEBUG
      dev.langchain4j: DEBUG
    pattern:
      console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

# Ollama配置
ollama:
  base-url: http://localhost:11434
  model: qwen3:0.6b
  timeout: 60

# 应用信息
info:
  app:
    name: LongChain4j Study
    version: 1.0.0
    description: LongChain4j学习项目 - 集成Ollama聊天示例 

API示例

    @Autowired
    private ChatModel chatModel;

    @Autowired
    private StreamingChatModel streamingChatModel;

    /**
     * 发送聊天消息(GET方式)
     *
     * @param prompt 用户输入的消息
     * @return 聊天响应
     */
    @GetMapping(value = "/chat", produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<String> chat(@RequestParam String prompt) {
        log.info("收到聊天请求: {}", prompt);

        try {
            String aiResponse = chatModel.chat(prompt);
            return ResponseEntity.ok(aiResponse);

        } catch (Exception e) {
            log.error("与Ollama通信时发生错误", e);
            String errorResponse = "抱歉,处理您的请求时发生了错误: " + e.getMessage();
            return ResponseEntity.ok(errorResponse);
        }
    }

    /**
     * 流式聊天消息(GET方式)
     *
     * @param prompt 用户输入的消息
     * @return 流式聊天响应
     */
    @GetMapping(value = "/chat/stream", produces = "text/html;charset=utf-8")
    public Flux<String> chatStream(@RequestParam String prompt) {
        log.info("收到流式聊天请求: {}", prompt);

        Sinks.Many<String> sink = Sinks.many().unicast().onBackpressureBuffer();

        streamingChatModel.chat(prompt, new StreamingChatResponseHandler() {
            @Override
            public void onPartialResponse(String s) {
                log.info("收到部分响应: {}",s);
                // 发送SSE格式的数据
                sink.tryEmitNext(escapeToHtml(s));
            }

            @Override
            public void onCompleteResponse(ChatResponse chatResponse) {
                log.info("流式响应完成");
                sink.tryEmitComplete();
            }

            @Override
            public void onError(Throwable throwable) {
                log.error("流式响应发生错误", throwable);
                sink.tryEmitError(throwable);
            }
        });

        return sink.asFlux();
    }

原文运行效果

Ollama 本地模型与流式调用示意 1

原文配图:Ollama 本地模型与流式调用示意 1。

Ollama 本地模型与流式调用示意 2

原文配图:Ollama 本地模型与流式调用示意 2。

文中代码:

yjmyzz/LangChain4j-study at day01 

参考:

LangChain4j 官方文档

原文引用的中文参考站

原文背景说明

原文认为 LangChain4j 比 Spring AI 出现更早,社区较成熟、活跃。这是作者当时的背景评价,本次未重新核验社区情况。聊天和流式响应的实现以本讲配置的模型接口为准。