AI 驅動的儀表板:從愿景到 Kibana

作者:來自 Elastic?Jeffrey Rengifo?及?Tomás Murúa

使用 LLM 處理圖像并將其轉換為 Kibana 儀表板。

想獲得 Elastic 認證?了解下一次 Elasticsearch Engineer 培訓的舉辦時間!

Elasticsearch 擁有眾多新功能,幫助你為你的使用場景構建最佳搜索解決方案。深入我們的示例筆記本了解更多,立即開始免費云試用,或在本地機器上嘗試 Elastic。


Kibana Lens 使儀表板創建變得拖放簡單,但當你需要幾十個面板時,點擊次數會累積。如果你可以畫一個儀表板草圖,截圖,然后讓 LLM 為你完成整個過程,會怎么樣?

在這篇文章中,我們將實現這個目標。我們將創建一個應用程序,接受儀表板圖像,分析我們的映射,然后生成一個儀表板,無需我們手動操作 Kibana!

步驟

  • 背景與應用工作流程
  • 準備數據
  • LLM 配置
  • 應用功能

背景與應用工作流程

第一個想法是讓 LLM 生成整個 NDJSON 格式的 Kibana 保存對象,然后將其導入到 Kibana。

我們嘗試了以下模型:

  • Gemini 2.5 pro
  • GPT o3 / o4-mini-high / 4.1
  • Claude 4 sonnet
  • Grok 3
  • Deepseek ( Deepthink R1 )

至于提示詞,我們從最簡單的開始:

You are an Elasticsearch Saved-Object generator (Kibana 9.0).
INPUTS
=====
1. PNG screenshot of a 4-panel dashboard (attached).
2. Index mapping (below) – trimmed down to only the fields present in the screenshot.
3. Example NDJSON of *one* metric visualization (below) for reference.TASK
====
Return **only** a valid NDJSON array that recreates the dashboard exactly:
* 2 metric panels (Visits, Unique Visitors)
* 1 pie chart (Most used OS)
* 1 vertical bar chart (State Geo Dest)
* Use index pattern `kibana_sample_data_logs`.
* Preserve roughly the same layout (2×2 grid).
* Use `panelIndex` values 1-4 and random `id` strings.
* Kibana version: 9.0

盡管我們嘗試了少樣本示例和關于如何構建每個可視化的詳細說明,但沒有成功。如果你對這個實驗感興趣,可以在這里找到詳細信息。

使用這種方法的結果是,在嘗試將 LLM 生成的文件上傳到 Kibana 時,看到以下消息:

這意味著生成的 JSON 無效或格式錯誤。最常見的問題是 LLM 生成了不完整的 NDJSON、虛構參數,或者無論我們如何強制要求,都返回常規 JSON 而不是 NDJSON。

受這篇文章的啟發 —— 其中搜索模板比 LLM 自由生成效果更好——我們決定為 LLM 提供模板,而不是要求它生成完整的 NDJSON 文件,然后我們在代碼中使用 LLM 提供的參數來創建正確的可視化。這種方法沒有讓人失望,而且是可預測和可擴展的,因為現在代碼承擔了主要工作,而不是 LLM。

應用工作流程如下:

我們將為了簡化省略一些代碼,但你可以在這個筆記本中找到完整應用的有效代碼。

前提條件

在開始開發之前,你需要以下內容:

  1. Python 3.8 或更高版本
  2. 一個 Venv Python 環境
  3. 一個運行中的 Elasticsearch 實例,以及其端點和 API 密鑰
  4. 一個存儲在環境變量名 OPENAI_API_KEY 下的 OpenAI API 密鑰:
export OPENAI_API_KEY="your-openai-api-key"

準備數據

對于數據,我們將保持簡單,使用 Elastic 樣本 Web 日志。你可以在這里了解如何將這些數據導入到你的集群。

每個文檔包括發出應用程序請求的主機的詳細信息,以及請求本身及其響應狀態的信息。以下是一個示例文檔:

