~/blog/crm-data-cleaning-llm-automation-guide.md
AI 自動化與智慧應用 · 2026 / 01 / 16 · 3 views

王大明跟 Da-Ming Wang 是同一個人嗎?用 LLM 打造 CRM 自動化資料清洗流水線

Eric — 浪花科技創辦人 / AI 架構師
Eric
浪花科技創辦人 · AI 架構師
王大明跟 Da-Ming Wang 是同一個人嗎?用 LLM 打造 CRM 自動化資料清洗流水線
目錄 table-of-contents.md

「王大明」、「Da-Ming Wang」、「wang.daming@gmail.com」——這三筆 CRM 紀錄是同一個人,還是三個客戶?傳統的字串比對規則答不出來,但 LLM 可以。這篇我會示範怎麼用 LLM 打造一條自動化的資料清洗流水線,從重複偵測做到格式標準化,把資料庫的垃圾山剷平。

那一刻,我心裡的 OS 通常是:「因為你們輸入資料的時候從來不看格式啊!」

但抱怨歸抱怨,技術債還是得還。過去我們處理 CRM 資料清洗,靠的是寫到手軟的 Regular Expressions (Regex) 和無止盡的 Excel VLOOKUP 地獄。但現在是 2025 年了,如果還在用 `if name == '台北市'` 這種寫法,真的會寫到懷疑人生。今天這篇文章,我要來聊聊如何利用 LLM (大型語言模型) 結合自動化工具,來解決這個困擾所有企業的千年難題:使用 LLM 自動處理重複或錯誤資料

為什麼傳統的 CRM 資料清洗是場災難?

在進入 AI 實戰之前,我們先來看看傳統方法的死穴在哪裡。大多數企業的 CRM (不管是 HubSpot, Salesforce 還是自架的 WordPress 系統) 資料來源都很雜:

  • 網站表單自動填入 (使用者手滑打錯字)
  • 業務手動 Key-in (格式隨心所欲)
  • 活動名單匯入 (Excel 欄位對不上)
  • API 串接同步 (編碼問題)

這導致了幾個經典問題:

  1. 語意重複無法識別:傳統程式碼認為「台積電」和「台灣積體電路製造股份有限公司」是兩個完全不同的實體,但人類(和 LLM)知道它們是一樣的。
  2. 地址格式混亂:有人寫「110 台北市信義區」,有人寫「台北市信義區 110」,傳統腳本很難統一。
  3. 拼音與錯別字:「John Smith」被誤打成「Jhon Smith」,Fuzzy Matching (模糊比對) 可以解決一部分,但誤判率很高。

LLM:資料清洗的降維打擊武器

這就是為什麼我們需要引入 LLM (Large Language Model)。LLM 最強大的能力在於「語意理解」與「推論」。對於 CRM 資料清洗 來說,LLM 就像是一個不知疲倦、且博學多聞的實習生,它能讀懂資料背後的「意圖」。

1. 利用 Vector Embeddings (向量嵌入) 抓出隱藏的重複項

這是目前最潮也最有效的做法。我們不直接比對文字,而是將客戶資料 (姓名、Email、公司名稱) 透過 OpenAI 的 `text-embedding-3-small` 模型轉換成一組「向量數字」。

在向量空間中,「AI 工程師」和「人工智慧開發者」的距離會非常近,即使它們字面上完全不同。透過計算 Cosine Similarity (餘弦相似度),我們可以輕易抓出那些傳統腳本抓不到的重複客戶。

2. 使用 LLM 進行格式標準化 (Standardization)

這是 LLM 最擅長的。你可以給它一個髒亂的地址或公司名稱,要求它輸出標準格式。例如:

  • Input: "北市信義路五段七號 101 大樓"
  • Prompt: "請將上述地址標準化為台灣郵政格式,包含郵遞區號,並以 JSON 格式回傳。"
  • Output: `{"zipcode": "110", "city": "台北市", "district": "信義區", "address": "信義路五段7號", "landmark": "台北101"}`

實戰教學:用 Python + OpenAI 打造清洗腳本

身為工程師,不秀點 Code 全身不對勁。雖然我們常推廣 n8n 這種 No-Code 工具 (這在自動化流程中超好用),但對於批次處理大量歷史髒資料,Python 還是王者。

以下是一個簡單的概念驗證 (PoC),展示如何使用 OpenAI API 來判斷兩筆 CRM 資料是否為同一人:


// 雖然這通常用 Python 跑,但為了照顧 WordPress 開發者,我用 PHP 示意 API 的呼叫邏輯

