自学内容网 自学内容网

玄姐:阿里基于 Spring AI 发布新版本

1Spring AI 是什么?

据 Spring AI 官网描述,该项目的灵感来自著名的 Python 项目,如 LangChain 和 LlamaIndex,但 Spring AI 并不是这些项目的直接复制。Spring AI 相信下一波 Generative AI 生成式应用程序将不仅面向 Python 开发人员,而且将在许多编程语言中无处不在。

图片

Spring AI 是一个 AI 工程师的应用框架,它提供了一个友好的 API 和开发 AI 应用的抽象,旨在简化 AI 大模型应用的开发工作。

Spring AI 吸取了知名 Python 项目的精髓,比如:LangChain 和 LlamaIndex。Spring AI 是基于这样一个理念创立的:未来的 AI 大模型应用将不仅限于 Python 开发者,而且会普及到多种编程语言中。Spring AI 的核心是提供了开发 AI 大模型应用所需的基本抽象模型,这些抽象拥有多种实现方式,使得开发者可以用很少的代码改动就能实现组件的轻松替换。

图片

Spring AI 主要功能特性如下:

第一、对主流 AI 大模型供应商提供了支持,比如:OpenAI、Microsoft、Amazon、Google HuggingFace、Ollama、MistralAI 支持,目前对国内大模型支持还不友好。

第二、支持 AI 大模型类型包括:聊天、文本到图像、文本到声音,比如:OpenAI with DALL-E、StabilityAI 等。

第三、支持主流的 Embedding Model 和向量数据库,比如:Azure Vector Search、Chroma、Milvus、Neo4j、PostgreSQL/PGVector、PineCone、Redis 等。

第四、把 AI 大模型输出映射到简单的 Java 对象(POJOs)上。

第五、支持了函数调用(Function calling)功能。

第六、为数据工程提供 ETL(数据抽取、转换和加载)框架。

第七、支持 Spring Boot 自动配置和快速启动,便于运行 AI 模型和管理向量库。

当前,Spring AI 最新版本为 0.8.1,具体使用也比较简单,符合 Java 开发者的开发习惯。

更详细的特性在这里:https://spring.io/projects/spring-ai

Spring AI 的核心是提供抽象,作为开发 Java AI 应用程序的基础,提供以下功能:

Spring AI 的核心理念在于为 Java AI 应用程序开发提供了一套基础抽象。其主要功能包括:

  1. 提供广泛的接口能力,以便与业界主流的大型模型服务进行对接;

  2. 支持灵活的提示模板(Prompt Template)和模型输出解析(Output Parsing)功能;

  3. 拥有多模态生成式AI能力,涵盖对话系统、文本生成图像、文本生成语音等多种应用;

  4. 供应一套通用且可移植的API,便于访问各类模型服务和嵌入服务,支持同步调用和流式调用,同时允许传递特定模型的定制参数;

  5. 嵌入支持RAG(Retrieval-Augmented Generation)功能的基础组件,包括文档加载器(DocumentLoader)、文本分割器(TextSplitter)、嵌入客户端(EmbeddingClient)、向量存储(VectorStore)等;

  6. 支持AI Spring Boot Starter,实现自动配置和装配。

2Spring AI 应用开发案例

接下来我们来看3个具体的开发案例,Spring AI 最新版本为 0.8.1,具体使用也比较简单,符合 Java 开发者的开发习惯。

案例一:基于大模型的对话应用开发

package org.springframework.ai.openai.samples.helloworld.simple;
import org.springframework.ai.chat.ChatClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestControllerpublic class SimpleAiController {
  private final ChatClient chatClient;
  @Autowired  public SimpleAiController(ChatClient chatClient) {    this.chatClient = chatClient;  }
  @GetMapping("/ai/simple")  public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {    return Map.of("generation", chatClient.call(message));  }}

案例二:RAG 检索增强应用开发

