客服半夜裝睡?OpenAI Assistants API 終極實戰,打造永不關機的 WordPress 智慧大腦

2025/12/26 | AI 人工智慧新知, API 串接與自動化, WP 開發技巧, 技術教學資源

告別半夜裝睡!WordPress 植入 Assistants API 終極戰略

厭倦了傳統關鍵字客服的「失憶症」嗎?OpenAI Assistants API 徹底改變遊戲規則!透過其內建的 Thread 上下文管理,我們將您的 WordPress 網站升級為永不關機的智慧大腦。文章詳細解析 Function Calling 和 RAG 技術,賦予 AI 查詢訂單、檢索文件等實戰能力。別再讓深夜客戶流失!立即學習這套硬核實戰,親手為您的網站裝上這個數位員工,或聯繫浪花科技,為您的企業部署客製化的 AI 戰力,全面提升客戶體驗與市場競爭力!

需要專業協助?

聯絡浪花專案團隊 →

客服半夜裝睡?OpenAI Assistants API 終極實戰,打造永不關機的 WordPress 智慧大腦

嗨,我是浪花科技的資深工程師 Eric。寫了這麼多年的程式,我看過太多企業在一個地方跌倒:客服。你的行銷團隊砸大錢引流,銷售團隊拼命成交,但客戶在凌晨三點遇到問題時,卻只能得到「目前非服務時間,請留言」的冰冷回覆。這就像球隊花了九牛二虎之力把球帶到門前,結果射門的球員睡著了,這能忍嗎?

傳統的客服機器人大多是關鍵字比對的「笨蛋」,只能回答設定好的問題,稍微換個問法就當機。但時代變了,AI 革命不是口號,而是已經落地的商業武器。今天,我就要帶你動手玩真的,我們來聊聊如何利用 OpenAI 最新、最強大的 Assistants API,為你的 WordPress 網站植入一個真正會思考、永不下班的智慧大腦,打造 24H 企業智能客服。

為什麼是 Assistants API?它跟 ChatGPT API 有何不同?

很多開發者可能已經玩過 OpenAI 的 Chat Completions API(就是大家常說的 ChatGPT API)。它很強大,但有個天生的限制:它是「無狀態 (Stateless)」的。每次對話,你都得把整個聊天紀錄重新傳一次,AI 才能理解上下文。這不僅浪費 token(也就是錢),在長對話中還很容易失憶。

身為一個有點龜毛的工程師,我必須說,這種方式太不優雅了。而 Assistants API 就是為了解決這個痛點而生的。你可以把它想像成,你不是在跟一個記憶力只有七秒的金魚對話,而是在聘請一位專屬的數位助理

Assistants API 的四大核心概念

  • Assistant (助理):這就是你創造的 AI 角色。你可以給它一個身份(例如「浪花科技專業客服」)、具體的指令 (Instructions)、選擇要用的模型(例如最新的 GPT-4o),以及賦予它特殊工具 (Tools)。
  • Thread (對話串):每個使用者與 Assistant 的對話都是一個獨立的 Thread。OpenAI 會自動幫你管理這個對話串的上下文,你再也不用手動傳送落落長的歷史紀錄了。這點真的超讚,省事省錢。
  • Message (訊息):使用者或你(代表 AI)在對話串中發送的每一句話。
  • Run (執行):當你把使用者的 Message 加入 Thread 後,你需要下達一個「Run」的指令,Assistant 才會開始思考並回應。這是一個非同步的過程,非常適合網頁應用。

簡單來說,整個流程就是:建立一個助理 -> 為新用戶建立一個對話串 -> 用戶傳訊息 -> 執行助理 -> 等待助理回覆。這個架構讓長對話、多使用者管理變得異常清晰且高效。

殺手級應用:讓 AI 學會使用你的工具 (Function Calling)

如果只是能記住上下文,那還不夠看。Assistants API 最讓我興奮的功能,是 Function CallingFile Search (RAG)

Function Calling:賦予 AI 操作你網站的能力

想像一下,客戶問:「請問訂單 #WP12345 的狀態是什麼?」傳統的 AI 只能說:「很抱歉,我無法查詢即時訂單狀態。」但有了 Function Calling,你可以「教」AI 如何呼叫你寫在 WordPress 裡的 PHP 函式!

