【架構優化】拒絕 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 腳本。

相关推荐
Ticnix18 小时前
我删了 200 行 if-else,把决策逻辑全写进了 System Prompt
python·llm·agent
谢白羽18 小时前
在4×B300用SGLang部署DeepSeek-V4.1 Flash优化实录
笔记·python·llm·llama·sglang
DigitalOcean18 小时前
DeepSeek V4.1 Flash 现已上线 DigitalOcean:更强 Agent,更低推理成本
llm
liulilittle18 小时前
OpenCode 中解禁 Muse-Spark 1.3 - max 档
ai·spark·llm·agent·tools·opencode·muse
桃西西呀20 小时前
限速 30 和限速 80 只差一个数字,卷积网络怎么分得清?
人工智能·深度学习·llm
武子康1 天前
小智首批设备怎样放量?从接入名单到故障后的恢复决定
人工智能·llm·agent
桃西西呀1 天前
邮件自动分类 Agent:分类即建模,动作即风险
人工智能·llm·agent
武子康1 天前
Data Parallel 深入解析:把请求分给真正有余量的副本
人工智能·llm·agent
Java后端的Ai之路1 天前
大模型LLM评估完全指南
开发语言·人工智能·python·llm·评估
牛油果子哥q2 天前
LLM安全与内容风控全栈落地: Prompt注入、越狱攻击、幻觉风控、敏感词过滤、C++风控网关、多级审核体系、线上攻防实战
ai·llm