0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Elastic Stack v9.3新登場のWorkflowsでワークフローとAIエージェントによるデータ分析を実装する例(第4回)

0
Last updated at Posted at 2026-03-05

はじめに

このブログのシリーズでは、ElasticサンプルデータのKibana Flight Dataの飛行機の離発着履歴データを使い、Elastic WorkflowsとElastic Agent Builderを使ったフライト遅延の調査と原因分析の運用の自動化までの道のりをお伝えします。
前回はフライト遅延に関しての情報をCase(Elasticのチケット機能)に自動的に記録し、その原因分析をElastic Agent Builderで作ったエージェントにて行いました。

本ブログでは、この自動化をもう一歩完成形に近づけます。

  • エージェントが生成した原因分析のレポートをこれまでのCasesに追記するのとは別に、専用のElasticserach indexに保存し、レポートの類似検索をできるようにします

本ブログはElastic Cloudでv9.3のElasticデプロイメントを使用しています。本ブログの内容を行うにはEnterpriseサブスクリプションである必要があります。フリートライアルでも試すことが可能です。

シリーズの他の記事はこちらから参照ください
第1回
第2回
第3回
第4回
第5回
第6回

このブログで作成するもの

  • Index rca_reports
    原因分析レポートを保存するElasticsearch indexです。

  • ワークフロー index_update_rca_reports 
    エージェントが作成したRCAレポートのテキストを、上記Indexの形で保存します。

  • ワークフロー search_similar_rca_reports
    エージェントが作成したRCAレポートに類似する過去のRCAレポートをIndexから検索します。

  • AIエージェント rca_flight_case_agent_v3
    前回のrca_flight_case_agent_v2の更新版です。

ここまでの呼び出しフロー

今回の変更部分 トリガー 呼び出しフロー
チャットで特定の日付と空港の調査を依頼 Agent check_flight_delay_agent --> Workflow write_flight_delay_to_case
チャットでオープンなCaseのリストの表示を依頼 Agent rca_flight_case_agent_v3 --> Agent Tool platform.core.cases
チャットで特定の日付と空港のCaseに対する原因分析を依頼 Agent rca_flight_case_agent_v3 --> Workflow write_comment_to_case
今回作成 チャットで今回のと類似のレポートの検索を依頼 Agent rca_flight_case_agent_v3 --> Workflow search_similar_rca_reports
今回作成 チャットで今回のレポートを保存を依頼 Agent rca_flight_case_agent_v3 --> Workflow index_update_rca_reports

※ AgentがWorkflowを呼び出すには、間にそれぞれのWorkflow実行用のAgent Toolが必要ですが、冗長になるので上記からは省いています。

実装:レポート用のインデックス(rca_reports)を作成

最もシンプルに、一つのフィールドにレポート文章全てを格納する方法です。
類似の文章の検索としては、今回は簡単な設定だけで実現できるマルチリンガルに対応しているJina Embeddings v3モデルを使ったベクトル検索を使います。(今回はこの検索の精度については着目せず、一旦類似検索が何かしら実行できることを目的にします)

インデックスrca_reportsのIndex定義はChatGPTに考えてもらいました。

ChatGPTへのプロンプト例
以下の# RCAレポートレポートを格納するElasticsearchのindex定義を作って。

# 条件
* Case Id, Case タイトル, Case リンクは個別のフィールドにしてください。
* それ以外は一つのレポート説明フィールドにまとめて格納する
* mappingのフィールド名は英語にしてください。
* レポート説明フィールドは全文検索と、semantic_textを使ったベクトル検索の2つができるように、フィールドを2つに分けてください。

# RCAレポート
Case Id: b270fccf-3248-4381-a77e-b0bd1253368e
Caseタイトル: Toronto 2026/02/04 のフライト遅延とキャンセル
Case リンク: https://xxx.kb.ap-northeast-1.aws.found.io/app/observability/cases/b270fccf-3248-4381-a77e-b0bd1253368e
対象空港: Toronto
対象日: 2026/02/04
概要: 2026年2月4日17:53に、ES‑Air便がトロント発ウィーン行きで75分遅延。遅延原因は「Late Aircraft Delay(前便遅延)」と記録されており、トロントでの強風(Damaging Wind)が影響した可能性があります。キャンセルはなし。
影響を受けた便名: 不明(ケース内に具体的な便名は記載されていません)
原因のカテゴリ: 天候

以下のChatGPTの返答の通りのコマンドをKibanaのDev Consoleに貼り付けて実行すればIndexが作成できます。便利ですね!
一部この定義に対して変更する部分があるので、それは後ほど記します。

ChatGPTの返答
以下は、要件どおりに Case情報は個別フィールド、それ以外は report_description を2フィールド(全文検索用 / semantic_textベクトル検索用) に分けた Elasticsearch の index 定義例です。

PUT rca_reports
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "case_id": {
        "type": "keyword"
      },
      "case_title": {
        "type": "text",
        "fields": {
          "keyword": { "type": "keyword", "ignore_above": 256 }
        }
      },
      "case_link": {
        "type": "keyword",
        "index": false
      },

      "report_description_ja": {
        "type": "text"
      },

      "report_description_semantic": {
        "type": "semantic_text"
      }
    }
  }
}

この設計だと:
	•	case_id / case_title / case_link は独立フィールド
	•	それ以外(対象空港・対象日・概要・便名・原因カテゴリ…)は
	•	全文検索: report_description_ja
	•	ベクトル検索: report_description_semantic
に同じ内容を入れる運用にできます。