{"agent": "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24","bytes": 8509,"clientip": "70.133.115.149","extension": "css","geo": {"srcdest": "US:IT","src": "US","dest": "IT","coordinates": {"lat": 38.05134111,"lon": -103.5106908}},"host": "cdn.elastic-elastic-elastic.org","index": "kibana_sample_data_logs","ip": "70.133.115.149","machine": {"ram": 5368709120,"os": "osx"},"memory": null,"message": "70.133.115.149 - - [2018-08-30T23:35:31.492Z] \"GET /styles/semantic-ui.css HTTP/1.1\" 200 8509 \"-\" \"Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24\"","phpmemory": null,"referer": "http://twitter.com/error/john-phillips","request": "/styles/semantic-ui.css","response": 200,"tags": ["success","info"],"@timestamp": "2025-07-03T23:35:31.492Z","url": "https://cdn.elastic-elastic-elastic.org/styles/semantic-ui.css","utc_time": "2025-07-03T23:35:31.492Z","event": {"dataset": "sample_web_logs"},"bytes_gauge": 8509,"bytes_counter": 51201128
}

現在,讓我們獲取剛剛加載的索引 kibana_sample_data_logs 的映射:

INDEX_NAME = "kibana_sample_data_logs"es_client = Elasticsearch([os.getenv("ELASTICSEARCH_URL")],api_key=os.getenv("ELASTICSEARCH_API_KEY"),
)result = es_client.indices.get_mapping(index=INDEX_NAME)
index_mappings = result[list(result.keys())[0]]["mappings"]["properties"]

我們將把映射與稍后加載的圖像一起傳遞。

LLM 配置

讓我們配置 LLM 使用結構化輸出,以輸入圖像并接收我們需要傳遞給函數的 JSON,以生成 JSON 對象。

我們安裝依賴項:

pip install elasticsearch pydantic langchain langchain-openai -q

Elasticsearch 會幫助我們獲取索引映射。Pydantic 允許我們在 Python 中定義 schema,以便要求 LLM 遵循這個結構,而 LangChain 是一個框架,可以更方便地調用 LLMs 和 AI 工具。

我們將創建一個 Pydantic schema 來定義我們希望從 LLM 得到的輸出內容。我們需要從圖像中識別的信息包括:圖表類型、字段、可視化標題,以及儀表板標題:

class Visualization(BaseModel):title: str = Field(description="The dashboard title")type: List[Literal["pie", "bar", "metric"]]field: str = Field(description="The field that this visualization use based on the provided mappings")class Dashboard(BaseModel):title: str = Field(description="The dashboard title")visualizations: List[Visualization]

請上傳你剛畫的儀表板圖片,我會根據圖像內容提取圖表類型、字段、可視化標題和儀表板標題。

現在我們聲明 LLM 模型調用和圖像加載。這個函數將接收 Elasticsearch 索引的 mappings 和我們想要生成的儀表板圖像。

通過使用 with_structured_output,我們可以將 Pydantic 的 Dashboard schema 作為 LLM 生成的響應對象。使用 Pydantic,我們可以定義帶有驗證的數據模型,確保 LLM 輸出符合預期結構。

要將圖像轉換為 base64 并作為輸入發送,可以使用在線轉換工具,或通過代碼實現。

prompt = f"""You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.You will be given a dashboard image and an Elasticsearch index mapping.Below are the index mappings for the index that the dashboard is based on.Use this to help you understand the data and the fields that are available.Index Mappings:{index_mappings}Only include the fields that are relevant for each visualization, based on what is visible in the image."""message = [{"role": "user","content": [{"type": "text", "text": prompt},{"type": "image","source_type": "base64","data": image_base64,"mime_type": "image/png",},],}
]try:llm = init_chat_model("gpt-4.1-mini")llm = llm.with_structured_output(Dashboard)dashboard_values = llm.invoke(message)print("Dashboard values generated by the LLM successfully")print(dashboard_values)
except Exception as e:print(f"Failed to analyze image and match fields: {str(e)}")

LLM 已經具備關于 Kibana 儀表板的上下文,因此我們不需要在提示詞中解釋所有內容,只需添加一些細節,以確保它不會忘記當前處理的是 Elasticsearch 和 Kibana。

讓我們來拆解這個提示詞:

SectionReason
You are an expert in analyzing Kibana dashboards from images for the version 9.0.0 of Kibana.

通過強調這是 Elasticsearch 以及指定 Elasticsearch 的版本,可以降低 LLM 產生舊的或無效參數的可能性。

You will be given a dashboard image and an Elasticsearch index mapping.

我們說明圖像是關于儀表板的,以避免 LLM 產生錯誤的解讀。

Below are the index mappings for the index that the dashboard is based on.Use this to help you understand the data and the fields that are available. Index Mappings: {index_mappings}