流程會變成這樣:

  1. 使用者問:「訂單 #WP12345 的狀態?」
  2. Assistant 分析後發現,這需要查詢資料庫,而它的「工具箱」裡有一個叫做 `get_order_status` 的工具。
  3. API 回傳一個 `requires_action` 的狀態,告訴你的 WordPress:「嘿,老兄,該你動手了,幫我執行 `get_order_status`,參數是 `WP12345`。」
  4. 你的 WordPress 執行這個 PHP 函式,查到訂單狀態是「已出貨」。
  5. 你把「已出貨」這個結果回傳給 Assistant。
  6. Assistant 收到結果後,用人性化的語氣回覆使用者:「您好,您的訂單 #WP12345 已經在路上了喔!」

看到沒?AI 不再只是個聊天對象,而是變成了一個能與你網站系統互動的操作員。查詢庫存、預約時間、找尋特定商品… 可能性是無限的。

File Search (RAG):讓 AI 成為你的產品專家

另一個神器是 File Search(在最新的 v2 API 中稱為 Vector Stores)。你可以上傳公司的產品手冊、FAQ 文件、技術規格書(PDF, DOCX 等),並將這些文件與你的 Assistant 關聯。當使用者問到相關問題時,Assistant 會自動在這些你提供的「知識庫」中尋找最相關的資訊來回答。

這就是所謂的「檢索增強生成 (Retrieval-Augmented Generation, RAG)」。你不需要花大錢去微調 (Fine-tune) 模型,就能讓 AI 精準回答關於你自家業務的刁鑽問題。這對於擁有複雜產品線或大量說明文件的企業來說,簡直是天降甘霖。

WordPress 實戰:一步步打造你的 AI 客服

好了,理論講夠了,工程師的靈魂在吶喊,是時候上 Code 了。我們來走一遍最核心的流程。這裡我建議你建立一個自訂外掛來放這些程式碼,別再什麼都塞 `functions.php` 了,拜託,這樣很難維護的。

步驟一:建立 WordPress REST API 端點

我們需要一個讓前端介面可以呼叫的入口。使用 WordPress REST API 是最乾淨的做法。


<?php
// 在你的自訂外掛或佈景主題的 functions.php 中
add_action( 'rest_api_init', function () {
    register_rest_route( 'my-chatbot/v1', '/chat', array(
        'methods' => 'POST',
        'callback' => 'handle_chat_request',
        'permission_callback' => '__return_true' // 實務上應加上 nonce 驗證或使用者權限檢查
    ) );
} );

function handle_chat_request( WP_REST_Request $request ) {
    $params = $request->get_json_params();
    $user_message = sanitize_text_field( $params['message'] );
    $thread_id = isset($params['thread_id']) ? sanitize_text_field($params['thread_id']) : null;

    // 在這裡呼叫 OpenAI Assistants API 的邏輯
    // ...

    // 為了簡化,我們先回傳一個假的回應
    $response = array(
        'reply' => '我收到了你的訊息:' . $user_message,
        'thread_id' => $thread_id ? $thread_id : 'new_thread_123' // 如果是新對話,回傳新的 thread_id
    );

    return new WP_REST_Response( $response, 200 );
}
?>

這段程式碼建立了一個 `yoursite.com/wp-json/my-chatbot/v1/chat` 的 API 端點,它會接收前端傳來的訊息和對話串 ID。

步驟二:串接 OpenAI Assistants API (PHP)

接下來是重頭戲,我們要用 PHP 的 `wp_remote_post` 來跟 OpenAI 打交道。


