longchain4j是比spring-ai更早出现的大模型相关工程开源框架,社区成熟,活跃度高。下面演示如何用longchain4j调用本地ollama

一、核心pom依赖

 1 <!-- LongChain4j Core -->
2 <dependency>
3 <groupId>dev.langchain4j</groupId>
4 <artifactId>langchain4j</artifactId>
5 <version>1.1.0</version>
6 </dependency>
7
8 <!-- LongChain4j Ollama Integration -->
9 <dependency>
10 <groupId>dev.langchain4j</groupId>
11 <artifactId>langchain4j-ollama</artifactId>
12 <version>1.1.0-rc1</version>
13 </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不同,longchain4j的流式响应,需要1个单独的模型StreamingChatModel

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

 

文中代码:

yjmyzz/longchain4j-study at day01 

参考:

longchain4j 学习系列(1)-ollama本地调用的更多相关文章

  1. Git学习系列之如何正确且高效地将本地项目上传到Github(图文详解)

    不多说,直接上干货! 首先你需要一个Github账号,所以还没有的话先去注册吧! https://github.com/ 见 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件 ...

  2. TortoiseGit学习系列之TortoiseGit基本操作将提交到本地的项目推送到在线仓库(图文详解)

    前面博客 TortoiseGit学习系列之TortoiseGit基本操作克隆项目(图文详解) TortoiseGit学习系列之TortoiseGit基本操作修改提交项目(图文详解) TortoiseG ...

  3. Spring Boot 2+gRPC 学习系列1:搭建Spring Boot 2+gRPC本地项目

    Spring Boot 2+gRPC 学习系列1:搭建Spring Boot 2+gRPC本地项目 https://blog.csdn.net/alinyua/article/details/8303 ...

  4. RabbitMQ学习系列(五): RPC 远程过程调用

    前面讲过一些RabbitMQ的安装和用法,也说了说RabbitMQ在一般的业务场景下如何使用.不知道的可以看我前面的博客,http://www.cnblogs.com/zhangweizhong/ca ...

  5. Dubbo源码学习总结系列二 dubbo-rpc远程调用模块

    dubbo本质是一个RPC框架,我们首先讨论这个骨干中的骨干,dubbo-rpc模块. 主要讨论一下几部分内容: 一.此模块在dubbo整体框架中的作用: 二.此模块需要完成的需求功能点及接口定义: ...

  6. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  7. MVC学习系列14--Bundling And Minification【捆绑和压缩】--翻译国外大牛的文章

    这个系列是,基础学习系列的最后一部分,这里,我打算翻译一篇国外的技术文章结束这个基础部分的学习:后面打算继续写深入学习MVC系列的文章,之所以要写博客,我个人觉得,做技术的,首先得要懂得分享,说不定你 ...

  8. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  9. 【深度学习系列3】 Mariana CNN并行框架与图像识别

    [深度学习系列3] Mariana CNN并行框架与图像识别 本文是腾讯深度学习系列文章的第三篇,聚焦于腾讯深度学习平台Mariana中深度卷积神经网络Deep CNNs的多GPU模型并行和数据并行框 ...

  10. 【深度学习系列2】Mariana DNN多GPU数据并行框架

    [深度学习系列2]Mariana DNN多GPU数据并行框架  本文是腾讯深度学习系列文章的第二篇,聚焦于腾讯深度学习平台Mariana中深度神经网络DNN的多GPU数据并行框架.   深度神经网络( ...

随机推荐

  1. FastAPI数据库连接池配置与监控

    title: FastAPI数据库连接池配置与监控 date: 2025/04/28 00:13:02 updated: 2025/04/28 00:13:02 author: cmdragon ex ...

  2. Java--Calendar类,Date类的简单使用,日期的格式化

    package demo; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; / ...

  3. 【经验】日常|WakeUp、Outlook、Google日历导入飞书日历

    以飞书团队账号登录时,设置的日历就能被团队其他成员看到(可选择私密.仅忙碌[默认].完全公开三种模式),以便相互查看空闲时间. Wakeup日历导出到Outlook日历 Wakeup支持从各大学校便利 ...

  4. 信息资源管理综合题之“H7N9禽流感-同学有无权利要求政府疫情进行信息公开 和 依据什么法律 和 相关法律的作用是什么 和 结合案例”

    一.案例:网络新闻报道某省有一名疑似H7N9禽流感病毒患者就医后不治身亡,于是刘苗红同学写信给该省政府,要求公开H7N9相应时期的信息 1.刘苗红同学有无权利要求省政府对H7N9疫情进行信息公开? 2 ...

  5. 采坑 - 字符串的 "" 与 pd.isnull()

    主要是记录一个采坑的过程. 当字符串 的 " " 和 pandas 中的 " " , NaN不是一个概念 . 需求 一个小伙伴要用 pandas 来处理一个, ...

  6. 探秘Transformer系列之(33)--- DeepSeek MTP

    探秘 Transformer系列之(33)--- DeepSeek MTP 目录 探秘 Transformer系列之(33)--- DeepSeek MTP 0x00 概述 0x01 EAGLE 1. ...

  7. 长短期记忆(LSTM)网络模型

    一.概述   长短期记忆(Long Short-Term Memory,LSTM)网络是一种特殊的循环神经网络(RNN),专门设计用于解决传统 RNN 在处理长序列数据时面临的梯度消失 / 爆炸问题, ...

  8. python 利用librosa库变声,声音变速

    wav文件可自定义,将wav文件放置在代码的同一目录下 文件要改名为gg. wav 声音变速: import librosa y,sr = librosa.load("gg.wav" ...

  9. sort等常用方法和技巧

    sort等常用方法和技巧 sort sort(first_pointer,first_pointer+n,cmp) 原理:sort并不是简单的快速排序,它对快速排序进行了优化.此外,它还结合了插入排序 ...

  10. Spring扩展接口-BeanPostProcessor

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...