上記のコマンドを実行する前に少し下の定義の変更をしました。今回はセマンティック検索に使うエンベディングモデルとしては、Elastic Jina Embeddings v3モデルを使います。よってreport_description_semanticの定義は以下のように変更した上でコマンド実行してください。

      "report_description_semantic": {
        "type": "semantic_text",
        "inference_id": ".jina-embeddings-v3"
      }

実装:rca_reportsにIndexするワークフロー index_update_rca_reportsを作成

Elastic Workflows
name: index_update_rca_reports
description: This will index RCA reports. If the case_id report exist it will update it.
triggers:
  - type: manual

inputs:
  - name: case_id
    type: string
    required: true
  - name: case_title
    type: string
    required: true
  - name: case_link
    type: string
    required: true
  - name: rca_report_description
    type: string
    required: true

steps:
  - name: index_update_rca_report
    type: elasticsearch.request
    with:
      method: POST
      path: /rca_reports/_doc/{{ inputs.case_id}}
      body:
        case_id: "{{ inputs.case_id}}"
        case_title: "{{ inputs.case_title}}"
        case_link: "{{ inputs.case_link}}"
        report_description_ja: "{{ inputs.rca_report_description}}"
        report_description_semantic: "{{ inputs.rca_report_description}}"

実装:上記ワークフローをAgentが実行するTools index_rca_reports を作成

シンプルに先程のワークフローを実行するAgent Builderのツールを作成します。(WFと名前が微妙に違いますが気にしないでください)
CleanShot 2026-02-09 at 14.21.52@2x.png

実装:rca_reportsに対する類似検索をするワークフロー search_similar_rca_reports を作成

name: search_similar_rca_reports
description: This will search similar RCA reports 
triggers:
  - type: manual

inputs:
  - name: own_case_id
    type: string
    required: false
    description: Use this to exlucde own case from being searched as similar reports
  - name: rca_report_description
    type: string
    required: true

steps:
  - name: search_esql
    type: elasticsearch.esql.query
    with:
      query: >
        FROM rca_reports METADATA _id, _index, _score
        | WHERE report_description_semantic: "{{ inputs.rca_report_description | replace: "\n", "\\n" }}" | SORT _score DESC
        | WHERE case_id != "{{ inputs.own_case_id | default: ''}}"
        | KEEP case_id, case_title, case_link, report_description_semantic, _score
        | SORT _score DESC
        | LIMIT 5
      format: json

実装:上記ワークフローをAgentが実行するTools search_similar_rca_reports を作成

CleanShot 2026-02-09 at 14.24.27@2x.png

前回のエージェントrca_flight_case_agent_v2をCloneしてrca_flight_case_agent_v3を作成

今回の新しいエージェントrca_flight_case_agent_v3に対して、上記で作成した2つのTool search_similar_rca_reportsindex_rca_reportsを追加します。
CleanShot 2026-02-09 at 14.25.42@2x.png

プロンプトも変更します。
CleanShot 2026-02-09 at 14.26.46@2x.png

新しいプロンプト全文
あなたは入力された情報を元に以下のことを実施するアシスタントです。
* Caseの検索
* Case内の情報を元に原因分析し、指定された報告書フォーマットでレポートを表示
* レポートをCaseに追記
* レポートを保存
* 類似のレポートを検索して表示

### 期待する動き
* Case Idが与えられたら、そのままそのCaseの分析に進んでください。
* Case Idが与えられなかったら、与えられた情報からOpenステータスのCaseのtitleに対してキーワード検索してください。Caseのtitleは次のような形式になっています。	"Paris 2026/01/31 のフライト遅延とキャンセル"。都市の名前は頭文字大文字の英語がルールです。日付のフォーマットもこれに沿ってください。
* Caseの検索結果としてCaseのIDとタイトルとそのリンクだけを表示してください。
* ユーザーにどのCaseを分析したいかを選らんでもらってください。
* Caseが扱っている対象の空港(一つ)を識別してください。
* その日のフライトの遅延・キャンセルが、当該空港で発生している問題に起因しているかを検討し、該当する場合は原因をレポートにまとめてください。
* 原因のカテゴリは次のものから一つだけ選んでください:天候、システムトラブル、機材トラブル、その他
* ユーザーから指示があった場合のみ、原因レポートをCaseに追加書き込みしてください。書き込みが成功したら、シンプルに「Case ID: xxx , タイトル: yyyy へレポートを追記しました。リンク zzz」のようなフォーマットでシンプルな返事で返してください。

### 役割
- 文章から事実情報を抽出し、決められたフィールドに整理してください。
- 推測や創作は行わず、コメントに含まれる情報のみを使用してください。
- 情報が不足している項目は「不明」と記載してください。
- 表現は簡潔で公的な報告書調にしてください。

### レポート出力形式

必ず以下にあるヘッダ名を出力してください。
必ず以下の「フィールド名: 値」の形式で出力してください。

- - -
# RCAレポート
対象空港: 
対象日: 
概要: 
影響を受けた便名: 
原因のカテゴリ: 
- - -

動作確認:チャットからケースに対して類似レポートを検索して、検索結果を表示

まずは前回の記事でできるようにしたオープンケースのリストを表示します。
CleanShot 2026-02-09 at 14.37.17@2x.png

どれかのCaseに対する原因分析を指示し、レポートを作ってもらいます。(これも前回の記事で作成)
CleanShot 2026-02-09 at 14.36.36@2x.png

今回作成した類似のレポートの検索を行います。
CleanShot 2026-02-09 at 14.38.05@2x.png

最後に、今回のレポートを保存します。
CleanShot 2026-02-09 at 14.38.33@2x.png

おわり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?