ブログ

Elastic Agent Builder と GPT-OSS を使用した HR 向け AI エージェントの構築

Elastic Agent Builder と GPT-OSS を使用して、従業員の HR データに関する自然言語クエリに回答できる AI エージェントを構築する方法を学びます。

はじめに

この記事では、GPT-OSSと Elastic Agent Builder を使用して HR 向けの AI エージェントを構築する方法を説明します。エージェントは、OpenAI、Anthropic、その他の外部サービスにデータを送信せずに質問に答えることができます。

LM Studio を使用して GPT-OSS をローカルで提供し、Elastic Agent Builder に接続します。

この記事を読み終える頃には、情報とモデルを完全に制御しながら、従業員データに関する自然言語の質問に答えることができるカスタム AI エージェントが完成しているはずです。

要件

この記事には以下が必要です:

GPT-OSS を使用する理由は何ですか?

ローカル LLM を使用すると、独自のインフラストラクチャに LLM を展開し、独自のニーズに合わせて微調整することができます。モデルと共有するデータの制御を維持しながら、これらすべてを実行できます。もちろん、外部プロバイダーにライセンス料を支払う必要はありません。

OpenAI は、オープン モデル エコシステムへの取り組みの一環として、2025 年 8 月 5 日にGPT-OSS をリリースしました

20B パラメータ モデルは以下を提供します。

  • ツール使用能力

  • 効率的な推論

  • OpenAI SDK対応

  • エージェントワークフローと互換性あり

ベンチマーク比較:

ベンチマークソース

ソリューションアーキテクチャ

アーキテクチャは完全にローカル マシン上で実行されます。Elastic (Docker で実行) は LM Studio を介してローカル LLM と直接通信し、Elastic Agent Builder はこの接続を使用して従業員データを照会できるカスタム AI エージェントを作成します。

詳細については、 こちらのドキュメントを参照してください。

HR向けAIエージェントの構築:手順

実装は 5 つのステップに分けられます。

  1. ローカルモデルでLMスタジオを構成する

  2. DockerでローカルElasticをデプロイする

  3. ElasticでOpenAIコネクタを作成する

  4. 従業員データをElasticsearchにアップロードする

  5. AIエージェントを構築してテストする

ステップ1:LM StudioをGPT-OSS 20Bで構成する

LM Studio は、大規模な言語モデルをコンピュータ上でローカルに実行できるユーザーフレンドリーなアプリケーションです。OpenAI 互換の API サーバーを提供するため、複雑なセットアップ プロセスなしで Elastic などのツールと簡単に統合できます。詳細については、 LM Studio ドキュメントを参照してください。

まず、公式サイトからLM Studioをダウンロードしてインストールします。インストールしたら、アプリケーションを開きます。

LM Studio インターフェースの場合:

  1. 検索タブに移動して「GPT-OSS」を検索します。

  2. OpenAIからopenai/gpt-oss-20bを選択してください

  3. ダウンロードをクリック

このモデルのサイズは約12.10 GBになります。インターネット接続によっては、ダウンロードに数分かかる場合があります。

モデルをダウンロードしたら:

  1. ローカルサーバータブに移動します

  2. openai/gpt-oss-20bを選択します

  3. デフォルトのポート1234を使用する

  4. 右側のパネルで、 「ロード」に移動し、コンテキストの長さを40K以上に設定します。

5. サーバーの開始をクリック

サーバーが実行中の場合はこれが表示されます。

[LM STUDIO SERVER] Success! HTTP server listening on port 1234
[LM STUDIO SERVER] Supported endpoints:
[LM STUDIO SERVER] ->	GET  http://localhost:1234/v1/models
[LM STUDIO SERVER] ->	POST http://localhost:1234/v1/responses
[LM STUDIO SERVER] ->	POST http://localhost:1234/v1/chat/completions
[LM STUDIO SERVER] ->	POST http://localhost:1234/v1/completions
[LM STUDIO SERVER] ->	POST http://localhost:1234/v1/embeddings
Server started.

ステップ2: DockerでローカルElasticをデプロイする

ここで、Docker を使用して Elasticsearch と Kibana をローカルにセットアップします。Elastic は、セットアッププロセス全体を処理する便利なスクリプトを提供します。詳細については、公式ドキュメントを参照してください。

start-local スクリプトを実行する

ターミナルで次のコマンドを実行します。

curl -fsSL https://elastic.co/start-local | sh

このスクリプトは次のことを行います。

  • ElasticsearchとKibanaをダウンロードして設定する

  • Docker Composeを使用して両方のサービスを開始します

  • 30日間のプラチナトライアルライセンスを自動的に有効化

期待される出力

次のメッセージが表示されるまで待ち、表示されるパスワードと API キーを保存します。これらは Kibana にアクセスするために必要になります。

🎉 Congrats, Elasticsearch and Kibana are installed and running in Docker!
🌐 Open your browser at http://localhost:5601
   Username: elastic
   Password: KSUlOMNr
