【限时收藏】Spring AI整合全路径拆解:涵盖依赖配置、服务调用与异常处理

第一章:Spring AI整合概述

Spring AI 是一个旨在简化人工智能功能集成到 Spring 生态系统中的全新项目,它为开发者提供了统一的 API 来对接主流的大语言模型(LLM)和服务平台,如 OpenAI、Azure AI、Google Vertex AI 等。通过抽象底层模型的具体实现细节,Spring AI 使应用能够以声明式的方式调用 AI 能力,同时保持与 Spring Boot 的自动配置和依赖注入机制无缝融合。

核心设计理念

  • 提供一致的编程模型来访问不同的 AI 平台
  • 支持文本生成、嵌入向量处理、提示模板管理等常见 AI 操作
  • 与 Spring Boot 的配置体系深度集成,便于环境化管理密钥与端点

快速接入 OpenAI 示例

以下代码展示了如何在 Spring Boot 应用中配置并使用 OpenAI 客户端进行文本生成:
// 引入 Spring AI OpenAI 依赖后,在配置类中定义客户端
@Bean
public OpenAIClient openAIClient() {
    return new OpenAIClient(
        OpenAIConnectionDetails.builder()
            .apiKey("your-openai-api-key") // 建议从配置文件读取
            .baseUrl("https://api.openai.com/v1")
            .build());
}

// 使用 AI 服务生成响应
@Service
public class AIService {
    private final AIModel aiModel;

    public AIService(AIModel aiModel) {
        this.aiModel = aiModel;
    }

    public String generateContent(String prompt) {
        Prompt p = new Prompt(new Message(UserMessage.from(prompt)));
        return aiModel.call(p).getResult().getOutput().getContent();
    }
}

支持的模型提供商对比

提供商支持模型类型是否支持流式输出
OpenAIGPT-3.5, GPT-4是
Azure AIGPT-3.5, GPT-4 (部署版本)是
Google Vertex AIPalm2, Gemini否
graph TD A[Spring Application] --> B{Call AIModel} B --> C[OpenAI Provider] B --> D[Azure Provider] B --> E[Vertex AI Provider] C --> F[HTTP Request to API] D --> F E --> F

第二章:环境准备与依赖配置

2.1 Spring AI核心模块解析与选型建议

核心模块架构概览
Spring AI 框架采用分层设计,主要包含抽象层、模型集成层与数据处理模块。其核心在于提供统一的 API 接口,屏蔽底层大模型差异,实现模型解耦。
  • spring-ai-core:定义对话、提示词、响应等通用接口
  • spring-ai-openai-spring-boot-starter:OpenAI 集成支持
  • spring-ai-anthropic-spring-boot-starter:Anthropic 模型适配
典型配置示例
@Bean
public OpenAiChatModel chatModel(OpenAiApi openAiApi) {
    return new OpenAiChatModel(openAiApi, 
        OpenAiChatOptions.builder()
            .withModel("gpt-4o")
            .withTemperature(0.7)
            .build());
}
上述代码构建了一个基于 GPT-4o 的聊天模型实例,temperature=0.7 表示生成文本在创造性与稳定性之间取得平衡。
选型评估维度
模块适用场景延迟表现
OpenAI通用对话、内容生成中等
Anthropic长文本推理、安全性要求高场景较高

2.2 构建Maven项目并引入必要依赖

在Java生态中,Maven是主流的项目构建与依赖管理工具。通过标准化的目录结构和声明式依赖配置,可高效搭建Spring Boot应用基础。
初始化Maven项目结构
执行以下命令生成基础项目骨架:
mvn archetype:generate -DgroupId=com.example \
-DartifactId=demo-app \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DinteractiveMode=false
该命令创建包含pom.xml和标准目录结构的Maven项目,groupId定义包命名空间,artifactId为项目名称。
引入核心依赖
在pom.xml中添加Spring Boot依赖管理:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.0</version>
    <relativePath/>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
父POM统一管理版本,starter-web自动引入Web开发所需组件,如Tomcat、Spring MVC等,减少手动配置复杂度。

2.3 配置AI服务访问密钥与基础参数

在调用AI服务前,必须正确配置访问密钥和基础运行参数,以确保身份认证通过并控制请求行为。
设置环境变量存储密钥
推荐使用环境变量管理敏感信息,避免硬编码。例如:
export AI_API_KEY="your-secret-key-here"
export AI_SERVICE_ENDPOINT="https://api.example-ai.com/v1"
该方式将密钥与代码分离,提升安全性,便于在不同部署环境中灵活切换配置。
初始化客户端参数
在程序中读取环境变量并构建请求配置:
import os
import requests

