你的 WordPress 搜尋匡還在裝傻?手把手打造 OpenAI 智慧搜尋引擎,讓使用者秒懂你的網站!

2025/07/16 | WP 開發技巧

你的 WordPress 搜尋匡還在裝傻?手把手打造 OpenAI 智慧搜尋引擎,讓使用者秒懂你的網站!

嗨,我是浪花科技的 Eric。身為一個天天跟程式碼打交道的工程師,我最受不了的事情之一,就是看到一個內容豐富的網站,卻配備了一個跟「金魚腦」差不多的搜尋功能。你一定也體驗過:在網站上搜了一個關鍵字,結果出來的內容牛頭不對馬嘴,最後只能嘆口氣手動一篇一篇找,或者乾脆關掉分頁。這真的太可惜了!

傳統的 WordPress 搜尋,說白了就是個「關鍵字比對器」。它只會傻傻地拿你輸入的字詞,去資料庫裡找有沒有一模一樣的字串。你搜「網站速度優化」,它就找不到那篇標題是「提升網站效能的五個技巧」的優質文章,因為字面上根本不一樣。這種搜尋方式在 2024 年,簡直就像用撥接上網一樣過時。

今天,我們就要來點硬核的。我要帶你親手為你的 WordPress 網站植入一顆「AI 大腦」,打造一個真正聽得懂「人話」的智慧搜尋引擎。我們會利用 OpenAI 的強大能力(沒錯,就是 ChatGPT 的那個家族),讓你的搜尋功能不再只是比對文字,而是理解語意、掌握使用者真正的意圖。準備好了嗎?泡杯咖啡,跟著我一起動手吧!

為什麼你的網站需要一顆「AI 大腦」?傳統搜尋的致命傷

在我們捲起袖子開始寫 code 之前,讓我們先囉嗦幾句,搞清楚「為什麼我們要做這件事」。很多客戶會問:「Eric,裝個搜尋外掛不就好了嗎?幹嘛搞這麼複雜?」問得好,但這就像問「走路就能到,為什麼要開車?」一樣。當你的目的地在 10 公里外時,工具的選擇就決定了你的效率和體驗。

傳統 WordPress 搜尋的極限

WordPress 預設的搜尋功能,背後是個簡單的 SQL LIKE 查詢。它的運作模式大概是這樣:

  • 缺乏語意理解: 它不懂「蘋果手機」和「iPhone」是同一個東西。
  • 對錯字零容忍: 你打錯一個字,它就直接罷工,給你一個「找不到內容」的白眼。
  • 無法理解上下文: 它無法判斷一篇文章是在講「蘋果」這種水果,還是在講「蘋果」這家公司。
  • 排序機制單純: 大部分時候只會按照日期排序,而不是按照內容的「相關度」。

這些問題加總起來,就是一個極差的使用者體驗。使用者找不到他們想要的資訊,跳出率自然就高,這對 SEO 來說絕對是一場災難。

AI 搜尋的魔法核心:向量嵌入 (Embeddings) 到底是什麼?

好了,理論課時間。要讓電腦理解人類語言的「意思」,而不是「字面」,我們需要一種叫做「向量嵌入 (Embeddings)」的技術。你可以把它想像成一個「翻譯機」,這個翻譯機不把中文翻成英文,而是把任何文字(一個詞、一句話、一篇文章)都「翻譯」成一串由數字組成的「座標」,也就是「向量」。

例如:

  • 「提升網站速度」 → [0.01, 0.54, -0.23, …] 一串長長的數字
  • 「網站效能優化」 → [0.02, 0.51, -0.25, …] 另一串很相似的數字
  • 「如何種植蘋果」 → [-0.45, 0.09, 0.81, …] 一串完全不同的數字

OpenAI 的 Embedding 模型(像是 text-embedding-3-small)就是一台頂級的翻譯機。當所有文章都被轉換成向量座標後,它們就在一個高維度的「語意空間」中有了各自的位置。意思相近的內容,它們的座標點就會非常靠近。