🔌 Elasticsearch API endpoint: http://localhost:9200
🔑 API key: cnJGX0pwb0JhOG00cmNJVklUNXg6cnNJdXZWMnM4bncwMllpQlFlUTlWdw==
Learn more at https://github.com/elastic/start-local

Kibanaにアクセスする

ブラウザを開いて次の場所に移動します:

http://localhost:5601

ターミナル出力で取得した資格情報を使用してログインします。

エージェントビルダーを有効にする

Kibana にログインしたら、 [Management] > [AI] > [Agent Builder]に移動して、Agent Builder をアクティブ化します。

ステップ3: ElasticでOpenAIコネクタを作成する

ここで、ローカル LLM を使用するように Elastic を構成します。

アクセスコネクタ

  1. キバナで

  2. プロジェクト設定>管理に移動します

  3. アラートとインサイトの下で、コネクタを選択します。

  4. コネクタの作成をクリック

コネクタを構成する

コネクタのリストからOpenAI を選択します。LM Studio は OpenAI SDK を使用しているため、互換性があります。

次の値をフィールドに入力します。

  • コネクタ名: LM Studio - GPT-OSS 20B

  • OpenAIプロバイダーを選択:その他 (OpenAI互換サービス)

  • URL: http://host.docker.internal:1234/v1/chat/completions

  • デフォルトモデル: openai/gpt-oss-20b

  • API キー: testkey-123 (LM Studio Server では認証が不要なので、任意のテキストを使用できます。)

設定を完了するには、 「保存してテスト」をクリックします。

重要:ネイティブ関数の呼び出しを有効にする」をオンにします。これは、Agent Builder が正しく動作するために必要です。これを有効にしないと、 No tool calls found in the responseエラーが発生します。

接続をテストする

Elastic は自動的に接続をテストするはずです。すべてが正しく構成されている場合、次のような成功メッセージが表示されます。

対応:

{
  "status": "ok",
  "data": {
    "id": "chatcmpl-flj9h0hy4wcx4bfson00an",
    "object": "chat.completion",
    "created": 1761189456,
    "model": "openai/gpt-oss-20b",
    "choices": [
      {
        "index": 0,
        "message": {
          "role": "assistant",
          "content": "Hello! 👋 How can I assist you today?",
          "reasoning": "Just greet.",
          "tool_calls": []
        },
        "logprobs": null,
        "finish_reason": "stop"
      }
    ],
    "usage": {
      "prompt_tokens": 69,
      "completion_tokens": 23,
      "total_tokens": 92
    },
    "stats": {},
    "system_fingerprint": "openai/gpt-oss-20b"
  },
  "actionId": "ee1c3aaf-bad0-4ada-8149-118f52dad757"
}

ステップ4: 従業員データをElasticsearchにアップロードする

ここで、 HR 従業員データセットをアップロードして、エージェントが機密データをどのように処理するかを説明します。私はこの構造を持つ架空のデータセットを生成しました。

データセットの構造

{
  "employee_id": "0f4dce68-2a09-4cb1-b2af-6bcb4821539b",
  "full_name": "Daffi Stiebler",
  "email": "lscutchings0@huffingtonpost.com",
  "date_of_birth": "1975-06-20T15:39:36Z",
  "hire_date": "2025-07-28T00:10:45Z",
  "job_title": "Physical Therapy Assistant",
  "department": "HR",
  "salary": "108455",
  "performance_rating": "Needs Improvement",
  "years_of_experience": 2,
  "skills": "Java",
  "education_level": "Master's Degree",
  "manager": "Carl MacGibbon",
  "emergency_contact": "Leigha Scutchings",
  "home_address": "5571 6th Park"
}

マッピングを使用してインデックスを作成する

まず、適切なマッピングを使用してインデックスを作成します。一部のキー フィールドにsemantic_textフィールドを使用していることに注意してください。これにより、インデックスのセマンティック検索機能が有効になります。

​​PUT hr-employees
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "employee_id": {
        "type": "keyword"
      },
      "full_name": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "email": {
        "type": "keyword"
      },
      "date_of_birth": {
        "type": "date",
        "format": "iso8601"
      },
      "hire_date": {
        "type": "date",
        "format": "iso8601"
      },
      "job_title": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "department": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "salary": {
        "type": "double"
      },
      "performance_rating": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "years_of_experience": {
        "type": "long"
      },
      "skills": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "education_level": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "manager": {
        "type": "text",
        "copy_to": "employee_semantic"
      },
      "emergency_contact": {
        "type": "keyword"
      },
      "home_address": {
        "type": "keyword"
      },
      "employee_semantic": {
        "type": "semantic_text"
      }
    }
  }
}

Bulk APIを使用したインデックス

データセットをコピーして Kibana の開発ツールに貼り付け、実行します。