api_key = os.getenv("AI_API_KEY")
endpoint = os.getenv("AI_SERVICE_ENDPOINT")

headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json"
}
timeout = 30  # 请求超时时间(秒)
代码中通过 os.getenv 安全获取密钥,设置标准请求头,并定义超时机制防止长时间阻塞,保障系统稳定性。

2.4 集成OpenAI/Alibaba Tongyi千问API实践

在现代应用开发中,集成大语言模型API是提升智能交互能力的关键步骤。本节以 OpenAI 和 Alibaba Cloud 的 Tongyi千问 为例,演示如何在服务端安全高效地调用模型接口。
环境准备与依赖引入
使用 Python 可通过 requests 库快速发起 HTTP 请求。首先安装依赖:
pip install requests python-dotenv
该命令安装请求库和环境变量管理工具,便于密钥隔离。
调用OpenAI API 示例
import requests
import os

url = "https://api.openai.com/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}",
    "Content-Type": "application/json"
}
data = {
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "你好,请介绍你自己"}]
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
代码中,Authorization 头部携带 Bearer Token,data 定义对话上下文。参数 model 指定模型版本,messages 支持多轮对话结构。
阿里云千问调用方式
Tongyi千问需通过阿里云 SDK 调用,使用 AccessKey 进行认证:
  • 配置 AK/SK 到环境变量
  • 使用官方 dashscope 包封装请求
  • 注意地域与 endpoint 匹配

2.5 多环境配置管理与敏感信息加密

在现代应用部署中,多环境(开发、测试、生产)的配置管理至关重要。统一使用配置文件集中管理参数,可提升可维护性。
配置文件分层设计
通过 application.yml 与环境特定文件(如 application-prod.yml)实现配置隔离:
spring:
  profiles:
    active: dev
---
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://prod-db:3306/app
    username: root
    password: ${DB_PASSWORD}
该结构通过激活不同 profile 加载对应配置,避免硬编码。
敏感信息加密处理
使用 Jasypt 对数据库密码等敏感字段进行加密:
  • 引入 jasypt-spring-boot-starter 依赖
  • 加密值以 ENC() 包裹,如 password: ENC(abc123xyz)
  • 启动时通过 JVM 参数传入解密密钥

第三章:服务调用实现机制

3.1 基于RestTemplate的同步调用封装

在Spring生态中,RestTemplate 是执行HTTP同步请求的核心工具类,适用于服务间轻量级通信。
基础配置与实例化
通过配置类注入定制化的RestTemplate实例,可提升连接复用率和超时控制能力:
@Configuration
public class RestTemplateConfig {
    @Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
        factory.setConnectTimeout(5000);
        factory.setReadTimeout(10000);
        return new RestTemplate(factory);
    }
}
该配置设置连接与读取超时时间,防止调用方因远端服务延迟而阻塞过久。
通用调用封装
为避免重复代码,可封装通用方法处理GET/POST请求:
  • 使用exchange()方法统一处理带头信息的请求
  • 结合ParameterizedTypeReference支持泛型反序列化
  • 异常统一由ResponseErrorHandler捕获并处理

3.2 使用WebClient实现异步非阻塞请求

WebClient 是 Spring WebFlux 提供的响应式客户端,支持非阻塞 I/O 操作,适用于高并发场景下的 HTTP 请求处理。
基本用法示例
WebClient webClient = WebClient.create("https://api.example.com");

Mono<String> response = webClient
    .get()
    .uri("/data")
    .retrieve()
    .bodyToMono(String.class);
上述代码创建了一个 WebClient 实例,并发起 GET 请求。调用 retrieve() 后通过 bodyToMono(String.class) 将响应体映射为 Mono 流,实现异步接收单个结果。
优势与适用场景
  • 非阻塞:线程无需等待响应,提升吞吐量
  • 响应式流:天然集成 Reactor 框架,支持背压管理
  • 函数式编程:链式调用简洁清晰,便于组合复杂逻辑

3.3 自定义AI客户端抽象层设计

为了屏蔽底层AI服务的差异性,提升系统可维护性,设计统一的客户端抽象层至关重要。该层通过接口封装模型调用、认证、重试等通用逻辑。
核心接口定义
type AIProvider interface {
    Generate(prompt string, opts ...Option) (string, error)
    Embed(texts []string) ([]float32, error)
}
上述接口定义了生成文本和向量嵌入两个核心能力。通过依赖注入,可灵活切换本地模型或云服务。
配置管理与多实例支持
  • 支持YAML动态加载不同AI提供商配置
  • 基于工厂模式创建对应客户端实例
  • 内置超时控制、限流与熔断机制
