SpringAI+DeepSeek大模型应用开发

课程介绍

认识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转换为需要的格式

-哄哄模拟器

-提示词工程

相关推荐
小鱼干..1 小时前
青少年ctf url
java
用户8181870627461 小时前
第26章 Kafka vs RocketMQ vs RabbitMQ真实选型对比
java·后端
lv__pf1 小时前
09-深入理解AQS之独占锁ReentrantLock源码分析【TL 并发 09】
java·开发语言
letisgo51 小时前
JAVA 高级进阶18篇《生产级RAG:切分、检索、评估与Graph RAG全链路实战》
java·面试·检索增强·rag·graph rag
随遇而安zx1 小时前
【并发】---Disruptor 原理、源码与实战 深度解析
java·并发·disruptor
Lyyaoo.1 小时前
【二分查找】【困难】寻找两个有序数组的中位数
java·数据结构·算法
小羊没烦恼!2 小时前
Memory 记忆设计讨论:Agent Memory 的安全边界:权限、删除、版本与回执
java·大数据·word·powerpoint·.net
这是程序猿2 小时前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
rannn_1112 小时前
【Java面试八股】Java基础篇|数据类型、面向对象、关键字、反射、注解、异常、新特性、序列化、设计模式、IO
java·后端·面试