package org.springframework.samples.ai.azure.openai.rag;
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.ai.client.AiClient;import org.springframework.ai.client.AiResponse;import org.springframework.ai.client.Generation;import org.springframework.ai.document.Document;import org.springframework.ai.embedding.EmbeddingClient;import org.springframework.ai.loader.impl.JsonLoader;import org.springframework.ai.prompt.Prompt;import org.springframework.ai.prompt.SystemPromptTemplate;import org.springframework.ai.prompt.messages.Message;import org.springframework.ai.prompt.messages.UserMessage;import org.springframework.ai.retriever.impl.VectorStoreRetriever;import org.springframework.ai.vectorstore.VectorStore;import org.springframework.ai.vectorstore.impl.InMemoryVectorStore;import org.springframework.beans.factory.annotation.Value;import org.springframework.core.io.Resource;
import java.util.List;import java.util.Map;import java.util.stream.Collectors;
public class RagService {
    private static final Logger logger = LoggerFactory.getLogger(RagService.class);
    @Value("classpath:/data/bikes.json")    private Resource bikesResource;
    @Value("classpath:/prompts/system-qa.st")    private Resource systemBikePrompt;
    private final AiClient aiClient;    private final EmbeddingClient embeddingClient;
    public RagService(AiClient aiClient, EmbeddingClient embeddingClient) {        this.aiClient = aiClient;        this.embeddingClient = embeddingClient;    }
    public Generation retrieve(String message) {
        // Step 1 - Load JSON document as Documents
        logger.info("Loading JSON as Documents");        JsonLoader jsonLoader = new JsonLoader(bikesResource,                "name", "price", "shortDescription", "description");        List<Document> documents = jsonLoader.load();        logger.info("Loading JSON as Documents");
        // Step 2 - Create embeddings and save to vector store
        logger.info("Creating Embeddings...");        VectorStore vectorStore = new InMemoryVectorStore(embeddingClient);        vectorStore.add(documents);        logger.info("Embeddings created.");
        // Step 3 retrieve related documents to query
        VectorStoreRetriever vectorStoreRetriever = new VectorStoreRetriever(vectorStore);        logger.info("Retrieving relevant documents");        List<Document> similarDocuments = vectorStoreRetriever.retrieve(message);        logger.info(String.format("Found %s relevant documents.", similarDocuments.size()));
        // Step 4 Embed documents into SystemMessage with the `system-qa.st` prompt template
        Message systemMessage = getSystemMessage(similarDocuments);        UserMessage userMessage = new UserMessage(message);
        // Step 4 - Ask the AI model
        logger.info("Asking AI model to reply to question.");        Prompt prompt = new Prompt(List.of(systemMessage, userMessage));        logger.info(prompt.toString());        AiResponse response = aiClient.generate(prompt);        logger.info("AI responded.");        logger.info(response.getGeneration().toString());        return response.getGeneration();    }
    private Message getSystemMessage(List<Document> similarDocuments) {
        String documents = similarDocuments.stream().map(entry -> entry.getContent()).collect(Collectors.joining("\n"));        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemBikePrompt);        Message systemMessage = systemPromptTemplate.createMessage(Map.of("documents", documents));        return systemMessage;
    }}

案例三:Function Calling Agent 应用开发

Spring AI Function Calling 函数调用工作流程如下图所示:包含了 Prompt 提示词、大模型、业务服务 API、回调、大模型响应等核心模块。

图片

2什么是 Spring Cloud Alibaba AI?

Spring Cloud Alibaba AI 目前已经顺利融合了 Spring AI 框架的 0.8.1版本接口,并实现了与“通义”高级模型系列的顺畅连接。这种整合是通过阿里云的灵积模型服务实现的,该服务基于“模型即服务”(MaaS)的理念,专注于 AI 领域的多样化模型应用,并通过标准化API,有效地支持模型推理、模型微调等全方位的功能。

在最新的更新中,Spring Cloud Alibaba AI 引入了多种流行的生成模型功能,包括对话生成、文本至图像转换以及文本到语音转换等多种应用场景,极大地扩展了开发者的工具集。利用这个框架,开发者可以轻松创建基于“通义”模型的交互式聊天机器人、创意图像生成器以及语音合成应用。此外,框架还内置了 OutputParser、Prompt Template、Stuff 等便捷组件,进一步简化了开发过程,增强了AI应用开发的效率和灵活性。

以下是当前官方提供的 Spring Cloud Alibaba AI 应用开发示例:

  1. 聊天对话应用

  2. 文生图应用

  3. 文生语音应用

  4. 模型输出解析 OutputParser(实现从 String 到自动 POJO 映射)

  5. 使用 Prompt Template

  6. 让 AI 模型接入外部数据(Prompt Stuff)

3体验第一个Spring AI应用开发

本项目演示如何使用 spring-cloud-starter-alibaba-ai 完成一个在线聊天 AI 应用,底层使用通义千问提供的模型服务。