该抽象层显著降低了集成新AI服务的技术成本,同时保障了调用链路的稳定性。

第四章:异常处理与系统稳定性保障

4.1 常见HTTP状态码识别与重试策略

在构建高可用的网络服务时,正确识别HTTP状态码并制定合理的重试机制至关重要。根据响应状态码的语义,可将其分为不同类别以指导重试逻辑。
常见需重试的状态码分类
  • 5xx服务器错误:如500、502、503、504,通常表示服务端临时不可用,适合重试;
  • 429 Too Many Requests:表明请求频率超限,应结合退避策略进行延迟重试;
  • 408 Request Timeout / 504 Gateway Timeout:网络或网关超时,建议指数退避后重试。
Go语言中的重试逻辑示例
func shouldRetry(statusCode int) bool {
    return statusCode == 429 || 
           (statusCode >= 500 && statusCode < 600)
}
该函数判断是否需要重试:当状态码为429或5xx范围时返回true,避免对4xx客户端错误(如404)进行无效重试。结合指数退避和最大重试次数,可显著提升系统容错能力。

4.2 超时控制与熔断机制集成(Resilience4j)

在微服务架构中,依赖服务的不稳定可能导致级联故障。Resilience4j 提供轻量级容错库,通过超时控制与熔断机制提升系统弹性。
核心功能配置
  • TimeLimiter:限制方法执行时间,避免长时间阻塞
  • CircuitBreaker:根据失败率自动切换服务状态,防止雪崩
  • Retry:支持异常重试,增强服务调用鲁棒性
代码示例与参数说明
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
    .failureRateThreshold(50) // 失败率阈值超过50%触发熔断
    .waitDurationInOpenState(Duration.ofMillis(1000)) // 熔断后1秒进入半开状态
    .slidingWindowType(SlidingWindowType.COUNT_BASED)
    .slidingWindowSize(5) // 统计最近5次调用
    .build();
该配置定义了基于滑动窗口的熔断策略,当最近5次调用中失败率达50%时,熔断器进入打开状态,暂停请求1秒后尝试恢复。

4.3 日志追踪与AI请求上下文记录

在分布式系统中,精准的日志追踪是定位AI服务调用链路问题的关键。通过引入唯一请求ID(Request ID)贯穿整个请求生命周期,可实现跨服务上下文的无缝关联。
上下文注入与传递
在请求入口处生成Trace ID,并注入到日志上下文中:
ctx := context.WithValue(context.Background(), "trace_id", uuid.New().String())
log.Printf("handling request: trace_id=%s, user=%s", ctx.Value("trace_id"), userID)
上述代码将唯一追踪ID绑定至上下文,确保后续日志输出均携带该标识,便于集中式日志系统(如ELK)进行聚合检索。
结构化日志增强可读性
采用JSON格式输出日志,结合字段标准化提升机器解析效率:
字段含义
trace_id全局追踪ID
prompt_len输入提示词长度
model_name调用模型名称

4.4 错误响应统一处理与业务降级方案

在微服务架构中,异常响应的统一管理是保障系统稳定性的关键环节。通过全局拦截器可集中处理HTTP错误,标准化返回格式。
统一错误响应结构
{
  "code": 5001,
  "message": "订单服务暂时不可用",
  "timestamp": "2023-09-10T12:34:56Z"
}
该结构便于前端解析并触发相应提示,code字段区分具体错误类型。
熔断与降级策略
使用Hystrix或Sentinel实现服务熔断。当依赖服务失败率超过阈值,自动切换至备用逻辑:
  • 缓存兜底数据返回
  • 异步队列延迟处理
  • 静态资源降级展示
状态行为
半开尝试恢复请求
打开直接返回降级结果

第五章:总结与未来演进方向

云原生架构的持续深化
现代企业正加速向云原生转型,Kubernetes 已成为容器编排的事实标准。以下是一个典型的 Helm Chart values.yaml 配置片段,用于在生产环境中启用自动伸缩:
replicaCount: 3
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80
该配置已在某金融客户的核心交易系统中落地,实现高峰时段资源利用率提升 40%。
AI 驱动的智能运维实践
AIOps 正在重构传统监控体系。某电商平台通过引入时序预测模型,提前 15 分钟预测数据库 IOPS 瓶颈,准确率达 92%。其告警收敛策略如下:
  • 基于拓扑关系进行根因分析
  • 使用聚类算法归并相似事件
  • 动态调整阈值避免误报
