Spring AI:简化 Java 与大型语言模型的集成

AI悲伤小熊 2024-08-10 10:31:03 阅读 95

前段时间,我用Python不到一百行代码就集成了LLM大模型,效果还挺好。考虑到公司有不少用Java的同事,我想,不妨也用Java试试看,效果会怎样呢?带着这个念头,我查阅了一些Java的资料,没想到竟然真的发现了支持集成LLM的Java框架。趁着一趟将近4个小时的高铁旅途,我就把这个入门步骤写出来了。

今年4月17日,Spring官方宣布Spring AI已经可以在Spring Initializr上使用了。这个新工具简化了与AI的交互方式,显著降低了将LLM模型集成到Java项目中的学习难度。现在,你可以在start.spring.io这个网站上尝试并构建你的Spring AI应用。

Spring AI是一个专为AI设计的工程应用框架,它秉承了Spring生态系统的设计原则,如可移植性和模块化设计,旨在推动使用POJO(Plain Old Java Object,简单Java对象)作为构建AI应用的基础。

1、Spring AI特性概览

这个API具有很强的灵活性,能够支持多种AI服务提供商之间的互操作,涉及聊天、生成图像和模型嵌入等多种功能。它提供同步和流API两种选项,并且允许用户配置参数来访问特定的模型。下面是一些主要支持的模型列表,方便用户快速了解。

1.1支持的聊天模型

AI提供商 模型名称
OpenAI GPT系列
Azure Open AI平台
Amazon Bedrock
Anthropic Claude
Cohere Command
AI21 Labs Jurassic-2
Meta LLama 2
Amazon Titan
Google Vertex AI
HuggingFace 多种模型(例如Llama2)
Ollama 支持本地运行,无需GPU

1.2支持的图像生成模型

AI提供商 模型名称
OpenAI DALL-E
StabilityAI 图像生成模型

1.3支持的向量模型

AI提供商 模型名称
OpenAI 向量模型
Azure Open AI向量模型
Ollama 本地向量处理
ONNX 跨平台支持
PostgresML 数据库集成模型
Bedrock Cohere Cohere平台
Bedrock Titan Titan平台
Google VertexAI

更多细节请参考官方文档:Spring AI项目文档。通过这些文档,用户可以详细了解如何将这些模型集成到自己的Java项目中,充分发挥AI技术的强大功能。

2、Spring AI 快速入门

在IDEA中快速启动一个新项目非常简单。在开始前需要选择你所需的AI模型依赖。

这里,我以Ollama模型为例来演示整个过程:

image.png

2.1 模型选择

Ollama允许我们在不需要GPU资源的情况下,仅通过一键在本地计算机上构建大型模型,并提供了控制台和RestfulAPI,方便我们在Ollama上快速测试和集成大型模型。

从Ollama官网中,我们可以看到Ollama支持以下模型。

模型名称 描述
wizardlm2 微软AI研发的最新大型语言模型,性能在复杂对话、多语言处理、推理及代理用户场景中有所提升。
mixtral Mistral AI发布的一套专家混合模型,提供开放权重,参数规模为8x7b和8x22b。
gemma Google DeepMind构建的轻量级、最先进的开放模型家族,适用于多种应用。
llama2 一系列基础语言模型,参数规模从7B到70B不等。
codegemma 一系列强大的轻量级模型,能够执行多种编码任务,如即时代码补全、代码生成、自然语言理解和数学推理等。
command-r 专为对话交互和处理长上下文任务优化的大型语言模型。
command-r-plus 一款强大且可扩展的大型语言模型,专为现实世界的企业用例设计,表现出色。
llava 一款新型端到端训练的大型多模态模型,结合视觉编码器和Vicuna实现视觉和语言理解。

注意:

Gemma是Google Meta最近发布的一款模型。相较于llama2模型对中文支持不足,gemma模型对中文的支持更加友好。

2.2、Ollama 安装设置

在计算机上安装Ollama,非常简单。直接访问Ollama的官方网站,下载与你的操作系统相匹配的版本。无论是Windows、Mac还是Linux,你都能找到适合的安装包。

