喬叔的 Elastic Stack 專業教育訓練
  • 喬叔的 Elastic Stack 專業教育訓練
  • 🧑關於喬叔 (Joe Wu)
  • Elastic 課程公開班
    • 🎯Elasticsearch 基礎實務班
      • 💯學員課後回饋
    • 🆕Elasticsearch 進階運維班
      • 💯學員課後回饋
    • Elasticsearch 進階開發班
    • Elastic Stack 基礎實務班
    • Elastic Observability 基礎實務班
    • 📩課程許願池
  • 技術分享
    • 📗喬叔帶你上手 Elastic Stack
      • 前言
      • Elastic Cloud 如何建立 Deployment
        • ES Node 的種類
        • 配置的選擇
      • Index 建立前你該知道的
        • ES Index 如何被建立
        • ES 的超前佈署 - Dynamic Mapping
        • ES 的超前佈署 - Index Template
        • ES Index 的別名 (Alias)
        • 管理你的 Index - Kibana Index
      • 管理 Index 的 Best Practices
        • Shard 的數量與 Rollover & Shrink API
        • 三溫暖架構 - Hot Warm Cold Architecture
        • Index Lifecycle Management (ILM)
        • Rollup
        • Transform
        • Snapshot Lifecycle Management (SLM)
        • 總結
      • Elastic Cloud 比免費版還多的功能
        • Elastic Stack 的方案比較與銷售方式
        • Centralized Beats Management
        • Centralized Pipeline Management
        • Watcher
        • Elasticsearch Token Service
        • Multi-stack monitoring & Automatic stack issue alerts
      • 向 App Search 學習怎麼用 Elasticsearch
        • 揭開 App Search 的面紗
        • Engine 的 Index Settings 篇
        • Engine 的 Mapping 篇
        • Engine 的 Search 基礎剖析篇
        • Engine 的 Search 進階剖析篇
      • Elasticsearch 的優化技巧
        • Indexing 索引效能優化
        • Searching 搜尋效能優化
        • Index 的儲存空間最佳化
        • Shard 的最佳化管理
      • 完賽心得
    • 📘喬叔帶你上手 Elastic Stack - 探索與實踐 Observability 系列
      • 前言 & 淺談 Observability
      • Elastic 的 Observability 解決方案
      • Uptime - 掌握系統的生命徵象
        • 我們要觀測的生命徵象是什麼?
        • 使用 Heartbeat 收集系統生命徵象數據
        • 透過 Kibana 觀看心電圖及設定警報
        • 使用合成監控 (Synthetics Monitor) 從使用者情境驗證服務的運作狀態
      • Metrics - 觀察系統的健康指標
        • Metrics 與 Metricbeat 的基本介紹
        • 使用 Metricbeat 掌握 Elastic Stack 的健康狀態
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Host 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Docker 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 Kubernetes 篇
        • 使用 Metricbeat 掌握 Infrastructure 的健康狀態 AWS 篇
      • Logs - 挖掘系統內部發生的狀況
        • Logs 與 Filebeat 的基本介紹
        • 使用 Filebeat 應該要了解的設計細節與原理
        • 透過 Filebeat 收集 Elastic Stack 中各種服務的細節資訊
        • 透過 Filebeat 收集 Infrastructure 中各種服務的細節資訊
      • Traces - 觀察應用程式的效能瓶頸
        • Elastic APM 基本介紹
        • 使用 APM-Integratoin-Testing 建立 Elastic APM 的模擬環境
        • 如何在 Kibana 使用 APM UI
        • 使用 APM Server 來收集 APM 數據
        • 透過 APM Agents 收集並傳送後端服務運作的記錄
        • 透過真實使用者監控 (RUM, Real User Monitoring) 來改善使用者體驗
      • 建立結構化的 Log
        • Elastic Common Schema 結構化 Log 的規範
        • Elasticsearch Ingest Pipeline 資料 Index 前的轉換好幫手
          • 基本介紹
          • 各種常用的 Processor
          • Enrich 資料與例外處理
      • 有效的使用 Observability 的資料
        • 透過 Machine Learning 發現異常的問題
        • 使用 Kibana Alerts 主動通知異常狀況
        • 資料的生命週期管理
        • 使用 Elastic Observability 追縱及觀察問題的心得
      • 完賽心得
    • 😀Elasticsearch 技術分享小品
      • 🤖Elastic 與 AI
        • Elasticsearch Inference API 讓我們直接在 ES 裡運用 OpenAI Completion API
    • 🎥線上分享
      • 喬叔 Elasticsearch Index 管理與效能優化技巧
      • Elastic Certification 認證經驗分享
    • 🛠️workshop
      • 如何在 Elasticsearch 實現敏捷的資料建模與管理 @ DevOpsDays 2023
        • 工作坊實作內容
      • Elastic Observability 實作體驗坊 @ DevOpsDays 2022
        • 行前準備
        • 工作坊實作內容
      • 當 Elasticsearch 搜尋引擎遇上 AI @ HelloWordDevConference 2024
        • 投影片
        • Elasticsearch 環境準備
        • Google Colab 環境準備
        • 工作坊操作說明
        • ElasticSearch Relevance Engine (ESRE)
    • ⬆️Elastic Stack 版本升級記錄
      • 🔍Elasticsearch
  • 其他專業服務
    • 👩‍🎓企業包班 | 企業內訓
    • 👨‍💼顧問服務
    • 🈺專案合作
    • 🧩Elastic 授權代理
  • 相關連結
    • Facebook 粉絲頁