第一、开发聊天对话应用

1、在项目 pom.xml 中加入 2023.0.1.0 版本 Spring Cloud Alibaba 依赖:

图片

2、在 application.yml 配置文件中加入以下配置:

图片

3、编写聊天服务实现类,由 Spring AI 自动注入 ChatClient、StreamingChatClient,ChatClient 屏蔽底层通义大模型交互细节。

图片

4、提供具体聊天逻辑实现

图片

5、编写 Spring 入口类并启动应用

图片

至此,您已经顺利完成了最基础的聊天AI应用开发,其过程与标准的Spring Boot应用开发流程完全相同!

第二、验证应用效果

启动应用后,可通过如下两种方式验证应用效果。

1、方式一

浏览器地址栏输入:http://localhost:8080/ai/example

返回如下响应:

{

    "Tell me a joke": "Sure, here's a classic one for you:\n\nWhy was the math book sad?\n\nBecause it had too many problems.\n\nI hope that made you smile! If you're looking for more, just let me know."

}

2、方式二

进入 resources/static 目录下,使用浏览器打开 index.html 文件,输入问题,即可获得输出响应(确保 api-key 有效):

图片

第三、申请通义API-KEY

为了确保示例能够顺利连接到通义大型模型,您需要在阿里云上启用DashScope灵积模型服务,并申请一个有效的API-KEY,随后将其更新至应用程序的配置文件中。详细的操作指南可以在以下文档中找到:https://help.aliyun.com/zh/dashscope/developer-reference/activate-dashscope-and-create-an-api-key。

4未来规划

在当前版本的 Spring Cloud Alibaba AI 中,已经实现了对几种主流生成式模型的适配,涵盖了对话生成、文本生成图像、文本生成语音等功能。在后续的版本更新中,我们计划继续增加对 VectorStore、Embedding、ETL Pipeline等功能的适配,进一步简化 RAG 等 AI 应用开发场景的复杂性。

图片

为了帮助同学们彻底掌握 AI 大模型 Agent 智能体、知识库、向量数据库、 RAG、微调私有大模型的应用开发、部署、生产化。

Spring AI + Ollama 快速构建大模型应用程序(含源码)

1Spring AI 开发框架介绍

Spring AI 借鉴了 LangChain(Python)的灵感,后者支持与 AI 和多种 LLM 集成。目前 Spring AI 提供了多种大模型和向量数据库供您选择。可以登录官网(https://spring.io/projects/spring-ai)查看 Spring AI 的更详细文档。

图片

今天的 Spring AI 项目中会使用到 Vaadin,Vaadin 是一个基于 Java 和 Kotlin 的 Web 应用开发框架。

图片

2开始构建大模型应用项目 

第一、需求

开发一款能够汇总股票市场周报的工具。

第二、项目效果

项目效果如下:

图片

第三、架构设计

整体架构设计如下分为3个步骤:

图片

  1. 设置 RAG

  2. 使用 Vaadin 设计 UI 界面

  3. 创建业务流程

步骤一、设置 RAG 检索增强生成

图片

在该项目中,我利用 Apache Tika 来解析位于 /resources 目录中的 PDF 文件。

图片

在大模型应用程序启动过程中,系统会开始读取 PDF 文件,并将数据 Embedding 后存储到向量数据库中。

图片

图片

RAG 将检索增强的前后端进行了分离,如下图所示:

图片

步骤二、使用 Vaadin 的 UI

这是一个简易的消息输入界面,用于接收提示信息(尝试构建一个类似 ChatGPT 的用户界面,但采用的是 Vaadin 框架)。

图片

步骤三、创建业务流程

最后但同样重要的一步是,我们将构建一个服务来与大模型进行通信。这包括添加系统提示词,我们将使用 HashMap 进行值的替换,接着利用 SystemPromptTemplate 生成消息,最后将其发送给大语言模型 (LLM)。

第四、项目集成

首先,我们在本地进行手动测试 Ollama。

图片

spring:  ai:    ollama:      base-url: ${AI_OLLAMA_BASE_URL:<http://localhost:11434>}      chat:        options:          model: llama3:8b

第五、项目完整代码

项目完整开源代码 Github 地址:

https://github.com/qianniucity/financial-weekly


原文地址:https://blog.csdn.net/Rookie_CEO/article/details/140538079

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!