spring ai入门实例
目录
- 大模型注册获取api
- spring-ai的基础了解
- spring-ai-alibaba
- 开启sprin-ai工程(Java17及以上)
- 实现结构化输出:列出“演员”的5部电影
- 测试输出:结构化输出的很好
本文为 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-testspring.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) {}
}