🦙

JavaでSpring AIやLangChain4jのLLMアプリを作る "JHipster LLM"

2024/05/30に公開

はじめに

この記事は、以下の記事の続編です。

  1. JavaでローカルLLMを動かす
  2. OpenAI API互換サーバをJHipsterで実装
  3. Spring AIとpgvectorとJHipsterを使ってRAGを実装

前回までは、JHipsterというSpring Bootアプのコード生成ツールを使って、Javaで簡単にLLMアプリケーションを開発する手順について書いてきましたが、今回はそのノウハウをまとめ(注:RAG実装はまだ...)、素早くLLMアプリが作れるツール、JHipster LLMを作ってみたので紹介します。

https://github.com/hide212131/generator-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互換サーバのコード
  • 選択した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のコミットがされるので、履歴で差分を確認できます。

  1. 以下のコマンドで、LLM関連コード抜きの、通常のSpring Bootアプリケーションコードを生成します。

    jhipster jdl https://raw.githubusercontent.com/hide212131/generator-jhipster-llm/main/.blueprint/generate-sample/templates/samples/sample.jdl
    
  2. 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