【ITニュース解説】Connecting to LLMs: Building a Simple HTTP Client for AI Integration
2025年09月19日に「Dev.to」が公開したITニュース「Connecting to LLMs: Building a Simple HTTP Client for AI Integration」について初心者にもわかりやすく解説しています。
ITニュース概要
JavaでGroqやGoogle GeminiなどのLLMと連携するHTTPクライアントの実装方法を解説する。標準機能のみでAIと通信し、JSONを処理するシンプルな設計を紹介。初心者でもAI連携を学び、プロトタイプ開発を始められる。
ITニュース解説
AIエージェントがユーザーの質問を理解し、適切なツールを判断して動くためには、「知性」が必要となる。この知性の核となるのが、LLM(大規模言語モデル)との連携である。本記事では、このLLMと連携するためのシンプルなHTTPクライアントをJavaで構築する過程を解説する。複雑なライブラリを使わず、Javaの標準的なHTTP機能とJSON解析にJavaレコードを使用し、いかにしてAIの力をアプリケーションに取り込むかを示す。
LLMプロバイダーとして、GroqとGoogle Geminiが選ばれた。これらのプロバイダーは、学習やプロトタイピングに最適な無料利用枠を提供している点が大きな理由である。Groqは高速な推論が可能で、リアルタイムアプリケーションに適している。無料枠でも大量のトークンを処理できるため、素早い試行錯誤に役立つ。一方、Google Geminiは複雑な質問に対する高い推論能力を持ち、コード生成のようなトークンを多く消費するタスクにも対応する無料枠がある。両者ともにREST APIがシンプルで、AI連携の学習や開発に適している。
まず、LLMプロバイダーとやり取りするための共通の窓口として、「LLMClient」というインターフェースを定義する。このインターフェースは、LLMに質問を送信するsendメソッド、プロバイダー名を取得するgetProviderNameメソッド、そしてクライアントが正常に動作しているかを確認するisHealthyメソッドの三つを持っている。これにより、異なるLLMプロバイダーを使っても、アプリケーション側からは同じ方法で操作できるようになる。
次に、このLLMClientインターフェースを実装するための共通基盤となる「BaseLLMClient」という抽象クラスを構築する。このクラスは、すべてのLLMクライアントに共通するHTTP通信の処理やJSONデータの整形処理をまとめている。具体的には、Javaの標準ライブラリであるHttpClientを使って、ウェブサービスとの通信を行うための設定を初期化する。たとえば、通信がタイムアウトするまでの時間を30秒に設定するなどである。また、JSONデータをJavaのオブジェクトに変換したり、JavaオブジェクトをJSONデータに変換したりするためのObjectMapperも初期化する。このObjectMapperは、意図しないプロパティがあってもエラーとしないように設定されている。この抽象クラスのコンストラクタでは、APIキーが必須であり、それが空でないかを厳しくチェックする。
BaseLLMClientのsendメソッドは、実際にLLMへプロンプト(質問文)を送信する中核的な処理を担う。このメソッドは、まずプロンプトが有効であるかをチェックし、その後、抽象メソッドであるbuildRequestを呼び出して具体的なHTTPリクエストを構築する。構築されたリクエストはhttpClientによって送信され、レスポンスが返ってくるのを待つ。レスポンスのステータスコードが200(成功)でなければ、エラーとして処理される。成功した場合は、これも抽象メソッドであるextractAnswerを呼び出し、レスポンスのJSONデータから実際の回答を抽出し、返却する。これにより、個々のLLMプロバイダーが異なるリクエスト形式やレスポンス形式を持っていても、sendメソッドの共通処理の中で柔軟に対応できるようになっている。また、isHealthyメソッドは、簡単な「Hello」というプロンプトを送信してみて、エラーが発生しなければ正常と判断する仕組みを提供する。
buildRequestとextractAnswerという二つの抽象メソッドは、各LLMプロバイダーの具体的なAPI仕様に合わせて実装する必要がある。
Groqクライアントの実装例を見てみよう。GroqはOpenAIと互換性のあるAPI構造を持っている。GroqClientクラスはBaseLLMClientを継承し、Groqの特定のエンドポイントURLとモデル名を使用する。buildRequestメソッドでは、ObjectMapperを使ってプロンプトを含むリクエストボディをJSON形式で構築する。この際、Javaの「レコード(record)」という機能が活用されている。レコードは、Immutable(変更不可)なデータを保持するシンプルなクラスを簡単に定義できる機能で、JSONデータの構造を直感的に表現できるため、コードの可読性が大幅に向上する。Groqへのリクエストには、モデル名、ユーザーのメッセージ(プロンプト)、最大トークン数、温度(応答の多様性を制御するパラメータ)などが含まれる。HTTPリクエストヘッダーには、コンテンツタイプがJSONであることと、認証用のAPIキーが設定される。extractAnswerメソッドでは、Groqから返されたJSONレスポンスをGroqResponseレコードにマッピングし、その中から実際の回答テキストを抽出する。
Google Geminiクライアントの実装も同様のパターンを踏む。GeminiClientクラスもBaseLLMClientを継承するが、Gemini独自のAPIエンドポイントURLと異なるリクエスト・レスポンス構造を使用する。buildRequestメソッドでは、Gemini APIの仕様に合わせたJSONリクエストボディを、やはりJavaレコードを使って構築する。Geminiへのリクエストには、コンテンツ(プロンプト)と生成設定(温度、最大出力トークン数)が含まれる。認証用のAPIキーはURLの一部として渡される点がGroqとは異なる。extractAnswerメソッドでは、GeminiのJSONレスポンスをGeminiResponseレコードにマッピングし、その中から回答テキストを抽出する。
このように、BaseLLMClientという共通の枠組みと、GroqClientやGeminiClientといった具体的な実装クラスを分けることで、異なるLLMプロバイダーのAPIの違いを吸収し、アプリケーションからは一貫した方法でLLMを利用できるようになる。Javaレコードは、これらの複雑なJSONデータ構造を非常にシンプルかつ安全に表現するのに貢献している。
クライアントの作成をさらに簡単に、そしてきれいに保つために、「LLMClientFactory」というファクトリークラスが提供されている。このクラスは、createGroqClientやcreateGeminiClientといった静的メソッドを通じて、適切なLLMクライアントインスタンスを生成する責任を持つ。これにより、利用する側はnewキーワードを使って直接クライアントをインスタンス化する必要がなく、どのLLMを使うかを意識せずにクライアントを取得できるようになる。
最後に、実際にLLMクライアントを使う例として、「LLMClientDemo」クラスがある。このデモでは、システム環境変数からAPIキー(GROQ_API_KEYやGEMINI_API_KEY)を読み込み、ファクトリーを使ってGroqクライアントとGeminiクライアントを生成する。その後、それぞれのクライアントに対して「2+2は何か?簡単に答えよ。」や「フランスの首都はどこか?簡単に答えよ。」といったプロンプトを送信し、返ってきた回答とクライアントの健康状態を表示する。APIキーはセキュリティ上重要な情報なので、コードに直接書き込まず、環境変数として設定することが推奨される。WindowsやUnix/MacOSでの環境変数の設定方法も示されている。
このシンプルなHTTPクライアントの構築は、「From Zero to AI Agent: My Journey into Java-based Intelligent Applications」シリーズの第4部にあたる。今回の基盤が、今後のAIエージェントにおける知的な機能すべてを支えることになる。次回は、ユーザーの問い合わせとツール実行の間を橋渡しする「推論戦略」について解説される予定である。今回の記事で構築したクリーンなHTTP基盤が、AIエージェントのインテリジェンスの要となるだろう。