<?php
function call_openai_assistant($user_message, $thread_id = null) {
    $api_key = 'sk-YOUR_OPENAI_API_KEY'; // 務必從安全的地方讀取,不要寫死!
    $assistant_id = 'asst_YOUR_ASSISTANT_ID'; // 你在 OpenAI 後台建立的 Assistant ID

    // 1. 如果沒有 thread_id,就建立一個新的
    if ( !$thread_id ) {
        $thread_response = wp_remote_post('https://api.openai.com/v1/threads', [
            'headers' => [
                'Content-Type'  => 'application/json',
                'Authorization' => 'Bearer ' . $api_key,
                'OpenAI-Beta'   => 'assistants=v2'
            ]
        ]);
        $thread_body = json_decode(wp_remote_retrieve_body($thread_response));
        $thread_id = $thread_body->id;
    }

    // 2. 將使用者的訊息加入 thread
    wp_remote_post("https://api.openai.com/v1/threads/{$thread_id}/messages", [
        'method'  => 'POST',
        'headers' => [
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $api_key,
            'OpenAI-Beta'   => 'assistants=v2'
        ],
        'body'    => json_encode(['role' => 'user', 'content' => $user_message])
    ]);

    // 3. 執行 Assistant
    $run_response = wp_remote_post("https://api.openai.com/v1/threads/{$thread_id}/runs", [
        'method'  => 'POST',
        'headers' => [
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $api_key,
            'OpenAI-Beta'   => 'assistants=v2'
        ],
        'body'    => json_encode(['assistant_id' => $assistant_id])
    ]);
    $run_body = json_decode(wp_remote_retrieve_body($run_response));
    $run_id = $run_body->id;

    // 4. 輪詢 (Polling) Run 的狀態,直到它完成
    $run_status = '';
    do {
        sleep(1); // 等待一秒,避免太頻繁的請求
        $status_response = wp_remote_get("https://api.openai.com/v1/threads/{$thread_id}/runs/{$run_id}", [
            'headers' => [
                'Authorization' => 'Bearer ' . $api_key,
                'OpenAI-Beta'   => 'assistants=v2'
            ]
        ]);
        $status_body = json_decode(wp_remote_retrieve_body($status_response));
        $run_status = $status_body->status;
    } while ($run_status === 'in_progress' || $run_status === 'queued');

    // 5. 如果 Run 完成了,就去抓取最新的訊息
    if ($run_status === 'completed') {
        $messages_response = wp_remote_get("https://api.openai.com/v1/threads/{$thread_id}/messages", [
            'headers' => [
                'Authorization' => 'Bearer ' . $api_key,
                'OpenAI-Beta'   => 'assistants=v2'
            ]
        ]);
        $messages_body = json_decode(wp_remote_retrieve_body($messages_response));
        // 通常最新的訊息是 AI 回的,在陣列的第一個
        $ai_reply = $messages_body->data[0]->content[0]->text->value;

        return ['reply' => $ai_reply, 'thread_id' => $thread_id];
    }

    return ['reply' => '抱歉,我現在有點忙,請稍後再試。', 'thread_id' => $thread_id];
}

// 修改我們剛剛的 REST API callback
function handle_chat_request( WP_REST_Request $request ) {
    $params = $request->get_json_params();
    $user_message = sanitize_text_field( $params['message'] );
    $thread_id = isset($params['thread_id']) ? sanitize_text_field($params['thread_id']) : null;

    $response = call_openai_assistant($user_message, $thread_id);

    return new WP_REST_Response( $response, 200 );
}
?>

工程師的小囉嗦:上面的輪詢 (Polling) 寫法是為了教學簡化。在正式產品中,你可能會想用更進階的方式,例如把 Run 的 ID 存起來,讓前端過幾秒後再來查詢結果,避免讓一個 PHP request 執行太久,佔用伺服器資源。

步驟三:前端聊天介面 (JavaScript)

前端的部分相對單純,就是一個輸入框、一個送出按鈕,和一個顯示對話的區塊。核心是用 `fetch` API 來呼叫我們寫好的後端端點。


