Upgrade to Pro — share decks privately, control downloads, hide ads and more …

エンタープライズ生成AI エージェント実践アーキテクチャ ~ LangChain4j と Az...

エンタープライズ生成AI エージェント実践アーキテクチャ ~ LangChain4j と Azure OpenAI Service を活用した情報資産のエンパワーメント ~(トランスクリプト付き)

2025/6/17のMicrosoft社様主催のイベント Java on Azure Day 2025 の、トランスクリプト付きの登壇資料です。

スライドのみの資料はこちらにあります

本資料の著作権は株式会社アルファシステムズに帰属します
https://www.alpha.co.jp/

Avatar for 鏡味秀行

鏡味秀行

June 18, 2025
Tweet

More Decks by 鏡味秀行

Other Decks in Technology

Transcript

  1. A LangChain4j と Azure OpenAI Service を 活用した 情報資産のエンパワーメント 経営企画本部

    AI推進室 室長 鏡味 秀行 皆様こんにちは。 エンタープライズ生成AIエージェント実践アーキテクチャ、LangChain4j と Azure OpenAI Service を活用した 情報資産 のエンパワーメント、と題しまして、 株式会社アルファシステムズ 経営企画本部 AI推進室 鏡味がお話いたします。 よろしくお願いします。
  2. A 自己紹介  鏡味(かがみ) 秀行  職務: 社内の生成AIの普及展開  生成AI:

    GraphRAGなど (弊社テックブログ参照)  Java: JJUG CCC で JHipster/LangChain4j  プライベート  日曜エンジニア(生活と地域をIT とAIで解決)  緑黄色社会、ドラム 軽く自己紹介します。現在 自社で生成AIに関する普及展開をしています。弊社のサイトのテックブログに 生成AIに関する記事がいくつ かありますので よろしければご参照ください。 https://www.alpha.co.jp/blog/tag/%E7%94%9F%E6%88%90ai/ また Javaとの関わり合いについては 日本JavaユーザーグループでJHipsterや今回のLangchain4Jに関する発表をしております。半 年ほど前になりますが、資料ありますので、これらもよろしければご参照ください。 https://speakerdeck.com/hide212131/jjug-ccc-2024-fall-langchain4j
  3. A 本日のアジェンダ Part 1: 技術基盤  LangChain4jの基礎と機能、AIエージェントによる高度な推論の実現方式 Part 2: エンタープライズ実装

     Azure OpenAI Serviceを中心とした、セキュリティ/運用モニタリング/ 評価と改善の勘所 本日のアジェンダです。大きく2つのパートに分けてお話しします。 前半では、LangChain4jの基礎と機能や、今注目を集めているAIエージェントによる高度な推論をどう実現するかを解説します。 後半では、Azure OpenAI Service の機能の中から、セキュリティ、運用モニタリング、評価と改善を使い、 LangChain4jで構築したシステムをエンタープライズ環境で安全に確実に運用する仕組みについてお伝えします。
  4. A LangChain4j LangChain を Java 向けに再設計した LLMフレームワーク  Spring Boot/QuarkusなどのJavaエコシステムに最適化

     主要機能  LLM(大規模言語モデル) 抽象化/  Structured Outputs/ Function Calling Tools/RAG  類似フレームワーク  Spring AI/Semantic Kernel  2025年5月に、1.0.0がGA https://docs.langchain4j.dev/ まず、LangChain4jについて簡単にご紹介します。 LangChain4jは、PythonのLangChainをJava向けに再設計したフレームワークです。 単なる移植ではなく、Javaのエコシステムに最適化されており、Spring BootやQuarkusとの統合が非常にスムーズです。 主な機能として、複数のLLMを統一的に扱える抽象化レイヤー、Structured OutputsやFunction Calling、 そしてRAGなど、AIアプリケーション開発に必要な機能が一通り揃っています。 類似のフレームワークとして槙さんのセッションでありますねSpring AI、ほかにSemantic Kernelもあります。 そして最近、バージョンが1.0.0に上がり、めでたくGAになりました。
  5. A LangChain4j の良いところ 統一API抽象化  OpenAI, Claude, Gemini等を統一的に扱える  ベンダーロックインなしで容易に切り替え

     最近のLLMの「安価で大量」「高価で高性能」の使い分けにフィット 既存のJava資産との統合  Spring BootのDIやアノテーション  Quarkus拡張によるCDI Beanやネイティブ化 柔軟な抽象レベル  Low-Level/High-Level  High-Levelの宣言的、直感的なAPIが「AIエージェント」と合っている。 LangChain4jを取り入れると良いところについて、3つのポイントをお話しします。 第一に、OpenAI、Claude、Geminiなど、日々進化する複数のLLMを統一的なAPIで扱えることです。 LLMの切り替えも設定変更だけで対応できるため、ベンダーロックインを避けられるほか、用途別のLLM使用にもFitします。 第二に、JavaエンジニアにとってはSpring BootやQuarkuなど既存Javaエコシステムとの親和性が非常に高く、 DIコンテナやアノテーションなど、慣れ親しんだ開発スタイルをそのまま活用できることがあります。 第三に、Low-LevelからHigh-Levelまで、用途に応じて適切な抽象度を選択できる柔軟性があります。 その中でもハイレベルなAPIは、個人的には結構AIエージェントにあった抽象化がされているな、という印象があります。 次のスライドで、このAPIレベルについて詳しく見ていきましょう。
  6. A Tool-Likeなスタイル  API: Low-Level/High-Level API  注目技術: Structured Outputs

    Agenticなスタイル  API: High-Level API  注目技術: Function Calling/MCP LangChain4j の開発スタイル 先ほどの柔軟な抽象レベルついて話します。LangChain4jの開発スタイルは、大きく2つに分かれると考えています。 それぞれに、使うAPIや機能のキーワードを当てはめてみました。 一つはツールとして使うスタイル。Low-Level/High-Level APIを用途によって使い分けます。 もうひとつは、いま注目のエージェント的なスタイル。こちらはHighLevelAPIを主に使います。 それぞれのスタイルと、主に使われる機能について説明します。
  7. A Tool-Likeなスタイル – Low-Level API ChatModel model = AzureOpenAiChatModel.builder() .apiKey(System.getenv(“AZURE_OPENAI_KEY”))

    // 後でなくします .endpoint(System.getenv("AZURE_OPENAI_ENDPOINT")) .deploymentName("gpt-4o")) .build(); String response = model.chat(“Javaが良いところを3つ挙げて!"); // "Javaの良いところは、まず…" Tool-Likeなスタイルについて説明します。Javaでいえば、LLMをメソッドのように使うイメージです。 まずLow-Level APIから説明します。これは、各LLMプロバイダーのAPIを薄くラップしたものです。 コードを見ていきましょう。LLMモデルのインスタンスを作り、プロンプトの文字列を与え回答の文字列を生成するというものです。ここでは 挙げてませんが、文字列のストリーミングも返却可能です。なおここではAzureのコード例を示していますが、どのベンダーのLLMであって も、基本ChatModelインターフェースを通じて統一的にアクセスできます。
  8. A Tool-Likeなスタイル – High Level API public interface Assistant {

    List<String> answer(String userMessage); } Assistant assistant = AiServices.builder(Assistant.class) .chatModel(model) // さきほど作ったLLMモデルをDI .build(); List<String> answers = assistant.answer("Javaが良いところを3つ挙げて!"); // ["1. プラットフォーム独立性…", "2. 豊富な…", …] これがHigh-LevelAPIとなると、Javaのデータ構造を活用したLLMの処理が可能です。LLMへの引数や戻り値を、Javaでよく使う、プ リミティブ型Collection、POJOなどで interface宣言すると、AiServiceというサービスにより動的プロキシが生成され、宣言したとおりの 動きをします。 このコードでは、「Javaの良いところ」の三つをリスト形式でほしい場合を示しています。実行すると期待通りリスト形式で返却されます。こ れを見てわかるとおり、Java言語の「型を重視するスタイル」との親和性がぐっと増してきて良い感じです!
  9. A Structured Outputs LLMからの出力が構造データであることを保証  Azure OpenAI Service 、他の主要なLLMプロバイダーではサポート AiServiceにおける処理:

     Input: LLMへ以下をリクエスト  InputのJavaデータを、文字列表現に変換  OutputのJavaの型を、JSONスキーマで指定  Output: LLMからのレスポンスを変換  JSONスキーマで指定し、データ型が保証されたOutput→Javaのデータに変換 Tool-Likeなスタイルの利便性を高める、要素技術の一つ、Structured Outputsを説明します。 LLMが返すデータの型を保証するというもので、Azure OpenAI Service のほか大手のLLMプロバイダーではサポートしており、比較的 安全に使用できます。 先ほどのAIServiceが、様々なJavaの型をサポートできるのは、裏側で以下からくりがあるからです。 まず入力時、データを文字列化しLLMに向けた説明を添えて、さらに出力してほしい型を「JSONスキーマで」書き、LLMへ送ります。 そうすると出力されたデータがスキーマに準拠したJSON出力となり、その結果をJavaオブジェクトに変換できるというものです。 具体的にどのようなデータか、見てみましょう。
  10. A List<Fruit> リンゴ 52kcal バナナ 96kcal オレンジ 43kcal Summary ・合計:

    191kcal ・最高:バナナ (Banana) 栄養士IF このデモは、栄養士に見立てたインターフェースを用意し、フルーツ一覧を渡すと、カロリーの合計とカロリー最高のフルーツを返してくれる、 というものです。 入力情報のフルーツ一覧は、リンゴ、バナナ、オレンジとそれぞれのカロリーを渡します。 栄養士インターフェースは、まずプロンプトとして栄養士としての役割を書きます。メソッドはフルーツ一覧を与えサマリを返却というもので す。 レコードの定義はこちらにあります。 入力情報のリスト要素です。名前とカロリーを持つフルーツのレコードです。 出力情報は、合計カロリーと、最高カロリーのフルーツ名、あと遊び心の説明を加えて英語でも返してくださいという、サマリーのレコードで す。そしてこれを実行すると、もう実行結果出てるんですけども、サマリーとしてこのようなものが出ています。 合計、バナナと、英名、返って きていますね。
  11. A Tool-Likeなスタイル  LLMを一機能、いわゆる「ツール(メソッドから呼ばれるAPI)」として配置  ユーザはシステムに指示や問い合わせ、  システムが、ビジネスロジックに応じて外部システムやLLMをAPI連携  ビジネスロジック(条件分岐やループ)は、コードにより人が作成

     RAGのアプローチはこれに近い ここではコードからいったん離れてアーキテクチャ、概念として整理します。 Tool-Likeなスタイルでは、システムの中でAI・LLMが「ツールとして」配置されます。 ユーザはシステムに指示や問い合わせを送り、システム側のビジネスロジックが内容を解釈して、情報資産(外部サービス、データベー ス、ナレッジベース)、そしてLLMをはじめとするツールをAPI経由で適切に呼び分けます。条件分岐やループといったビジネスロジックその ものはエンジニアがコードで設計することになります。 よく話題になるRAGの基本の仕組みはまさにこの考え方で、「まず取り出し、次に生成」という、決められた役割分担と決められた制御に よって実現します。
  12. A RAG (Retrieval-Augmented Generation)  情報を取り出し(Retrieve) LLMが生成(Generation)  情報取り出し: 

    基本: ContentRetriever  応用: RetrivalAugmentor  制御「情報取り出し→生成のロ ジック」は決められたもの ContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder() .embeddingStore(embeddingStore) .embeddingModel(embeddingModel) .maxResults(2) .minScore(0.5) .build(); Assistant bot = AiServices .builder(Assistant.class) .chatModel(model) .contentRetriever(contentRetriever) // またはRetrivalAugmentorのDI // .retrievalAugmentor(…) .build(); 制御 Retrieve Generation 先ほどのRAGの「まず情報を取り出し、次に生成」について、LangChain4jでの実装方法を説明します。ベクトルDBなどから情報を取り 出しす部分、ContentRetrieverの実装をインスタンス化したものを、AiServiceにインジェクションします。 ここで、制御ロジック、すなわちContentRetrieverから取り出した情報をもとにLLMが回答する、という順序は、LangChain4jにより決 められています。 Advanced RAGなどの多機能のRAGを作成するときは、多機能用にRetrivalAugmentorの実装をインジェクションします。
  13. A AIエージェントの本質: 人間の判断・推論を外部化  ユーザは自然言語指示するだけでAIエージェントが解析し、解決  AIエージェントが主体的に外部の情報資産との連携と推論を繰り返す Agenticなスタイル 次にAgenticなスタイルです。「AIエージェント」という言葉。これは様々な文脈で使われますが、最近注目されるLLMを活用した実装ス タイルとしてはかなりスタンダードな概念が出てきています。

    その概念は、人間がコーディングしていた判断や制御プロセスもLLMに任せるというものです。 具体的には、ユーザーは自然言語の指示を出すだけで、AIが自律的に外部の情報資産にアクセスし、その結果を踏まえて推論し、さら に次の行動を決める、というループを繰り返します。
  14. A AIエージェントにおけるツール 情報資産にアクセスするためのインターフェース 個人ユース: Web ブラウジング/ファイルシステム/計算機能 エンタープライズシステム:  既存外部システム (ERP,

    CRM)  データベース (顧客DB, 商品DB)  情報リソース (ナレッジベース, 文書管理) ツール仕様: AIエージェントが理解  名前/パラメータ、それらの説明  OpenAPI Specはイメージが近い  MCPも同じ考え方 ナレッジベースTool 外部システムTool データベースTool AIエージェントが出てきたことで、改めて「ツール」の概念を再整理します。 ツールとは、AIエージェントが外部の情報資産(機能やリソース)にアクセスするためのインターフェースです。個人向けのAIツールでは、 最近だとVSCodeからMCPツールを触るなどが一番身近ですね。VSCodeから外部のWeb検索やファイルシステムへのアクセスができま す。 エンタープライズシステムの視点では、これらが、既存システムやデータベース、つまり企業が持つ価値である情報資産へのアクセス手段と なります。例えば、ERPシステムから売上データを取得する、顧客DBを検索する、社内ナレッジベースから関連文書を抽出する、といった 具合です。 ここでAIエージェントがツールを使用するにあたっては、「その情報資産はいったい何であるか?」を理解するための「仕様」という概念が必 要です。そこでツールはいわゆる関数仕様のようなものをAIエージェントに対し公開し、AIエージェントは仕様を理解することで、目的を達 成するために最適なタイミングでツールにアクセスすることができます。 なお「仕様」についてピンとこない方は、以前からあるOpenAPI/SwaggerのAPI仕様を連想するのが良いです。API仕様からAPIド キュメントが作られ、そこに書かれていることをAIが理解する、だから使うことができる、というイメージです。そしてMCPツールも、これらと同 様の考え方になります。
  15. A Function Calling AIエージェントがツール選択に用いる要素技術 動作:  LLMにコンテキスト(状況)を与え、関係するツール仕様を与える  LLMが適切と判断したツールとパラメータを返す 

    それに従い実行する LangChain4jのAiServiceでは以下を自動でおこなう  Javaのメソッド仕様(名前/パラメータ、それらの説明)からJSON Schemaに変換してLLMへ送信  LLMの応答内容に応じ、ツール実行  結果を整形しLLMに送信し、さらなる判断を仰ぐ エージェントがツールを呼び出す際の技術要素、Function Callingについて詳しく見ていきましょう。 Function Callingは、LLMが、状況を読み取り、呼び出し元が用意したツールうち、どれ呼び出したらよいかを判断し、呼び出し元へ指 示するというものです。 LLMは、ツールの仕様(スキーマ)を知っておく必要がありますが、LangChain4jの強力な点は、Javaの型情報からFunction Callingのスキーマを自動生成することです。 さらに結果を整理して、LLMに判断を仰ぐことも行います。 具体てきに動きを見ていきましょう。
  16. A ログを見ていきます。ここではまず最初に質問を投げていきますね。 重要なのはその後にツールの仕様を連ねていくことです。ここではファンクションとして足し算、平方根、文字列の長さ、これらのツールの仕 様をパラメータ定義ですね。そうすると LLMがそれをもとに提案を返してきます。文字列の長さを最初に求めたらどうでしょう? Helloと Worldそれぞれに対して、という提案です。その提案をもとに実行していく。 そして実行の結果、それぞれの文字列が5というのが出てきて おり、5が出てきましたということを、LLMに教えてあげます。ついでに元のこの関数に対する答えというようにIDも関連付けてあげています。 これもLangChain4jがやってくれます。

    するとLLMは、次にじゃあその2つの5を足してみたらいかがでしょう、という提案をしてくる、、と思いきや、LLMが簡単な計算と判断し自分 で10の答えを出してくれていますね。 その10をもとに、平方根を求めてはいかがでしょうか?という内容の提案をLLMの方がしてくるので、そこでさらにこちらで計算をし 3.16と いう数字を出す。それを求めたということをLLMに教えてあげる。そうすると最終的にLLMの方がやっと答えが出せるということで、回答を返 してきてくる、こういう仕組みになっています。
  17. A MCP(Model Context Protocol)  ツールの実現手段の一つ  AIモデルとツールの標準 プロトコル 

    AiServiceの抽象化はそ のまま活用 McpTransport transport = new HttpMcpTransport.Builder() .sseUrl("http://localhost:3001/sse") .timeout(Duration.ofSeconds(60)) .logRequests(true) .logResponses(true) .build(); McpClient mcpClient = new DefaultMcpClient.Builder() .transport(transport) .build(); ToolProvider toolProvider = McpToolProvider.builder() .mcpClients(List.of(mcpClient)) // ツール一覧 .build(); Bot bot = AiServices.builder(Bot.class) .chatModel(model) .toolProvider(toolProvider) .build(); Tool Tool Tool M C P 最近話題のMCP(Model Context Protocol)についても触れておきましょう。 MCPは、AIモデルとツールを接続するための標準プロトコルです。 重要なのは、AiServiceの抽象化により、ツールとして はそのまま活用できることです。 ツールの実態が、先ほど説明したFunction CallingによるローカルのJavaメソッドであっても、MCPサーバー経由の外部サービスであって も、エージェントのコードは変更する必要がありません。画面のコード例では、MCPクライアントをツールとして登録する方法を示しています 。 これにより、既存のMCPエコシステムのツールも簡単に活用できます。
  18. A RAG vs MCP…? ちがいます RAGもツールも適材適所(餅は餅屋)へ VectorDB (セマンティック担当) RDB (表構造担当)

    システムの検索機能 (システム固有情報担当) M C P VectorDB さて、ここでちょっと思うところとして。 最近はRAGの話題よりもAIエージェント・ツールの話題が多いですが、これは「適材適所」の考えが浸透してきているという気がします。 以前はRAGといえばベクトルDBということでいろいろなものをチャンク・インデックス化する傾向がありましたが、よく考えてみると、例えば「表 構造」が得意なのはやはりRDBなわけで、であれば、SQLツールを使い、RDBの機能を最大限生かす、VectorDBは非構造・セマン ティックな性質のところを担当させる、という考え方が自然に見えます。いわゆる「もちはもちや」ということで、技術特性をよく理解し、得意 な分野を組み合わせて、課題を解決するという方針が大切です。 以上、ここまでLangChain4jの基本と機能、その周辺の概念についてお話ししました。
  19. A Azure / Azure OpenAI Service (AOAI) LangChain4j アプリケーションをエンタープライズレベルに昇華 

    AOAIの「責任あるAI」に準じたセキュリティ対策  認証・認可/ガードレール設計  AzureでObservability  Application Insights で LangChain4jの メトリクス/ログ/トレースを一元可視化  AOAIの評価・改善環境(Preview) ここからは後半のパート、Azure OpenAI Serviceを活用した、エンタープライズ環境での実装について説明します。 Azure OpenAI Service、略してAOAIは、OpenAIの強力なLLMモデルを、Microsoftのエンタープライズグレードのインフラ上で利 用できるサービスです。AOAIの多くある機能の中から、今日は3つの機能をご紹介します。 1つめはセキュリティ。AOAIは責任ある AIガイドラインに沿ったセキュリティを標準装備しており、認証・認可や、Guardrails設計を簡単 に取り込めます。結果、企業が求める要件を満たしながらOpenAIの最先端のAI機能を活用できます。 2つめに、Observability。Application Insights と OpenTelemetry を組み合わせると、LangChain4j からの呼び出しも含め、 メトリクス・ログ・トレースをワンストップで可視化できます。 3つめは、評価と改善。LLMの出力の品質を評価し、フィードバックループを回せるような仕組みが用意されています。
  20. A LangChain4jのAOAI対応  OpenAIの公式SDKに対応  https://github.com/ope nai/openai-java  OpenAI Java

    API Libraryを取り込み  最新仕様に追従できる安定感 が強み  従来の langchain4j-azure- open-ai はAzure/Spring 統合機能が豊富 <!-- LangChain4J Core - AI Services等の基本機能 --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j</artifactId> <version>1.0.1</version> </dependency> <!-- LangChain4J OpenAI Official SDK --> <dependency> <groupId>dev.langchain4j</groupId> <artifactId>langchain4j-open-ai-official</artifactId> <!-- or <artifactId>langchain4j-azure-open-ai</artifactId> --> <version>1.0.1-beta6</version> </dependency> LangChain4jでのAOAI対応ですが、基本は依存ライブラリを取り込むだけで簡単に活用できます。 実は最近LangChain4jは、従来の実装とは別に、OpenAIのJava公式SDKを内部で利用できるライブラリをリリースしています。 OpenAI/AOAI両方に対応しており、変化の速いOpenAIのサービスに追従していけるなど、公式としての安心感があります。できて間 もないですが、すでに、後述するAzureの認証連携には対応しており、今後もAzure関連の機能が充実されることが期待できます。 一方、従来のAzure連携のライブラリもあり、これはAzureの機能のほかSpring Boot連携と密接に統合されており、両者を共に使う 状況では便利な実行環境が実現できます。
  21. A 認証・認可 Entra ID統合 Managed Identity  APIキー不要の安全な認証  自動的なクレデンシャル管理

    // パスワードレス認証でモデルを作成 ChatModel model = OpenAiOfficialChatModel.builder() .baseUrl(endpoint) .isAzure(true) .modelName(deploymentName) .build(); $ az containerapp identity assign … $ az role assignment create --role "Cognitive Services OpenAI User" … <dependency> <groupId>com.azure</groupId> <artifactId>azure-identity</artifactId> </dependency> 認証・認可はエンタープライズ環境で最も重要です。AOAI では Entra ID と Managed Identity を組み合わせることで、API キー を使わず安全にアクセスできます。LangChain4j を Azure Container Apps で動かす場合は、ACA で システム割り当て Managed Identity を有効化し、その ID に Azure OpenAI への 「Cognitive Services OpenAI User」 ロールを RBAC で 割り当てます。プロジェクトに azure-identity を追加すると DefaultAzureCredential が自動でトークンを取得し、キーやパスワード を持たずに済むため、漏えいリスクを大幅に低減できます。
  22. A コンテンツフィルター Content Safety  不適切な入出力を自動検出し、 注意喚起 or 遮断 “

    の作り方を教えてください" さらにAOAIにはコンテンツセーフティーフィルターにより、不適切な入力や出力を自動的に検出・遮断します。これは、企業のコンプライア ンス要件を満たす上で重要な機能です。 例では、危険な文言に対するAOAIのレスポンスです。自傷行為のself_harm、や暴力表現violenceをスコアリングし、危険なものは 200のステータスにした上で「お答えできません」と返したり、高スコアなものは400エラーでエラー応答にできます。
  23. A 運用モニタリング(Observability) Application Insights によるObservabilityの向上  LangChain4j+Azure環境  Application Insights連携でログやトレースの収集と分析

     Quarkusの拡張機能  OpenTelemetry拡張 + Azureエクスポーター拡張  依存関係と設定の追加のみでLLM呼び出しのスパン・属性情報が収集  MCPなどツール呼び出しもトレース可能  今後LangChain4j本体自身もOpenTelemetry対応による Observability強化予定(Label: Observability) 運用フェーズでの可観測性(Observability)について説明します。 LangChain4jのアプリケーションをAzureにデプロイすることにより、Application Insightsに統合でき、AIの機能を含むアプリケーション 全体の挙動をログやトレースにより詳細に追跡・分析できます。 加えて、この分野では Quarkus上でのLangChain4jが、OpenTelemetry 対応により秀でています。依存関係の追加と設定のみ で、内部の詳細な挙動がスパンや属性情報として記録されます。ツール呼び出しも分けて出力されるので、解析に便利です。 なお、Quarkus以外の対応、LangChain4j本体のObservability組み込みは、優先度高めの対応Issueがラベリングされており、期 待が持てます。 次のスライドで、Quarkus上のLangChain4jのApplication Insightsの出力をみてみましょう。
  24. A 今回デモで使うリポジトリは、マイクロソフト・ラーンが出してくれているAzure上でQuarkusとLangChain4jを動かすRAGサンプルに、 オープンテレメトリ等の手を加えて実現しています。 まず依存関係を見てみます。重要なのはQuarkusのOpenTelemetry拡張ライブラリですね。あとは3つ目、OpenTelemetryと AzureのApplication Insightの連携のためのエクスポーターも取り入れます。一方アプリケーションプロパティの設定についてはテレメトリ のどの部分を出すかとか、プロンプトを出すかというこういう設定のみですね。 今回追加したコードは、先ほどのカリキュレーションのAIサービスをQuarkus上のサービスとして新たに定義し直しています。AIサービスが 使うツールを3つ宣言しており内容は先ほどと一緒です。このツールを取り込んだサービスをインジェクションしてそしてエンドポイントから呼び 出したときに、ついでにカリキュレーションのサービスを呼び出すようにちょっと手を加えています。

    Application Insightのテレメトリ情報がこのように可視化されます。Web呼び出しからAIサービス呼び出し、さらにこの中でSPANの情 報として4つのツールを呼び出しているということが見て取れますね。それぞれツールがどのようなタイミングで何回呼ばれたかまた、それにに かかった時間なども記録されるので解析に非常に便利かと思われます。
  25. A 品質評価と改善 Azure OpenAI Evaluation サービス  開発・運用でLLM出力を効率的に評価  API設定により要求・応答の自動収集も可

     メタデータによるタグ付けも可 Azure OpenAI Garders  LLMによる自動評価(LLM-as-a-Judge) // 設定 ChatModel model = OpenAiOfficialChatModel.builder() .baseUrl(endpoint) .isAzure(true) .modelName(deploymentName) .store(true) .metadata(Map.of( "title", "Tool Demo", "type" , "simple" )) .build(); 最後に品質評価と改善です。またPreview版ではありますが、モデルの性能を評価する Azure OpenAI Evaluation サービスという のがあります。評価用のデータや期待される出力(グラウンドトゥルース)を用意することで、実際のモデルの応答を様々な基準でテスト できます。 データは自前で用意したものをインポートする方法のほか、右側のコード例にあるように、LangChain4jなどを通して、モデルにstoreフラ グを設けてアクセスすると、APIアクセスしつつ、評価用データが自動的に保存されます。また、その際、metadataを使ってラベリングしたり して、テストデータを選別します。 Azure OpenAI Evaluationは本来の目的は、LLM自身をチューニングして改善するためのものですが、実は、適切な評価用データさ え用意すれば、LangChain4jに限らず、様々なAIアプリケーションのエンドツーエンドの品質も評価できます。LLMによる自動評価もあ り、今回はそれを紹介します。
  26. A 注:動画編集しており、実際は完了まで10秒ほどかかります Azure OpenAIの評価画面の操作を説明します。新しい評価ボタンを押してスタート。評価用データを選択します。今回は評価用の JSON-Lのファイルをアップロードしておいたのでそれを使います。ここであらかじめアップロードをしておいたファイルがあります。 検証に使うファイルは10問ほどで、インプットとして質問、アウトプットとしてLLMの回答、そして想定回答・グランドトゥルースという3カラム の評価情報を用意しています。次へボタンを押すと新しいテスト条件の作成となります。ここでいろんな評価手法を試すことができます。今 回はこの中のモデルスコアラーに、セマンティック類似性という文字の近似性を確かめるLLMジャッジの評価方法があり、それを使います。 評価用LLMはo3など推論モデルが良いとされていますが今回はgpt-4oを使います。評価用のLLMプロンプトがテンプレートが用意され ており、それを完成させます。ここで先ほどの

    JSON-Lにある列名を正しく入力しなおす必要があります ここはサジェクションが出てくるので うまくそれを活用すれば 正確に入力は可能です。このようにしてできたプロンプトを実行させると、LLMが評価をはじめます。 結果まで早送りします。今回の評価データは6割ほどわざと失敗するよう入れており、このような結果になります。 以上、Azure OpenAIの組み込みの機能を使って、LLMやアプリケーションの評価をすることが可能となります。
  27. A まとめ  LangChain4j  型安全なJavaとのデータ連携(Structured Outputs)  AiServiceとMCPなどのツールによる情報資産との連携(Function Calling)

     Azure OpenAI Service  セキュリティ、Observability、評価の実現 LangChain4j AOAI = + AIエンパワーメント 情報資産 + 本日のまとめです。 LangChain4j、そしてAzure OpenAI Service AOAIを組み合わせることで、エンタープライズにおける情報資産に対し、AIによるエ ンパワーメントを実現できます。 技術的には、LangChain4jにより実現される型安全なJavaとの円滑なデータ連携、AiServiceとツールの仕組みによる、既存の情報 資産との連携、 そして、Azure OpenAI Serviceを中心としたAzure基盤により、エンタープライズに必要なセキュリティ、Observability、品質評価を 確保できます。 最も重要なのは、これらの技術により、皆様が長年開発・蓄積してきたエンタープライズJavaのエコシステムを活かしながら、AIエージェン トによる新たな価値を生み出せることと思います。 ぜひ、小さなプロトタイプでもよいので始めて、段階的にAI化を目指していただければと思います。 以上です。ご清聴ありがとうございました。