告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力
Spring AI 项目旨在简化开发包含人工智能功能的应用程序,而无需不必要的复杂性。
该项目从著名的 Python 项目中汲取灵感,如 LangChain 和 LlamaIndex,但 Spring AI 并不是这些项目的直接移植。
Spring AI 提供以下功能:
- 支持所有主要的模型提供商,如 OpenAI、Microsoft、Amazon、Google 和 Huggingface。
- 支持的模型类型包括聊天和文本到图像,未来将支持更多类型。
- 跨 AI 提供商的便携式 API,支持同步和流式 API 选项。
- 将 AI 模型输出映射到 POJO。
- 支持所有主要的向量数据库提供商,如 Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Qdrant、Redis 和 Weaviate。
- 函数调用。
官方文档: docs.spring.io/spring-ai/r…
1. 说明
-
本文代码示例是基于OpenAI的,有些小伙伴没有网络环境,可以使用one-api,one-api可以通过标准的 OpenAI API 格式访问所有的大模型,开箱即用。官方文档:github.com/songquanpen…
-
示例中模型使用月之暗面,api可以免费使用(每天限额150万token):官网:www.moonshot.cn/
-
文中示例jdk版本为jdk17,springboot版本为3.2.5
2. 部署one-api
2.1 使用docker部署
熟悉docker的小伙伴可以使用 docker-compose 方式部署,其他部署方式请参考官方文档
version: '3.0'
services:
one-api:
image: justsong/one-api
container_name: one-api
volumes:
- ./data:/data
ports:
- "3000:3000"
restart: always
privileged: true
environment:
TZ: Asia/Shanghai
部署好之后访问 http://localhost:3000/ 并登录。初始账号用户名为 root,密码为 123456。
2.2 使用方法
在渠道页面中添加你的 API Key,然后在令牌页面中新增访问令牌。
之后就可以使用你的令牌访问 One API 了,使用方式与 OpenAI API 一致。
你需要在用到 OpenAI API 的地方设置 API Base 为你的 One API 的部署地址,例如:http://localhost:3000,API Key 则为你在 One API 中生成的令牌。
3. 获取调用大模型的apikey
3.1 官方文档
platform.moonshot.cn/docs/intro#…
3.2 将获取到的apikey填入one-api即可
4. 在springboot项目中使用spring-ai
4.1 创建一个Spring Boot项目
可以使用你最喜欢的IDE来生成一个基础的Spring Boot项目。如果你使用idea,可以在这里获取激活方式: note.youdao.com/s/CsdRf0Qw
Spring AI已经上架到Spring Initializr 上,在 start.spring.io/ 上可以使用并构建,如图:
点击下一步,选择spring web和openai,如图所示,创建一个springboot项目
4.2 修改配置文件
修改此项目的application.yml配置文件,核心配置如图:
4.3 写一个最简单的调用
private final OpenAiChatClient chatClient;
@Autowired
public ChatController(OpenAiChatClient chatClient) {
this.chatClient = chatClient;
}
@GetMapping("/ai/generate")
public String generate(@RequestParam(value = "message", defaultValue = "鲁迅和周树人是什么关系?") String message) {
return chatClient.call(message);
}
效果如图所示:
4.4 使用PromptTemplate
通过使用PromptTemplate创建一个模版,然后根据用户输入,使用模版来创建具体的Prompt生成结果。
@GetMapping("/ai/completion")
public ChatResponse completion(@RequestParam(value = "message", defaultValue = "The vibrant city skyline shimmered with a myriad of lights as the sun set, casting a warm glow on the bustling streets below.") String message){
PromptTemplate promptTemplate = new PromptTemplate("把给定的英语句子译成中文 {query}");
Prompt prompt = promptTemplate.create(Map.of("query", message));
return chatClient.call(prompt);
}
效果如图所示:
4.5 流式调用
@GetMapping("/ai/stream")
public SseEmitter stream(HttpServletResponse response){
response.setContentType("text/event-stream");
response.setCharacterEncoding("UTF-8");
SseEmitter emitter = new SseEmitter();
String systemPrompt = "{prompt}";
SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemPrompt);
String userPrompt = "淄博有什么特产?";
Message userMessage = new UserMessage(userPrompt);
Message systemMessage = systemPromptTemplate.createMessage(Map.of("prompt", "you are a helpful AI assistant"));
Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
chatClient.stream(prompt).subscribe(x -> {
try {
List<Generation> generations = x.getResults();
if(!CollectionUtils.isEmpty(generations)){
for(Generation generation:generations){
AssistantMessage assistantMessage = generation.getOutput();
String content = assistantMessage.getContent();
if(StringUtils.isNotEmpty(content)){
emitter.send(content);
}else{
if(StringUtils.equals(content,"null"))
emitter.complete(); // Complete the SSE connection
}
}
}
} catch (Exception e) {
emitter.complete();
e.printStackTrace();
}
});
return emitter;
}
效果是这样的
转载自:https://juejin.cn/post/7361368052570816550