<!-- HTML 結構 -->
<div id="chat-container">
    <div id="chat-box"></div>
    <input type="text" id="chat-input" placeholder="請輸入您的問題...">
    <button id="send-btn">送出</button>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    const sendBtn = document.getElementById('send-btn');
    const chatInput = document.getElementById('chat-input');
    const chatBox = document.getElementById('chat-box');
    let threadId = null; // 在前端保存 threadId

    sendBtn.addEventListener('click', async function() {
        const message = chatInput.value;
        if (!message) return;

        // 顯示使用者訊息
        chatBox.innerHTML += `<p><strong>你:</strong> ${message}</p>`;
        chatInput.value = '';

        try {
            const response = await fetch('/wp-json/my-chatbot/v1/chat', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({
                    message: message,
                    thread_id: threadId
                })
            });

            const data = await response.json();

            // 保存 threadId 供下次對話使用
            threadId = data.thread_id;

            // 顯示 AI 回覆
            chatBox.innerHTML += `<p><strong>AI客服:</strong> ${data.reply}</p>`;

        } catch (error) {
            console.error('Error:', error);
            chatBox.innerHTML += `<p><strong>系統:</strong> 連線錯誤,請稍後再試。</p>`;
        }
    });
});
</script>

結論:這不只是工具,而是企業戰力的延伸

串接 OpenAI Assistants API 到 WordPress,絕對不是裝個外掛按幾下就能搞定的事。它需要你對 API 流程有清楚的理解,也需要你動手寫程式。但這件事的價值遠遠超過投入的時間成本。

你得到的不是一個制式化的機器人,而是一個可被高度客製化、能學習你公司知識、能實際操作你系統功能的「數位員工」。它能 24 小時不知疲倦地解決 80% 的常見客戶問題,讓人力客服能專注在更複雜、更有價值的深度溝通上。這不僅是提升效率,更是全面升級你的客戶體驗,建立別人難以複製的競爭壁壘。

當然,實作中還有很多細節要考慮,比如 API 金鑰的安全性、成本控管、更複雜的 Function Calling 邏輯、錯誤處理機制等等。但別擔心,這就是我們浪花科技這種技術團隊存在的價值。

延伸閱讀

如果你覺得這個主題太硬核,或者想直接為你的企業導入一套量身打造的 AI 解決方案,別客氣,這正是我們的專業所在。歡迎與浪花科技聯繫,讓我們聊聊如何為你的網站裝上這個永不下班的智慧大腦,一起在 AI 時代搶佔先機!

常見問題 (FAQ)

Q1: Assistants API 跟 Chat Completions API (ChatGPT API) 最大的差別是什麼?

最主要的差別在於「狀態管理」和「內建工具」。Assistants API 會自動幫你管理對話的上下文(透過 Thread),你不需要每次請求都把歷史紀錄重傳一次,這讓長對話變得非常容易。此外,它內建了強大的工具,如 Function Calling(讓 AI 呼叫你的程式碼)和 File Search(RAG,讓 AI 查詢你上傳的文件),這是 Chat Completions API 本身不具備的。

Q2: 這樣串接一個 AI 客服會很貴嗎?

成本取決於幾個因素:使用的模型(例如 GPT-4o 比 GPT-4 Turbo 便宜且速度更快)、對話的長度、以及是否使用 File Search 等工具(這會產生額外的儲存和檢索費用)。好消息是,因為 Assistants API 能有效管理上下文,可以避免不必要的 token 浪費。建議先從少量測試開始,並在 OpenAI 後台設定預算限制,以有效控制成本。

Q3: 我完全不會寫程式,有辦法做到嗎?

坦白說,要實現本文中這種深度整合、能呼叫網站內部功能的客製化 AI 客服,程式開發是必要的。市面上或許有一些外掛提供簡易的聊天機器人功能,但它們的彈性和智慧程度通常遠不及直接串接 Assistants API。如果你希望 AI 能真正理解並操作你的業務邏輯,這就需要客製化開發。

Q4: 什麼是 RAG (File Search),為什麼它對客服機器人很重要?

RAG(Retrieval-Augmented Generation)中文是「檢索增強生成」。簡單來說,就是讓 AI 在回答問題前,先去你指定的「知識庫」(例如你上傳的產品 PDF)裡「查找資料」,然後再根據查到的內容來生成答案。這對客服機器人至關重要,因為它能確保 AI 的回覆是基於你公司的準確資訊,而不是它自己「想像」出來的。這讓 AI 能快速成為你公司的產品專家,而不需要昂貴且複雜的模型微調 (Fine-tuning)。

 
立即諮詢,索取免費1年網站保固