下载完毕后,根据提示完成安装。然后,打开命令行工具,输入以下命令来确认Ollama已经正确安装,并且检查其版本:

ollama --version

从Ollama的模型库中拉取(pull)所需的模型。打开你的终端或命令提示符,输入以下命令来下载gemma:2b模型:

ollama pull gemma:2b

下载完成后,你可以立即在本地运行这个模型。继续在命令行中输入:

ollama run gemma:2b

这个命令会启动gemma:2b模型。一旦运行成功,你就可以开始使用模型的功能了。记得,每次使用模型时,只需简单地在控制台里运行上述命令即可。

首次使用ollama命令运行模型时,系统会自动开始下载所需的模型文件。注意,这个文件大概需要3GB的存储空间,下载时间取决于你的网络速度,可能需要一段时间,请耐心等待。

模型文件下载完毕后,模型会按照之前的设置自动启动。这时,你就可以在你的控制台里进行各种测试,与模型进行交互,看看模型的表现如何。

完成使用后,如果你需要退出模型,可以在控制台输入以下命令来安全地关闭模型:

<code>/bye

2.3、Spring依赖说明

需要特别注意的是,当你在使用Spring AI相关的依赖项时,可能会遇到一些小问题。由于这些依赖项目前还没有在Maven中央仓库中提供,所以你需要手动配置使用Spring的专用仓库。

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>

</dependency>

</dependencies>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.ai</groupId>

<artifactId>spring-ai-bom</artifactId>

