Spring AIを用いた初めてのAIアプリケーション開発

はじめに

Spring Bootの公式サイトを閲覧中に、新たに追加されたSpring AIプロジェクトに気づきました。実際に試してみたところ、なかなか良い出来でした。各社のAPI呼び出しプロセスをラップしているだけですが、これからの発展が期待されます。最近、AI時代におけるプログラマーとは何かを考え続けていました。その結果として導き出された答えは、「一人で開発チーム全体の役割を担える存在」です。現在のAI技術は個別の要件においてプログラマーを圧倒しており、プログラマーの役割はビジネス全体の理解と協調的な実装に集中する必要があります。将来的にAIがチーム全体の作業を代替できるようになれば、プログラマーはビジネス分析に特化することになるでしょう。その際には、理解力が高い人が優れたプログラマーとなるはずです。

環境準備

まず、最新の開発環境が必要です。国内の多くのプロジェクトではまだJDK1.8が使われており、IntelliJ IDEA 2019を使用している人も多く、これはもう時代遅れです。現在必要なのは以下の通りです:

  1. JDK 17以上
  2. IntelliJ IDEA 2022以上
  3. OpenAI APIキー
  4. ネットワークアクセス手段

OpenAI環境が利用できない場合は、他のサービス環境も検討できます。Spring AIは複数の環境をサポートしており、詳細はhttps://spring.io/projects/spring-aiを参照してください。

プロジェクト初期化

  • 新規プロジェクトを作成
  • WebAIモジュールを選択
  • Mavenによる依存関係のダウンロード完了を待機

アリババクラウドのリポジトリからダウンロードに失敗する場合は、デフォルトのリポジトリ設定に戻すことを推奨します。

<repository>
    <id>spring-milestones</id>
    <name>Spring Milestones</name>
    <url>https://repo.spring.io/milestone</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>

pom.xmlファイル内の依存関係を確認してください:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.ai</groupId>
   <artifactId>spring-ai-openai-spring-boot-starter</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-test</artifactId>
   <scope>test</scope>
</dependency>

新しいConversationControllerクラスを作成し、以下のようなシンプルなコードを実装します:

@RestController
public class ConversationController {

  private final OpenAiChatClient aiClient;

  @Autowired
  public ConversationController(OpenAiChatClient aiClient) {
      this.aiClient = aiClient;
  }

  @GetMapping("/chat/generate")
  public Map produceContent(@RequestParam(value = "input", defaultValue = "Share a funny story") String input) {
      System.setProperty("http.proxyHost", "127.0.0.1");
      System.setProperty("http.proxyPort", "10809");
      System.setProperty("https.proxyHost", "127.0.0.1");
      System.setProperty("https.proxyPort", "10809");
      System.setProperty("proxySet", "true");
      return Map.of("result", aiClient.call(input));
  }

  @GetMapping("/chat/generateStreaming")
  public Flux<ChatResponse> produceStreaming(@RequestParam(value = "input", defaultValue = "Share a funny story") String input) {
      Prompt requestPrompt = new Prompt(new UserMessage(input));
      return aiClient.stream(requestPrompt);
  }
}

application.propertiesファイルでOpenAIのAPIキーを設定します:

spring.ai.openai.api-key=YOUR_API_KEY
spring.ai.openai.chat.options.model=gpt-3.5-turbo
spring.ai.openai.chat.options.temperature=0.7

現在選択可能なモデルは多数あります。

問題解決

3.1 接続タイムアウト対応

これはJavaコード内でプロキシ設定が行われていないことが原因です。一部のツールはデフォルトでグローバル設定になっているためコード内での設定は不要ですが、そうでない場合もあるため適宜設定してください。上記コードで既に記述していますが、SOCKS5プロキシなど他の方式でも対応可能です。

System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "10809");
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "10809");
System.setProperty("proxySet", "true");

使用しているツールのIPアドレスとポート番号が不明な場合は、以下の手順で確認できます:
Windows 10および11の場合:スタートメニュー右クリック→設定→ネットワークとインターネット→プロキシ→手動プロキシ設定

3.2 クォータ超過エラー

HTTP 429エラーはOpenAIの公式サイトで説明されています。
単純に言えば、有料アカウントへのアップグレードが必要か、アカウントのクォータが不足しているため、追加課金が必要です。

API呼び出しテスト

最初に設定した質問「tell me a joke」を思い出してください。
再度アクセスして、返答が変化するか確認します。
結果が変わったことで、正しく動作していることが確認できました。

まとめ

新しい技術の登場は常に不安感を引き起こします。抵抗する人、受け入れる人、無関心な人、冷淡な人がいます。しかし、これはかつて電気や自動車の出現と同じように、多くの人の職を失わせる一方で、新たな雇用機会も生み出します。恐れる必要はありません。AIはあくまでツールであり、プログラマーは多くの人よりも早くAIを理解し利用する機会があります。継続的に学習し続ける限り、将来においても機械に置き換えられることはないでしょう。なぜなら、機械には感情がないからです。

タグ: spring-ai openai-api java-ai-integration gpt-3.5-turbo spring-boot-starter

7月29日 22:06 投稿