Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】LangChain4j in Action: Building an AI Assistant in Java

2025年09月17日に「Dev.to」が公開したITニュース「LangChain4j in Action: Building an AI Assistant in Java」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

JavaでAIアプリを開発する「LangChain4j」ライブラリを解説する。プロンプト、RAG、モデレーションなどのAI技術を組み合わせ、具体的なAIアシスタントの構築手順を紹介。Pythonが主流のAI分野において、JavaでのAI開発の可能性と実践的な方法を学ぶ。

ITニュース解説

JavaでAIを搭載したアプリケーションを構築することは、現代のシステム開発においてますます重要になっている。LangChain4jは、Javaの強力なライブラリとして、AIアシスタントを構築する具体的な方法を提示する。LangChain4jは、プロンプトテンプレート、検索拡張生成(RAG)、モデレーション、入力/出力のガードレールといった、大規模言語モデル(LLM)アプリケーションの主要なパターンを実装するのに役立つツールである。具体例ではQuarkusというJavaフレームワークが用いられるが、その中心となる考え方やコードは、SpringやHelidon、Micronautといった他のフレームワーク、あるいはプレーンなJavaアプリケーションにも容易に適用できるものである。

AIアプリケーションを開発する際には、いくつかの選択肢が存在する。一つは、LangChain4jのようなオープンソースのライブラリを利用する方法である。オープンソースツールは、自分のクラウド環境やオンプレミス(自社設備内)で実行でき、データの管理やセキュリティ要件、カスタマイズの自由度を最大限に高められる利点がある。しかし、その設定やメンテナンスには、ある程度の労力が必要となることが多い。もう一つの選択肢は、Azure AI Foundry、AWS Bedrock、Vertex AIのような、より包括的でマネージドなプラットフォームを利用することである。これらのプラットフォームは、スケーリング(負荷に応じてシステムを拡張すること)や他のシステムとの連携、セキュリティ、ガバナンスといった多くの複雑な作業を代行してくれる。そのため、インフラ構築やコンプライアンス(法令遵守)の設定に時間をかけずに、迅速に開発を進めたい場合に非常に有効である。このニュース記事は、オープンソースのルートを選び、内部で何が起こっているかを深く理解することに焦点を当てて、LangChain4jを使ったAIアシスタントの構築を説明している。

AI開発の世界では、Pythonが長らく主流のプログラミング言語であった。Pythonは成熟したライブラリ、活発なコミュニティサポート、迅速な開発を可能にする豊富なツール群を持っているため、この状況は当面変わらないだろう。しかし、Javaも30年以上の歴史を持ち、ソフトウェア開発の根幹を支えてきた言語である。現代のJavaは、軽量で高速、そして柔軟性に富んでおり、AI関連のアプリケーションを含むあらゆる種類のアプリケーションに適している。LangChain4jのようなツールが登場したことで、特に既存のチームがJavaで開発を行っている場合、JavaをAIアプリケーション開発の有力な選択肢として検討できるようになっている。

JavaでAI開発を行うための主要なライブラリとして、「LangChain4j」と「Spring AI」が挙げられる。LangChain4jは、Pythonの人気ライブラリであるLangChainに触発されて2023年に登場したJavaフレームワークである。Apache 2.0ライセンスのオープンソースとして、熱心なコミュニティによって活発にメンテナンスされている。このライブラリは、プロンプトテンプレート、チャットメモリ管理、エージェント、画像モデル、関数呼び出し、RAGなど、実用的でモジュール化されたツールボックスを提供し、複数のLLMプロバイダーやベクトルストアをサポートしている。低レベルの詳細に踏み込んで制御する柔軟性も持ち合わせ、基本的なアシスタントだけでなく、自律的な意思決定を行うエージェントの構築も可能である。一方、Spring AIは、Springフレームワークを使ったプロジェクトにAI機能を統合するための公式なアプローチである。Springの哲学である移植性とモジュール性を踏襲しており、チャット補完、埋め込み、RAGなどの機能を提供する。両者は共に優れた選択肢だが、LangChain4jは低レベルの詳細な調整や、より幅広い統合(15以上のLLMプロバイダーとベクトルストア)、およびAgentやAiServices、Chainsといった高度なビルディングブロックを提供し、複雑なワークフローを容易にオーケストレーション(調整・管理)できる点で、より柔軟性が高いと述べられている。この解説記事では、LangChain4jを使ってAIアシスタントを構築している。

AIアシスタントを構築する上で、「RAG(Retrieval-Augmented Generation、検索拡張生成)」は非常に重要なパターンである。RAGは、大規模言語モデル(LLM)が、あらかじめ学習した知識だけでなく、ユーザーが提供する「独自のデータ」を基にして、より正確で関連性の高い応答を生成できるようにする技術である。その仕組みは比較的シンプルである。まず、手持ちのドキュメントやデータを用意し、それらを小さな「チャンク(断片)」に分割する。各チャンクには、検索の際に役立つ「メタデータ(付加情報)」が付与される。次に、「埋め込みモデル」というAIモデルが、それぞれのチャンクのテキストを、その意味を表す数値のリストである「ベクトル」に変換する。これらのベクトルは、「ベクトルデータベース」と呼ばれる特殊なデータベースに保存される。この準備が整うと、システムは「セマンティック検索(意味検索)」を実行できるようになる。これは、単なるキーワードの一致ではなく、テキストの意味を理解して、質問に最も関連性の高いチャンクをベクトルデータベースから探し出すことである。見つけ出された関連チャンクは、LLMに対する指示(プロンプト)の一部として「コンテキスト(文脈情報)」として与えられる。これにより、LLMは、もともと学習したデータだけでなく、提供された独自のコンテンツを使って応答を生成するため、より具体的で信頼性の高い回答が可能となる。