边缘计算与低延迟场景融合
在智能制造场景中,边缘节点需在 50ms 内完成视觉质检推理。某工厂部署轻量化服务网格,通过以下优化降低通信开销:
优化项实施前延迟实施后延迟
gRPC KeepAlive18ms6ms
本地缓存 Token12ms3ms
图:边缘集群服务调用链路优化前后对比

相关推荐

SpringAI打造自己的AI应用-入门篇

SpringAI是一个基于Spring生态的AI集成框架,支持自然语言处理、计算机视觉、语音识别等多种AI模型和服务。开发者可以轻松将AI能力集成到Spring应用中,无需关注底层实现。本文介绍了如何通过SpringAI集成Ollama的qwen2.5:7b模型,实现文本生成功能。首先,需准备JDK17、Maven/Gradle和SpringBoot3.0等环境,并创建SpringBoot项目,添加SpringAI依赖。接着,配置Ollama模型,并创建控制器处理HTTP请求,返回生成的文本。最后,启动应用

wjianwei666的专栏 420

SpringAI使用

多模态是指模型同时理解和处理来自各种来源的信息的能力,包括文本、图像、i音频和其他数据格式。多模式大语言模型(LLM)特征使模型能够结合其他模态(如图像、音频或视频)来处理和生成文本。Spring Al 多模态API提供了所有必要的统一抽象和代码封装来支持多模式LLM;

weixin_63164764的博客 3109

halcon 检测直线

图中后三个对象既是检测出的图像;

qq_59062726的博客 666

SpringAI的使用

初始化项目:添加必要依赖,配置 SpringAI 和基础设施准备数据:将领域知识(如 PDF 文档)处理并存储到向量数据库配置聊天服务:设置聊天客户端、历史记忆和检索功能注册工具:根据业务需求配置可调用的工具提供接口:通过控制器暴露聊天功能前端集成:开发前端界面与后端 API 交互(您的项目中未包含,需补充)

hqxstudying的博客 2438

MicroPython跨平台移植实战:从源码解析到STM32+FreeRTOS部署

本文详细解析了MicroPython的跨平台移植实战,重点介绍了如何将其从源码开始,成功部署到STM32微控制器并运行于FreeRTOS实时操作系统。内容涵盖源码结构解析、编译环境搭建、内存管理协调、FreeRTOS任务集成、数学库(math)启用与优化,以及自定义模块开发等核心步骤,为开发者提供了一套完整的、可操作的嵌入式Python移植方案。

vodka的博客 1014

stm32学习笔记:ADC

stm32学习笔记:ADC

hmh520i的博客 3224

Spring AI教程(二十):依赖管理与Spring AI BOM | Spring AI教程(二十一):添加特定组件的依赖与模型支持

BOM(Bill of Materials)声明了给定Spring AI版本使用的所有依赖项的推荐版本。通过在项目中使用BOM,可以避免手动指定和维护依赖项版本。BOM版本决定了项目中使用的依赖项版本,并确保默认情况下使用支持和测试过的依赖项版本,除非你选择覆盖它们。

阿里渣渣java研发组-群主 5719

傻瓜式下载、安装CentOS7操作步骤

CentOS7.9下载和安装操作步骤

weixin_45608163的博客 1万+

Spring AI——入门介绍

本文介绍了 Spring AI 的基础使用。

代码星辰的博客 1万+

告别MATLAB依赖:手把手教你用Python实现GCC-PHAT时延估计(附完整代码与对比测试)

本文详细介绍了如何使用Python实现GCC-PHAT时延估计算法,替代传统的MATLAB依赖。通过完整的代码示例和性能对比测试,展示了Python在信号处理领域的强大能力,特别是在广义互相关和TDOA应用中的高效实现。文章还提供了实时音频处理和嵌入式部署的实用技巧,帮助工程师快速掌握这一关键技术。

weixin_42667269的博客 221

在 Android Studio 中接入 DeepSeek:加速 Android 开发进程

通过在 Android Studio 中接入 DeepSeek,Android 开发者能够充分利用人工智能技术带来的强大优势,显著提升开发效率和代码质量。从前期的安装准备,到具体的接入步骤,再到使用过程中的技巧和注意事项,每一个环节都为打造高效、智能的开发环境提供了有力支持。希望本文能帮助你顺利将 DeepSeek 融入到 Android Studio 的开发工作流程中,让你在 Android 开发的道路上更加得心应手,创造出更优质的 Android 应用。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4176

Maven父继承

