Java在人工智能应用开发中的强大角色

人工智能主要分为两个部分:一个是进行底层大语言模型的训练,另一个是基于这些大模型构建业务应用。Java在第二个方面表现得尤为出色,即基于大模型开发业务应用。由于过去大量的企业级应用程序都是使用Java编写的,因此利用Java来集成人工智能能力变得非常自然且高效,可以在现有架构上轻松叠加新的智能特性。

具体来说,Java在人工智能领域的应用广泛而多样。例如,在聊天机器人场景中,通过Spring AI框架,开发者能够迅速接入大模型,并提供强大的对话交互功能;在图片生成领域,同样借助Spring AI提供的接口,可以实现基于文本描述自动生成图像的能力;

此外,对于图片识别、语音识别以及文档分析等任务,也都有相应的解决方案和技术支持。这些都使得传统的业务流程或用户体验得到极大提升。

然而,在此之前,这一过程面临的主要挑战之一是缺乏一个通用性强、易用性高的AI应用开发框架。各个大模型提供商各自为政,其API设计差异巨大,给开发者带来不小的困扰。幸运的是,随着Spring AI这样的项目出现,这些问题得到了有效缓解。Spring AI不仅统一了不同AI服务提供商之间的调用方式,还提供了丰富的工具集,如函数调用(Function Calling)、检索增强生成(RAG)等功能,进一步增强了Java应用程序处理复杂AI任务的能力。总之,现在利用Java进行人工智能项目的开发变得更加便捷与高效。

Spring AI:统一接口,简化AI工程开发

Spring AI是一个专为AI工程设计的应用框架,它将Spring生态系统的设计原则如可移植性和模块化应用到了AI领域。其核心优势在于提供了一套统一的接口,使得开发者能够通过简单的配置更改即可轻松切换不同的AI服务提供商(例如OpenAI、Azure、阿里云等),而无需大幅修改代码。这不仅极大地简化了开发过程,还减少了在不同AI平台之间迁移时的工作量。此外,Spring AI与现有的Spring生态无缝集成,并且完美兼容Java面向对象编程,让熟悉Spring和Java的开发者可以快速上手,专注于业务逻辑而非底层技术细节。

Spring AI alibaba:一键对接云端大模型

Spring AI Alibaba是Spring AI的一个实现,专门用于集成阿里云的百炼系列云产品的大模型。它通过提供一套标准化接口,使得开发者可以轻松接入并使用不同的AI服务,如通义千问、文生图等,而无需针对每个AI提供商单独编写代码。其核心优势在于支持“一次编码,多处运行”的理念,极大简化了跨平台迁移和开发流程。此外,Spring AI Alibaba还提供了诸如Prompt Template、OutputParser等功能,进一步增强了应用开发的灵活性与效率。通过利用这些特性,开发者能够快速构建基于阿里云AI能力的应用程序。

Spring AI Alibaba实操:打造带Prompt及流式聊天功能的完整教程

专家意见:Java可以做人工智能么?_aigc


为了基于Spring AI Alibaba完成一个有Prompt和流式返回的聊天API实现,需要遵循以下步骤。本示例将展示如何从零开始构建这个功能,包括必要的配置、依赖添加以及核心代码编写。

1. 环境准备

  • JDK版本:确保你的项目使用的是 JDK 17 或更高。
  • Spring Boot版本:确认使用的Spring Boot版本在3.3.x以上。

2. 获取API Key

首先,在阿里云上获取通义千问的API Key:

  • 访问阿里云百炼页面并登录。
  • 开通“百炼大模型推理”服务,并等待开通成功的通知。
  • 成功后,通过右上角个人图标进入API-KEY管理界面创建一个新的API-KEY,并记录该key值。

3. 配置环境变量

设置环境变量来存储你的API Key,便于后续应用读取:

export AI_DASHSCOPE_API_KEY=这里填写你获得的API-KEY

同时,在项目的application.properties文件中加入API Key的引用:

spring.ai.dashscope.api-key=${AI_DASHSCOPE_API_KEY}

4. Maven仓库与依赖配置

由于Spring AI Alibaba当前仍处于早期阶段,我们需要添加额外的Maven仓库来获取其最新的快照或里程碑版本。编辑pom.xml以包含这些库:

<repositories>
    <repository>
        <id>sonatype-snapshots</id>

        <url>https://oss.sonatype.org/content/repositories/snapshots</url>

        <snapshots>
            <enabled>true</enabled>

        </snapshots>

    </repository>

    <repository>
        <id>spring-milestones</id>

        <name>Spring Milestones</name>

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

        <snapshots>
            <enabled>false</enabled>

        </snapshots>

    </repository>

    <repository>
        <id>spring-snapshots</id>

        <name>Spring Snapshots</name>

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

        <releases>
            <enabled>false</enabled>

        </releases>

    </repository>

</repositories>

接着,在dependencies部分引入必需的库:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-dependencies</artifactId>

            <version>3.3.4</version>

            <type>pom</type>

            <scope>import</scope>

        </dependency>

    </dependencies>

</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>

        <artifactId>spring-ai-alibaba-starter</artifactId>

        <version>1.0.0-M2</version>

    </dependency>

    <!-- 其他可能的依赖 -->
</dependencies>

5. 创建Controller处理聊天请求

现在我们可以创建一个控制器类,用于接收用户的输入并通过Flux流式响应返回结果。

@RestController
@RequestMapping("/chat")
public class ChatController {

    private final ChatClient chatClient;

    @Autowired
    public ChatController(ChatClient.Builder builder) {
        this.chatClient = builder.build();
    }

    @GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamChat(@RequestParam("input") String input) {
        return chatClient.prompt()
                         .user(input)
                         .stream()
                         .content();
    }
}

这段代码定义了一个RESTful API端点/chat/stream,它接受用户输入作为查询参数input,然后调用ChatClient进行交互,并以流的方式返回对话内容。

6. 使用Prompt Template增强对话质量

为了让对话更加丰富,可以使用预设的提示词模板(Prompt Template)。为此,你需要准备一个.st格式的文件放在项目的资源目录下(例如src/main/resources/prompts/chat-template.st):

You are a friendly and helpful assistant.
{message}

然后修改控制器方法,使其能够利用这个模板:

@Autowired
@Value("classpath:/prompts/chat-template.st")
private Resource chatTemplateResource;

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam("input") String input) {
    PromptTemplate promptTemplate = new PromptTemplate(chatTemplateResource);
    Prompt prompt = promptTemplate.create(Map.of("message", input));
    return chatClient.prompt(prompt).stream().content();
}

这样,每次接收到用户输入时,都会先将其填充到指定的提示词模板中再发送给AI模型处理,从而提高生成回复的质量。

按照上述步骤操作,你就能够成功地基于Spring AI Alibaba搭建起一个具备Prompt支持及流式响应能力的基础聊天应用了。此方案不仅适用于快速原型开发,也适合更复杂的企业级应用集成场景。

Spring AI Alibaba实战 2 :打造动漫美图生成教程

编写控制器代码创建一个名为ImageModelController的新类,并注入ImageModel实例。以下是完整的示例代码:

@RestController
@RequestMapping("/ai")
public class ImageModelController {

    private final ImageModel imageModel;

    @Autowired
    public ImageModelController(ImageModel imageModel) {
        this.imageModel = imageModel;
    }

    @GetMapping("/image")
    public String generateImage(@RequestParam String input) {
        ImageOptions options = ImageOptionsBuilder.builder()
                .withWidth(1024)
                .withHeight(1024)
                .withModel("wanx-v1") // 使用正确的模型名称
                .withN(1)
                .build();
        ImagePrompt imagePrompt = new ImagePrompt(input, options);
        ImageResponse imageResponse = imageModel.call(imagePrompt);
        List<ImageGeneration> results = imageResponse.getResults();
        String url = results.get(0).getOutput().getUrl();
        return url;  // 返回图像URL
    }
}
  1. 测试API启动应用程序后,使用如下URL请求生成图片:
http://localhost:8080/ai/image?input=美丽的动漫女孩

解释

上述步骤首先保证了您的开发环境符合最低要求,然后指导如何正确配置项目的构建文件来引入必要的库。接着通过配置应用属性来指定API Key,并且通过简单的RESTful服务实现了图像生成的功能。最后一步提供了如何测试此功能的具体方法。这样就完成了一个基本但完整的基于Spring AI Alibaba的图像生成功能集成案例。