SpringOneカンファレンスでSpring AIに関する実験的なプロジェクトが紹介された。これにより、同AIの基本的なコンセプトを用いたAIアプリケーションの制作が可能となる。現在、プロジェクトはAzure OpenAIとOpenAIをAIバックエンドとして統合している。コンテンツ生成、コード生成、セマンティック検索、要約などのユースケースがプロジェクトによってサポートされている。
歴史的に、PythonはCやC++などの言語で書かれたAIアルゴリズムへの高速アクセスを提供するために使われてきた。OpenAIのChatGPTのようなソリューションで使用されている生成AIは、HTTP経由で事前に訓練されたモデルにアクセスを可能にしている。これにより、Javaなどの言語において、AIアルゴリズムとの効率的なやりとりが可能になる。
ChatGPTとは、Chat Generative Pre-Trained Transformerの略で、事前に訓練されたモデルを使用する。これにより、開発者はデータベースを使うのと同じようにAIを使いやすくなる。AIにはもはや、データを集めてモデルを訓練するデータサイエンティストは不要なのである。
しかし、OpenAIやAzure OpenAIなどのAIソリューションにおけるJavaクライアントAPIはそれぞれ異なるため、これらのソリューション間での切り替えは難しくなっている。Spring AIは、PythonのライブラリLangChainとLlamaIndexに触発され、これらのクライアントAPIの上に抽象化レイヤーを提供した。これらのライブラリは、モジュール性、拡張性、様々なデータソースとの統合など、Springプロジェクトと同様の設計値に基づいている。
Spring AIは、共通のAPIを通じたAIモデルとの統合など、いくつかの機能を提供する。プロンプトは、オプションでSpring MVCのビューに匹敵するテンプレートを使い、AIモデルと対話する。難易度の高い問題を解くために、モデルへの呼び出しの連鎖がサポートされている。出力パースにより、例えばString
出力をCSVやJSONに変換できる。モデルは、プロジェクトのFAQのようなカスタムデータを使用し、特定の会話スタイルを学習できる。テストを通じて回答を評価することで、プロジェクトの品質維持が可能だ。
Spring AIは、スナップショットリリースのみの実験的なプロジェクトなので、以下のリポジトリを追加してから使用が可能だ。
<repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <releases> <enabled>false</enabled> </releases> </repository></repositories>
OpenAIを使用する場合、以下の依存関係を使用できる。
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <version>0.2.0-SNAPSHOT</version></dependency>
OpenAIの代わりにAzure OpenAIを使う場合は、以下の依存関係が使用可能である。
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> <version>0.2.0-SNAPSHOT</version></dependency>
また、Spring CLIを使って新しいプロジェクトの作成も可能だ。Spring CLIは様々なオペレーティングシステム用のバイナリをサポートしているので、詳細はドキュメントを参照してほしい。以下のコマンドでOpenAIの新規プロジェクトを作成できる。
Spring boot new ai
その他には、以下のコマンドでAzure OpenAI用の新規プロジェクトの作成が可能だ。
spring boot new ai-azure
Spring CLIGetting Startedガイドに、Spring AIでプロジェクトを作成するための詳細情報がある。
プロジェクトでOpenAIやAzure OpenAIを使う前には、APIキーを提供する必要がある。OpenAIの場合は、API Keysページでトークンが生成される。その後、環境変数をエクスポートするなどして、spring.ai.openai.api-key property
でトークンを利用できるよう設定してほしい。
export SPRING_AI_OPENAI_API_KEY=<INSERT KEY HERE>
Azure OpenAIの場合、エンドポイント
とapi-key
は Azure OpenAI Serviceセクションから取得できる。その後、環境変数をエクスポートして、spring.ai.azure.openai.api-key
などのプロパティでトークンを利用できるよう設定する。
export SPRING_AI_AZURE_OPENAI_API_KEY=<INSERT KEY HERE>export SPRING_AI_AZURE_OPENAI_ENDPOINT=<INSERT ENDPOINT URL HERE>
この設定により、Azure OpenAIサービスへ質問ができる。
AiClient aiClient = new AzureOpenAiClient();AiClient aiClient = new AzureOpenAiClient(); String response = aiClient.generate("What's the answer to the Ultimate Question of Life, the Universe, and Everything?");
実際、Spring Boot StarterはAiClientを作成し、たった1行のコードでAIモデルとの対話を可能にしている。
ハードコードされた質問を作成する代わりに、プロンプト・テンプレートの使用が可能だ。まず、your-prompt.stのような.st
型のファイルを作成し、トピックと呼ばれるプレースホルダを含む文章を作成する。
Tell me a fun fact about {topic}
このプロンプト・テンプレートは、AIモデルを呼び出すときに使用できる。たとえば、トピック・テンプレートに開発者の値を指定する。
@BeanApplicationRunner applicationRunner (@Value("classpath:/your-prompt.st) Resource resource, AiClient aiClient) { return args -> { var promptTemplate = new PromptTemplate(resource); var prompt = promptTemplate.create(Map.of("topic", "developers"); var response = aiClient.generate(prompt); System.out.println(response.getGeneration()); };}
プロジェクト内で、ユーザーはFAQのような会社の内部情報や、モデル作成時には利用できなかった新しいデータなど独自の情報およびデータを、モデルへ提供することが可能になる。関連する情報にはリソースを定義できる。
@Value("classpath:/myCustomInformation.txt) Resource myCustomInformation;
そして、コンテキストをプロンプトテンプレートとして追加ができる。
var prompt = "... {context}...";
最後に、提供された情報でコンテキストを埋める。
var promptTemplate = new PromptTemplate( prompt);promptTemplate.create(Map.of("context", myCustomInformation)));
プロンプトの入力は、AIモデルへ送信する前にまず検証され、リクエストの数を減らすことによってコストを削減している。
VMwareのSpringディベロッパーアドボケイトであるJosh Long氏は、Spring AIプロジェクトのリーダーであるMark Pollack博士と 対談を行い、様々な可能性について議論し、いくつかのコード例を作成した。
より詳細な情報はリファレンス・ドキュメントに記載されており、Azure OpenAIのためのワークショップも用意されている。ワークショップの例は、正しい依存関係を使用することで、Azure OpenAIの代わりにOpenAIをサポートするように変換できる。