具体的なAIアシスタントの構築例として、企業の「オンボーディングAIアシスタント」が提案されている。このアシスタントの目標は、新入社員が会社「AcmeCorp」のビジネスドメイン、技術情報、社内プロセスなどについて、自然言語で質問し、迅速かつ正確な回答を得られるようにすることである。これにより、新入社員は短期間で業務に慣れ、貢献できるようになる。このアシスタントはRAGの仕組みを活用し、独自のドキュメントに基づいて応答を生成する。また、不適切な入力からモデルを保護するためのガードレールも実装される。

このアシスタントの構築には、以下の技術が選定されている。LLMおよび埋め込みモデルにはOpenAIのモデルが使用されるが、LangChain4jは多くの他のオープンソースモデルもサポートしており、必要に応じてオンプレミスでデプロイできるモデルも利用可能である。埋め込みストアとしては、高速なRedisが選ばれている。LangChain4jはRedis以外にも複数の埋め込みストアに対応している。Javaフレームワークは、クラウドネイティブ開発に強く、高速な開発サイクルと優れた開発者体験を提供するQuarkusが採用される。Quarkusはメモリ使用量が少なく、起動が非常に速いため、現代のJavaアプリケーションに最適な選択肢であるとされている。AIライブラリとしては、LangChain4jがQuarkusの拡張機能として統合され、よりスムーズな連携が実現される。チャットUI(ユーザーインターフェース)は、JavaでWebアプリケーションを構築できるオープンソースフレームワークであるVaadinを使用して構築される。これは、迅速なプロトタイプ作成に適した選択肢だが、もちろん、好みのフロントエンドフレームワークで独自のUIを構築することも可能である。

プロジェクトの作成は、公式のQuarkusページ(code.quarkus.io)から新しいアプリケーションをブートストラップ(初期設定)することで始められる。次に、LangChain4jのモデル依存関係を追加する。OpenAIモデルを使用する場合、LangChain4j OpenAIのQuarkus拡張機能をMavenのpom.xmlファイルに追加する。この依存関係は、使用するモデルプロバイダーによって異なり、Anthropic、Gemini、LLaMA 3などのモデルに対応する適切なものに置き換える必要がある。LangChain4jは、独自のプロバイダーとOllamaやHugging Faceのようなツールを使ってオンプレミスでデプロイできるオープンソースモデルの両方に対応している。

RAGの取り込み(Ingestion)機能を構築するために、Redisをベクトルデータベースとして設定する。まず、LangChain4jが提供するRedisの埋め込みストアにアクセスするための依存関係をMavenに追加する。その後、アプリケーションのapplication.propertiesファイルで、OpenAI APIキーと埋め込みモデル名(例: text-embedding-ada-002)を設定する。さらに、Redisのホスト、パスワード、埋め込みインデックス名、次元数(選択した埋め込みモデルの次元数と一致させる必要がある)、そして距離尺度(ベクトルの類似度を測る方法)としてコサイン類似度を設定する。コサイン類似度は、ベクトルの方向の一致度を測定するもので、意味検索においてテキストの意味的な類似性を評価するのに特に効果的である。

アプリケーション固有のRAG設定として、ドキュメントの処理と結果の検索方法を制御するいくつかのカスタムパラメータが追加される。これには、ドキュメントを分割する際のチャンクごとのトークン数(chunk-size)、チャンク間のトークンの重複量(chunk-overlap)、取り込むドキュメントが置かれているローカルフォルダのパス(files-location)、関連する結果と見なされるための最小類似度スコア(min-score)、そしてクエリごとに取得するチャンクの最大数(max-results)が含まれる。これらの設定は、RAGConfigというJavaインターフェースを使って型安全にマッピングされる。

ドキュメント取り込みの実際のロジックは、以下の簡単なステップで実行される。まず、指定されたフォルダからPDFドキュメントを読み込む。次に、埋め込みモデルと、ベクトルを保存するRedisの埋め込みストアを設定する。その後、ドキュメントをチャンクに分割する戦略を定義し、最後に、各チャンクの埋め込み(ベクトル)を生成し、メタデータと共に埋め込みストアに保存する。このプロセスは、DocumentIngestorというクラスによって管理され、最終的に処理されたドキュメントの数と使用されたトークンの合計数をまとめたIngestionSummaryが返される。

LangChain4jは、RAGの取り込みフローを構成するいくつかの重要な抽象化(部品)を提供している。RedisEmbeddingStoreはRedisでの埋め込みの保存と取得を管理する。EmbeddingModelは、選択されたモデル(例: OpenAI)に応じて、テキストをベクトル表現に変換する役割を担う。ApachePdfBoxDocumentParserはPDFファイルからテキストを抽出し、生のコンテンツを扱えるようにする。OpenAiTokenCountEstimatorは、テキストのトークン数を推定し、ドキュメント分割やプロンプトサイズの制御に役立つ。そして、これら全てを統合するのがEmbeddingStoreIngestorである。これは、ドキュメントを受け取り、チャンクに分割し、埋め込みを生成し、それら全てをメタデータと共に埋め込みストアに保存するという一連の作業を実行する。このように、LangChain4jはRAGの取り込みプロセスを非常にシンプルにし、低レベルの詳細のほとんどを隠蔽しながらも、必要に応じてパイプラインをカスタマイズする柔軟性を提供している。