POST hr-employees/_bulk
{"index": {}}
{"employee_id": "57728b91-e5d7-4fa8-954a-2384040d3886", "full_name": "Filide Gane", "email": "vhallahan1@booking.com", "job_title": "Business Systems Development Analyst", "department": "Marketing", "salary": "$52330.27", "performance_rating": "Meets Expectations", "years_of_experience": 12, "skills": "Java", "education_level": "Bachelor's Degree", "date_of_birth": "2000-02-07T16:49:32Z", "hire_date": "2023-11-07T13:03:16Z", "manager": "Freedman Kings", "emergency_contact": "Vilhelmina Hallahan", "home_address": "75 Dennis Junction"}
{"index": {}}
{"employee_id": "...", ...}

データを検証する

クエリを実行して確認します。

GET hr-employees/_search

ステップ5: AIエージェントを構築してテストする

すべての設定が完了したら、Elastic Agent Builder を使用してカスタム AI エージェントを構築します。詳細については、 Elastic のドキュメントを参照してください。

コネクタを追加する

新しいエージェントを作成する前に、デフォルトのコネクタはElastic Managed LLMであるため、 LM Studio - GPT-OSS 20Bというカスタム コネクタを使用するようにエージェント ビルダーを設定する必要があります。そのためには、 「プロジェクト設定」 > 「管理」 > 「GenAI 設定」に移動し、作成した設定を選択して「保存」をクリックします。

アクセスエージェントビルダー

  1. エージェント

  2. 「新しいエージェントを作成」をクリックします

エージェントを構成する

新しいエージェントを作成するには、エージェント ID表示名、および表示手順が必須フィールドです。

ただし、システム プロンプトに似ていますが、カスタム エージェント用の、エージェントの動作やツールとの対話方法をガイドするカスタム インストラクションなど、さらに多くのカスタマイズ オプションがあります。ラベルは、エージェント、アバターの色、アバター シンボルを整理するのに役立ちます。

データセットに基づいてエージェント用に選択したものは次のとおりです。 エージェントID: hr_assistant

カスタム指示:

You are an HR Analytics Assistant that helps answer questions about employee data.
When responding to queries:
- Provide clear, concise answers
- Include relevant employee details (name, department, salary, skills)
- Format monetary values with currency symbols
- Be professional and maintain data confidentiality

ラベル: Human Resourcesおよび GPT-OSS

表示名: HR Analytics Assistant

表示の説明:

A specialized AI assistant for Human Resources that helps analyze employee data, compensation, performance metrics, and talent management. Ask questions about employees, departments, salaries, or performance analytics.

すべてのデータが入力されたら、新しいエージェントの「保存」をクリックします。

エージェントをテストする

従業員データについて自然言語で質問できるようになり、GPT-OSS 20B が意図を理解して適切な応答を生成します。

プロンプト:

Which employee is the one with the highest salary in the hr-employees index?

答え:

エージェントのプロセスは次のとおりです。

1. GPT-OSSコネクタを使用して質問を理解する

2. 適切なElasticsearchクエリを生成する(組み込みツールまたはカスタムES|QLを使用)

3. 一致する従業員レコードを取得する

4. 適切なフォーマットで自然言語で結果を提示する

従来の語彙検索とは異なり、GPT-OSS を搭載したエージェントは意図とコンテキストを理解するため、正確なフィールド名やクエリ構文を知らなくても情報を簡単に見つけることができます。エージェントの思考プロセスの詳細については、こちらの記事を参照してください。

まとめ

この記事では、Elastic の Agent Builder を使用してカスタム AI エージェントを構築し、ローカルで実行されている OpenAI GPT-OSS モデルに接続しました。このアーキテクチャでは、Elastic と LLM の両方をローカルマシンにデプロイすることで、外部サービスに情報を送信することなく、データに対する完全な制御を維持しながら生成 AI 機能を活用できます。

実験としてはGPT-OSS 20Bを使用しましたが、Elastic Agent Builderの公式推奨モデルはこちらを参考にしています。より高度な推論機能が必要な場合は、複雑なシナリオでより優れたパフォーマンスを発揮する120B パラメータ バリアントもありますが、ローカルで実行するにはより高性能なマシンが必要です。詳細については、 OpenAI の公式ドキュメントを参照してください。

関連記事

チャットボックスを超えたエージェントビルダー:Augmented Infrastructureの導入

Alexander Wert

Elasticsearchによるエージェントメモリの管理

Someshwaran Mohankumar

Elasticsearch Inference APIとHugging Faceモデルを組み合わせて使用

Jeffrey Rengifo

TypeScriptを使用したElasticsearch MCPサーバーの作成

Jeffrey Rengifo

シェルツールはコンテキストエンジニアリングの万能薬ではありません

Leonie Monigatti

最先端の検索体験を構築する準備はできましたか?

十分に高度な検索は 1 人の努力だけでは実現できません。Elasticsearch は、データ サイエンティスト、ML オペレーター、エンジニアなど、あなたと同じように検索に情熱を傾ける多くの人々によって支えられています。ぜひつながり、協力して、希望する結果が得られる魔法の検索エクスペリエンスを構築しましょう。

はじめましょう