使用Spring AI接入OpenAI,Java开发者快速上手大模型

开发 前端
在本教程中,你学会了如何开始使用Spring AI,还熟悉了特定术语,如Prompt、Role、Message和PromptTemplate。

在本教程中,将学习Spring AI的基本概念,以及如何在项目中实现它。本文将在Spring Boot应用程序中创建一个AI助手,帮助学生练习外语。

一、演示项目

1.1 构想 💡

想象一下,你是一名外语学生,想要练习新词汇和语法。如果你是自学,可以考虑一个想要描述的情境。例如,我今天早上吃了什么早餐,我昨天做了什么,等等。

然而,反复练习相同的情境可能会感到无聊。单独思考新的练习对话情境是具有挑战性的。如果有人开始一个故事供你继续,这将很有帮助。

假设你刚刚完成了一节关于衣服的课程,想用一个有趣的情境来练习新的词汇。这就是AI助手的作用所在。它具有丰富的想象力,可以为你编造各种故事供你继续讲下去。✨

1.2 技术背景 💻

1.2.1 什么是Spring AI?

Spring AI简化了集成AI功能的应用程序开发。它为Spring应用程序中的AI模型和服务提供了一系列方便的抽象。

1.2.3 SpringAI的应用场景

Spring AI可以帮助开发聊天机器人,用于自然语言交互、内容生成和总结、数据分析及可视化、图像识别和自然语言处理。

它擅长为你个性化推荐事物,预测机器可能发生故障的时间以避免问题,并在提高安全性的同时迅速识别欺诈行为。

1.3 项目设置 🛠

  1. 在这个演示中将使用Maven,需要以下依赖项。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
 
   <dependency>
    <groupId>org.springframework.experimental.ai</groupId>
    <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
    <version>0.7.1-SNAPSHOT</version>
   </dependency>
 
   <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
   </dependency>

请注意,spring-ai依赖项可以通过Milestones和Snapshots仓库获取,将以下内容添加到pom.xml的 repositories部分。

<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>
  1. 本项目需要一个OpenAI API密钥。如果你尚未拥有,请按照说明进行操作。

【OpenAI API密钥】:https://platform.openai.com/api-keys

  1. 生成密钥后,将其添加到项目中的application.yml中。
spring:
  ai:
    openai.api-key: YOUR_KEY

这就是开始所需的一切,接下来继续编码部分。

  1. 创建一个RestController。
@RestController
@RequiredArgsConstructor
public class PromptController {

    private final PromptService promptService;

    @PostMapping("/starter")
    public ResponseEntity<String> generateSentenceStarter(@RequestBody Map<String, String> params) {
        String language = params.get("language");
        String topic = params.get("topic");
        return ResponseEntity.ok(promptService.generateSentences(language, topic));
    }
}

generateSentenceStarter方法通过/starter端点接收传入的POST请求。学生将提供他们想要练习的主题和所学语言。

  1. 以下是PromptService的代码。
@Service
@RequiredArgsConstructor
public class PromptService {

    private final AiClient aiClient;

    public String generateSentences(String language, String topic) {
        String userText = """
                 Start a sentence in {language} about this topic {topic} and ask the student to think about continuing the story to practice grammar and new words. 
                 If the sentence is in Japanese,
                 always write back in Hiragana and provide the Romaji equivalent in brackets.
                 Also, translate it into English.
                 """;
        PromptTemplate userPromptTemplate = new PromptTemplate(userText);
        Message userMessage = userPromptTemplate.createMessage(Map.of("language", language, "topic", topic));

        String systemText = """
                You are a helpful AI assistant that helps students in practicing foreign languages. Respond in the style of an encouraging teacher.
                """;
        SystemPromptTemplate systemPromptTemplate = new SystemPromptTemplate(systemText);

        Message systemMessage = systemPromptTemplate.createMessage();
        
        Prompt prompt = new Prompt(List.of(userMessage, systemMessage));
        return aiClient.generate(prompt).getGeneration().getText();
    }
}

1.4 基本概念

AiClient是一个抽象接口,用于启用生成性AI API的使用。目前,它有两种实现方式:OpenAI和Azure OpenAI。

在Spring AI中,Prompt告诉AI要生成什么输出。

PromptTemplate使用模型对象来填充模板中的占位符。我们将渲染的字符串作为提示提供给AI模型。

Roles指的是提示中的特定部分,它们在制作最终回复时发挥着不同的功能。这些角色有助于构建提供给人工智能模型的信息结构,使输出结果更有针对性和意义。

AI提示中的角色介绍如下。

  • 系统角色:通过设置解释和响应风格规则来引导AI的行为。
  • 用户角色:代表用户的输入,形成AI响应的基础。
  • 助手角色:AI的响应保持对话的流畅性和上下文。
  • 功能角色:专注于特定任务,例如计算或数据提取,超出对话范围在需要时提供实际帮助。

