<一>Sping-AI alibaba 了解

Spring AI 官方文档

标题看完文档应该了解了一些概念:

  • model:模型。针对不同的任务,有不同的模型可以应用。在这里插入图片描述
  • Prompts :提示。是引导 AI 模型生成特定输出的语言输入基础。它不仅是用户输入的文本字符串,更是一种结构化的指令集,通过定义角色、上下文和任务目标,告诉模型 “如何思考” 和 “如何回应”。
  • Prompt Templates :提示模板。Spring AI 为此使用了 OSS 库 StringTemplate。
  • Embeddings :嵌入。一种将图片、语言等等抽象为数字表征。那么原本两个图片、或者文字等等之间的相似性,就能够通过数字之间的相似性计算完成。请添加图片描述
  • Tokens:AI 模型工作基本单位。比如一个长句子划分为多个token。但是token数量不要太多,否则计算量很大,而且我们调用的api也是以token为单位的。
  • Structured Output:结构化输出-文档在这里插入图片描述
    • 你让 AI 返回 JSON 格式的天气数据,它可能输出一个看起来像 JSON 的字符串:

      “{“city”:“北京”,“temperature”:30,“weather”:“晴天”}”

    • 但这个输出本质上是字符串(String),而非编程语言能直接操作的 JSON 对象。即使在提示中要求 “返回 JSON”,AI 仍可能输出格式错误的内容(如缺少逗号、引号不匹配),导致解析失败。
    • 结构化输出转换采用精心设计的提示,通常需要与模型进行多次交互才能获得所需的格式。

Spring AI Alibaba

官方文档
Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。

简单示例

官方示例

创建项目

勾选web
在这里插入图片描述

在这里插入图片描述
还需要引入阿里巴巴依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dd.ai</groupId>
    <artifactId>spring-ai-alibaba-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-ai-alibaba-demo</name>
    <description>spring-ai-alibaba-demo</description>
    <url/>
    <licenses>
        <license/>
    </licenses>
    <developers>
        <developer/>
    </developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--        引入Spring AI Alibaba相关依赖-->

        <dependency>
            <groupId>com.alibaba.cloud.ai</groupId>
            <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
            <version>1.0.0.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件

使用的平台:阿里云百炼(langchain4j第一篇有介绍)
此处需要申请APPID
在这里插入图片描述

DASHSCOPE_API_KEY: xx
APP_ID: x

server:
  port: 8080

spring:
  application:
    name: spring-ai-demo

  ai:
    dashscope:
      agent:
        app-id: ${APP_ID} # 大模型应用ID,如未配置环境变量,请在这里替换为实际的值
      api-key: ${DASHSCOPE_API_KEY} # 百炼API Key,如未配置环境变量,请在这里替换为实际的值
      #workspace-id: ${WORKSPACE_ID} # 业务空间ID,可选,未配置时使用主账号空间

代码编写

官方示例

package com.dd.ai.springaialibabademo.controller;

import com.alibaba.cloud.ai.dashscope.agent.DashScopeAgent;
import com.alibaba.cloud.ai.dashscope.agent.DashScopeAgentOptions;
import com.alibaba.cloud.ai.dashscope.api.DashScopeAgentApi;

import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;

import java.util.List;

@RestController
@RequestMapping("/ai")
public class MyController {
    private static final Logger logger = LoggerFactory.getLogger(MyController.class);

    private DashScopeAgent agent;

    @Value("${spring.ai.dashscope.agent.app-id}")
    private String appId;