Powered by GitBook
  1. 技術分享
  2. Elasticsearch 技術分享小品
  3. Elastic 與 AI

Elasticsearch Inference API 讓我們直接在 ES 裡運用 OpenAI Completion API

PreviousElastic 與 AINext線上分享

Last updated 10 months ago

這二年來出來各式各樣 AI 工具與流程自動化的工具,而我自己也常運用這些工具來拼湊出 AI 的應用流程,但是 Elasticsearch 頂多是當個 vector store,還沒有想過要嘗試在 Elasticsearch ETL 的過程中使用 LLM。(去年曾自己用 ChatGPT 寫了個 Logstash OpenAI filter plugin 來呼叫 OpenAI API,做到這件事,但這也是使用外部的 ETL 工具)

這幾天因應某個專案,ETL 的任務是由 ES 的 Ingest Pipeline 負責,而沒用到 Logstash,讓我發現了 Elasticsearch 8.14 在 Inference API 當中加入的 #Completion 的功能 (使用 #OpenAI Completion API)。

這個功能在 Elasticsearch Release Notes 並沒有被特別強調,所以我一直沒注意到這件事,現在找到之後覺得實在是太方便了,必須在這邊分享一下。

這樣能做到什麼事?

  1. 可以在 Elasticsearch API 直接下 prompt 取得 OpenAI 的回覆結果。

  2. 可以直接運用在 Ingest Pipeline 當中,也就是你的資料寫入到 Elasticsearch 時,可以先透過 LLM 幫你加工或處理資料,再寫入到 Elasticsearch 當中。

我直接在我的圖片分享我這次做的事:

將一篇新聞文章,寫入到 Elasticsearch 時,在 ETL 透過 GPT4o 進行"摘要"以及"擷取重要關鍵字",並寫入到"summary"與"keywords"的欄位之中。

以下是這次操作 Kibana 的完整步驟:

PUT _inference/completion/openai_chat_completions
{
    "service": "openai",
    "service_settings": {
        "api_key": "${apiKey_openAI}",
        "model_id": "gpt-4o"
    }
}

POST _inference/completion/openai_chat_completions
{
    "input": "我女兒的姊姊是隻叫曲翑的狗,請問我女兒是什麼生物?"
}

PUT _ingest/pipeline/summarization_pipeline
{
  "processors": [
    {
      "script": {
        "source": "ctx.prompt = 'Please summarize the following text in 繁體中文 by using 台灣習慣用語: ' + ctx.content"
      }
    },
    {
      "inference": {
        "model_id": "openai_chat_completions",
        "input_output": {
          "input_field": "prompt",
          "output_field": "summary"
        }
      }
    },
    {
      "remove": {
        "field": "prompt"
      }
    },
    {
      "remove": {
        "field": "model_id"
      }
    }
  ]
}

