1
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?

[v9.1] 生成AIをクエリでシームレスに利用する方法 〜ES|QL COMPLETION〜

Posted at

はじめに

生成AIを利用してO11yやセキュリティを効率化・高度化するというのはElasticでもAI AssistantやAttack Discoveryという機能により対応しています。
今回ご紹介するのは、それより手前のクエリ文を使ったログ解析の部分で生成AIを使う方法です。

ES|QL

ES|QLはElasticsearchの新しいクエリ言語です。SQLをご存じの方なら何の抵抗もなく利用できるかと思います。
https://www.elastic.co/docs/explore-analyze/query-filter/languages/esql
Qiitaにも記事がありました。
https://qiita.com/wooooo/items/ba46068307e045fd41e9

パイプでどんどん繋いでいくわけですが、その繋ぎ先の一つとして生成AIがあるわけです。

COMPLETION

Processing CommandとしてCOMPLETIONが用意されています。
https://www.elastic.co/docs/reference/query-languages/esql/commands/completion

ROW question = "What is Elasticsearch?"
| COMPLETION question WITH my_inference_endpoint
| KEEP question, completion

COMPLETION機能は2025年8月21日現在、Technical Preview機能です。
正式リリース時には変更の可能性があります

ユースケース

当然ですが、「What is Elasticsearch?」を聞くために使うわけではありません。
ログを処理しながら生成AIに何かをやらせたいときに使うわけです。
今回ご紹介するユースケースは、NGINXのUser Agentにあるブラウザがいつリリースされたか、というのを生成AIに回答させるというものです。

NGINXのログはこんな感じです

6.143.29.34 - - [20/Aug/2025:06:24:25 ] "PUT /page-8.html HTTP/1.1" 404 4770 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0"

ここのFirefox Version 101.0がいつリリースされたか、というのをチェックします。

Webサーバなどで何等かエラーが起きたときにそれがあるブラウザ固有の問題である可能性はあります。ダッシュボードでアクセスしてきているブラウザを円グラフなどで可視化されている方も多いでしょう。
その時に問題のあるブラウザがいつリリースされたのかがわかれば、問題発生日時と照らし合わせることで何らか原因が判明する可能性もあります。

もちろんこれ以外にもいくらでもユースケースはあると思いますが、実装が簡単なので今回はこのユースケースを例に取りながらCOMPLETIONの利用方法を説明していきます。

設定と環境

手順

git cloneしてコンテナを立ち上げるだけです

Elasticsearchの準備

クラウドもしくはオンプレで用意する

Inference Endpoint作成

生成AIに投げるためのEndpointを作ります
https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put

geminiだとこんな感じになります。
一部hogehogeにしてあります。

PUT _inference/completion/gemini
{
    "service": "googlevertexai",
    "service_settings": {
        "service_account_json": """{
  "type": "service_account",
  "project_id": "hogehoge",
  "private_key_id": "hogehoge",
  "private_key": "-----BEGIN PRIVATE KEY-----hogehoge-----END PRIVATE KEY-----\n",
  "client_email": "hogehoge",
  "client_id": "hogehoge",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/takeo-serviceaccount%40elastic-sa.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}
""",
        "model_id": "gemini-2.5-pro",
        "location": "us-central1",
        "project_id": "hogehoge"
    }
}

.envの作成

cloud_id=
esapi_key=

以下を参考にそれぞれの値を入力します。

コンテナ起動

docker compose up -d

NGINX疑似ログ作成 & Elasticへの投入

docker exec -it completion python nginxlog.py

プログラム内部の変数

  • Ingest Pipeline
    User AgentをパースするためにIngest Pipelineを使用しています。
    pipeline_idで決まっています。すでに存在する場合は上書きはしません
def setup_ingest_pipeline():
    pipeline_id = "agent"
  • インデックス名
    ここのlogs-nginx
    ingest pipelineはここでも使います。
def send_to_elasticsearch(log_entry):
    """Elasticsearchに投入"""
    es.index(index="logs-nginx", document=log_entry, pipeline="agent")

Discoveryでデータを確認

こんな感じで見えるはずです。
スクリーンショット 2025-08-21 15.12.57.png
見えない場合は左上のData viewAll logsになっているか確認しましょう。
インデックス名を変更している場合はそれに合わせてData Viewを作成してください。

ES|QLで見てみる

右上にあるTry ES|QLをクリックします。
スクリーンショット 2025-08-21 15.17.16.png

例えばUser Agentのブラウザ名でGROUP BYしたい場合はこんな感じになります。

FROM logs-nginx
| STATS COUNT() BY user_agent.name.keyword

スクリーンショット 2025-08-21 15.23.05.png

COMPLETIONしてみる

今生成AIで確認したいのはUser Agentの名前とバージョンのリリース日です。
以下のように入れて実行してみます
Inference Endpointはここではgeminiになってますが、違う名前にしている場合は適宜変更します。
LIMIT 2も適宜変更してください。大きくすると時間がかかる上に生成AIのコストをかかります。

FROM logs-nginx
| LIMIT 2
| EVAL prompt = CONCAT(
   "このブラウザバージョンがリリースされた日付をmm/dd/yyyyのフォーマットで回答。日付のみ回答すること ",
   "browser: ",user_agent.name, " version: ",user_agent.version)
| COMPLETION release_date = prompt WITH gemini
| EVAL release_date = DATE_PARSE("MM/dd/YYYY", release_date)
| KEEP release_date, prompt

以下のような結果になります。
スクリーンショット 2025-08-21 15.39.42.png

まとめ

ES|QL COMPLETIONを使うと非常に簡単にログ解析に生成AIを取り込むことができます。
Elasticsearchはこれからも生成AIを簡単かつ効果的に利用できるように製品開発を行っていきます。
ぜひともお試しください。

1
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
1
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?