AIサービス
これまで、ChatModel
、ChatMessage
、ChatMemory
などの低レベルコンポーネントについて説明してきました。
このレベルで作業することは非常に柔軟で完全な自由を与えてくれますが、多くのボイラープレートコードを書く必要もあります。
LLM駆動のアプリケーションは通常、単一のコンポーネントだけでなく、複数のコンポーネントが連携して動作する必要があります
(例:プロンプトテンプレート、チャットメモリ、LLM、出力パーサー、RAGコンポーネント:埋め込みモデルとストア)。
また、多くの場合、複数の対話が含まれるため、それらすべてを調整することはさらに面倒になります。
私たちは、低レベルの実装の詳細ではなく、ビジネスロジックに集中してほしいと考えています。 そのため、現在LangChain4jには、それを支援する2つの高レベルな概念があります:AIサービスとチェーン。
チェーン(レガシー)
チェーンの概念は、Python版LangChain(LCELの導入前)に由来します。
アイデアは、チャットボット、RAGなどの一般的なユースケースごとにChain
を持つことです。
チェーンは複数の低レベルコンポーネントを組み合わせ、それらの間の対話を調整します。
主な問題は、何かをカスタマイズする必要がある場合に柔軟性が低すぎることです。
LangChain4jには2つのチェーン(ConversationalChain
とConversationalRetrievalChain
)しか実装されておらず、
現時点ではこれ以上追加する予定はありません。
AIサービス
私たちはJava向けに調整された「AIサービス」と呼ばれる別のソリューションを提案します。 アイデアは、LLMや他のコンポーネントとの対話の複雑さを単純なAPIの背後に隠すことです。
このアプローチはSpring Data JPAやRetrofitに非常に似ています:望ましいAPIを持つインターフェースを宣言的に定義し、 LangChain4jがこのインターフェースを実装するオブジェクト(プロキシ)を提供します。 AIサービスをアプリケーションのサービス層のコンポーネントと考えることができます。 それは_AI_サービスを提供します。そのため、この名前が付けられています。
AIサービスは最も一般的な操作を処理します:
- LLMへの入力のフォーマット
- LLMからの出力の解析
また、より高度な機能もサポートしています:
- チャットメモリ
- ツール
- RAG
AIサービスは、双方向の対話を促進するステートフルなチャットボットの構築や、 LLMへの各呼び出しが分離されているプロセスの自動化に使用できます。
最もシンプルなAIサービスを見てみましょう。その後、より複雑な例を探ります。
最もシンプルなAIサービス
まず、入力としてString
を受け取り、String
を返す単一のメソッドchat
を持つインターフェースを定義します。
interface Assistant {
String chat(String userMessage);
}
次に、低レベルコンポーネントを作成します。これらのコンポーネントはAIサービスの内部で使用されます。
この場合、必要なのはChatModel
だけです:
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(GPT_4_O_MINI)
.build();
最後に、AiServices
クラスを使用してAIサービスのインスタンスを作成できます:
Assistant assistant = AiServices.create(Assistant.class, model);