ホームページ > テクノロジー周辺機器 > AI > Spring Boot と Spring AI を使用して生成人工知能アプリケーションを構築する

Spring Boot と Spring AI を使用して生成人工知能アプリケーションを構築する

PHPz
リリース: 2024-04-28 11:46:01
転載
680 人が閲覧しました

業界リーダーとして、Spring+AI は、強力で柔軟な API と高度な機能を通じて、さまざまな業界に最先端のソリューションを提供します。このトピックでは、さまざまな分野での Spring+AI の応用例を詳しく掘り下げ、Spring+AI がどのように特定のニーズを満たし、目標を達成し、これらの教訓をより広範囲のアプリケーションに拡張するかを示します。このトピックが Spring+AI の無限の可能性をより深く理解し、活用するきっかけになれば幸いです。

Spring フレームワークはソフトウェア開発の分野で 20 年以上使用されており、Spring Boot 1.0 バージョンがリリースされてから 10 年が経過しました。 Spring が開発者を反復的なタスクから解放し、ビジネス価値の提供に重点を置く独自のスタイルを作成したことに異論を唱える人はいません。時間が経つにつれて、Spring の技術的な深みは増し続け、幅広い開発領域とテクノロジをカバーしています。その一方で、より特殊なソリューションが試行され、概念実証が作成され、最終的にプロジェクトの傘下で推進されるにつれて、その技術的な幅は拡大し続けています。

Spring + AI プロジェクトは、その参考ドキュメントによると、生成人工知能レイヤーの必要性がアプリケーションに導入された場合に開発プロセスを簡素化することを目的とした例です。開発者は再び反復的なタスクから解放され、シンプルなインターフェイスを通じて事前トレーニングされたモデル (実際の処理アルゴリズムを含む) と直接対話できるようになります。

Spring AI を介してプログラム的に生成事前学習トランスフォーマー (GPT) と直接対話することにより、ユーザー (開発者) は広範な機械学習の知識を必要としません。しかし、エンジニアとして、これらの開発者ツールは簡単かつ迅速に使用でき、結果を生み出すことができるとしても、自分を抑制し、最初に基本的な概念を理解することに慎重になる必要があると強く感じています。さらに、このパスに従うことで、出力の価値がさらに高まる可能性があります。

目的

この記事では、Spring AI を Spring Boot アプリケーションに統合し、プログラムで OpenAI と対話する方法を紹介します。私たちは、デザインは一般に最先端の活動であると想定しています。したがって、実験中に使用されるプロンプトは有益ではありますが、あまり応用可能ではありません。ここで焦点を当てているのは、通信インターフェイスである Spring AI API です。

実装前

まず第一に、より良い品質を提供し、時間を節約し、コストを削減することを期待することに加えて、GPT ソリューションを使用する理由を明確にする必要があります。

プロダクション AI は、時間のかかる大量のタスクを実行し、より迅速かつ効率的に結果を生成することに優れていると言われています。さらに、これらの結果が経験豊富で知的な人間によってさらに検証されると、有用な結果が得られる可能性が高まります。

次に、すぐに実装に取り​​掛かりたいという誘惑に抵抗し、少なくとも時間をかけて一般的な概念を理解してください。生成 AI の概念の詳細な説明は、この記事の範囲をはるかに超えています。ただし、相互作用に存在する「主要なアクター」については、以下で簡単に説明します。

ステージ - 生成 AI は人工知能の一部です
入力 - 提供されたデータ (入力)
出力 - 計算の結果 (出力)
大規模言語モデル (LLM) - 出力を生成する微調整されたアルゴリズム解釈された入力に基づく
プロンプト ワード - 入力がモデルに渡される最先端のインターフェイス
プロンプト ワード テンプレート - 構造化されたパラメーター化されたプロンプトの構築を可能にするコンポーネント
トークン - アルゴリズムは内部で入力をトークンに変換し、次に、これらのトークンを使用して結果をコンパイルし、最終的に
モデルの環境ウィンドウ - モデルが呼び出しごとのトークン数を制限するしきい値 (一般に、使用されるトークンが多いほど、操作のコストが高くなります) からの出力を構築します

最後に、実装を開始できますが、実装が進むにつれて、最初の 2 つのステップを確認して最適化することをお勧めします。

プロンプトワード

この演習では、次のことを要求します:

Write {count = three} reasons why people in {location = Romania} should consider a {job = software architect} job. These reasons need to be short, so they fit on a poster. For instance, "{job} jobs are rewarding."
ログイン後にコピー

