---
title: "用 AI Agent + LangChain 打造基於大語言模型的自然語言 BI 報表系統"
description: "分享如何用 AI Agent 搭配大語言模型（LLM）讀取資料庫結構，結合 LangChain SQL Toolkit，快速打造一套自然語言驅動的 BI 報表系統"
canonical_url: "https://blog.markkulab.net/post/bi-agent-langchain-natural-language-sql"
author: "Mark Ku"
author_url: "https://blog.markkulab.net/author/mark-ku"
site: "Mark Ku's Blog"
date_published: "2026-02-06 10:00:00 +0800"
category: "AI"
tags: ["ai-agent", "langchain", "gemini", "bi", "sql", "nextjs", "llm"]
language: "zh-TW"
license: "CC BY 4.0"
license_url: "https://creativecommons.org/licenses/by/4.0/"
attribution: "轉載或引用請註明作者並附上原文連結"
---

# 用 AI Agent + LangChain 打造基於大語言模型的自然語言 BI 報表系統

> **TL;DR** — 歡迎收聽 Mark 的 Tech Insights，我是主持人璦廷。你是否常被同事打斷手邊工作，要求幫忙撈取資料庫的數據呢？今天，讓我們來看看如何運用人工智慧代理與 LangChain，快速打造一套自然語言驅動的商業智慧報表系統。 想像一下，只要輸入「列出所有付費用戶」，系統中的人工智慧大腦就會像超級翻譯員一樣，自動將日常口語轉換為資料庫查詢指令，並產出精美的表格。作者選用了 Next.js 作為全端框架，搭配便宜且回應快速的 Gemini 2.0 Flash 模型，專門用來處理標準化的報表查詢。 這個重點值得注意：雖然人工智慧很聰明，但我們必須事先設定好角色規則，讓它理解資料庫結構與業務邏輯，同時設立防護機制以確保資訊安全。透過這套架構，加上現成模板的輔助，短短一個上午就能完成系統雛形。 總結來說，善用人工智慧與合適的開發工具，能大幅釋放工程師的生產力。不妨思考看看，你的日常工作中，還有哪些繁瑣的任務可以交給人工智慧來代勞呢？

## 前言

身為工程師，最常被同事問：「幫我查一下這個報表」、「上個月的業績數字是多少？」每次都要停下手邊工作，寫程式去資料庫撈資料，其實蠻花時間的。

於是我想：**能不能讓 AI 來幫忙做這件事？**

想像一下，你只要用「說話」的方式告訴電腦：「幫我找出所有付費客戶的名單」，AI 就會自動幫你去資料庫查資料、整理成報表，不需要會寫程式，一般人也能輕鬆使用！

這篇文章+會分享我如何利用**大語言模型（LLM）** 快速打造出這樣的智慧報表系統。**一個上午就能完成雛形架構**，後續再根據實際使用情況微調優化即可。


## 這套系統怎麼運作？

簡單來說，整個流程就像這樣：

```
你說的話 → AI 翻譯成電腦看得懂的指令 → 資料庫回傳結果 → 顯示報表
```

舉個例子：
- 你輸入：「列出所有付費用戶，包含公司名稱和到期日」
- AI 會自動把這句話轉換成資料庫查詢指令
- 系統執行查詢，把結果用漂亮的表格呈現給你

P.S. 以前靠傳統程式撰寫，要花很多時間的，現在可以透過AI 很快速的產生SQL 語言及報表結構。  

```
┌──────────────────────────────────────────────────────────────┐
│                      系統運作流程                             │
├──────────────────────────────────────────────────────────────┤
│                                                              │
│   👤 使用者在後台輸入                                               │
│   「列出所有付費用戶，包含公司名稱、方案類型、到期日」              │
│        │                                                     │
│        ▼                                                     │
│   ┌─────────────────────────────────────────────┐            │
│   │           🤖 AI 智慧助手 (LangChain)        │            │
│   │  ┌───────────────────────────────────────┐  │            │
│   │  │  📚 內建知識                           │  │            │
│   │  │  - 知道公司的業務規則                   │  │            │
│   │  │  - 知道哪些資料不能查                   │  │            │
│   │  │  - 知道如何保護機密資料                 │  │            │
│   │  └───────────────────────────────────────┘  │            │
│   └─────────────────────────────────────────────┘            │
│        │                                                     │
│        ▼                                                     │
│   ┌─────────────────┐    ┌─────────────────┐                 │
│   │  翻譯成查詢指令  │ →  │  安全檢查       │                 │
│   └─────────────────┘    └─────────────────┘                 │
│        │                         │                           │
│        ▼                         ▼                           │
│   ┌─────────────────────────────────────────────┐            │
│   │              📊 資料庫                       │            │
│   └─────────────────────────────────────────────┘            │
│                                                              │
└──────────────────────────────────────────────────────────────┘
```

