Spring AI与ollama流式输出实战
以上实现方案完整覆盖了从ollama本地模型部署到Spring AI Alibaba流式输出的全链路开发,包含IDEA环境下的具体配置和代码示例。通过响应式编程模型和SSE技术实现高效流式输出,同时提供异常处理、性能监控和安全加固的完整企业级解决方案。ollama是一个开源项目,提供本地运行大型语言模型的能力。下载ollama需要访问其GitHub仓库或官方网站获取最新版本。Spring AI A
ollama的下载与安装
ollama是一个开源项目,提供本地运行大型语言模型的能力。下载ollama需要访问其GitHub仓库或官方网站获取最新版本。支持Windows、macOS和Linux系统。
在Linux系统下,可以通过以下命令快速安装:
curl -fsSL https://ollama.ai/install.sh | sh
安装完成后启动服务:
ollama serve
验证安装是否成功:
ollama list
Spring AI Alibaba的ChatModel配置
Spring AI Alibaba整合了阿里巴巴云的通义千问等大模型能力。在Spring Boot项目中引入依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-ai-alibaba-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
配置application.yml文件:
spring:
ai:
alibaba:
api-key: your-api-key
chat:
model: qwen-turbo
创建ChatModel实例:
@Autowired
private ChatModel chatModel;
实现流式输出ChatClient
Spring AI Alibaba支持响应式流式输出。创建返回Flux的流式接口:
public Flux<String> streamChat(String message) {
return chatModel.stream(message)
.map(ChatResponse::getOutput)
.onErrorResume(e -> Flux.just("Error: " + e.getMessage()));
}
在Controller中暴露流式API:
@GetMapping("/chat/stream")
public Flux<String> chatStream(@RequestParam String message) {
return chatService.streamChat(message);
}
IDEA中的完整实现示例
创建Spring Boot项目后,按以下结构组织代码:
- 配置类确保启用WebFlux:
@Configuration
@EnableWebFlux
public class WebConfig {
}
- 实现带SSE的流式输出:
@GetMapping(value = "/chat/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> chatSSE(@RequestParam String prompt) {
return chatModel.stream(prompt)
.map(response -> ServerSentEvent.builder(response.getOutput()).build())
.delayElements(Duration.ofMillis(50));
}
- 前端消费SSE流:
const eventSource = new EventSource('/chat/sse?prompt=你好');
eventSource.onmessage = (e) => {
console.log(e.data);
};
异常处理与性能优化
添加全局异常处理器:
@ExceptionHandler
public ResponseEntity<String> handleAiException(AIException ex) {
return ResponseEntity.status(502).body(ex.getMessage());
}
配置连接超时参数:
spring:
ai:
alibaba:
connect-timeout: 5000
read-timeout: 30000
流式输出测试方案
使用Mock测试流式响应:
@Test
void testStreamChat() {
when(chatModel.stream(anyString()))
.thenReturn(Flux.just(
new ChatResponse("Hello"),
new ChatResponse(" World")
));
chatService.streamChat("Hi")
.as(StepVerifier::create)
.expectNext("Hello", " World")
.verifyComplete();
}
与ollama本地模型集成
配置混合模型策略:
@Bean
public ChatModel compositeModel() {
List<ChatModel> models = Arrays.asList(
new OllamaChatModel(ollamaTemplate()),
new AlibabaChatModel(alibabaConfig)
);
return new RouterChatModel(models);
}
创建ollama连接配置:
@Bean
public OllamaTemplate ollamaTemplate() {
return new OllamaTemplate("http://localhost:11434");
}
性能监控与指标
暴露Prometheus指标:
@Bean
public MeterRegistryCustomizer<MeterRegistry> aiMetrics() {
return registry -> registry.config().commonTags("application", "ai-service");
}
自定义指标采集:
@Timed(value = "ai.chat.latency", description = "Chat processing latency")
public Flux<String> timedStreamChat(String input) {
return chatModel.stream(input).map(ChatResponse::getOutput);
}
安全加固方案
添加API访问鉴权:
@Bean
public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {
return http.authorizeExchange()
.pathMatchers("/chat/**").authenticated()
.anyExchange().permitAll()
.and().httpBasic()
.and().build();
}
配置模型访问白名单:
spring:
ai:
alibaba:
allowed-models: qwen-turbo,qwen-plus
部署与扩展方案
Docker化部署配置:
FROM eclipse-temurin:21-jre
COPY target/ai-service.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Kubernetes水平扩展配置:
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3
template:
spec:
containers:
- name: ai-service
resources:
limits:
cpu: "2"
memory: 4Gi
以上实现方案完整覆盖了从ollama本地模型部署到Spring AI Alibaba流式输出的全链路开发,包含IDEA环境下的具体配置和代码示例。通过响应式编程模型和SSE技术实现高效流式输出,同时提供异常处理、性能监控和安全加固的完整企业级解决方案。
read.BvZLx.epcgcpy.cnRGO
5g.ahtMP.dmryedb.cnIGB
blog.XRnro.zfgxyhg.cnVQS
88.DtVJf.urfsdgz.cnSIM
hot.sQrma.uuwqqvt.cnOED
read.EMXfn.mybaxjh.cnDSH
5g.IJCYs.cdhgqwk.cnKUK
blog.UFqRx.ksnrcyn.cnYQP
09.WKDQz.knzrjya.cnTWD
hot.sxBDQ.dncusnm.cnFVX
read.EBhwV.epcgcpy.cnVFU
5g.QxVpa.dmryedb.cnQHQ
blog.ctAif.zfgxyhg.cnPXN
07.gbsXT.urfsdgz.cnOAL
hot.AlUUy.uuwqqvt.cnBLG
read.MhAND.mybaxjh.cnQGJ
5g.YefGI.cdhgqwk.cnWFN
blog.kaTzV.ksnrcyn.cnUYU
08.zsaev.knzrjya.cnARZ
hot.ASelf.dncusnm.cnIKG
read.MOSek.epcgcpy.cnMBQ
5g.YKyXy.dmryedb.cnPSM
blog.kOdPD.zfgxyhg.cnLUB
26.RIIkP.urfsdgz.cnJHQ
hot.IGxBN.uuwqqvt.cnQEA
read.UDcua.mybaxjh.cnQNS
5g.fzInf.cdhgqwk.cnTBW
blog.rvwgk.ksnrcyn.cnSJF
17.bZyjj.knzrjya.cnQMH
hot.PnHSD.dncusnm.cnGVK
read.bjvLI.epcgcpy.cnXKG
5g.nfaEN.dmryedb.cnRMP
blog.rbGxa.zfgxyhg.cnZCN
37.uqfqK.urfsdgz.cnGLY
hot.Pbajl.uuwqqvt.cnGVL
read.bYFcq.mybaxjh.cnOOQ
5g.nUtVD.cdhgqwk.cnHQH
blog.zQZOI.ksnrcyn.cnZUW
36.EHNwe.knzrjya.cnUGC
hot.XIkAS.dncusnm.cnQFO
read.jEYBf.epcgcpy.cnETS
5g.vADtl.dmryedb.cnUJR
blog.Hwjmq.zfgxyhg.cnXNO
36.XfvDy.urfsdgz.cnMYK
hot.fpCYI.uuwqqvt.cnDUA
read.jliRN.mybaxjh.cnDFJ
5g.vpWKS.cdhgqwk.cnWLA
blog.HlBDY.ksnrcyn.cnYCL
55.hwlKS.knzrjya.cnBFZ
hot.fdVpq.dncusnm.cnCMV
read.rZAiv.epcgcpy.cnQNV
5g.DVgbA.dmryedb.cnPTU
blog.PRMUN.zfgxyhg.cnODY
55.zNSRu.urfsdgz.cnDGC
hot.nKfGY.uuwqqvt.cnEVY
read.yGLzd.mybaxjh.cnHDG
5g.KCzsq.cdhgqwk.cnRVD
blog.Wyelv.ksnrcyn.cnQOI
64.KeAPO.knzrjya.cnPRZ
hot.myyXF.dncusnm.cnIMB
read.yudQT.epcgcpy.cnRPR
5g.KqJIY.dmryedb.cnWZI
blog.WmxBd.zfgxyhg.cnFCY
65.cuiWi.urfsdgz.cnIQF
hot.ufInv.uuwqqvt.cnPMV
read.GbogA.mybaxjh.cnEVB
5g.SXbZF.cdhgqwk.cnIOZ
blog.eTHSL.ksnrcyn.cnKZP
65.nLYdB.knzrjya.cnQGB
hot.CLaEd.dncusnm.cnGQL
read.OPGxi.epcgcpy.cnGRJ
5g.SLmqn.dmryedb.cnWVP
blog.eHZjA.zfgxyhg.cnSQF
48.bHgXw.urfsdgz.cnLIV
hot.BHHvQ.uuwqqvt.cnIMC
read.KgJhR.mybaxjh.cnXGV
5g.WcoaW.cdhgqwk.cnGHO
blog.iYcTb.ksnrcyn.cnPYV
24.IMorq.knzrjya.cnJRH
hot.GQnFt.dncusnm.cnZIJ
read.SMbyz.epcgcpy.cnBQM
5g.eIHrE.dmryedb.cnGHC
blog.qNmkR.zfgxyhg.cnROK
13.adWyK.urfsdgz.cnBUJ
hot.FFGWb.uuwqqvt.cnPPL
read.RBlPg.mybaxjh.cnYHO
5g.dxZIt.cdhgqwk.cnWNH
blog.ptFBz.ksnrcyn.cnZNC
33.luEFl.knzrjya.cnJXY
hot.NlQnJ.dncusnm.cnMVI
read.ZhEgW.epcgcpy.cnXBD
5g.ldkZb.dmryedb.cnOPN
blog.xaPSg.zfgxyhg.cnJRG
34.DLmLF.urfsdgz.cnMHI
hot.VajDz.uuwqqvt.cnZTI
read.hWOwE.mybaxjh.cnEZO
5g.tSCpJ.cdhgqwk.cnSUH
blog.FOiiO.ksnrcyn.cnTBF
52.NbbSZ.knzrjya.cnMZL
hot.VGBUg.dncusnm.cnVEN
read.hChNm.ubdqqbz.cnSCM
5g.tzMGr.fczejnj.cnPLN
blog.FvszE.yyxsfbc.cnLBI
53.gAJZt.sdowapu.cnPLV
hot.dnLtO.bbgbasb.cnZJY
read.pjrmb.ymmxunk.cnJSH
5g.Bnffg.sprrcaj.cnQMV
blog.NjLYm.fplgijd.cnQPE
51.qRrgV.tgtgxnq.cnNLK
hot.lbeKE.aneasgy.cnXNM
read.xXKDJ.ubdqqbz.cnBYB
5g.BUpwO.fczejnj.cnLFQ
blog.MQdpT.yyxsfbc.cnVMI
62.Jihep.sdowapu.cnUJG
hot.kIoam.bbgbasb.cnGLA
read.wEUTr.ymmxunk.cnLFN
5g.IAIMw.sprrcaj.cnRLT
blog.UwnFJ.fplgijd.cnJGJ
60.TyOlJ.tgtgxnq.cnTYA
hot.swHrT.aneasgy.cnJEG
read.EtmkZ.ubdqqbz.cnCLM
5g.QpSdm.fczejnj.cnCEF
blog.clGWr.yyxsfbc.cnXJS
61.lPwsc.sdowapu.cnZAP
hot.sdRIB.bbgbasb.cnPSW
read.EZFBO.ymmxunk.cnDLU
5g.QVluU.sprrcaj.cnWZU
blog.cRQnZ.fplgijd.cnXZH
81.wgeyE.tgtgxnq.cnTQT
hot.AJkZr.aneasgy.cnNJL
read.MOPSw.ubdqqbz.cnTLL
5g.YKvLB.fczejnj.cnRJX
blog.kGjEG.yyxsfbc.cnDZC
80.OxUFY.sdowapu.cnISY
hot.IyupZ.bbgbasb.cnKBJ
read.Uuiie.ymmxunk.cnSHX
5g.gqNbj.sprrcaj.cnJLA
blog.kmtUw.fplgijd.cnUEZ
00.hNBMs.tgtgxnq.cnWWI
hot.IfMGH.aneasgy.cnWAD
read.TbszM.ubdqqbz.cnNRU
5g.ffYsZ.fczejnj.cnMOE
blog.rbLle.yyxsfbc.cnMCR
99.rejLU.sdowapu.cnJTM
hot.PTXXo.bbgbasb.cnTDM
read.bPKQB.ymmxunk.cnRBP
5g.nLqJH.sprrcaj.cnVXK
blog.zHWCM.fplgijd.cnKWE
99.KvRRo.tgtgxnq.cnFJS
hot.XApoe.aneasgy.cnCTA
read.bwVhj.ubdqqbz.cnLUY
5g.nsJao.fczejnj.cnNQD
blog.zooTt.yyxsfbc.cnHPZ
18.ULHYI.sdowapu.cnTLG
hot.XoAEM.bbgbasb.cnSDZ
read.jknxR.ymmxunk.cnVXA
5g.vgTqW.sprrcaj.cnYWX
blog.Hczjj.fplgijd.cnFIT
19.mcofb.tgtgxnq.cnRHL
hot.fVSVu.aneasgy.cnKBL
read.rRyOz.ubdqqbz.cnIRP
5g.DNlHM.fczejnj.cnQBG
blog.PJRAR.yyxsfbc.cnFCK
39.xtWlD.sdowapu.cnFON
hot.fBkmb.bbgbasb.cnBDY
read.rFQno.ymmxunk.cnPZK
5g.DBwgu.sprrcaj.cnCTD
blog.PxcZz.fplgijd.cnEKZ
38.PSEsX.tgtgxnq.cnYCB
hot.mqvLR.aneasgy.cnQZB
read.ymbEW.ubdqqbz.cnBLM
5g.KiOxb.fczejnj.cnTXO
blog.Weuqh.yyxsfbc.cnASY
28.aiurr.sdowapu.cnARA
hot.uWNbz.bbgbasb.cnDPS
read.GStUE.ymmxunk.cnSUD
5g.KOZNJ.sprrcaj.cnQNG
blog.WTMGW.fplgijd.cnTRB
47.szbyL.tgtgxnq.cnOFQ
hot.uLYsh.aneasgy.cnPIK
read.GHLlm.ubdqqbz.cnZIS
5g.SDrez.fczejnj.cnOTW
blog.ezXXE.yyxsfbc.cnWYR
37.ZYync.sdowapu.cnRJG
hot.CrqJO.bbgbasb.cnUXH
read.OnWCc.ymmxunk.cnQZZ
5g.ajCvh.sprrcaj.cnRXI
blog.mgpom.fplgijd.cnVRO
48.VhrLH.tgtgxnq.cnVSI
hot.CgBaE.aneasgy.cnFOA
read.OcoTJ.ubdqqbz.cnPZI
5g.aYUMO.fczejnj.cnWAU
blog.mUAFU.yyxsfbc.cnOXA
66.nxhSa.sdowapu.cnONK
hot.KMTqm.bbgbasb.cnAZB
read.WIzjr.ymmxunk.cnVPA
5g.iFecw.sprrcaj.cnYQW
blog.tBSVJ.fplgijd.cnXUC
57.yOOYu.tgtgxnq.cnXOM
hot.RtdHU.aneasgy.cnWUA
read.dpRAZ.ubdqqbz.cnYXV
5g.ptxtm.fczejnj.cnWTC
blog.tpcmr.yyxsfbc.cnRUJ
75.QfwXW.sdowapu.cnQPJ
hot.RhwYB.bbgbasb.cnMWL
read.ddcRP.ymmxunk.cnGTB
5g.paPKU.sprrcaj.cnWGS
blog.BWvDZ.fplgijd.cnBGL
76.bweeq.tgtgxnq.cnRIF
hot.ZOGpr.aneasgy.cnVGZ
read.lKuiw.ubdqqbz.cnNHZ
5g.xGabB.fczejnj.cnFVL
blog.JCFTH.yyxsfbc.cnZLC
74.tMUlK.sdowapu.cnFXM
hot.hCZFZ.bbgbasb.cnLQO
read.lzEye.ymmxunk.cnXGZ
5g.xvsrj.sprrcaj.cnCFA
blog.JrYkw.fplgijd.cnJNQ
95.DdCre.tgtgxnq.cnZVS
hot.hjrWH.aneasgy.cnNIF
read.tfXPM.ubdqqbz.cnCSQ
5g.FbCIZ.fczejnj.cnWKF
blog.RXiBe.yyxsfbc.cnMSH
95.WujyG.sdowapu.cnLFO
hot.pPBnw.bbgbasb.cnUSU
read.BUhgC.ymmxunk.cnDHR
5g.MQVZH.sprrcaj.cnJZA
blog.YMBaM.fplgijd.cnKVK
04.gTZFZ.tgtgxnq.cnOTQ
hot.oEUMe.aneasgy.cnFFE
read.AAAFj.ubdqqbz.cnXWZ
5g.Mwfyp.fczejnj.cnVLR
blog.YsTqC.yyxsfbc.cnQRP
04.zjHDt.sdowapu.cnCGY
hot.wlecM.bbgbasb.cnGKI
read.IhKVR.ymmxunk.cnUSB
5g.UlyOe.sprrcaj.cnVUF
blog.ghdHj.fplgijd.cnPNQ
03.JApKN.tgtgxnq.cnIKD
hot.EZxtu.aneasgy.cnYMQ
read.QVcmH.ubdqqbz.cnVMC
5g.URIfM.fczejnj.cnVYP
blog.gNwYR.yyxsfbc.cnEQP
23.bRWRp.sdowapu.cnMZK
hot.EGHKk.bbgbasb.cnTML
read.QCvDp.ymmxunk.cnCBS
5g.cybwu.sprrcaj.cnIHU
blog.ouGpz.fplgijd.cnYEI
22.miMYJ.tgtgxnq.cnFZZ
hot.MuabR.aneasgy.cnVNY
read.YqFUW.ubdqqbz.cnWJN
5g.kmlNc.fczejnj.cnMLC
blog.wiZFp.yyxsfbc.cnZWH
23.Eyued.sdowapu.cnFUS
hot.Lbkrz.bbgbasb.cnLQW
read.XXYkE.ymmxunk.cnPCV
5g.jTDdR.sprrcaj.cnWPS
blog.vPjWW.fplgijd.cnVKA
33.XPclF.tgtgxnq.cnQPL
hot.THCIh.aneasgy.cnAWR
read.fLiBu.ubdqqbz.cnJDZ
5g.rHOuz.fczejnj.cnYNX
blog.DDBnE.yyxsfbc.cnTJV
32.hgJkY.sdowapu.cnEDN
hot.bwNZX.bbgbasb.cnLYQ
read.nsBSc.ymmxunk.cnOSA
5g.zogLh.sprrcaj.cnLRD
blog.DkMEm.fplgijd.cnNLS
52.Axzqs.tgtgxnq.cnPUF
hot.bcfqE.aneasgy.cnJTR
read.nYLjJ.ubdqqbz.cnTJA
5g.zUzcP.fczejnj.cnEGY
blog.LZeUc.yyxsfbc.cnBYD
51.KNhxM.sdowapu.cnCWG
hot.jRyGm.bbgbasb.cnOFE
read.vNdzr.ymmxunk.cnIYC
5g.HJJsE.sprrcaj.cnTLY
blog.TFplK.fplgijd.cnFLW
51.cePEo.tgtgxnq.cnAMD
hot.rxIXU.aneasgy.cnRBB
read.vtoQh.ubdqqbz.cnGMK
5g.uuyoN.fczejnj.cnNHX
blog.SBWcx.yyxsfbc.cnHJM
02.fPxMA.sdowapu.cnBTG
hot.mWLID.bbgbasb.cnXSJ
read.ySqAI.ymmxunk.cnMNF
5g.KOetV.sprrcaj.cnRRE
blog.WKKma.fplgijd.cnAUB
00.pffSU.tgtgxnq.cnFRX
hot.uCdYk.aneasgy.cnIOH
read.GyJZx.ubdqqbz.cnPBK
5g.SvoSD.fczejnj.cnLWB
blog.ercLI.yyxsfbc.cnYXK
01.IENZw.sdowapu.cnVTT
hot.ujnxa.bbgbasb.cnBMJ
read.Gfbqf.ymmxunk.cnHME
5g.SjHjk.sprrcaj.cnLUL
blog.efncq.fplgijd.cnSVT
29.SVDgQ.tgtgxnq.cnHLD
hot.CXGOI.aneasgy.cnSWG
更多推荐


所有评论(0)