目录
本文为 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) {
}
}