    public MyController(DashScopeAgentApi dashscopeAgentApi) {
        this.agent = new DashScopeAgent(dashscopeAgentApi);
    }
    @GetMapping(value="/chatStream", produces="text/event-stream")
    public Flux<String> stream(@RequestParam(value = "message",
            defaultValue = "你好,今天天气怎么样?") String message) {
        return agent.stream(new Prompt(message, DashScopeAgentOptions.builder().withAppId(appId).build())).map(response -> {
            if (response == null || response.getResult() == null) {
                logger.error("chat response is null");
                return "chat response is null";
            }

            AssistantMessage app_output = response.getResult().getOutput();
            String content = app_output.getText();

            DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput output = (DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput) app_output.getMetadata().get("output");
            List<DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputDocReference> docReferences = output.docReferences();
            List<DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputThoughts> thoughts = output.thoughts();

            logger.info("content:\n{}\n\n", content);

            return content;
        });
    }
    @GetMapping("/chat")
    public String call(@RequestParam(value = "message",
            defaultValue = "你好,今天天气怎么样?") String message) {
        ChatResponse response = agent.call(new Prompt(message, DashScopeAgentOptions.builder().withAppId(appId).build()));
        if (response == null || response.getResult() == null) {
            logger.error("chat response is null");
            return "chat response is null";
        }

        AssistantMessage app_output = response.getResult().getOutput();
        String content = app_output.getText();

        DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput output = (DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput) app_output.getMetadata().get("output");
        List<DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputDocReference> docReferences = output.docReferences();
        List<DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputThoughts> thoughts = output.thoughts();

        logger.info("content:\n{}\n\n", content);

        if (docReferences != null && !docReferences.isEmpty()) {
            for (DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputDocReference docReference : docReferences) {
                logger.info("{}\n\n", docReference);
            }
        }

        if (thoughts != null && !thoughts.isEmpty()) {
            for (DashScopeAgentApi.DashScopeAgentResponse.DashScopeAgentResponseOutput.DashScopeAgentResponseOutputThoughts thought : thoughts) {
                logger.info("{}\n\n", thought);
            }
        }

        return content;
    }


}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
控制台输出正常

### 如何下载 Spring-Aspects 库 #### 1. Maven 中央仓库获取 如果项目使用 Maven 构建工具,则可以在 `pom.xml` 文件中添加以下依赖项以引入 `spring-aspects`: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.20</version> <!-- 替换为所需版本 --> </dependency> ``` 此操作会自动从 Maven 中央仓库下载对应的 `spring-aspects` 版本[^2]。 --- #### 2. Gradle 构建工具配置 对于基于 Gradle 的项目,可以通过在 `build.gradle` 文件中添加如下内容实现依赖管理: ```groovy dependencies { implementation 'org.springframework:spring-aspects:5.3.20' // 替换为所需版本 } ``` 执行 `gradle build` 或者 `./gradlew build` 后即可完成库的下载和集成[^4]。 --- #### 3. 手动下载 JAR 包 如果不希望通过构建工具自动化处理,可以直接访问 [Maven Central Repository](https://search.maven.org/) 并手动查找对应版本的 `spring-aspects`。具体步骤如下: - 访问链接:[Spring Aspects on Maven Central](https://search.maven.org/artifact/org.springframework/spring-aspects/) - 下载所需的 `.jar` 文件并将其放置于项目的 `libs` 目录下。 - 如果 IDE 支持本地库管理功能(如 IntelliJ IDEA),则需将该路径注册至项目设置中[^1]。 --- #### 4. 编译源码获得自定义版本 当需要调试或者修改核心逻辑时,可以从官方 Git 仓库克隆完整的 Spring Framework 源码,并单独编译 `spring-aspects` 模块。以下是基本流程: 1. **克隆源码** ```bash git clone https://github.com/spring-projects/spring-framework.git cd spring-framework ``` 2. **切换目标分支** 切换到指定标签或分支(例如 v5.3.20): ```bash git checkout v5.3.20 ``` 3. **调整镜像地址** 修改 `build.gradle` 文件中的仓库列表,加入国内加速站点以便提升速度: ```gradle repositories { maven { url 'https://maven.aliyun.com/repository/public/' } mavenCentral() } ``` 4. **预编译 oxm 模块** 根据文档提示运行初始化脚本: ```bash ./gradlew :spring-oxm:compileTestJava ``` 5. **卸载冲突模块** 在 IDE 中右键单击 `spring-aspects` 模块,选择 “Unload Module”,从而避免与其他组件发生兼容性问题[^5]。 6. **打包产物** 使用以下命令生成最终的 JAR 文件供后续测试调用: ```bash ./gradlew clean assemble ``` 完成后可在 `build/libs/` 路径下找到生成的目标文件。 --- ### 注意事项 由于 AspectJ 工具链的存在,某些场景可能引发额外复杂度。比如尝试启用 `AdviceMode.ASPECTJ` 方式时,必须确保 JVM 参数正确传递 `-javaagent:<path-to>/aspectjweaver.jar`[^4]。 此外,部分开发者反馈因缺少特定子包支持而导致编译失败的情况,这通常涉及缓存扩展机制下的类缺失问题[^3]。此时应仔细核对所选框架版本是否满足最低需求标准。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值