### 我用了哪些工具？

| 工具名稱 | 功能 | 為什麼選它 |
|------|------|----------|
| **Next.js** | 網站開發框架 | 前端後端都能處理，開發快速 |
| **LangChain** | AI 助手框架 | 現成的資料庫查詢功能，直接用 |
| **Gemini 2.0 Flash** | AI 大腦 | Google 的 AI 模型，便宜又快 |
| **TypeORM** | 資料庫連線工具 | 安全連線 Azure 資料庫 |
| **Tailwind CSS** | 網頁美化工具 | 手機電腦都好看 |

## AI 大腦在這系統中做什麼？

在這套系統中，**AI（大語言模型）** 就像是一位「超級翻譯員」，負責把你說的話翻譯成電腦看得懂的資料庫指令。

### AI 的工作是什麼？

```
┌─────────────────────────────────────────────────────────────────┐
│                    AI 在系統中的角色                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  你說的話                       電腦指令                         │
│  ┌─────────────────┐           ┌─────────────────────────────┐  │
│  │ 「列出所有      │    AI     │ SELECT TOP 1000             │  │
│  │   付費用戶」    │   ───→    │   公司名稱, 方案類型         │  │
│  │                 │   翻譯    │ FROM 用戶資料表...           │  │
│  └─────────────────┘           └─────────────────────────────┘  │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

### AI 需要先學會三件事

1. **認識資料庫結構**
   - 資料庫裡有哪些表格？每個表格存什麼資料？
   - 表格之間有什麼關聯？（例如：客戶資料表和訂單表的關係）

2. **理解公司的業務規則**
   - 什麼叫做「付費用戶」？（有綁定信用卡且沒有取消的用戶）
   - 什麼是「測試帳號」？要怎麼排除？

3. **遵守安全規則**
   - 哪些操作是禁止的？（不能刪除資料、不能修改資料）
   - 哪些資料不能查？（密碼、金鑰等機密資料）

### 為什麼選 Gemini 2.0 Flash？

市面上有很多 AI 模型，我選 Google 的 Gemini 2.0 Flash 是因為：

| 模型 | 優點 | 缺點 | 適合場景 |
|------|------|------|----------|
| **GPT-4o** | 思考能力強 | 比較貴 | 複雜的分析任務 |
| **Claude 3.5** | 處理長文件厲害 | 使用限制較多 | 文件整理 |
| **Gemini 2.0 Flash** ✅ | 便宜、速度快 | 複雜推理稍弱 | **報表查詢（本案使用）** |

對於報表查詢這種「有標準格式」的任務，Gemini 2.0 Flash 的性價比最高：

- **超級便宜** - 用一整個月大概不到台幣 50 元
- **回應快速** - 1-2 秒就能生成查詢指令
- **翻譯準確** - 對資料庫查詢語法理解很到位

### 告訴 AI「你是誰」

我們需要事先告訴 AI 它的角色和規則，就像新員工入職時要先了解公司規定：

```typescript
const AI助手設定 = `
## 你的身份
你是公司的資料分析專家，專門幫大家查報表資料。

## 你必須遵守的規則
1. 只能「查詢」資料，不能新增、修改或刪除
2. 每次最多查 1000 筆資料
3. 已刪除的資料不要顯示
4. 密碼等機密欄位不能查

## 你知道的業務規則
- 付費用戶 = 有綁信用卡 且 沒有取消訂閱
- 測試帳號 = 信箱包含「xxx」的帳號
`;
```

這樣設計的好處是：
- **行為可控** - AI 不會做出危險的事
- **結果一致** - 每次查詢都會套用相同的規則
- **容易調整** - 想加新規則只要改這段設定

### 不能 100% 信任 AI：三層防護機制

雖然 AI 很聰明，但我們不能完全相信它。萬一有人故意輸入惡意指令怎麼辦？所以系統設計了**三道防線**：

```
┌─────────────────────────────────────────────────────────────────┐
│                       三層安全防護                               │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  第一層：事先告訴 AI 規則                                        │
│  ────────────────────────                                       │
│  告訴 AI「你只能做什麼」                                         │
│  → 80% 的危險操作在這裡就被擋住                                  │
│                                                                 │
│  第二層：程式碼再檢查一次                                        │
│  ────────────────────────                                       │
│  AI 產生的指令，程式會再檢查一遍                                  │
│  → 就算 AI 被騙了，程式碼也會把危險指令擋下來                     │
│                                                                 │
│  第三層：資料庫權限限制                                          │
│  ────────────────────────                                       │
│  資料庫帳號只有「讀取」權限，根本不能改資料                        │
│  → 最後一道防線，確保資料安全                                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

