JavaでSpring AIやLangChain4jのLLMアプリを作る "JHipster LLM"
はじめに
この記事は、以下の記事の続編です。
前回までは、JHipsterというSpring Bootアプのコード生成ツールを使って、Javaで簡単にLLMアプリケーションを開発する手順について書いてきましたが、今回はそのノウハウをまとめ(注:RAG実装はまだ...)、素早くLLMアプリが作れるツール、JHipster LLMを作ってみたので紹介します。
JHipsterは、ビルドツールなど開発環境を含めたSpring Bootアプリのコードを、様々なバリエーションで出力できます。 今回作ったJHipster LLM
は、Blueprintと呼ばれるJHipsterのコード生成機能を拡張するしくみです。これを用いてLLM用のコードを様々なバリエーションで出力できます。
「様々なバリエーション」というのは、具体的には以下です。JHipster LLM
は、以下のすべての選択肢の組み合わせで動作するアプリケーションを作成できます。
- ビルドツール: Maven / Gradle
- LLMフレームワーク: Spring AI / Langchain for Java
- LLMライブラリ: Ollama / Java Bindings for Llama.cpp
- LLMモデル: Llama2, MistralなどのローカルLLMモデル(今のところ7Bが主です)
- Flexを用いたReactiveなコード / Spring MVCを用いたImperative(命令的)なコード
上記の選択どの組み合わせであっても、以下の機能をもつコードを出力します。
- Spring Bootのアプリケーションサーバのコード。ビルドツールなど開発環境を含む(これはJHipsterの持つ機能です)
- OpenAI API互換サーバのコード
- 前々回のブログOpenAI API互換サーバをJHipsterで実装で紹介したような、OpenAI specとOpenAPI Generatorを使った、OpenAI Chat Completions API互換のコードを出力します。
- Server-Sent Eventsを使ったストリーミングで、流れるようなチャット応答のコードを出力します。
- 前々回のブログOpenAI API互換サーバをJHipsterで実装で紹介したような、OpenAI specとOpenAPI Generatorを使った、OpenAI Chat Completions API互換のコードを出力します。
- 選択したLLMモデルのダウンロード
- チャットUIクライアントとしてBetterChatGPTのバンドル
使い方
事前準備
- Java 17以上
- Node.js 20以上
- Ollamaを動かす場合はDockerが必要
インストール
以下のコマンドで、JHipster LLM
をインストールします。
npm install -g generator-jhipster-llm
コード生成
一番簡単な手順でアプリケーションを作る場合は、以下のコマンドを実行します。
mkdir myLlmApp
cd myLlmApp
jhipster-llm generate-sample sample
(sample
はツールにビルトインされている JHipsterの構成を定義したファイルです。現在この構成のみ動作確認しています)
このコマンドを実行すると、以下のようにLLMフレームワークやLLMライブラリ、モデルを選択する画面となり、回答していくとコードが生成されます。
なお、上述したバリエーションのうち、Maven/Gradle, Reactive/Imperativeの選択はMaven, Imperativeを生成するようにしています。そうでない選択をするには、JHipster本体の機能で、以下のようにオプションを指定することでコード生成ができます。
jhipster-llm generate-sample sample --build gradle --reactive
なお、上記すべてを以下のようにワンライナーで実行ことも可能です。
例えば、Gradle + Spring AI + Llama.cpp + Mistral
の組み合わせの場合は、こちら。
jhipster-llm generate-sample sample --build gradle --llm-framework springai --llm-library llamacpp --llm-model-name mistral
Maven + Langchain4j + Ollama + Llama2 + Reactive
の組み合わせは、こちら。
jhipster-llm generate-sample sample --build maven --llm-framework langchain4j --llm-library ollama --llm-model-name llama2 --reactive
さて、コードが生成されたらあとは、以下のコマンドで Spring Bootを起動するだけです。
起動時の最中に、選択したLLMモデルがダウンロードされます。サイズが大きいので初回は時間がかかります。
./mvnw
起動後、以下のURLにアクセスすると、BetterChatGPTのUIが表示されます。
http://localhost:8080/chat-ui/index.html
チャット画面を開いたら、左下のAPI
メニューを開き、カスタムAPIエンドポイントを使用する
にチェックを入れ、APIエンドポイント
にhttp://localhost:8080/api/llm/v1/chat/completions
を入力します。
何か入力してみてください。応答が返ってきたら成功です!簡単ですね!
(ハルシネーション起こしてますね...)
LLMライブラリにOllamaを選択した場合の注意点
OllamaはDocker上で動作します。事前のアプリのインストールは不要です。./mvnw
を実行する前に、以下のコマンドを実行してください。Ollamaを含む各種サービスがDockerで起動します。
npm run services:up
LLM向けにどのような変更がされているかを確認する
Spring Boot のアプリケーションコードに、どのようなLLM関連のコードが変更がされたかを見たい場合、コード生成を2段階に分けて生成すると、生成ごとにGitのコミットがされるので、履歴で差分を確認できます。
-
以下のコマンドで、LLM関連コード抜きの、通常のSpring Bootアプリケーションコードを生成します。
jhipster jdl https://raw.githubusercontent.com/hide212131/generator-jhipster-llm/main/.blueprint/generate-sample/templates/samples/sample.jdl
-
1.のコードに対して以下ような
JHipster LLM
コマンドを実行すると、既存コードに対してLLM関連コードの追加変更がされます。jhipster-llm generate-sample sample --build gradle --llm-framework springai --llm-library llamacpp --llm-model-name mistral --force # コード強制上書き
おわりに
今後もJHipster LLMの機能拡張を進めていく予定です。
VectorDBを使ったRAGの実装や、その他LLMライブラリの対応など、JavaでLLMアプリ開発をより手軽に行えるよう、アップデートしていきます。
ぜひ、JavaでLLMアプリ開発を始めてみてください!
Discussion