提供 mappings 至關重要,這樣 LLM 才能動態選擇有效字段。否則我們只能在這里寫死 mappings,太死板,或者依賴圖像中包含正確的字段名,但這種方式不可靠。

Only include the fields that are relevant for each visualization, based on what is visible in the image.

我們必須添加這個強化說明,因為有時它會嘗試添加與圖像無關的字段。

這將返回一個包含可顯示可視化數組的對象:

"Dashboard values generated by the LLM successfully
title=""Client, Extension, OS, and Response Keyword Analysis""visualizations="["Visualization(title=""Count of Client IP","type="["metric"],"field=""clientip"")","Visualization(title=""Extension Keyword Distribution","type="["pie"],"field=""extension.keyword"")","Visualization(title=""Most Used OS","type="["bar"],"field=""machine.os.keyword"")","Visualization(title=""Response Keyword Distribution","type="["bar"],"field=""response.keyword"")"
]

處理 LLM 響應

我們創建了一個示例的 2x2 面板儀表板,然后使用 Get a dashboard API 導出為 JSON,再將面板存儲為可視化模板(餅圖、條形圖、指標),可以根據問題替換部分參數以創建不同字段的新可視化。

你可以在這里看到模板 JSON 文件。注意我們如何用 {variable_name} 替換想要后續替換的對象值。

根據 LLM 提供的信息,我們可以決定使用哪個模板以及替換哪些值。

fill_template_with_analysis 函數將接收單個面板的參數,包括可視化的 JSON 模板、標題、字段,以及可視化在網格上的坐標。

然后,它會替換模板中的值,返回最終的 JSON 可視化結果。

def fill_template_with_analysis(template: Dict[str, Any],visualization: Visualization,grid_data: Dict[str, Any],
):template_str = json.dumps(template)replacements = {"{visualization_id}": str(uuid.uuid4()),"{title}": visualization.title,"{x}": grid_data["x"],"{y}": grid_data["y"],}if visualization.field:replacements["{field}"] = visualization.fieldfor placeholder, value in replacements.items():template_str = template_str.replace(placeholder, str(value))return json.loads(template_str)

為了簡化,我們會使用固定坐標分配給 LLM 決定創建的面板,生成如上圖所示的 2x2 網格儀表板。

# Filling templates fields
panels = []    
grid_data = [{"x": 0, "y": 0},{"x": 12, "y": 0},{"x": 0, "y": 12},{"x": 12, "y": 12},
]i = 0for vis in dashboard_values.visualizations:for vis_type in vis.type:template = templates.get(vis_type, templates.get("bar", {}))filled_panel = fill_template_with_analysis(template, vis, grid_data[i])panels.append(filled_panel)i += 1

根據 LLM 決定的可視化類型,我們會選擇對應的 JSON 模板文件,使用 fill_template_with_analysis 替換相關信息,然后將新面板添加到數組,稍后用來創建儀表板。

當儀表板準備好后,我們會使用 Create a dashboard API 將新的 JSON 文件推送到 Kibana,生成儀表板:

try:dashboard_id = str(uuid.uuid4())# post request to create the dashboard endpointurl = f"{os.getenv('KIBANA_URL')}/api/dashboards/dashboard/{dashboard_id}"dashboard_config = {"attributes": {"title": dashboard_values.title,"description": "Generated by AI","timeRestore": True,"panels": panels,  # Visualizations with the values generated by the LLM"timeFrom": "now-7d/d","timeTo": "now",},}headers = {"Content-Type": "application/json","kbn-xsrf": "true","Authorization": f"ApiKey {os.getenv('ELASTICSEARCH_API_KEY')}",}requests.post(url,headers=headers,json=dashboard_config,)# Url to the generated dashboarddashboard_url = f"{os.getenv('KIBANA_URL')}/app/dashboards#/view/{dashboard_id}"print("Dashboard URL: ", dashboard_url)print("Dashboard ID: ", dashboard_id)except Exception as e:print(f"Failed to create dashboard: {str(e)}")

要執行腳本并生成儀表板,請在控制臺運行以下命令:

python <file_name>.py

最終結果將如下所示:

Dashboard URL: https://your-kibana-url/app/dashboards#/view/generated-dashboard-id
Dashboard ID: generated-dashboard-id

結論

