你的 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 搜尋是這樣運作的:
- 使用者輸入查詢:「如何讓網站跑快一點?」
- 我們把這句話也丟給 OpenAI,得到它的向量座標。
- 接著,我們在我們儲存所有文章向量的資料庫中,找出跟這個查詢座標「距離最近」的幾個點。
- 這些距離最近的點,就是語意上最相關的文章!
這就叫「語意搜尋 (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」?資深工程師手把手教你串接 OpenAI API,打造會思考的智慧大腦!
- WordPress 只能寫文章?錯!資深工程師手把手教你用 REST API 自訂端點,打造無頭應用超能力!
- 解鎖 WordPress 數據庫的鑰匙:WP_Query 終極指南,從入門到效能優化一篇搞定!
需要專業的 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 搜尋外掛,它們提供了方便快速的解決方案。然而,客製化開發提供了無可比擬的彈性與深度整合。例如,你可以精準控制哪些內容要被索引、自訂搜尋結果的排序邏輯(結合相關性、瀏覽量、文章新舊等)、整合內部使用者數據,並確保資料隱私與安全性。對於追求極致使用者體驗和擁有獨特業務邏輯的企業網站來說,客製化開發是更長遠且更強大的選擇。