function check_duplicate_with_llm($record_a, $record_b) {
    $api_key = 'YOUR_OPENAI_API_KEY';
    $endpoint = 'https://api.openai.com/v1/chat/completions';

    $prompt = "
    你是專業的 CRM 資料管理員。請判斷以下兩筆資料是否代表同一個客戶。
    回傳 JSON 格式:{'is_duplicate': boolean, 'reason': string, 'confidence_score': 0-100}

    資料 A: " . json_encode($record_a, JSON_UNESCAPED_UNICODE) . "
    資料 B: " . json_encode($record_b, JSON_UNESCAPED_UNICODE);

    $body = [
        'model' => 'gpt-4o-mini', // 使用 mini 版本較省錢
        'messages' => [
            ['role' => 'system', 'content' => 'Output only JSON.'],
            ['role' => 'user', 'content' => $prompt]
        ],
        'response_format' => ['type' => 'json_object']
    ];

    // 發送請求 (使用 wp_remote_post 是 WordPress 的標準做法)
    $response = wp_remote_post($endpoint, [
        'headers' => [
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer ' . $api_key
        ],
        'body' => json_encode($body),
        'timeout' => 30
    ]);

    if (is_wp_error($response)) {
        return false;
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    return json_decode($body['choices'][0]['message']['content'], true);
}

// 測試資料
$client_1 = ['name' => 'Eric Chen', 'company' => 'Roamer Tech', 'email' => 'eric@roamer.com'];
$client_2 = ['name' => '陳埃瑞克', 'company' => '浪花科技', 'email' => 'eric.chen@roamer-tech.com'];

// 呼叫函式
$result = check_duplicate_with_llm($client_1, $client_2);

// 結果:LLM 能夠理解 Roamer Tech = 浪花科技,判定為高度疑似重複

自動化架構設計:別讓資料有機會變髒

清洗歷史資料只是「治標」,要「治本」就必須在資料進入 CRM 的入口處設下關卡。這就是我們常說的 Data Quality Firewall (資料品質防火牆)

我建議的架構如下:

  1. 輸入端 (WordPress 表單/Webhook):當使用者提交表單時。
  2. 中介層 (n8n / Middleware):資料不要直接寫入 CRM。
    • 第一步:呼叫 LLM 進行格式標準化 (修正 Email、電話、地址)。
    • 第二步:呼叫 Vector DB 或 CRM API 查詢是否有相似度 > 90% 的現有聯絡人。
  3. 決策層
    • 如果是新客戶 -> 寫入 CRM。
    • 如果是重複客戶 -> 更新現有資料 (Update) 或標記為 Review。

隱私與資安:工程師的最後一道防線

在使用 LLM 處理 CRM 資料清洗 時,大家最擔心的就是資安問題。「Eric,把客戶名單傳給 OpenAI 真的安全嗎?」

這是個好問題。這裡有幾個實務建議:

  • PII 去識別化:在傳送給 LLM 之前,可以將敏感個資 (如身分證字號、信用卡號) 進行 Hash 處理或遮罩,只讓 LLM 處理非敏感的結構化資料。
  • 使用 Enterprise 協議:如果你使用的是 Azure OpenAI Service 或 OpenAI Enterprise,條款中通常會保證不會使用你的資料來訓練模型。
  • Local LLM (地端模型):如果資料真的極度敏感,可以考慮在公司內部伺服器跑 Llama 3 或 Mistral 模型,透過 Ollama 串接,這樣資料就完全不出內網,雖然維護成本較高,但最安全。

結論:資料是資產,髒資料是負債

導入 使用 LLM 自動處理重複或錯誤資料 的流程,初期看起來需要一點技術門檻,但長遠來看,它能節省業務團隊無數個小時的「找人」時間,更能讓你的行銷自動化不再因為錯誤的 Email 而寄送失敗。

不要讓你的 CRM 變成數位垃圾場。善用 AI,讓資料真正成為驅動業績的資產。

延伸閱讀

受夠了手動整理 Excel 和 CRM 裡的髒資料嗎?

浪花科技專注於企業級資料整合與自動化流程設計,讓我們幫你把 AI 清洗管線架設起來,還給業務乾淨的數據庫。

立即填寫表單聯繫我們
// FAQ

常見問題

為什麼傳統方法難以清洗 CRM 中的重複資料?
傳統程式碼依靠字面比對與正則表達式,無法理解語意。例如它會把「台積電」和「台灣積體電路製造股份有限公司」當成兩個不同實體,也難以統一格式混亂的地址,對拼音與錯別字的模糊比對誤判率也很高。這些都是需要語意理解才能解決的問題。
如何用 LLM 抓出 CRM 裡語意重複的客戶?
可使用向量嵌入(Vector Embeddings),將客戶的姓名、Email、公司名稱透過嵌入模型(如 OpenAI 的 text-embedding-3-small)轉換成向量數字。在向量空間中語意相近的資料距離會很接近,再透過計算餘弦相似度(Cosine Similarity),就能找出字面不同但實為同一人的重複客戶。
把客戶資料傳給 OpenAI 做清洗安全嗎?
可透過幾種方式降低風險:在傳送前對身分證字號、信用卡號等敏感個資做 Hash 或遮罩(PII 去識別化),只讓 LLM 處理非敏感的結構化資料;使用 Azure OpenAI Service 或 OpenAI Enterprise 等保證不拿資料訓練模型的企業協議;若資料極度敏感,則可在內部伺服器以 Ollama 跑 Llama 3 或 Mistral 等地端模型,讓資料完全不出內網。
如何從源頭防止 CRM 資料變髒?
在資料進入 CRM 的入口處設下「資料品質防火牆」。讓表單或 Webhook 的資料先經過中介層(如 n8n),第一步呼叫 LLM 標準化格式(修正 Email、電話、地址),第二步查詢是否有高相似度的現有聯絡人;若是新客戶就寫入,若是重複客戶則更新現有資料或標記待審核,而非直接寫入資料庫。
~/roamer-tech/newsletter // FREE
// newsletter

訂閱免費電子報

把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。

$
// final.exec()

準備好讓你的網站開始為你工作了嗎?