上面内容代表了提示词模板。按照建议,应作为提示词的一部分提供清晰的主题,清晰的任务含义以及额外的有用信息,以提高结果的准确性。

提示词包含三个参数

count - 希望作为输出的原因数量
job - 感兴趣的领域或工作
location - 工作申请者所在的国家,城镇,地区等

概念验证

在这篇文章中,简单的概念验证目标如下:

将 Spring AI 集成到Spring Boot应用程序并使用它
允许客户端通过应用程序与 Open AI 进行通信
客户端向应用程序发出参数化的HTTP请求
应用程序使用一个提示词来创建输入,发送给 Open AI 并获取输出
应用程序将响应发送给客户端

利用Spring Boot以及Spring AI构建生成式人工智能应用图片

项目设置

Java 21
Maven 3.9.2
Spring Boot – v. 3.2.2
Spring AI – v. 0.8.0-SNAPSHOT (仍在开发,实验性)

代码实现

Spring AI 集成

通常,这是一个基本步骤,不一定值得一提。然而,因为 Spring AI 目前以快照形式发布,为了能够集成 Open AI 自动配置依赖,你需要添加一个引用到 Spring 快照仓库。

<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></repositories>
ログイン後にコピー

下一步是添加 spring-ai-openai-spring-boot-starter Maven 依赖项。

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId><version>0.8.0-SNAPSHOT</version></dependency>
ログイン後にコピー

Open AI ChatClient 现在是应用程序类路径的一部分。它是用来向 Open AI 发送输入并获取输出的组件。

为了能够连接到AI模型,需要在 application.properties 文件中设置 spring.ai.openai.api-key 属性。

spring.ai.openai.api-key = api-key-value
ログイン後にコピー

它的值代表了用户的有效API密钥,用户将通过此密钥进行通信。通过访问[资源2],可以注册或登录并生成一个。

客户端 - Spring Boot应用程序通信

概念验证的第一部分是客户端应用程序(例如浏览器,curl等)与开发的应用程序之间的通信。这是通过一个 REST 控制器实现的,可以通过HTTP GET请求访问。

URL路径是 /job-reasons,还有之前在定义提示时概述的三个参数,这将导致如下格式:

/job-reasons?count={count}&job={job}&locatinotallow={location}
ログイン後にコピー

和相应的控制器:

@RestControllerpublic class OpenAiController { @GetMapping("/job-reasons")public ResponseEntity<String> jobReasons(@RequestParam(value = "count", required = false, defaultValue = "3") int count, @RequestParam("job") String job, @RequestParam("location") String location) {return ResponseEntity.ok().build();}}
ログイン後にコピー

由于来自 Open AI 的响应将是一个字符串,因此控制器返回一个封装了字符串的ResponseEntity。如果我们运行应用程序并发出请求,当前响应体部分没有返回任何内容。

客户端 - Open AI 通信

Spring AI 目前主要关注处理语言并产生语言或数字的AI模型。在前一类别中, Open AI 模型的例子包括GPT4-openai或GPT3.5-openai。

为了与这些AI模型(实际上是指 Open AI 算法)进行交互, Spring AI 提供了一个统一的接口。

ChatClient接口目前支持文本输入和输出,并具有简单的契约。

@FunctionalInterfacepublic interface ChatClient extends ModelClient<Prompt, ChatResponse> {default String call(String message) {Prompt prompt = new Prompt(new UserMessage(message));return call(prompt).getResult().getOutput().getContent();} ChatResponse call(Prompt prompt);}
ログイン後にコピー

确实如此,功能接口的实际方法通常是被使用的方法。

在我们的概念验证中,这正是我们所需要的,一种调用 Open AI 并发送目标参数化 Prompt 作为参数的方式。我们定义了以下的OpenAiService,在其中注入了一个 ChatClient 的实例。