Message接口的不同实现方式与AI模型可以处理的消息类别相一致。消息类别根据模型中的对话角色进行区分。这一区分通过MessageType实现。

以上是理论部分。接下来测试一下应用程序。

二、测试应用程序🧪

启动应用程序,并使用curl发送带有类似参数的POST请求。

curl -X POST -H "Content-Type: application/json" -d '{"language": "japanese", "topic": "clothes"}' http://localhost:8080/starter

以下是生成的响应。

あなたは明日友達とショッピングに行く予定です。何を着て行く予定ですか?
(Anata wa ashita tomodachi to shoppingu ni iku yotei desu. Nani o kite iku yotei desu ka?)
Translation: You are planning to go shopping with your friend tomorrow. What are you planning to wear?

这个回应看起来是正确的,这是一个很好的句子开头。

接下来再尝试另一个角色。这次,学生希望对他们的文本提供反馈。

在PromptService中添加以下这种方法。

public String provideFeedback(String userText) {
        Message userMessage = new UserMessage("Is this sentence correct: " + userText);

        String instructions = """
                You are a helpful AI assistant that helps students in practicing foreign languages.
                You should provide feedback to the students to correct the grammar and make the sentence in the foreign language sound native.
                Check and correct the user text {text}. Tell the student if the sentence is correct. If the sentence is in Japanese,
                always write back in Hiragana and provide the Romaji equivalent in brackets.
                """;
        AssistantPromptTemplate assistantPromptTemplate = new AssistantPromptTemplate(instructions);
        Message assistantPromptTemplateMessage = assistantPromptTemplate.createMessage(Map.of("text", userText));

        Prompt prompt = new Prompt(List.of(userMessage, assistantPromptTemplateMessage));
        return aiClient.generate(prompt).getGeneration().getText();
    }

如你所见,它使用了助手角色。

将新端点添加到RestController中。

@PostMapping("/feedback")
        public ResponseEntity<String> provideFeedback(@RequestBody Map<String, String> params) {
            String text = params.get("text");
            return ResponseEntity.ok(promptService.provideFeedback(text));
        }

应用程序将监听/feedback端点,并将学生的文本发送给AI助手。它将返回更正后的答案。

接下来尝试一下。

curl -X POST -H "Content-Type: application/json" -d '{"text": "Kirei dzubon o kaimashita. Murasakiiro no sukaato mo kaimashita. Kono sukaato wa kirei da ga takai desu."}' http://localhost:8080/feedback

以下是AI的回复。

The sentence you provided is mostly correct. Here is the corrected version:

きれいなズボンを買いました。紫色のスカートも買いました。このスカートはきれいだが高いです。
(Kirei na zubon o kaimashita. Murasakiiro no sukāto mo kaimashita. Kono sukāto wa kirei da ga takai desu.)

Translation: I bought a nice pair of pants. I also bought a purple skirt. This skirt is beautiful, but expensive.

Well done! Your sentence is grammatically correct and the vocabulary usage is appropriate. Keep up the good work!

它理解了我想要表达的意思,还纠正了我的错误。这令人印象深刻!

但当然,我们应该谨慎对待反馈,因为AI可能会出错。始终仔细检查答案是个好主意。

三、结论

在本教程中,你学会了如何开始使用Spring AI,还熟悉了特定术语,如Prompt、Role、Message和PromptTemplate。

现在,你可以根据自己的需求使用Spring AI创建自己的应用程序。本文示例项目的完整代码可以在以下GitHub仓库中找到。

四、参考资料

  • 【Spring AI API文档】:https://docs.spring.io/spring-ai/reference/api/
  • 【GitHub仓库】:https://github.com/kirshiyin89/spring-ai-demo/tree/main
责任编辑:武晓燕 来源: Java学研大本营
相关推荐

2023-03-08 12:43:44

微软AI

2023-11-08 07:55:48

2023-06-25 15:04:09

2023-10-12 10:12:28

OpenAIAI 模型

2024-06-25 12:40:10

2024-02-27 07:22:45

DriftAI应用

2024-11-12 13:41:49

2024-12-20 13:01:03

2024-07-05 11:34:07

2023-11-07 13:22:52

2024-01-23 18:53:04

PostgreSQL关系数据库

2024-07-08 10:51:16

2023-12-07 09:12:46

IDEA开发工具

2024-10-25 19:32:58

ChatGPT

2023-05-19 14:01:47

AI模型

2019-08-16 10:55:37

开发者技能AI

2024-04-17 14:44:49

2018-06-03 08:00:24

AI开发深度学习语言
点赞
收藏

51CTO技术栈公众号