课程介绍


认识AI和大模型

ai的发展



大模型应用开发
模型部署方案对比


模型部署
-云服务

-本地部署

通过ollama进行本地模型的部署

调用大模型


java
// 该代码 OpenAI SDK 版本为 2.6.0
import com.openai.client.OpenAIClient;
import com.openai.client.okhttp.OpenAIOkHttpClient;
import com.openai.models.chat.completions.ChatCompletion;
import com.openai.models.chat.completions.ChatCompletionCreateParams;
public class Main {
public static void main(String[] args) {
OpenAIClient client = OpenAIOkHttpClient.builder()
.apiKey(System.getenv("DASHSCOPE_API_KEY"))
.baseUrl("https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1")
.build();
ChatCompletionCreateParams params = ChatCompletionCreateParams.builder()
.addUserMessage("你是谁")
.model("qwen3.8-max")
.build();
try {
ChatCompletion chatCompletion = client.chat().completions().create(params);
System.out.println(chatCompletion);
} catch (Exception e) {
System.err.println("Error occurred: " + e.getMessage());
e.printStackTrace();
}
}
}
什么是大模型应用

SpringAI
课程安排


对话机器人
快速入门




java中区分流式输出还是非流式输出的是通过调用方法以及结果类型不同区分的


会话日志
SpringAI 基于 AOP 机制,实现对与大模型对话过程的增强、拦截、修改等功能。所有的增强通知都需要实现 Advisor 接口。

Spring提供了一些Advisor的默认实现,来实现一些基本的增强功能:

-
SimpleLoggerAdvisor:日志记录的Advisor
-
MessageChatMemoryAdvisor:会话记忆的Advisor
-
QuestionAnswerAdvisor:实现RAG的Advisor
要实现不同的功能就要传入不同的advisor
要实现日志功能就要传入SimpleLoggerAdvisor

简单来说:Java 代码负责"生产"日志内容,YAML 配置负责"允许"日志显示。
以下是详细的作用解析:
第一步:Java 代码中传入 Advisor
.defaultAdvisors(new SimpleLoggerAdvisor())
-
作用:安装"监控探头"
-
Advisor(顾问/增强器)是 Spring AI 中的一种拦截机制。 -
SimpleLoggerAdvisor的具体任务是:拦截每一次 AI 的调用请求(Prompt)和返回结果(Completion)。 -
当它拦截到数据后,它会调用底层的日志框架(如 SLF4J),试图打印出一条包含对话内容的日志。
-
-
如果不加这行代码:
- 程序依然能正常运行,AI 也能回答问题,但是没有任何关于对话过程的日志输出。就像快递在运输,但没有物流信息更新。
第二步:YAML 文件中配置日志级别
logging:
level:
org.springframework.ai: debug # 关键配置
-
作用:打开"显示开关"
-
Java 的日志框架是有等级之分的(从高到低):
ERROR>WARN>INFO>DEBUG>TRACE。 -
Spring Boot 默认只显示
INFO级别以上的日志。而SimpleLoggerAdvisor产生的日志通常属于DEBUG(调试) 级别。 -
如果你不写这行配置,Spring Boot 会觉得"调试信息不重要",从而把
SimpleLoggerAdvisor试图打印的内容过滤掉(隐藏)。
-
-
如果不加这行配置:
- 虽然你安装了"监控探头"(第一步),但监控室的屏幕是黑的,你依然看不到任何日志。
📌 总结
| 步骤 | 代码位置 | 作用比喻 | 结果 |
|---|---|---|---|
| 1. Advisor | Java Config | 写信 | 程序内部生成了日志内容,准备发送。 |
| 2. YAML | application.yml | 邮递 | 告诉日志系统:"请把 DEBUG 级别的信件投递给我看"。 |
对接前端

前端访问的端口号是5173
这个和后端服务监听的端口号8080不同

方法详细解析
-
addCorsMappings(CorsRegistry registry)- 含义:这是专门用来注册跨域规则的方法。
-
.addMapping("/**")- 含义 :"对所有路径生效"。
/**是通配符,表示不管前端请求的是/user/login还是/product/list,所有的接口都允许跨域。
-
.allowedOrigins("*")- 含义 :"允许任何人访问"。
*代表所有域名。这意味着不管是localhost:5173(你的开发环境),还是以后上线后的www.baidu.com,都可以调用你的接口。- 注意:在正式生产环境中,为了安全,通常会把
*改成具体的前端域名,比如https://www.your-frontend.com。
-
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")- 含义 :"允许这些动作"。
- 前端不仅会发 GET/POST 请求,还会发 PUT(修改)、DELETE(删除)。
- 重点 :必须包含
OPTIONS。这是浏览器在发复杂请求前,会自动先发一个"预检请求"来探路。如果不允许 OPTIONS,真正的请求根本发不出去。
-
.allowedHeaders("*")- 含义 :"允许携带任何请求头"。
- 比如前端要在 Header 里放 Token (
Authorization),或者放自定义的 ID,这个配置允许它们通过。
-
.exposedHeaders("Content-Disposition")- 含义 :"允许前端读取这个响应头"。
- 默认情况下,JS 只能读取很少的几个响应头。加上这个,通常是为了文件下载 功能。后端返回文件时,会把文件名放在
Content-Disposition头里,前端 JS 需要读取它来获取文件名。
会话记忆功能--在当前会话过程中实现记忆功能



SpringAi只提供了chatmemory接口来维护定义规范
SpringAi提供的具体的实现类是InMemoryChatMemory(),也可以自行实现ChatMemory方法

需要在增强器里面注册一下

需要传递的参数在调用的时候传递

会话历史功能--回看之前的对话
会话历史id列表



获取历史会话详情
主要运用了chatMemory保存历史会话的信息
chatMemory中有四个方法

get方法可以获取以下属性:包括messageType,text,metadata

messageType代表对话的角色

text代表对话的内容
将message转换为需要的格式

