Dict.CN 在线词典, 英语学习, 在线翻译 ------------- MyGitee My腾云code My51cto

Happy_EveryDay

可以平凡 不可以平庸 无爱则无忧,无欲则无求,无怒而无敌,无怨才是佛。所有烦恼,都是放不下的执著 开源技群 328035181 MyGitee

博客园 首页 管理

 

image

 

 

 

 

 

1、pom

<properties>
<java.version>17</java.version>
<spring-ai.version>2.0.0-M7</spring-ai.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-ollama</artifactId>
</dependency>
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>${spring-ai.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

 

 

2、application.yml

2.1

${OPENAI_API_KEY}

image

 

 2.2

ollama docker容器

宿主机:192.168.91.164

image

 

容器ollama启动模型qwen2.5:0.5b

image

 

访问宿主机模型

http://192.168.91.164:11434/   

image

 

 

 

 

 

 

 

spring:
application:
name: dashscope18088
ai:
openai:
api-key: ${OPENAI_API_KEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
chat:
model: qwen3.6-plus
# chat:
# model: qwen3.6-plus
# 可选:超时/重试配置
ollama:
base-url: http://192.168.91.164:11434
chat:
model: qwen2.5:0.5b
# options:
# temperature: 0.7
# max-tokens: 2000
server:
port: 18088

#.defaultAdvisors(new MySimpleLoggerAdvisor())//添加日志拦截器
logging:
level:
org.springframework.ai: debug



3、advisor

import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import reactor.core.publisher.Flux;

/**
* 实现CallAdvisor和StreamAdvisor接口,同时支持两种模式
*/
public class MySimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {
@Override
public ChatClientResponse adviseCall(ChatClientRequest request, CallAdvisorChain chain) {
System.out.println("发送请求前:" + request);
ChatClientResponse response = chain.nextCall(request);
System.out.println("接收到响应:" + response);
return response;
}

@Override
public Flux<ChatClientResponse> adviseStream(ChatClientRequest request, StreamAdvisorChain chain) {
System.out.println("发送流式请求:" + request);
return chain.nextStream(request)
.doOnNext(response -> System.out.println("收到流式响应片段:" + response));
}

@Override
public String getName() {
return "简单日志Advisor";
}

/**
* 这个 getOrder() 方法用于指定 Advisor(通知器)的执行顺序。
* 作用说明:
* 返回值越小,优先级越高,越早执行
* 返回 0 表示高优先级
* 如果有多个 Advisor,Spring AI 会按照此值从小到大依次执行
* @return
*/
@Override
public int getOrder() {
return 0;
}
}

4、config

import com.sb.dashscope18088.advisor.MySimpleLoggerAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AiConfiguration {

@Bean
public ChatClient chatClient(OpenAiChatModel model){
return ChatClient
.builder(model) // 创建ChatClient对象,以及设置模型model
.defaultAdvisors(new MySimpleLoggerAdvisor())//添加日志拦截器
//.defaultAdvisors(new SimpleLoggerAdvisor())//内置日志拦截器
.build(); // 构建ChatClient对象
}

@Bean
public ChatClient chatClient2(OllamaChatModel model){
return ChatClient
.builder(model) // 创建ChatClient对象,以及设置模型model
.defaultAdvisors(new MySimpleLoggerAdvisor())//添加日志拦截器
.build(); // 构建ChatClient实例
}
}

 

 

5、controller

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class MyAiChatController {

@Autowired
private ChatClient chatClient;

@Autowired
private ChatClient chatClient2;

@RequestMapping("/ai")
public String ai(String question){
return chatClient.prompt() // 创建 Prompt 对象,用于构建聊天请求
.user(question) // 设置用户输入
.call() // 调用模型,返回结果
.content(); // 获取结果内容
}

/**
* ollama
* @param question
* @return
*/
@RequestMapping("/ai2")
public String ai2(String question){
return chatClient2.prompt() // 创建 Prompt 对象,用于构建聊天请求
.user(question) // 设置用户输入
.call() // 调用模型,返回结果
.content(); // 获取结果内容
}

/**
* ollama
* @param question
* @return
*/
@RequestMapping(value = "/ai3",produces = "text/html;charset=UTF-8")
public Flux<String> ai3(String question){
return chatClient2.prompt() // 创建 Prompt 对象,用于构建聊天请求
.user(question) // 设置用户输入
.stream() // 流式响应输出
.content(); // 获取结果内容
}
}

 

 

6、访问

   调用ollam模型 http://localhost:18088/ai2?question=你是谁?

image

 

发送请求前:ChatClientRequest[prompt=Prompt{messages=[UserMessage{content='你是谁?', metadata={messageType=USER}, messageType=USER}], modelOptions=org.springframework.ai.ollama.api.OllamaChatOptions@4ba55f9}, context={}]
接收到响应:ChatClientResponse[chatResponse=ChatResponse [metadata={ id: , usage: DefaultUsage{promptTokens=32, completionTokens=68, totalTokens=100}, rateLimit: org.springframework.ai.chat.metadata.EmptyRateLimit@13c1dc2c }, generations=[Generation[assistantMessage=AssistantMessage [messageType=ASSISTANT, toolCalls=[], textContent=我是Qwen,一个由阿里云开发的超大规模语言模型,我被命名为"通义千问"。我的英文名是GPT,中文名称为通义千问。我是阿里巴巴集团研发的AI助手,专门负责回答各种问题和提供信息。如果你有任何疑问或需要帮助,请随时告诉我!, metadata={messageType=ASSISTANT}], chatGenerationMetadata=DefaultChatGenerationMetadata[finishReason='stop', filters=0, metadata=0]]]], context={}]

 

 

 

 

 

 

 

 

 

 

 http://localhost:18088/ai?question=你是谁?

image

 

发送请求前:ChatClientRequest[prompt=Prompt{messages=[UserMessage{content='你是谁?', metadata={messageType=USER}, messageType=USER}], modelOptions=OpenAiChatOptions{model='qwen3.6-plus, frequencyPenalty=null, logitBias=null, logprobs=null, topLogprobs=null, maxTokens=null, maxCompletionTokens=null, n=null, outputModalities=null, outputAudio=null, presencePenalty=null, responseFormat=null, streamOptions=null, streamUsage=, seed=null, stop=null, temperature=null, topP=null, toolChoice=null, user='null', parallelToolCalls=null, store=null, metadata=null, reasoningEffort='null', verbosity='null', serviceTier='null', extraBody=null, toolCallbacks=[], toolNames=[], internalToolExecutionEnabled=null, toolContext={}}}, context={}]
接收到响应:ChatClientResponse[chatResponse=ChatResponse [metadata={ id: chatcmpl-ea261beb-99b9-92be-bb3d-a34f6ed63bab, usage: DefaultUsage{promptTokens=12, completionTokens=229, totalTokens=241}, rateLimit: org.springframework.ai.chat.metadata.EmptyRateLimit@7962b136 }, generations=[Generation[assistantMessage=AssistantMessage [messageType=ASSISTANT, toolCalls=[], textContent=我是 Qwen(通义千问),由阿里巴巴集团旗下通义实验室研发的大语言模型。有什么我可以帮你的吗?, metadata={role=assistant, messageType=ASSISTANT, refusal=, finishReason=STOP, annotations=[{}], index=0, id=chatcmpl-ea261beb-99b9-92be-bb3d-a34f6ed63bab}], chatGenerationMetadata=DefaultChatGenerationMetadata[finishReason='STOP', filters=0, metadata=0]]]], context={}]

 

 

 

 

 

 

 

 

 

 

 

 流式 http://localhost:18088/ai3?question=你好?

 

image

 





发送流式请求:ChatClientRequest[prompt=Prompt{messages=[UserMessage{content='你好', metadata={messageType=USER}, messageType=USER}], modelOptions=OpenAiChatOptions{model='qwen3.6-plus, frequencyPenalty=null, logitBias=null, logprobs=null, topLogprobs=null, maxTokens=null, maxCompletionTokens=null, n=null, outputModalities=null, outputAudio=null, presencePenalty=null, responseFormat=null, streamOptions=null, streamUsage=, seed=null, stop=null, temperature=null, topP=null, toolChoice=null, user='null', parallelToolCalls=null, store=null, metadata=null, reasoningEffort='null', verbosity='null', serviceTier='null', extraBody=null, toolCallbacks=[], toolNames=[], internalToolExecutionEnabled=null, toolContext={}}}, context={}]
收到流式响应片段:ChatClientResponse[chatResponse=ChatResponse [metadata={ id: chatcmpl-ff85a1d8-a06d-93d9-a4ad-9a93ae97b44a, usage: DefaultUsage{promptTokens=0, completionTokens=0, totalTokens=0}, rateLimit: org.springframework.ai.chat.metadata.EmptyRateLimit@47351de9 }, generations=[Generation[assistantMessage=AssistantMessage [messageType=ASSISTANT, toolCalls=[], textContent=, metadata={chunkChoice=Choice{delta=Delta{content=null, functionCall=, refusal=, role=assistant, toolCalls=, additionalProperties={reasoning_content=Here}}, finishReason=null, index=0, logprobs=null, additionalProperties={}}, role=assistant, messageType=ASSISTANT, finishReason=_UNKNOWN, refusal=, annotations=[], index=0, id=chatcmpl-ff85a1d8-a06d-93d9-a4ad-9a93ae97b44a}], chatGenerationMetadata=DefaultChatGenerationMetadata[finishReason='_UNKNOWN', filters=0, metadata=0]]]], context={}]
收到流式响应片段:ChatClientResponse[chatResponse=ChatResponse [metadata={ id: chatcmpl-ff85a1d8-a06d-93d9-a4ad-9a93ae97b44a, usage: DefaultUsage{promptTokens=0, completionTokens=0, totalTokens=0}, rateLimit: org.springframework.ai.chat.metadata.EmptyRateLimit@4b41b0d7 }, generations=[Generation[assistantMessage=AssistantMessage [messageType=ASSISTANT, toolCalls=[], textContent=, metadata={chunkChoice=Choice{delta=Delta{content=null, functionCall=, refusal=, role=, toolCalls=, additionalProperties={reasoning_content='s a thinking process}}, finishReason=null, index=0, logprobs=null, additionalProperties={}}, role=assistant, messageType=ASSISTANT, finishReason=_UNKNOWN, refusal=, annotations=[], index=0, id=chatcmpl-ff85a1d8-a06d-93d9-a4ad-9a93ae97b44a}], chatGenerationMetadata=DefaultChatGenerationMetadata[finishReason='_UNKNOWN', filters=0, metadata=0]]]], context={}]
收到流式响应片段:ChatClientResponse[chatResponse=ChatResponse [metadata={ id: chatcmpl-ff85a1d8-a06d-93d9-a4ad-9a93ae97b44a, usage: DefaultUsage{promptTokens=0, completionTokens=0, totalTokens=0}, rateLimit: org.springframework.ai.chat.metadata.EmptyRateLimit@5a01eb0 }, generations=[Generation[assistantMessage=AssistantMessage [messageType=ASSISTANT, toolCalls=[], textContent=, metadata={chunkChoice=Choice{delta=Delta{content=null, functionCall=, refusal=, role=, toolCalls=, additionalProperties={reasoning_content=:

 

 7、

image

 

image

 

 

posted on 2026-05-28 19:18  cn2025  阅读(2)  评论(0)    收藏  举报