@Servicepublic class OpenAiService { private final ChatClient client; public OpenAiService(OpenAiChatClient aiClient) {this.client = aiClient;} public String jobReasons(int count, String domain, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding.""""; final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", domain);promptTemplate.add("location", location); ChatResponse response = client.call(promptTemplate.create());return response.getResult().getOutput().getContent();}}
ログイン後にコピー

如果应用程序正在运行,那么可以从浏览器执行以下请求:

http://localhost:8080/gen-ai/job-reasons?count=3&job=software%20architect&locatinotallow=Romania
ログイン後にコピー

这下面的结果被检索出来的结果:

利润丰裕的职业:软件架构师的工作提供了有竞争力的薪酬和出色的增长机会,确保在罗马尼亚的财务稳定和成功。
热门职业:随着技术需求的持续增长,软件架构师在罗马尼亚和全世界都备受追捧,提供了丰富的就业前景和就业保障。
创造性问题解决:软件架构师在设计和开发创新软件解决方案中扮演着至关重要的角色,使他们可以释放他们的创造力,并对各种行业产生重大影响。

这就是我们所期望的——一个简易的接口,通过它,可以要求 Open AI GPT模型写出一些原因,解释为何在特定地点的特定工作具有吸引力。

调整和观察

到目前为止,开发的简单概念验证主要使用了默认的配置。

ChatClient实例可以通过各种属性根据所需需要来配置。虽然这超出了本文的范围,但在这里举两个例子。

spring.ai.openai.chat.options.model 指定要使用的AI模型。默认为'gpt-35-turbo',但'gpt-4'和'gpt-4-32k'指定的是最新版本。虽然这些版本都是可用的,但你可能无法使用按使用量付费的计划来访问这些版本,但 Open AI 网站上有更多的信息可以帮助你了解如何适应它。

另一个值得一提的属性是 spring.ai.openai.chat.options.temperature。根据参考文档,采样温度控制了“回应的创新性”。据说,较高的值会让输出“更随机”,而较低的值会“更专注和决定性”。默认值为0.8,如果我们将其降低到0.3,重启应用并再次使用相同的请求参数询问,下面的结果将被检索出来。

有利可图的职业机会:罗马尼亚的软件架构师工作提供有竞争力的薪水和极好的成长前景,对于寻求财务稳定和职业发展的个人来说,这是一个吸引人的职业选择。
具有挑战性和智能刺激的工作:作为一名软件架构师,你将负责设计和实现复杂的软件系统,解决复杂的技术问题,并与有才华的团队合作。这个角色提供了持续的学习机会和在尖端技术上工作的机会。
高需求和工作保障:随着对技术和数字化转型的依赖增加,各行各业对熟练软件架构师的需求在上升。选择在罗马尼亚的软件架构师工作确保了工作安全和广泛的就业选择,无论是在本地还是国际上。

可以看出,这种情况下的输出更具描述性。

最后一个考虑因素是与获取的输出的结构相关的。拥有将实际接收的有效载荷映射到Java对象(例如,类或记录)的能力将非常方便。截至目前,表示形式是文本形式,实现也是如此。输出解析器可能实现这一点,类似于Spring JDBC的映射结构。

在这个概念验证中,我们使用了一个BeanOutputParser,它允许直接将结果反序列化到Java记录中,如下所示:

public record JobReasons(String job, String location, List<String> reasons) {}
ログイン後にコピー

通过将 {format} 作为提示文本的一部分,并将其作为指示提供给 AI 模型。

OpenAiService 方法变为:

public JobReasons formattedJobReasons(int count, String job, String location) {final String promptText = """Write {count} reasons why people in {location} should consider a {job} job.These reasons need to be short, so they fit on a poster.For instance, "{job} jobs are rewarding."{format}"""; BeanOutputParser<JobReasons> outputParser = new BeanOutputParser<>(JobReasons.class); final PromptTemplate promptTemplate = new PromptTemplate(promptText);promptTemplate.add("count", count);promptTemplate.add("job", job);promptTemplate.add("location", location); promptTemplate.add("format", outputParser.getFormat());promptTemplate.setOutputParser(outputParser); final Prompt prompt = promptTemplate.create(); ChatResponse response = client.call(prompt);return outputParser.parse(response.getResult().getOutput().getContent());}
ログイン後にコピー

再次调用时,输出如下:

{"job":"software architect","location":"Romania","reasons":["High demand","Competitive salary","Opportunities for growth"]}
ログイン後にコピー

格式符合预期,但解释的原因似乎较少,这意味着需要进行额外的调整以达到更好的可用性。然而,从概念验证的角度来看,这是可接受的,因为焦点是形式。

结论

提示设计是任务的重要部分 - 提示越清晰,输入越好,输出的质量也就越高。

使用 Spring AI 与各种聊天模型进行集成非常简单 - 本篇文章展示了一个 Open AI 的集成。

然而,对于 Gen AI 或者几乎任何技术来说,首先至少要熟悉基本概念是非常重要的。然后,尝试理解如何进行通讯的魔法,最后再开始编写“生产”代码。

最后但同样重要的是,建议进一步探索 Spring AI API,以了解实现并随着其不断发展和改进保持最新状态。


以上がSpring Boot と Spring AI を使用して生成人工知能アプリケーションを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート