spring ai入门实例

发布于:2025-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

本文为 spring-ai 入门篇,主要是基础概念知识和简单的ai对话实例

大模型注册获取api

deepseek: https://api-docs.deepseek.com/zh-cn/

阿里云百炼:https://bailian.console.aliyun.com/?tab=api#/api

我这里选择阿里云百炼的,可以有免费,直接参考文档创建好API Key
在这里插入图片描述

spring-ai的基础了解

spring-ai文档参考:https://www.spring-doc.cn/projects/spring-ai

ai基础概念:https://www.spring-doc.cn/spring-ai/1.0.0/concepts.html#_prompt_templates,建议看英文文档:https://www.spring-doc.cn/spring-ai/1.0.0/concepts.en.html

可以简单的了解一些概念:

  • Model(模型)
  • Prompt(提示词,模型的输入)
  • Token (Token是人工智能模型(尤其是大语言模型)处理文本的最小单位‌,可以是单词、子词、字符或符号,用于将文本转化为模型可计算的数字序列)
  • Structured Output (结构化输出)
  • Tool Calling (function calling) (函数调用)
  • MCP(模型上下文协议(Model Context Protocol),由Anthropic推出的开放标准协议,旨在实现大语言模型与外部数据源及工具的高效集成。该协议被视为AI应用的标准化接口,推动大模型应用的互联互通和场景拓展)
  • Agent
    AI Agent(Artificial Intelligence Agent,人工智能代理)是一种能够自主感知环境、进行决策并执行任务的智能实体。其核心特征在于将大语言模型(LLM)作为“大脑”,结合规划、记忆、工具调用等能力,实现复杂任务的自动化处理。例如,用户只需输入“取消订阅服务”,AI Agent即可自主分解步骤、调用支付接口完成操作。

spring-ai-alibaba

也可以使用Spring AI Alibaba ,其是一款以 Spring AI 为基础,深度集成百炼平台,支持 ChatBot、工作流、多智能体应用开发模式的 AI 框架。

参考文档:https://github.com/alibaba/spring-ai-alibaba/blob/main/README-zh.md

开启sprin-ai工程(Java17及以上)

可以参考生成spring-boot工程:https://docs.spring.io/spring-ai/reference/getting-started.html

  • application.properties
spring.application.name=demo-spring-test

spring.ai.dashscope.api-key=<api-key>
spring.ai.dashscope.chat.options.model=qwen-plus

maven工程的pom.xml, 使用了spring-ai-alibaba

<?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.4.6</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo-spring-test</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo-spring-test</name>
	<description>Demo project for Spring Boot</description>
	<url/>
	<licenses>
		<license/>
	</licenses>
	<developers>
		<developer/>
	</developers>
	<scm>
		<connection/>
		<developerConnection/>
		<tag/>
		<url/>
	</scm>
	<properties>
		<java.version>17</java.version>
		<spring-ai.version>1.0.0</spring-ai.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- Spring AI Alibaba(通义大模型支持) -->
		<dependency>
			<groupId>com.alibaba.cloud.ai</groupId>
			<artifactId>spring-ai-alibaba-starter</artifactId>
			<version>1.0.0-M6.1</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-core</artifactId>
			<version>1.0.0-M6</version>
		</dependency>
		<dependency>
			<groupId>com.alibaba.cloud.ai</groupId>
			<artifactId>spring-ai-alibaba-autoconfigure</artifactId>
			<version>1.0.0-M6.1</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

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

</project>

实现结构化输出:列出“演员”的5部电影

package com.example.demo.controller;

import com.example.demo.entity.ActorsFilms;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 参考:https://www.spring-doc.cn/spring-ai/1.0.0-M6/api_structured-output-converter.html
 */
@RestController
public class StructuredOutputCallController {

    private final ChatClient chatClient;

    public StructuredOutputCallController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    /**
     * curl http://localhost:8080/func
     */
    @GetMapping("/func")
    public ActorsFilms chat() {
        ActorsFilms actorsFilms = chatClient
                .prompt()
                .user(u -> u.text("Generate the filmography of 5 movies for {actor}.")
                                .param("actor", "Tom Hanks"))
                        .call()
                        .entity(ActorsFilms.class);
        return actorsFilms;
    }

    /**
     * curl http://localhost:8080/films?actor=成龙
     */
    @GetMapping("/films")
    public ActorsFilms chat2(@RequestParam String actor) {
        ActorsFilms actorsFilms = chatClient
                .prompt()
                .user(u -> u.text("列出演员{actor}的5部电影")
                        .param("actor", actor))
                .call()
                .entity(ActorsFilms.class);
        return actorsFilms;
    }
}
  • ActorsFilms
package com.example.demo.entity;

import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.util.List;

@JsonPropertyOrder({"actor", "movies"})
public class ActorsFilms {
    public String actor;
    public List<String> movies;

    public ActorsFilms() {
    }

    public ActorsFilms(String actor, List<String> movies) {
    }
}

测试输出:结构化输出的很好

在这里插入图片描述

在这里插入图片描述