LLM 在文本轉代碼或將圖像轉為代碼時展現出強大的視覺能力。儀表板 API 也使得將 JSON 文件轉換為儀表板成為可能,結合 LLM 和一些代碼,我們可以將圖像轉成 Kibana 儀表板。

下一步是通過使用不同的網格設置、儀表板尺寸和位置,提升儀表板視覺的靈活性。同時,支持更復雜的可視化和更多類型的可視化,將是該應用的有益補充。

原文:AI-powered dashboards: From a vision to Kibana - Elasticsearch Labs

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89450.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI產品經理面試寶典第17天:AI時代敏捷開發與MVP構建面試題與答法

機器學習MVP構建問題怎么答? 面試官:請舉例說明如何將業務問題轉化為機器學習可解的問題? 你的回答:以電商供應商評價為例,傳統方法用人工設定的低維度指標評分,而機器學習能利用大數據構建高維模型。比如通過供應商歷史交易數據、物流時效、售后投訴率等數百個特征,訓…

HBase2.5.4單機模式與偽分布式的安裝與配置(Ubuntu系統)

HBase的安裝也分為三種&#xff0c;單機模式、偽分布式模式、完全分布式模式&#xff1b;我們先來安裝單機版。 一、環境準備 1. 系統要求 Ubuntu 20.04/22.04 LTS Java 8&#xff08;必須&#xff0c;HBase不兼容更高版本&#xff09; Hadoop&#xff08;單機模式不需要&a…

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 +/- 10VDC 060-6881-02

Honeywell霍尼韋爾DV-10 變速器放大器 輸入 15-28 VDC,輸出 /- 10VDC 060-6881-02

騰訊位置商業授權鴻蒙地圖SDK工程配置

工程配置 安裝 DevEco Studio 開發環境 手機HarmonyOS系統&#xff1a;OpenHarmony-5.0.0.71及以上DevEco Studio版本&#xff1a;DevEco Studio NEXT Release(Build Version: 5.0.3.900)及以上 獲取key與生成秘鑰 獲取key 登錄騰訊位置服務控制臺&#xff0c;未注冊過賬號可…

RocketMQ源碼級實現原理-Commitlog刷盤機制

刷盤機制 同步刷盤 代碼實現 寫入線程 寫入線程可能同時有多個&#xff0c;但是刷盤線程至始至終就是一個單線程 刷盤線程&#xff0c;始終是操作雙緩沖區域&#xff0c;一個用來刷盤&#xff0c;另一個用來接收多個寫入線程同時寫入刷盤請求 刷盤線程 通過這種方式&#xff0…

Java與Vue技術搭建的SRM招標采購管理系統,提供源碼,涵蓋招標、投標、評標全流程,助力企業高效規范采購管理

前言&#xff1a;在當今競爭激烈的商業環境中&#xff0c;高效、透明、規范的招標采購流程對于企業的成本控制、供應鏈穩定以及整體運營效率至關重要。SRM招標采購管理系統應運而生&#xff0c;它借助先進的信息技術&#xff0c;整合了招標采購的各個環節&#xff0c;實現了采購…

Kotlin集合分組

集合的分組&#xff08;Grouping&#xff09; 在之前的學習中&#xff0c;我們已經學會了如何對集合進行過濾、排序或執行聚合操作。 在本節中&#xff0c;我們將學習如何對集合元素進行分組&#xff0c;以便以最適合我們任務的方式呈現信息。分組&#xff08;Grouping&#xf…

阿里云ssh證書過期,如果更換并上傳到服務器

登錄阿里云平臺&#xff0c;在控制臺中找到“數字證書管理服務”進入頻道后&#xff0c;選擇“SSL證書管理”點擊“創建證書”&#xff0c;創建成功后&#xff0c;進入證書詳情頁選擇“下載”板塊&#xff0c;根據自身服務器類型&#xff0c;下載相應的證書即可服務器更新證書登…

【軟件系統架構】系列七:系統性能——計算機性能深入解析

目錄 一、什么是計算機性能&#xff1f; 二、計算機性能核心指標 1. CPU性能指標 2. 內存性能指標 3. 存儲子系統性能 4. 網絡性能指標 5. 系統資源使用與并發能力 三、性能瓶頸分析方法 四、計算機性能評測與對比 常見性能測試指標與工具&#xff1a; 五、計算機性…

基于現代R語言【Tidyverse、Tidymodel】的機器學習方法

