這二年來出來各式各樣 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 並沒有被特別強調,所以我一直沒注意到這件事,現在找到之後覺得實在是太方便了,必須在這邊分享一下。
將一篇新聞文章,寫入到 Elasticsearch 時,在 ETL 透過 GPT4o 進行"摘要"以及"擷取重要關鍵字",並寫入到"summary"與"keywords"的欄位之中。
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