Maven父继承 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId>

vende_tta的博客 368

Oracle EBS Interface/API(43) -自定义AP发票状态说明API

在某项目,客户需求获得AP发票的状态说明,例如对账系统或者某些报表。由于标准系统未提供状态说明,需要通过AP发票的标准Form获得相关业务逻辑,然后自定义AP发票状态说明API。

陈显平的专栏-Oracle EBS 607

Spring AI 使用教程

Spring AI 使用教程

乐于分享,共同成长 3410

05 SAP CPI 访问第一个CPI接口

其中的clientid的值可作为Basic验证的用户名,clientsecret的值可作为Basic验证的密码。点击SEND按钮,可看见返回状态为200 OK。在04中,我们得到TOKEN令牌。POSTMAN向下滚动。点击按钮获取token。

SAP CPI 663

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Spring Boot】在项目中使用Spring AI

在 Spring Boot 项目中使用 Spring AI

hui_zai_的博客 2324

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

快速学习SpringAi

快速学习SpringAi

qq_63486066的博客 1695

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

springAi使用教程

环境版本号java 17。

行东的bug博客笔记 2290

Spring-Ai

①引入依赖(自动完成)②配置模型③配置客户端。

2402_87834207的博客 691

spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter

spring ai 报错与踩坑

dj1955的博客 1万+

快速体验Spring AI_基于Spring AI Alibaba

一句话说明:Spring AI 提供了一个统一的接口来调用不同的AI模型,使得开发者能够方便地切换不同的AI服务提供者。输入输出举例:输入为用户查询或请求,输出可以是文本、图像、语音等不同形式。例如,通过对话模型输入问题 "明天天气如何?",输出可能是 "明天天气晴朗,气温在15到20度之间"。Spring AI Alibaba是Spring AI针对阿里云服务的一个实现,旨在简化开发者利用阿里云AI能力(包括国产大模型如通义千问)构建应用的过程。

whisperzzza的博客 2460

企业级AI开发利器:Spring AI框架深度解析与实战

Spring AI的出现标志着Java生态正式进入AI开发的黄金时代。通过标准化接口、与Spring生态的深度集成以及丰富的企业级特性,它解决了传统AI集成的痛点,让Java开发者能够高效构建智能应用。从简单的文本生成到复杂的RAG系统,Spring AI提供了全生命周期的支持。未来,随着多模态模型、边缘计算和联邦学习的发展,Spring AI将持续扩展其能力边界。对于企业而言,采用Spring AI不仅能快速落地AI应用,还能借助Spring的微服务治理、监控和安全机制确保系统的稳定性和可扩展性。

-曾牛的博客 1871

Spring AI最完整入门指南:从依赖配置到生产部署

你是否还在为AI应用开发中的模型集成、向量存储、分布式部署等问题头疼?作为Spring生态系统的重要扩展,Spring AI提供了一套统一的API和工具链,让Java开发者能够轻松构建企业级AI应用。本文将带你从环境搭建到生产部署,全面掌握Spring AI的核心功能与最佳实践。 读完本文后,你将能够: - 快速配置Spring AI依赖并集成主流AI模型 - 实现基于向量存储的智能检索增强生成...

gitblog_01076的博客 928

【Spring AI】记录Spring AI Alibaba接入大模型时的依赖问题

【Spring AI】记录Spring AI Alibaba接入大模型时的依赖问题

un_fired的博客 2629

SpringAI学习及搭建AI原生应用

SpringAI的推出被认为是Java开发领域的一大福音,因为它结合了Spring生态系统的设计原则和模块化的概念,降低了接入大型语言模型(LLM)的学习成本。此外,在输入封装和输出处理等配套类的帮助下,聊天模型 API 统一了与 AI 模型的通信。简单而言,Spring AI 是AI工程师所使用的一种应用性框架,通过提供出来的API和API key来进行开发应用,所用在于使用AI应用来简化开发工序流程。

qq_43548590的博客 1万+

Spring Boot + Spring AI快速体验

Spring AI是Spring的一个子项目,是Spring专门面向于AI的应用框架。本文基于Spring Boot + Spring AI 实现了简单的Open AI对话接口调用,并提供了测试Controller实现及效果展示。文章最后提供了项目示例的github地址。

xu2439645715的博客 5435
上一篇: 为什么你的预测模型总不准?Python实战案例揭示5大常见陷阱
下一篇: 你还在自学Java?顶级技术沙龙免费报名通道已开放,仅限本周!
QuickProceed
博客等级 码龄1年 149粉丝 2008原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值