機器學習已經成為繼理論、實驗和數值計算之后的科研“第四范式”&#xff0c;是發現新規律&#xff0c;總結和分析實驗結果的利器。機器學習涉及的理論和方法繁多&#xff0c;編程相當復雜&#xff0c;一直是阻礙機器學習大范圍應用的主要困難之一&#xff0c;由此誕生了Python…

Python暑期學習筆記5

時間&#xff1a;2025.7.18學習內容&#xff1a;【語法基礎】while循環與循環嵌套一、循環語句循環流程圖二、while循環基本格式&#xff1a;while條件&#xff1a;循環體&#xff08;條件滿足時段做的事情&#xff09;改變變量死循環while True:循環體&#xff08;要循環做的事…

world models and Human–Object Interaction (HOI)

Author: Chatgpt Here are several key research papers that explore the intersection of world models and Human–Object Interaction (HOI)—especially ones that build structured, object-centric representations from videos or use world-model-based learning to p…

無人值守共享自習室物聯系統安全防線:從設備到數據的全面防護策略!

在“全民學習”浪潮的推動下&#xff0c;無人值守共享自習室憑借24小時開放、靈活預約和沉浸式體驗&#xff0c;已成為城市學習空間的新形態。而當人力值守被物聯網設備替代后&#xff0c;安全風險卻從物理世界延伸到了數字世界。一套完整的自習室物聯網系統包含門禁、傳感器、…

【27】MFC入門到精通——MFC 修改用戶界面登錄IP IP Address Control

界面搭建 將【IP Address Control】控件&#xff0c;【Edit Control】控件和兩個【button】控件分別拖入主界面 將ID分別修改為&#xff1a;IDC_IP_ADDRESS IDC_IPADDRESS_EDIT IDC_GET_BUTTON IDC_CLEAN_BUTTON添加變量 為【IP Address Control】控件添加變量【m_IPaddress】&…

MacOS安裝linux虛擬機

在學習docker時用的云環境本身就是一個容器&#xff0c;啟動docker總是各種問題&#xff0c;所以直接在本機上裝一個虛擬機。 當前系統環境&#xff1a; 安裝虛擬機軟件 安裝UTM 下載官網&#xff1a;https://mac.getutm.app/ uname -m查看一下指令架構&#xff0c;下載…

TimSort:論Java Arrays.sort的穩定性

TimSort 是一種混合的、穩定的排序算法&#xff0c;結合了歸并排序&#xff08;Merge Sort&#xff09;和二分插入排序&#xff08;Binary Insertion Sort&#xff09;的優點&#xff0c;尤其適用于部分有序的數據。在 Java 中&#xff0c;Arrays.sort() 對對象數組排序時內部使…

企業數據生命周期安全架構設計

數據是企業的生命線&#xff0c;而安全則是這條生命線的保護神。今天我們就來聊聊如何為企業數據的一生一世構建一套堅不可摧的安全防護體系。 &#x1f4da; 文章目錄 為什么需要數據生命周期安全架構數據生命周期全景圖安全架構設計的核心原則各階段安全防護策略整體安全架構…

【Java】字符串常量池

文章目錄一.字符串常量池(StringTable)1.1 定義1.2 演示示例1.3 intern方法一.字符串常量池(StringTable) 1.1 定義 字符串常量詞本質是一個固定大小的HashTable。當用一個字符串構造String對象時&#xff0c;首先會去StringTable中查看是否存在在字符串&#xff0c;如果存在…

數據通信與計算機網絡——模擬傳輸

主要內容數字到模擬轉換幅移鍵控ASK頻移鍵控FSK相移鍵控PSK正交振幅調制QAM模擬信號調制調幅AM調頻FM調相PM一、數字到模擬轉換數字信號需要低通通道&#xff0c;如果現實應用中只有帶通通道&#xff0c;只能選擇模擬信號進行傳輸。將數字數據轉換為帶通模擬信號&#xff0c;傳…

如何用Python并發下載?深入解析concurrent.futures 與期物機制

concurrent.futures模塊的核心價值 Python的concurrent.futures模塊提供了線程池&#xff08;ThreadPoolExecutor&#xff09;和進程池&#xff08;ProcessPoolExecutor&#xff09;兩種并發模型&#xff0c;通過高層接口簡化并發編程。其核心優勢在于&#xff1a; 自動管理資源…