はじめに
このブログのシリーズでは、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に考えてもらいました。
以下の# 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が作成できます。便利ですね!
一部この定義に対して変更する部分があるので、それは後ほど記します。
以下は、要件どおりに 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を作成
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と名前が微妙に違いますが気にしないでください)

実装: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 を作成
前回のエージェントrca_flight_case_agent_v2をCloneしてrca_flight_case_agent_v3を作成
今回の新しいエージェントrca_flight_case_agent_v3に対して、上記で作成した2つのTool search_similar_rca_reportsとindex_rca_reportsを追加します。

あなたは入力された情報を元に以下のことを実施するアシスタントです。
* 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レポート
対象空港:
対象日:
概要:
影響を受けた便名:
原因のカテゴリ:
- - -
動作確認:チャットからケースに対して類似レポートを検索して、検索結果を表示
まずは前回の記事でできるようにしたオープンケースのリストを表示します。

どれかのCaseに対する原因分析を指示し、レポートを作ってもらいます。(これも前回の記事で作成)

おわり