所以,我們的 AI 搜尋是這樣運作的:

  1. 使用者輸入查詢:「如何讓網站跑快一點?」
  2. 我們把這句話也丟給 OpenAI,得到它的向量座標。
  3. 接著,我們在我們儲存所有文章向量的資料庫中,找出跟這個查詢座標「距離最近」的幾個點。
  4. 這些距離最近的點,就是語意上最相關的文章!

這就叫「語意搜尋 (Semantic Search)」,是不是比單純比對文字酷多了?

實戰開始:一步步打造 WordPress 的 AI 搜尋引擎

理論講完了,來點實際的。這個過程我會分成三個核心階段:儲存知識、建立溝通管道、執行搜尋。

階段一:為你的文章產生並儲存「向量座標」

首先,我們得讓我們網站裡現有的所有內容都變成向量。最有效率的方式,就是在每次文章發布或更新時,自動幫它產生向量。

1. 建立一個客製化資料表

雖然可以直接把向量塞進 `wp_postmeta`,但相信我,當你的文章一多,那會是一場效能災難。身為一個有格調的工程師,我們要用正確的方法。我們來建立一個專門存放向量的資料表。

你可以用 phpMyAdmin 或其他工具執行以下 SQL 指令:


CREATE TABLE `wp_post_embeddings` (
  `post_id` BIGINT(20) UNSIGNED NOT NULL,
  `embedding` VECTOR(1536) NOT NULL, -- OpenAI text-embedding-3-small 的維度是 1536
  PRIMARY KEY (`post_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

工程師的小囉嗦:注意,上面的 `VECTOR` 欄位型態需要你的 MySQL 8.0.34+ 或 MariaDB 10.11+ 支援。如果你的資料庫版本不支援,你可以先用 `TEXT` 或 `BLOB` 欄位型態來儲存,但搜尋效能會差很多。這就是為什麼基礎架構很重要的原因!

2. 在文章儲存時觸發 OpenAI API

我們會用到 `save_post`這個 WordPress Hook。把以下程式碼加到你的主題 `functions.php` 或是一個自訂外掛中。


<?php
add_action('save_post', 'generate_and_save_post_embedding', 10, 2);

function generate_and_save_post_embedding($post_id, $post) {
    // 避免在自動儲存或修訂版本時觸發
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if (wp_is_post_revision($post_id)) return;
    if ($post->post_status !== 'publish') return; // 只處理已發布的文章

    // 組合要變成向量的內容 (可以自己客製化)
    $content_to_embed = $post->post_title . "\n\n" . wp_strip_all_tags($post->post_content);

    // --- 呼叫 OpenAI API --- 
    $api_key = '你的_OPENAI_API_KEY'; // 記得要用安全的方式儲存金鑰!
    $response = wp_remote_post('https://api.openai.com/v1/embeddings', [
        'method'    => 'POST',
        'headers'   => [
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $api_key,
        ],
        'body'      => json_encode([
            'model' => 'text-embedding-3-small',
            'input' => $content_to_embed,
        ]),
        'timeout'   => 30, // 增加超時時間
    ]);

    if (is_wp_error($response)) {
        // 錯誤處理,例如寫入 log
        error_log('OpenAI API Error: ' . $response->get_error_message());
        return;
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);

    if (isset($body['data'][0]['embedding'])) {
        global $wpdb;
        $embedding = $body['data'][0]['embedding'];
        $table_name = $wpdb->prefix . 'post_embeddings';
        
        // 將陣列轉換成資料庫需要的格式 '[1.2,3.4,...]'
        $embedding_str = '[' . implode(',', $embedding) . ']';

        // 寫入/更新資料庫
        $wpdb->query(
            $wpdb->prepare(
                "INSERT INTO {$table_name} (post_id, embedding) VALUES (%d, %s) ON DUPLICATE KEY UPDATE embedding = VALUES(embedding)",
                $post_id,
                $embedding_str
            )
        );
    }
}
?>

這段程式碼做了幾件事:監聽文章儲存事件、組合標題和內文、呼叫 OpenAI API 取得向量、最後把向量存到我們剛建立的資料表裡。記得把 `’你的_OPENAI_API_KEY’` 換成你自己的金鑰。

階段二:建立一個客製化 API 端點來接收搜尋請求

我們不能用 WordPress 預設的 `?s=keyword` 搜尋。我們需要一個自己的 API 端點,專門處理來自前端的 AI 搜尋請求。

一樣,把這段程式碼加到 `functions.php` 或自訂外掛中。


<?php
add_action('rest_api_init', function () {
    register_rest_route('my-ai-search/v1', '/search', [
        'methods'  => 'GET',
        'callback' => 'handle_ai_search_request',
        'permission_callback' => '__return_true' // 任何人都可以搜尋
    ]);
});

function handle_ai_search_request($request) {
    $query = sanitize_text_field($request['query']);
    if (empty($query)) {
        return new WP_Error('no_query', 'Missing search query', ['status' => 400]);
    }

    // 1. 將使用者的搜尋 query 也轉換成向量
    $api_key = '你的_OPENAI_API_KEY'; 
    $response = wp_remote_post('https://api.openai.com/v1/embeddings', [
        'headers'   => [
            'Content-Type'  => 'application/json',
            'Authorization' => 'Bearer ' . $api_key,
        ],
        'body'      => json_encode(['model' => 'text-embedding-3-small', 'input' => $query]),
    ]);

    if (is_wp_error($response)) {
        return new WP_Error('api_error', 'Failed to get embedding for query', ['status' => 500]);
    }

    $body = json_decode(wp_remote_retrieve_body($response), true);
    if (!isset($body['data'][0]['embedding'])) {
         return new WP_Error('api_error', 'Invalid API response', ['status' => 500]);
    }

    $query_embedding = $body['data'][0]['embedding'];
    $query_embedding_str = '[' . implode(',', $query_embedding) . ']';

    // 2. 在資料庫中執行向量搜尋 (核心!)
    global $wpdb;
    $table_name = $wpdb->prefix . 'post_embeddings';
    
    // 使用 COSINE_DISTANCE 函數計算距離,並找出最近的 5 篇文章
    // 這個函數需要你的資料庫支援向量運算
    $results = $wpdb->get_col(
        $wpdb->prepare(
            "SELECT post_id FROM {$table_name} ORDER BY embedding <=> %s LIMIT 5",
            $query_embedding_str
        )
    );

    if (empty($results)) {
        return [];
    }

    // 3. 根據 post_id 列表,取得完整的文章資訊並回傳
    $args = [
        'post_type'      => 'post', // 或任何你想要搜尋的文章類型
        'post__in'       => $results,
        'orderby'        => 'post__in', // 保持向量搜尋的排序
        'posts_per_page' => 5,
    ];
    $query = new WP_Query($args);

    $posts_data = [];
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $posts_data[] = [
                'id'      => get_the_ID(),
                'title'   => get_the_title(),
                'link'    => get_permalink(),
                'excerpt' => get_the_excerpt(),
            ];
        }
        wp_reset_postdata();
    }

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

這段程式碼建立了一個 `/wp-json/my-ai-search/v1/search?query=你的查詢` 的 API。它會接收查詢、轉換成向量、然後在我們的客製化資料表中使用向量運算子 `<=>` (Cosine Distance) 來找出最接近的五個 `post_id`,最後再用 `WP_Query` 撈出這些文章的資料回傳。

階段三:前端整合

後端的大腦已經建好了,現在只需要讓前端的搜尋框跟它對話。這通常會用 JavaScript 的 `fetch` API 來完成。

你可以用 JavaScript 監聽搜尋輸入框的變化,然後發送請求到我們剛才建立的 API 端點,再把回傳的結果動態地顯示在頁面上。這部分比較偏前端,但核心邏輯就是呼叫 API 並渲染結果。

不只是搜尋:成本與未來擴展性考量

身為工程師,我們不能只求「會動就好」,還要考慮現實問題。

  • 成本: OpenAI 的 Embedding API 是要收費的。雖然它比 GPT-4 便宜非常多,但如果你的網站有數萬篇文章,初次建立索引時會是一筆開銷。後續使用者每次搜尋也都會有一次 API call 的費用。
  • 效能與擴展性: 當你的文章數量達到數十萬篇時,單純在 MySQL 中進行向量搜尋可能會開始變慢。這時候,就該考慮使用專門的向量資料庫服務,例如 Pinecone, Weaviate, 或是在支援 `pgvector` 的 PostgreSQL 上進行開發。這些是更進階的架構,但原理是相通的。

建立一個 AI 智慧官網,不只是安裝外掛那麼簡單。它是一項結合了後端邏輯、API 串接、資料庫設計,甚至前端互動的綜合工程。今天我們從最核心的「智慧搜尋」下手,你已經踏出了最關鍵的一步。這套邏輯不僅能用在搜尋,還能擴展到「相關文章推薦」、「智慧客服問答」等各種 AI 應用。

技術的世界日新月異,AI 正在以前所未有的速度改變我們與網站互動的方式。與其被動地等待外掛更新,不如親自動手,為你的網站打造真正獨一無二的智慧功能。

當然,如果你覺得這個過程太過複雜,或者你的業務需要更穩定、更具擴展性的企業級 AI 解決方案,浪花科技的團隊隨時準備好為你提供專業的協助。


延伸閱讀

需要專業的 WordPress AI 整合服務嗎?

覺得今天的內容太硬核,或是想為你的企業網站導入更複雜的 AI 功能,例如 AI 智慧客服、個人化商品推薦、或是自動化內容產銷流程?歡迎聯繫浪花科技,我們的資深工程師團隊擁有豐富的 API 串接與 WordPress 客製化開發經驗,可以協助你打造真正「會思考」的智慧網站,讓你的數位資產發揮最大價值。

常見問題 (FAQ)

Q1: 什麼是語意搜尋 (Semantic Search)?為什麼它比傳統關鍵字搜尋好?

語意搜尋是一種能理解使用者查詢「意圖」而非僅僅比對「字詞」的搜尋技術。它透過 AI 模型(如 OpenAI Embeddings)將文字轉換為代表其意義的數學向量。這使得搜尋引擎可以找到意思相近但用詞不同的內容,例如搜尋「讓網站變快的方法」也能找到標題為「網站效能優化技巧」的文章。這能大幅提升搜尋結果的相關性與使用者體驗。

Q2: 我一定要用特別的資料庫才能在 WordPress 中實現 AI 搜尋嗎?

不一定,但強烈建議。本文範例中提到的 `VECTOR` 資料型態和向量運算函數,需要較新版本的 MySQL (8+) 或 MariaDB。如果你的主機資料庫不支援,可以先將向量儲存為 `TEXT` 或 `BLOB` 格式,但在應用層(PHP)計算向量距離會非常沒有效率。對於大型網站,更推薦使用專門的向量資料庫(如 Pinecone, Weaviate)或支援 pgvector 的 PostgreSQL,以獲得最佳搜尋效能。

Q3: 實作這樣的 AI 搜尋功能會很貴嗎?

成本主要來自兩個部分:開發成本和 API 使用費。開發成本取決於是自行實作還是委外開發。API 使用費方面,OpenAI 的 Embedding API 相對便宜,但費用會隨著你的文章數量(初次建立索引)和網站搜尋流量(每次搜尋)而增加。在導入前,建議先評估網站規模與預算,做好成本控管。

Q4: 市面上有沒有可以直接用的 AI 搜尋外掛?為什麼我還需要客製化開發?

市面上確實有一些 AI 搜尋外掛,它們提供了方便快速的解決方案。然而,客製化開發提供了無可比擬的彈性與深度整合。例如,你可以精準控制哪些內容要被索引、自訂搜尋結果的排序邏輯(結合相關性、瀏覽量、文章新舊等)、整合內部使用者數據,並確保資料隱私與安全性。對於追求極致使用者體驗和擁有獨特業務邏輯的企業網站來說,客製化開發是更長遠且更強大的選擇。

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