## 我的技術選型

開發這套系統時，我選了 **Next.js** 這個網頁全端開發框架 (React + Node )

### 好處 1：所有程式碼放在一起

傳統做法是前端、後端分開兩個專案，但 Next.js 可以全部放在一起：

```
我的專案/
├── src/
│   ├── app/              # 使用者看到的網頁畫面
│   │   └── reports/
│   │       └── page.tsx
│   ├── app/api/          # 處理資料的後台程式
│   │   └── reports/
│   │       └── route.ts
│   └── lib/              # 共用的工具程式
│       └── langchain-sql.ts
```

這樣做的好處：

- **AI 助手更容易幫忙** - 像 Cursor、Copilot 這類 AI 工具，模型的 Context 長度都有限制，程式都在同個專案中，對於AI會比較容易了解這系統
- **程式碼可以共用** - 寫一次就能前後端都用
- **改一個地方馬上生效** - 不用切來切去

### 好處 2：直接整合 AI 套件

LangChain 是一個專門用來打造 AI 應用的套件，剛好有 Node 版本，可以直接在 Next.js 裡使用：

```typescript
// 簡單幾行程式碼就能讓 AI 幫忙查資料庫
const ai = new ChatVertexAI({ model: 'gemini-2.5-flash-001' });
const 資料庫 = await SqlDatabase.fromDataSourceParams({ appDataSource });
const AI助手 = await createSqlAgent(ai, new SqlToolkit(資料庫, ai));

const 結果 = await AI助手.invoke({ input: '列出付費用戶' });
```

### 好處 3：網頁自動適應各種螢幕大小

用 **Tailwind CSS** 這個樣式工具，可以輕鬆讓網頁在手機、平板、電腦上都好看：

```tsx
// 手機一欄、平板兩欄、電腦三欄
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
```

P.S. Next.js 採用的是 request-based 的生命週期，每次請求都是獨立執行，因此不適合用來處理長時間的 Job 或大量、複雜的運算任務，這類需求建議交由 Background Worker / Job Queue 來負責。
以避免影響請求效能與整體系統穩定性。

## 另外，花小錢買現成模板，省大時間