<version>${spring-ai.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

在进行项目配置时,由于Maven官方仓库尚未收录Spring AI的相关依赖,我们需要对项目的pom.xml配置文件进行一点小修改,以确保能够正确地从Spring的专用仓库拉取所需依赖。具体地,你需要修改pom.xml文件中的仓库地址部分,指向Spring提供的专用仓库。

修改后的pom.xml文件中关于仓库配置的部分应该如下所示:

<repositories>

<!--这里使用的是快照版本-->

<repository>

<id>spring-snapshot</id>

<name>Spring Snapshot</name>

<url>https://repo.spring.io/snapshot</url>

<releases>

<enabled>false</enabled>

</releases>

</repository>

</repositories>

2.4配置Ollama模型

在你的项目中,要确保Ollama模型能正确发挥作用,我们需要对application.yml配置文件做一些关键性的调整。这个文件是定义项目运行时参数的核心文件,因此它的重要性不言而喻。

首先,你需要打开你项目中的application.yml文件,然后在合适的部分加入如下配置:

spring:

ai:

ollama:

base-url: http://localhost:11434

chat:

model: gemma:2b

接着,我们将配置一个专门处理聊天功能的配置类,如下所示:

package io.daasrattale.generalknowledge.chat;

import org.springframework.ai.chat.ChatClient;

import org.springframework.ai.ollama.OllamaChatClient;

import org.springframework.ai.ollama.api.OllamaApi;

import org.springframework.ai.ollama.api.OllamaOptions;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class ChatConfig {

@Bean

public ChatClient chatClient() {

return new OllamaChatClient(new OllamaApi())

.withDefaultOptions(OllamaOptions.create()

.withTemperature(0.9f));

}

}

说明一下,模型的“temperature”参数用于控制语言模型输出的随机性。这里我们将其设置为0.9,目的是让模型在回答时更具随机性,从而更愿意冒险尝试。

最后一步是创建一个简单的聊天用的REST API:

package io.daasrattale.generalknowledge.chat;

import org.springframework.ai.ollama.OllamaChatClient;

import org.springframework.http.ResponseEntity;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.RestController;

import reactor.core.publisher.Mono;

@RestController

@RequestMapping("/v1/chat")

public class ChatController {

private final OllamaChatClient chatClient;

public ChatController(OllamaChatClient chatClient) {

this.chatClient = chatClient;

}

@GetMapping

public Mono<ResponseEntity<String>> generate(@RequestParam(defaultValue = "Tell me to add a proper prompt in a funny way") String prompt) {

return Mono.just(

ResponseEntity.ok(chatClient.call(prompt))

);

}

}

2.5测试验证

我们来尝试调用一个GET请求 /v1/chat,输入一个空的提示:

那么,如果是一个简单的常识性问题呢:

2.6流访问代码测试示例

<code>@Test

void streamChat() throws ExecutionException, InterruptedException {

// Build an asynchronous function to manually close the test function

CompletableFuture<Void> future = new CompletableFuture<>();

String message = """

year-end work summary report

""";

PromptTemplate promptTemplate = new PromptTemplate("""

You are a Java development engineer, and you are good at writing the company’s year-end work summary report.

Write a 100-word summary report based on: {message} scenario

""");

Prompt prompt = promptTemplate.create(Map.of("message", message));

chatClient.stream(prompt).subscribe(

chatResponse -> {

System.out.println("response: " + chatResponse.getResult().getOutput().getContent());

},

throwable -> {

System.err.println("err: " + throwable.getMessage());

},

() -> {

System.out.println("complete~!");

// Close the function

future.complete(null);

}

);

future.get();

}

如何系统的去学习大模型LLM ?

作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的 AI大模型资料 包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

在这里插入图片描述

四、AI大模型商业化落地方案

img

阶段1:AI大模型时代的基础理解

目标:了解AI大模型的基本概念、发展历程和核心原理。内容

L1.1 人工智能简述与大模型起源L1.2 大模型与通用人工智能L1.3 GPT模型的发展历程L1.4 模型工程L1.4.1 知识大模型L1.4.2 生产大模型L1.4.3 模型工程方法论L1.4.4 模型工程实践L1.5 GPT应用案例

阶段2:AI大模型API应用开发工程

目标:掌握AI大模型API的使用和开发,以及相关的编程技能。内容

L2.1 API接口L2.1.1 OpenAI API接口L2.1.2 Python接口接入L2.1.3 BOT工具类框架L2.1.4 代码示例L2.2 Prompt框架L2.2.1 什么是PromptL2.2.2 Prompt框架应用现状L2.2.3 基于GPTAS的Prompt框架L2.2.4 Prompt框架与ThoughtL2.2.5 Prompt框架与提示词L2.3 流水线工程L2.3.1 流水线工程的概念L2.3.2 流水线工程的优点L2.3.3 流水线工程的应用L2.4 总结与展望

阶段3:AI大模型应用架构实践

目标:深入理解AI大模型的应用架构,并能够进行私有化部署。内容

L3.1 Agent模型框架L3.1.1 Agent模型框架的设计理念L3.1.2 Agent模型框架的核心组件L3.1.3 Agent模型框架的实现细节L3.2 MetaGPTL3.2.1 MetaGPT的基本概念L3.2.2 MetaGPT的工作原理L3.2.3 MetaGPT的应用场景L3.3 ChatGLML3.3.1 ChatGLM的特点L3.3.2 ChatGLM的开发环境L3.3.3 ChatGLM的使用示例L3.4 LLAMAL3.4.1 LLAMA的特点L3.4.2 LLAMA的开发环境L3.4.3 LLAMA的使用示例L3.5 其他大模型介绍

阶段4:AI大模型私有化部署

目标:掌握多种AI大模型的私有化部署,包括多模态和特定领域模型。内容

L4.1 模型私有化部署概述L4.2 模型私有化部署的关键技术L4.3 模型私有化部署的实施步骤L4.4 模型私有化部署的应用场景

学习计划:

阶段1:1-2个月,建立AI大模型的基础知识体系。阶段2:2-3个月,专注于API应用开发能力的提升。阶段3:3-4个月,深入实践AI大模型的应用架构和私有化部署。阶段4:4-5个月,专注于高级模型的应用和部署。

这份完整版的大模型 LLM 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【<code>保证100%免费】

😝有需要的小伙伴,可以Vx扫描下方二维码免费领取🆓



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。