likes
comments
collection
share

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

作者站长头像
站长
· 阅读数 12

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。

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

2.2 使用方法

在渠道页面中添加你的 API Key,然后在令牌页面中新增访问令牌。

之后就可以使用你的令牌访问 One API 了,使用方式与 OpenAI API 一致。

你需要在用到 OpenAI API 的地方设置 API Base 为你的 One API 的部署地址,例如:http://localhost:3000,API Key 则为你在 One API 中生成的令牌。

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

3. 获取调用大模型的apikey

3.1 官方文档

platform.moonshot.cn/docs/intro#…

3.2 将获取到的apikey填入one-api即可

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

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 AI让你的Spring Boot应用快速拥有AI能力

点击下一步,选择spring web和openai,如图所示,创建一个springboot项目

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

4.2 修改配置文件

修改此项目的application.yml配置文件,核心配置如图:

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

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);
    }

效果如图所示:

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

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);
    }

效果如图所示:

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力

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;
    }

效果是这样的

告别复杂:Spring AI让你的Spring Boot应用快速拥有AI能力