為了加速開發，我買了一個現成的後台模板（[Isomorphic](https://themeforest.net/item/isomorphic-react-redux-admin-dashboard/20262330)），價格約 **台幣 800 元**。

### 免費模板 vs 付費模板

市面上也有免費的 [shadcn-ui](https://ui.shadcn.com/)，它其實很棒：
- 創辦人在知名公司 Vercel 工作
- GitHub 上有超過 **10 萬人**按讚

但實際差異在於「**省不省時間**」：

| 比較 | 免費模板 | 付費模板 |
|------|---------|----------|
| 整合時間 | 要自己慢慢調整 | 直接就能用 |
| 穩定度 | 要自己測試 | 已經被很多人測試過 |
| 遇到問題 | 機率較高 | 機率較低 |
| 價格 | 免費 | 約 800 元 |

### 這筆錢值不值得？

```
┌─────────────────────────────────────────────────────────────┐
│  投資報酬分析                                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  模板成本:  約台幣 800 元                                    │
│                                                             │
│  省下的時間:  至少 2 週                                      │
│    - 網頁畫面開發                                           │
│    - 手機平板電腦都要顧到                                    │
│    - 各種瀏覽器測試                                         │
│    - 搜尋引擎優化設定                                       │
│                                                             │
│  結論:  2 週工程師薪水 遠大於 800 元 → 超值！                │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

### 模板已經幫你做好這些事

專業模板通常已經內建：

- ✅ **搜尋引擎優化** - Google 更容易找到你的網站
- ✅ **各種裝置都能用** - 手機、平板、電腦都測試過
- ✅ **統一的視覺風格** - 顏色、間距、字體都設計好
- ✅ **常用功能元件** - 表格、表單、圖表、通知等
- ✅ **深色模式** - 晚上看螢幕不刺眼

這讓專案一開始就有「**產品等級**」的品質，可以專心做真正重要的功能。

## 這套架構很適合 AI 輔助開發

現在很流行用 AI 工具（像 Cursor、Copilot）來幫忙寫程式，這套架構特別適合：

```
┌─────────────────────────────────────────────────────────────┐
│  為什麼 AI 助手特別喜歡這種架構？                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 全部放一個專案                                          │
│     → AI 可以一次看懂整個專案                               │
│                                                             │
│  2. 有型別檢查(typescript)                                            │
│     → AI 寫錯了馬上會被抓到                                 │
│                                                             │
│  3. 樣式寫法統一                                            │
│     → AI 調畫面更快                                         │
│                                                             │
│  4. 檔案結構就是網址                                        │
│     → AI 很容易理解哪個檔案對應哪個頁面                      │
│                                                             │
│  5. AI 套件模組化 (Langchain)                                           │
│     → 可以換不同的 AI 模型                                  │
│     → 可以串接 Google、OpenAI、Claude                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘
```

這也是為什麼**一個上午就能完成雛形架構** — 選對工具 + AI 幫忙，後續只需要根據實際需求微調即可！

## 實際程式碼怎麼寫？

以下是核心程式碼的簡化版本，讓大家了解基本原理。

### 第一步：連接資料庫

首先要讓程式能夠連上資料庫，這裡用安全的方式連線（不把密碼寫在程式碼裡）：

```typescript
// 連接資料庫的程式碼
import { DataSource } from 'typeorm';

async function 連接資料庫() {
  const 資料庫連線 = new DataSource({
    type: 'mssql',                              // 使用微軟的 SQL Server
    host: process.env.AZURE_SQL_SERVER,         // 資料庫位址（從環境變數讀取）
    database: process.env.AZURE_SQL_DATABASE,   // 資料庫名稱
    // ... 其他安全認證設定
  });

  await 資料庫連線.initialize();  // 建立連線
  return 資料庫連線;
}
```

### 第二步：記住資料庫結構（快取機制）

資料庫的結構（有哪些表格、哪些欄位）不會常常變，記起來可以省錢：

```typescript
// 快取機制：記住資料庫結構，不用每次都重新問
let 快取 = null;
const 快取時間 = 60 * 60 * 1000; // 60 分鐘後才重新取得

function 快取還有效嗎() {
  if (!快取) return false;
  return new Date() < 快取.過期時間;
}
```

### 第三步：設定 AI 的「規則手冊」

這是最重要的部分！告訴 AI 它能做什麼、不能做什麼：

```typescript
const AI規則手冊 = `
## 你的身份
你是公司的資料分析專家，專門幫忙查報表資料。

---

## 絕對不能做的事

### 禁止的操作
- 不能新增資料
- 不能修改資料  
- 不能刪除資料
- 不能改變資料庫結構

### 不能查的欄位（機密資料）
- 密碼相關欄位
- 金鑰和 Token

### 查詢限制
- 每次最多查 1000 筆
- 一定要有過濾條件

---

## 你知道的公司規則

### 主要資料表
- 客戶資料表 - 存客戶基本資訊（ID、方案類型、是否取消等）
- 客戶詳細資料表 - 存公司名稱、聯絡人等
- 付款紀錄表 - 存付款歷史

### 重要業務規則

#### 已刪除的資料不要顯示
- 查詢時自動排除已刪除的資料

#### 測試帳號要排除
- 信箱包含「IQT」的都是測試帳號

#### 判斷付費用戶的條件
有綁信用卡 + 沒取消訂閱 + 還沒過期
`;
```

## 安全防護怎麼做？

就算 AI 很聰明，我們還是要多加幾道防線，確保不會出錯。

### 第一道防線：程式碼檢查

在執行查詢之前，程式會先檢查有沒有危險的操作：

```typescript
// 危險操作黑名單
const 禁止清單 = ['新增資料', '修改資料', '刪除資料', '刪除表格'];

function 檢查安全性(查詢指令) {
  // 1. 一定要是「查詢」開頭
  if (!查詢指令.startsWith('SELECT')) {
    return { 安全: false, 錯誤: '只能查詢，不能做其他操作' };
  }

  // 2. 檢查有沒有危險操作
  for (const 禁止項目 of 禁止清單) {
    if (查詢指令.includes(禁止項目)) {
      return { 安全: false, 錯誤: `發現禁止的操作: ${禁止項目}` };
    }
  }

  // 3. 檢查有沒有查機密欄位
  // ... 類似的檢查邏輯

  return { 安全: true };
}
```

### 第二道防線：自動加上數量限制

萬一忘了限制查詢數量，程式會自動補上：

```typescript
function 自動加限制(查詢指令) {
  // 如果沒有限制數量，自動加上「最多 1000 筆」
  if (!查詢指令.includes('TOP')) {
    return 查詢指令.replace('SELECT', 'SELECT TOP 1000');
  }
  return 查詢指令;
}
```

### 第三道防線：資料庫本身的權限設定

最保險的做法是，在資料庫那邊就設定好：這個帳號只能「讀」，不能「改」：

```sql
-- 在資料庫設定：只給讀取權限
CREATE ROLE [報表查詢角色];
GRANT SELECT TO [報表查詢角色];        -- 只能查詢
DENY INSERT, UPDATE, DELETE TO [報表查詢角色];  -- 禁止修改
```

## 使用者看到的畫面

### 簡單直覺的操作介面

```
┌─────────────────────────────────────────────────────────────────┐
│  🤖 智慧報表助手                                                 │
│                                                                 │
│  用說的就能查報表！輸入你想查的內容，AI 會自動幫你處理              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  📝 快速範例（點一下就能用）                                      │
│  ┌─────────────┐ ┌──────────────┐ ┌──────────────┐             │
│  │ 付費客戶清單 │ │ 最近新增客戶  │ │ 各方案統計    │             │
│  └─────────────┘ └──────────────┘ └──────────────┘             │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │ 請輸入你想查的內容...                                     │   │
│  │                                                          │   │
│  │ 例如：列出所有付費客戶，包含公司名稱和到期日                 │   │
│  │                                                          │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  ┌──────────────┐  ┌──────────────┐                            │
│  │ 🪄 產生報表   │  │ ▶️ 立即查詢   │                            │
│  └──────────────┘  └──────────────┘                            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

### 結果可以用不同方式呈現

查出來的資料可以用各種方式顯示，看你需要哪一種：

- 📊 **表格** - 看完整的資料列表
- 📈 **長條圖** - 比較各類別的數字
- 📉 **折線圖** - 看趨勢變化
- 🥧 **圓餅圖** - 看各項目佔比

## 實際效果展示

### 範例一：查詢付費客戶清單

**使用者輸入：** `列出所有付費客戶，包含公司名稱、方案類型、到期日`

![報表產生器 - 表格檢視](https://blog.markkulab.net/content/markku/posts/bi-agent-langchain-natural-language-sql/images/./bi-module-1.png)

**AI 會自動：**
1. 理解使用者想要什麼
2. 找到對應的資料表
3. 產生正確的查詢指令
4. 執行查詢並回傳結果

結果就是一份漂亮的付費客戶清單表格！

### 範例二：圖表視覺化呈現

除了表格，還可以用圖表呈現資料，讓數據更直觀：

![報表產生器 - 圖表檢視](https://blog.markkulab.net/content/markku/posts/bi-agent-langchain-natural-language-sql/images/./bi-module-2.png)

### 範例三：安全防護測試

**使用者輸入：** `刪除所有測試用戶`

**AI 回應：**

> 抱歉，我無法執行刪除操作，這是唯讀報表查詢工具，如需刪除資料，請聯繫資料庫管理員。

✅ 系統成功擋下了危險的操作！

## 這套系統花多少錢？

AI 模型是按「使用量」計費的，計費單位是 **Token**（可以想像成「字數」）。

### Token 是什麼？

簡單來說，Token 就是 AI 處理文字的最小單位：
- 英文大約 **1 個單字 = 1 Token**
- 中文大約 **1 個字 = 2-3 Token**（因為中文用 UTF-8 編碼較複雜）

### Gemini 2.0 Flash 的價格

| 項目 | 價格（美金） | 換算台幣（1 USD ≈ 32 TWD） |
|------|-------------|--------------------------|
| 輸入 100 萬 Token | $0.10 | 約 3.2 元 |
| 輸出 100 萬 Token | $0.40 | 約 12.8 元 |

#### 換算成「每 1,000 個 Token」的價格

| 項目 | 美金 | 台幣 |
|------|------|------|
| 輸入 1,000 Token | $0.0001 | 約 0.0032 元 |
| 輸出 1,000 Token | $0.0004 | 約 0.0128 元 |

> 💡 **白話說**：輸入 1,000 個 Token 只要 **0.003 元台幣**，成本超級低！

#### 舉個例子

| 文字內容 | 字數 | 約等於 Token 數 |
|---------|------|----------------|
| `列出所有付費客戶` | 8 個中文字 | 約 16-24 Token |
| `SELECT * FROM customers` | 4 個英文單字 | 約 5 Token |
| 一段 SQL 查詢指令 | 約 50 個字元 | 約 30-50 Token |
| 系統提示詞（規則手冊） | 約 800 個中文字 | 約 2,000 Token |

每次跟 AI 對話，會產生兩種費用：
- **輸入 Token**：你問 AI 的問題 + 資料庫結構資訊
- **輸出 Token**：AI 回答你的內容（SQL 指令 + 說明）

### 實際使用情境估算

```
┌─────────────────────────────────────────────────────────────────┐
│  一次報表查詢的 Token 消耗                                       │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  📥 輸入 Token（你給 AI 的資訊）                                 │
│  ├── 系統提示詞（規則手冊）    約 2,000 Token                    │
│  ├── 資料庫結構（快取後不重複） 約 3,000 Token（首次）            │
│  └── 使用者問題               約 100 Token                      │
│                                                                 │
│  📤 輸出 Token（AI 回答的內容）                                  │
│  ├── SQL 查詢指令             約 200 Token                      │
│  └── 結果說明                 約 300 Token                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

### 費用明細表

| 操作 | Token 消耗 | 費用估算 | 說明 |
|------|-----------|---------|------|
| 讀取資料庫結構（第一次） | 約 5,000 輸入 + 500 輸出 | 約 0.03 元 | 只有第一次需要，之後會快取 |
| 每次查詢（快取後） | 約 2,100 輸入 + 500 輸出 | 約 0.003 元 | 省掉重複讀取結構的成本 |
| 一天用 50 次 | 約 13 萬 Token | 約 0.15 元 | 一般中小企業的日常用量 |
| **一個月下來（22 工作天）** | 約 286 萬 Token | **約 5 元台幣** | 比一杯手搖飲還便宜！ |

#### 單次查詢費用計算範例

假設使用者問：「**列出所有付費客戶，包含公司名稱和到期日**」

```
┌─────────────────────────────────────────────────────────────────┐
│  💰 單次查詢費用計算                                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  📥 輸入費用                                                     │
│  ├── 系統提示詞      2,000 Token × $0.0001/1K = $0.0002         │
│  ├── 使用者問題        100 Token × $0.0001/1K = $0.00001        │
│  └── 小計：約 $0.00021（約 0.007 元台幣）                        │
│                                                                 │
│  📤 輸出費用                                                     │
│  ├── SQL 指令          200 Token × $0.0004/1K = $0.00008        │
│  ├── 結果說明          300 Token × $0.0004/1K = $0.00012        │
│  └── 小計：約 $0.0002（約 0.006 元台幣）                         │
│                                                                 │
│  ────────────────────────────────────────────────────────────   │
│  📊 總計：約 $0.0004（約 0.013 元台幣）                          │
│                                                                 │
│  👉 一次查詢只要 0.01 元，問 100 次才 1 塊錢！                    │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

### 為什麼這麼便宜？

```
┌─────────────────────────────────────────────────────────────────┐
│  省錢關鍵：快取機制                                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  ❌ 不用快取的情況                                               │
│     每次查詢都要重新讀取資料庫結構                                │
│     → 每次消耗 5,000+ Token                                     │
│     → 一個月可能要 50 元以上                                     │
│                                                                 │
│  ✅ 使用快取的情況                                               │
│     資料庫結構記住 60 分鐘                                       │
│     → 每次只消耗 2,100 Token                                    │
│     → 一個月只要約 5 元                                         │
│                                                                 │
│  💡 省了 90% 的費用！                                            │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘
```

### 跟其他 AI 模型比較

| 模型 | 同樣用量的月費 | 備註 |
|------|--------------|------|
| **Gemini 2.0 Flash** ✅ | 約 5 元 | 本專案使用 |
| GPT-4o | 約 50 元 | 貴 10 倍 |
| GPT-4o mini | 約 8 元 | 也是便宜的選擇 |
| Claude 3.5 Sonnet | 約 40 元 | 適合複雜分析 |

超級便宜！一個月的 AI 費用比一杯飲料還便宜 🥤

## 給開發團隊的安全規則

除了系統本身的防護，我還幫團隊寫了開發規則，讓大家用 AI 工具（像 Cursor）寫程式時也不會誤觸危險操作：

```markdown
# 開發規則：資料庫安全

## AI 絕對不能做的事

### 1. 刪除資料
- 不能刪除任何一筆資料
- 不能清空整個表格

### 2. 刪除結構  
- 不能刪除表格
- 不能刪除資料庫

### 3. 危險的修改
- 不能隨意修改表格結構
```

## 總結

### 為什麼這個方案可行？

1. **工具夠成熟** - LangChain 已經把複雜的事情都處理好了
2. **AI 夠便宜** - Gemini 2.0 Flash 費用幾乎可以忽略
3. **安全有保障** - 三層防護機制，不怕出錯

### 未來還可以加什麼功能？

1. **記住常用查詢** - 下次直接點選就能用
2. **自動推薦圖表** - 根據資料類型建議用什麼圖表
3. **追問功能** - 查完可以說「只顯示前 10 名」

### 適合什麼場景？

- 公司後台的報表需求
- 讓不會寫程式的人也能查資料
- 資料分析師快速驗證想法


---

如果你也想打造類似的系統，歡迎參考這個架構！透過vibe coding ，一個上午就能做出雛形，後續微調優化，很快就能上線使用。

---

## 關於本文與作者

本文出自 [Mark Ku's Blog](https://blog.markkulab.net/post/bi-agent-langchain-natural-language-sql)

授權條款： [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) — 轉載或引用請註明作者並附上原文連結

### 關於作者

**[Mark Ku](https://blog.markkulab.net/author/mark-ku)** — Software Solution Provider

- 10+ 年資深軟體工程師，現為 AI 應用 Builder
- 專注大型平台架構設計，從北美電商到AI SaaS訂閱收費系統
- 結合 AI Agent 與自動化，打造高效可演進的產品技術基礎

### 作者開發的免費工具

以下工具皆可免費使用：

- [免費 PDF 簽名工具](https://blog.markkulab.net/tools/pdf-sign): 線上 PDF 簽名工具，瀏覽器內完成手繪、打字、上傳簽名，可拖曳放置、縮放、下載。所有處理都在你的裝置完成，檔案不會上傳。
- [VS Code Refactory](https://blog.markkulab.net/tools/refactory): Refactory 是一款 VS Code 重構擴充套件：34 個重構動作、37 條 code smell 檢查、Code Health 儀表板、18 種語言、534 支測試。懂你的專案慣例：介面放哪、DI 註冊寫在哪、'use client' 該不該加；還會用 git 修改頻率 × 複雜度排出「該先修哪個檔案」，並一鍵把壞味道交給你自己電腦上的 Claude Code 修。免費使用，原始碼不離開你的機器。
- [DB-Kit 資料庫管理工具](https://blog.markkulab.net/tools/db-kit): DB-Kit 是一個用 Tauri + Rust + React 打造的輕量跨平台資料庫管理工具，用單一一致的介面同時管理 MySQL、MariaDB、PostgreSQL、SQL Server、Oracle、SQLite、MongoDB、Redis、Kafka、Elasticsearch 與 RabbitMQ 十一種資料來源：連線密碼以 OS keychain 加密、SSH Tunnel、完整 CRUD、視覺化查詢建構器、多結果集同時顯示、跨連線資料傳輸與比對同步、Excel / CSV 匯入匯出、執行計畫視覺化、ER 圖、排程備份、SQL 壓力測試（p50～p99 延遲百分位）、15 條規則的 SQL 審查、Kafka 訊息瀏覽與監控告警；繁中 / 英文雙語介面，內建 AI 助手（自然語言生成 SQL、AI 審查與調校建議）與命令列工具 dbk。免費開源（MIT），提供 Windows / macOS / Linux 安裝檔。
- [VS Code Super Mermaid](https://blog.markkulab.net/tools/super-mermaid): Super Mermaid 是一款 VS Code 擴充套件：開箱即用的漂亮 Mermaid 圖表，自動上色、即時預覽、滑鼠平移縮放、PNG / SVG 高解析匯出，內建 21 種範本與多種主題。免費開源（MIT）。
- [React Super Mermaid](https://blog.markkulab.net/tools/react-super-mermaid): react-super-mermaid 是一個開源 React 元件庫：一行 <MermaidViewer> 即可渲染漂亮的 Mermaid 圖表，內建 colorful / sketch 主題、平移縮放、圖內搜尋、SVG / PNG 高解析匯出。輕量、SSR 安全、完整 TypeScript 型別。免費開源（MIT）。
- [Jira / Confluence Super Mermaid](https://blog.markkulab.net/tools/jira-super-mermaid): Atlassian Forge app：在 Jira issue 與 Confluence 內文直接寫 Mermaid 語法，畫流程圖、時序圖、狀態機與甘特圖。11 種圖表、SVG / PNG 匯出、明暗主題、完整中日韓文字支援。取得 Runs on Atlassian 資格：圖表存在你自己的站台，app 不呼叫任何第三方服務。免費，即將上架 Atlassian Marketplace。
- [Mermaid 線上預覽](https://blog.markkulab.net/tools/mermaid-preview): 在瀏覽器裡寫 Mermaid、即時看圖，整張圖表壓進網址就能分享。免註冊、不上傳伺服器，相容 mermaid.live 的分享連結。
- [React Intl Phone Number](https://blog.markkulab.net/tools/react-intl-phone-number): react-intl-phone-number 是一個開源 React 元件：framework-agnostic、不依賴 antd，提供 E.164 進出、可搜尋國旗 / 國碼下拉、可配置驗證等級（strict / mobile-strict / loose）、可主題化 CSS 與 i18n，電話邏輯由 google-libphonenumber 驅動。輕量、完整 TypeScript 型別。免費開源（MIT）。
- [Uptime Kuma Cluster](https://blog.markkulab.net/tools/uptime-kuma-cluster): 把單機版 Uptime Kuma 改造成高可用叢集：OpenResty + Lua 智慧負載平衡、MariaDB 共享狀態、健康檢查與自動 Failover，附叢集管理 REST API，一行 Docker Compose 啟動。免費開源（MIT）。
- [特教專案](https://blog.markkulab.net/education): 為特殊教育學生製作的學習教材

### 每日 Podcast

- [科技新鮮事](https://blog.markkulab.net/category/tech-news): 每日精選 AI 與科技趨勢，透過語音摘要快速掌握最新技術動態，涵蓋 AI 應用、軟體架構、DevOps 與工程實戰。 — RSS: https://blog.markkulab.net/feed.xml
- [AI股市蝦聊](https://blog.markkulab.net/category/ai-stock-chat): 每個交易日用 AI 分析台股盤勢，以雙人對話聊當天的盤中觀察與隔日預測。 — RSS: https://blog.markkulab.net/ai-stock-chat/feed.xml

### 電子報

[訂閱電子報](https://blog.markkulab.net/subscribe) — 第一時間收到新文章通知，無垃圾信、隨時可取消訂閱。