PUT _ingest/pipeline/keyword_extraction_pipeline
{
  "processors": [
    {
      "script": {
        "source": "ctx.prompt = '你是一個關鍵字的擷取專家,你總是能從一段文字中,依照這段文字最主要的涵意,找到最重要的關鍵字,請直接回覆我關鍵字,並使用|分隔每個關鍵字,不需要額外的說明,直接回覆關鍵字結果即可,以下是你要頡取關鍵字的文章內容:\n\n' + ctx.content + '\n\n以下是關鍵字結果'"
      }
    },
    {
      "inference": {
        "model_id": "openai_chat_completions",
        "input_output": {
          "input_field": "prompt",
          "output_field": "keywords"
        }
      }
    },
    {
      "split": {
        "field": "keywords",
        "separator": "\\|"
      }
    },
    {
      "remove": {
        "field": "prompt"
      }
    },
    {
      "remove": {
        "field": "model_id"
      }
    }
  ]
}

PUT _ingest/pipeline/content_ai_etl
{
  "processors": [
    {
      "pipeline": {
        "name": "summarization_pipeline"
      }
    },
    {
      "pipeline": {
        "name": "keyword_extraction_pipeline"
      }
    }
  ]
}

POST joe-test/_doc/1?pipeline=content_ai_etl
{
  "content": """
「蟹肉棒」可說是火鍋常見配料之一,不過對於其塑膠膜該不該先拆再煮,始終分成兩派說法。一名網友就談到,跟朋友約好一起吃火鍋,但煮了30分鐘才發現「蟹肉棒塑膠膜沒拆」,讓他不禁擔心是否還能吃。貼文曝光後,除了引起兩派網友的看法外,食藥署也對此做出解答了。

一名網友在PTT上談到,「跟朋友約好要來我家吃火鍋,煮了大概30分鐘左右吧,才發現蟹肉棒的塑膠套忘了拆掉,等等要開吃了怎麼辦?」

 

貼文一出,有網友表示「拆三小,你煮餛飩水餃有在拆皮的嗎」、「本來就不用拆,這樣蟹肉棒很完整,超棒」、「根本沒差,我常這樣」。不過也有人認為不健康,並狠酸「吃下去變生化人,郎共讚欸」、「這樣會變塑化劑風味湯底,更好喝」、「塑化劑吃很多了不差這一點」、「不要拉低台灣平均長短」。

事實上,食藥署過去就曾解釋,「肉棒外層的塑膠是種高分子聚合物,裡頭成分耐熱程度不同,將塑膠套放入鍋中長時間煮食,很有可能將有毒物質吃下,因此建議民眾還是先拿下比較保險」,並提醒蟹肉棒的塑膠膜耐熱度從60度至140度都有,在高溫環境下結構相對不穩定,建議民眾不要嫌麻煩,多一個步驟多一分保護。
  """
}

GET joe-test/_doc/1

統整一下使用這個方式的優缺點:

優點:

  • 全在 Elasticsearch 裡做完"運用 LLM 處理 ETL"這件事,Tech stack 的維護成本較低。

  • 可直接運用 Ingest Pipeline 的 error handling 機制,發生錯誤時可寫入到別的 index,並方便重試的處理可再寫回原先的 index 中。

缺點:

  • Indexing 的整體執行時間被拉長,資料寫入 TPS 較高的服務,可能不適合這樣的運作架構

  • CoT (Chain of Thought) 或是過於複雜的 Prompt Chaining,若要加工 LLM 回覆的結果,可能導致處理流程太複雜,複雜的流程放在 No Code 工具來做,往往維護成本比寫 code 高非常多。(最近這半年多的深刻體驗。)

對於想在 ETL 當中簡單應用 LLM 的情境,這個功能真的很方便!

😀
🤖