Spring AI覚え書き

# この記事について

本稿は、自分自身の学習のための、下記サイトからの自由な翻案です。

https://docs.spring.io/spring-ai/reference/concepts.html

# Spring AIのコンセプト

## モデル
AI モデルモデルは、大規模なデータセットからパターンと洞察を学習し、予測、テキスト、画像、その他の出力を作成します。Spring AI の当初の焦点は、**言語入力を処理し、言語出力を提供するモデル** (手始めとして、 OpenAIとAzure OpenAI) にあります。また、Spring AI は、**エンベディングをサポート**します。


## プロンプト
プロンプトは、AI モデルが特定の出力を生成するようにガイドする言語ベースの入力のファウンデーションとして機能します。
プロンプトとして使用される言語表現は AI モデルの応答に大きな影響を与え、応答を意図した方向に導きます。

このスキルの重要性が「プロンプトエンジニアリング」の出現につながりました。特定のユースケースに対する効果的なプロンプトが特定されると、コミュニティ内で共有される動きが出てきています。

### プロンプトテンプレート
効果的なプロンプトを作成するには、リクエストのコンテキストを確立し、リクエストの一部をユーザーの入力に固有の値に置き換えます。

このプロセスは、従来のテキストベースのテンプレート エンジンを利用して実現します。Spring AI は、この目的のために OSS ライブラリ StringTemplate を採用します。

たとえば、次のような単純なプロンプト テンプレートを考えてみましょう。
```
Tell me a {adjective} joke about {content}.
```

Spring AI では、プロンプト テンプレートは Spring MVC アーキテクチャの「ビュー」に例えることができます。モデル オブジェクト (通常は`java.util.Map`）が、テンプレート内のプレースホルダーを設定するために利用されます。「レンダリングされた」文字列は、AI モデルに提供されるプロンプトのコンテンツになります。


## トークン
トークンは、AI モデルの入出力の構成要素として捉えることができます。モデルは入力時に単語をトークンに変換し、出力時にトークンを単語に変換します。

おそらく、より重要なのは、「トークン = $ 」であることです。

ホスト型 AI モデルのコンテキストでは、料金は使用されるトークンの数によって決まります。入力と出力の両方が全体のトークン数に影響します。

また、モデルにはトークン制限があり、1 回の API 呼び出しで処理されるテキストの量が制限されます。このしきい値は、「コンテキスト ウィンドウ」と呼ばれます。

たとえば、ChatGPT3 には 4K トークン制限がありますが、GPT4 には 8K、16K、32K などのさまざまなオプションが用意されています。さらに、100,000や、1,000,000というトークン制限を持つモデルも存在します。

AIモデルを活用するには、データを細分化し、モデルのコンテキスト ウィンドウの制限内でデータを表示するためのソフトウェア エンジニアリング戦略を考案する必要があります。これは、Spring AI プロジェクトが役立つ分野です。

## 出力解析
AI モデルの出力は、伝統的に 文字列（`java.util.String`）として届きます。これは、JSON での応答を要求した場合（プロンプトの一部として「JSONで...」とリクエストした婆氏）でも同様です。これは正しいJSONフォーマットである可能性もありますが、データ構造としては、（JSON データ構造ではなく）ただの文字列です。

ここから、意図した出力を生成するためのプロンプトの作成という分野に加え、モデルから得られた単純な文字列である出力をアプリケーション統合に使用可能なデータ構造に解析するという別の分野が出現しました。

出力解析では、プロンプトが使用され、多くの場合、目的の書式設定を達成するためにモデルとの複数回の対話が必要になります。

この課題に応えるため、OpenAI はモデルから目的の出力形式を正確に指定する手段として「OpenAI Functions」を導入しています。

## 呼び出しの連鎖 Chaining Calls
チェーンは、AI モデルへの一連の呼び出しを表す概念です。ある呼び出しからの出力を別の呼び出しへの入力として使用します。

呼び出しを連鎖させることで、複数のチェーンのパイプラインを構成して複雑なユースケースをサポートできます。

## モデルのカスタマイズ: データの統合
トレーニング時に利用されていない情報を AI モデルに装備するにはどうすればよいでしょうか?

GPT 3.5/4.0 データセットは 2021 年 9 月時点のものであることに注意することが重要です。そのため、モデルは、その日付以降の知識を必要とする質問に対しては、分からないと答えます。

データを活用して、AI モデルをカスタマイズするには、次の 2 つの手法があります。

**ファインチューニング:** この従来の機械学習手法には、モデルのチューニングと内部の重み付けの変更が含まれます。ただし、これは機械学習の専門家にとっても、しばしば困難なプロセスであり、GPT のようなモデルの場合はそのサイズにより非常にリソースを大量に消費します。また、一部のモデルではこのオプションが提供されない場合があります。

**プロンプトスタッフィング:** より実用的な代替方法として、モデルに提供されるプロンプト内にデータを埋め込むことができます。この時、モデルのトークン制限を考慮し、モデルのコンテキスト ウィンドウ内で関連データを表示するためのテクニックが必要になります。このアプローチは口語的に「プロンプトスタッフィング（プロンプトの詰め込み）」と呼ばれます。

Spring AI ライブラリは、「プロンプトスタッフィング」手法に基づいたソリューションの実装に役立ちます。

## 検索拡張生成
AIモデルへのプロンプトに関連データを組み込むという課題に対処するために、検索拡張生成と呼ばれる手法が登場しました。

このアプローチには、データソースから関連データを抽出し、それをモデルのトークン制限内で小さな単位に分割するプロセスが含まれます。これらの部分はデータベースに保存されます。ユーザーのリクエストを受信すると、最も適切なドキュメントの断片がデータベースから取得され、プロンプトに補われることによって、AI モデルの応答精度の向上を図ります。

データ ローダーはこのプロセスで重要な役割を果たします。データローダー、読み取ったデータをデータベース ストレージに適したフラグメントにフォーマットします。関連ドキュメントを最適に検索するには、ベクター データベースがこのタスクに最適なデータベースです。

データ ローダーとベクター データベースは、「ドキュメントに対する Q&A」などのユースケースを解決するための基本的な構成要素です。


## AIからの応答の評価
AI システムからの出力（の精度）を評価することは、アプリケーションの有用性を確保するために非常に重要です。

この評価プロセスには、生成された応答がユーザーの意図およびクエリのコンテキストと一致しているかどうかの分析が必要です。関連性、一貫性、事実の正確さなどの指標が、AI が生成した応答の品質を評価するために使用されます。

1 つのアプローチとして、ユーザーのリクエストと、期待される応答の両方を提示し、モデルからの応答が提示されたデータとどの程度一致するかを検証することができます。

また、ベクター データベースに保存されている情報を補足データとして利用すると、評価プロセスを強化でき、応答の関連性の判断に役立ちます。

現在の Spring AI プロジェクトでは、JUnit テストで利用できる、AIモデルからの応答の評価方法の非常に基本的な例がいくつか提供されています。