【架構優化】拒絕 LLM 幻覺:設計基於 Python 路由的 AntV 智慧圖表生成系統

在開發 Dify 數據助理過程中,直接將原始數據(如 BigQuery JSON)丟給 LLM 並期望其產出精確的圖表代碼,往往是穩定性的噩夢。

雖然 MCP 提供了便利,但在處理大規模數據或複雜語意時,常會遇到 Token 溢出、數據類型錯誤 或 圖表類型誤判。

為了追求生產級的穩定性,我將原有的「純 Prompt 驅動」方案改進為 「Python 預處理 + 智慧語意路由 (Chart Router)」 的架構。本文將深度解析這套在 RTX 4090 環境下實測、穩定性極高的圖表生成邏輯。


⚠️ 為什麼純 Prompt 策略會失敗?

在早期版本中,我們常依賴 LLM 自行轉換格式,這會導致以下痛點:

  1. 資料量過載 (Context Overflow):原始 JSON 包含大量冗餘元數據,直接輸入會耗盡 Token。
  2. 類型不匹配 (Schema Mismatch) :AntV 要求的 category (String) 與 value (Number) 嚴格定義,LLM 常在 JSON 轉換時將數字加上引號,導致渲染報錯。
  3. 圖表選型盲目:LLM 難以判斷數據的分佈狀態(例如該用柱狀圖對比,還是直方圖觀察分佈)。

🚀 核心架構:智慧圖表路由 (Chart Router)

我設計了一個 Python 核心節點,作為數據與視覺化組件之間的「路由媒介」。

1. 數據清洗與「強力解包」(Aggressive Unpack)

每個人處理的資料可能不相同,像我處理的是資料庫回傳的json文件,因此這方面得自行資料清洗一番,而和各位說明我這邊所做的幾個Feature。

  • 數據校準 :將 TIMESTAMP 自動轉為人體可讀的 YYYY-MM-DD 格式。
  • 單位縮放 (Scaling) :當數值最大值大於 時,自動換算為 (M) 單位;大於 則換算為 (K),確保座標軸簡潔。

2. 基於語意的「標籤分類器」

透過定義 DIM_IDENTIFIERS (維度標籤) 與 TIME_IDENTIFIERS (時間趨勢標籤),系統能自動區分:

  • 指標 (Metrics):真正的數值(如 Revenue, Count)。
  • 維度 (Dimensions) :雖然型別可能是數字,但語意上是分類(如 year, group_id, status_code)。

🔸這是用Keyword Mapping的方式,彈性比較低,但勝在穩定。


🛠️ 圖表決策矩陣:如何選擇正確的「衣服」

我的系統會根據解析出的維度與指標數量,路由至不同的 AntV 生成節點:

數據特徵 路由目標 設計決策理由
包含時間維度 (Date/Time) 折線圖 (Line) 強調數據隨時間的連續性變動與趨勢。
單指標 + 類別 < 32 筆 柱狀圖 (Column) 適合橫向對比不同分類的大小,視覺精確度高。
雙指標 (Two Metrics) 雙軸圖 (Dual Axes) 第一指標用柱狀、第二指標用折線,觀察兩者關聯性。
數據量大 + 分佈關鍵字 直方圖 (Histogram) 利用平方根法 () 自動計算分箱數,觀察數據集散。
無數值或筆數過多 Markdown Table 保持資訊完整性,避免視覺過於擁擠導致信息遺失。

💻 關鍵實作範例 (Dify Workflow)

在我的 ChartGenerator 工作流中,核心邏輯被封裝在 Python 節點內:

python 复制代码
# 核心決策片段
def route_chart(data, metrics, dims, row_count):
    if row_count == 0:
        return "text"
    if not metrics:
        return "table"
    if len(metrics) >= 2:
        return "dual"
    if any(k in x_axis.lower() for k in TIME_IDENTIFIERS):
        return "line"
    if any(k in x_axis.lower() for k in ['range', 'bucket', 'bin']):
        return "histogram"
    return "column"

我的Dify Workflow

為什麼這比單純的 Prompt 有效?

  • 確定性:圖表類型由硬邏輯判定,不會受 LLM 隨機性的影響。
  • Payload 優化 :Python 節點僅將處理後的 flattened_data 傳給後續的 AntV 組件,大幅降低了傳輸負擔。

💡 結語與未來思考

希望上述內容可以給大家一些幫助,我們不能僅僅依賴MCP的強大,在作為生產用的工具,時間效率也是我們需要控制的環節。對於圖表製作追求穩定的話,我們還是將「格式標準」與「統計計算」交還給 Python 腳本。

相关推荐
XLYcmy1 小时前
智能体大赛 目录
数据库·ai·llm·prompt·agent·检索·万方
山顶夕景1 小时前
【VLM】Qwen3-VL-SFT微调简要流程
llm·多模态大模型·vlm
XLYcmy5 小时前
智能体大赛 总结与展望 未来展望
ai·llm·app·prompt·agent·检索·万方数据库
A小码哥11 小时前
三大模型深度对比:Zhipu GLM-5 vs MiniMax M2.5 vs Qwen3-Coder-Next
人工智能·llm
lhxcc_fly12 小时前
0.LangChain--大模型篇
langchain·大模型·llm·openai·deepseek
不会敲代码113 小时前
用 LangChain 把大模型串起来:一个前端开发者的 AI 入门笔记
langchain·llm·aigc
IvanCodes13 小时前
Gemini 3.1 Pro 正式发布:一次低调更新,还是谷歌的关键反击?
人工智能·大模型·llm
Johnny.Cheung14 小时前
MLOps是什么?AWS-Azure-GCP
llm·azure·aws·mlops·gcp
@SmartSi14 小时前
Ollama 实战:从零开始本地运行大语言开源模型
llm·ollama
sg_knight1 天前
如何为 Claude Code 配置代理与网络环境
网络·ai·大模型·llm·claude·code·claude-code