برای انتخاب کلیدenter انتخاب کنید یا برای لغو ESC فشار دهید.

یکپارچه‌سازی OpenAI Embeddings برای جستجوی دقیق در پایگاه‌های داده وردپرس

OpenAI Embeddings در وردپرس: راهنمای کامل برای جستجوی دقیق

OpenAI Embeddings در وردپرس به‌عنوان یک فناوری پیشرفته، امکان ایجاد جستجوی معنایی و دقیق بر اساس محتوا را فراهم می‌کند. در این مقاله، به بررسی جامع این فناوری، مراحل نصب، ذخیره‌سازی، به‌روز‌رسانی، بهینه‌سازی و نکات امنیتی می‌پردازیم و برای زبان فارسی و مقیاس‌پذیری راهکارهای عملی ارائه می‌کنیم.

مقدمه‌ای بر OpenAI Embeddings و کاربردهای آن در وردپرس

Embeddings به‌صورت بردارهای عددی، ویژگی‌های معنایی متن را در فضای چندبعدی کدگذاری می‌کنند. این بردارها موجب می‌شوند که موتور جستجو بتواند مقایسهٔ معنایی بین متن‌های مختلف را انجام دهد، نه فقط بر اساس کلیدواژه‌ها. در وردپرس، این امکان را می‌دهد تا کاربران به‌صورت دقیق‌تری نهایی‌ترین نتایج را در صفحات محصول، پست، یا مقاله پیدا کنند.

از مزایای اصلی Embeddings در وردپرس می‌توان به زیر اشاره کرد:

  • جستجوی معنایی پیشرفته برای محتواهای چندزبانه، به‌ویژه فارسی.
  • کاهش زمان پاسخ‌گویی برای جستجوهای پیچیده.
  • داده‌سازی نتایج بر اساس شباهت متنی، نه فقط برچسب‌ها.

برای بهره‌برداری مؤثر، نیازمند یک چارچوب استقرار و ذخیره‌سازی مشخص هستیم.

مرحله ۱: نصب و پیکربندی افزونه‌های مورد نیاز

برای یکپارچه‌سازی Embeddings در وردپرس، ابتدا باید افزونه‌های زیر را نصب کنید:

  1. WordPress Embeddings Vector Databases AI Search – افزونه‌ی اصلی که قابلیت ذخیره‌سازی و جستجوی بردارها را فراهم می‌کند.
  2. هسته اصلی هوش مصنوعی چطور کار میکند؟ – کتابخانه‌ی پشتیبانی برای ارتباط با API OpenAI.
  3. افزونه‌ی WP REST API برای دسترسی برنامه‌نویسی به داده‌های وردپرس.
  4. افزونه‌ی WP Rocket یا مشابه برای کش‌سازی و بهینه‌سازی عملکرد.

پس از نصب، در تنظیمات افزونه‌ی Embeddings، کلید API OpenAI را وارد کنید و مدل مناسب (مانند text-embedding-ada-002) را انتخاب کنید. در زیر، تصویر پیکربندی اصلی را مشاهده می‌کنید.

مرحله ۲: پشتیبانی از زبان فارسی و پردازش متن

برای زبان فارسی، مهم‌ترین نکته‌ای که باید رعایت شود، Tokenization صحیح است. افزونه افزونه هوش مصنوعی برای تشخیص کلمات ناپسند در نظرات می‌تواند به‌عنوان پیش‌پردازنده برای حذف کلمات نامناسب و stemming استفاده شود. سپس، با استفاده از کتابخانه‌های hazm یا parsivar، متن را برش دهید و به OpenAI ارسال کنید.

سوالات متداول:

چگونه می‌توان OpenAI Embeddings را در وردپرس به‌صورت خودکار به‌روز کرد؟

برای این کار، یک cron job را در وردپرس تنظیم کنید که به‌صورت دوره‌ای (مثلاً ۳۰ دقیقه یک‌بار) پست‌های جدید یا به‌روز‌شده را استخراج کرده و Embedding جدیدی تولید کند. در کد افزونه، تابع wp_schedule_event را استفاده کنید.

مرحله ۳: ذخیره‌سازی و به‌روز‌رسانی بردارهای Embedding در دیتابیس وردپرس

افزونه‌ی Embeddings به‌صورت پیش‌فرض، بردارها را در جدول wp_woembeddings_vectors ذخیره می‌کند. ستون‌های اصلی عبارتند از:

id post_id vector created_at
1 42 [0.12, -0.45, …] ۲۰۲۴-۱۱-۱۳ ۱۰:۰۰:۰۰
۲ ۴۳ [

پیکربندی و بهینه‌سازی موتور جستجوی Embedding در وردپرس

بعد از ذخیره‌سازی بردارهای Embedding، گام بعدی، بهینه‌سازی عملکرد موتور جستجو است. در این بخش، می‌توانیم از فیلترهای پیش‌پردازش، ایندکس‌های فیلد متا و کشینگ استفاده کنیم تا زمان پاسخ‌دهی را به حداقل برسانیم.

ایندکس‌سازی فیلدهای متا

به‌جای ذخیره‌سازی بردارها در ستون meta_value، می‌توانید یک جدول اختصاصی ایجاد کنید:

CREATE TABLE wp_embedding_index (
  post_id BIGINT UNSIGNED NOT NULL,
  embedding BLOB NOT NULL,
  PRIMARY KEY (post_id)
) ENGINE=InnoDB;

ایندکس‌های فیلدهای متا، جستجوی سریع‌تری را فراهم می‌کنند. همچنین، برای مقیاس‌پذیری، از فیلدهای متا در جدول wp_postmeta با ایندکس meta_key می‌توانید استفاده کنید.

کشینگ نتایج جستجو

برای کاهش بار سرور، نتایج جستجو را در کش Redis یا Memcached ذخیره کنید. مثال زیر، ذخیره‌سازی در Redis را نشان می‌دهد:

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$key = 'search_' . md5($query);
$cached = $redis->get($key);
if ($cached) {
  return json_decode($cached, true);
}
// اگر پیدا نشد، جستجو را اجرا کنید و سپس ذخیره کنید
$redis->setex($key, 3600, json_encode($results));

یکپارچه‌سازی با موتورهای جستجوی متن باز مانند ElasticSearch

اگر حجم داده‌ها به حدی برسد که نیاز به مقیاس‌پذیری بالا باشد، می‌توانید بردارهای Embedding را به یک نود ElasticSearch ارسال کنید. این موتور، قابلیت جستجوی برداری (vector search) را به‌صورت native دارد.

پیکربندی اتصال ElasticSearch

  • نصب پلاگین ElasticPress یا استفاده از کتابخانه elasticsearch-php.
  • تعریف فیلد embedding در mapping:
PUT /wp_posts
{
  "mappings": {
    "properties": {
      "title": {"type": "text"},
      "content": {"type": "text"},
      "embedding": {
        "type": "dense_vector",
        "dims": 1536
      }
    }
  }
}

ارسال داده‌ها به نود ElasticSearch

  1. در هنگام ذخیره‌سازی، بردار را از پایگاه داده استخراج کنید.
  2. با استفاده از API _bulk، داده‌ها را به صورت دسته‌ای ارسال کنید.
  3. در زمان جستجو، از knn_query برای مقایسه بردار استفاده کنید.

این روش، عملکرد جستجوی برداری را به‌طور چشمگیری بهبود می‌بخشد و امکان مقیاس‌پذیری افقی را فراهم می‌کند.

مدیریت نسخه‌های متعدد Embedding و آزمایش A/B

برای بهبود دقت جستجو، ممکن است بخواهید چند مدل Embedding مختلف (مثلاً text-embedding-ada-002 و text-embedding-3-small) را آزمایش کنید. در این بخش، نحوه مدیریت و مقایسه نسخه‌های مختلف را بررسی می‌کنیم.

ساختار پایگاه داده برای نسخه‌گذاری

یک ستون جدید در جدول wp_embedding_index اضافه کنید:

ALTER TABLE wp_embedding_index ADD COLUMN version VARCHAR(50) NOT NULL DEFAULT 'ada-002';

هر بار که بردار جدیدی تولید می‌شود، نسخه مدل را ذخیره کنید.

آزمایش A/B با مقایسه دقت

  • برای هر نسخه، یک مجموعه تستی از ۱۰۰۰ پرسش و پاسخ آماده کنید.
  • نتایج را با معیار Mean Reciprocal Rank (MRR) مقایسه کنید.
  • به‌صورت دوره‌ای، نسخه برتر را به‌عنوان نسخه پیش‌فرض تنظیم کنید.

نکات امنیتی و رعایت حریم خصوصی در استفاده از OpenAI Embeddings

توجه: هر بردار Embedding ممکن است حاوی اطلاعات حساس باشد؛ بنابراین، حتماً از رمزنگاری در حین ذخیره‌سازی و انتقال استفاده کنید.

برای رمزنگاری بردارها در پایگاه داده، می‌توانید از کتابخانه openssl_encrypt استفاده کنید. همچنین، در هنگام ارسال به سرویس‌های خارجی، از HTTPS مطمئن شوید.

رمزنگاری بردارها در دیتابیس

$key = openssl_random_pseudo_bytes(32);
$iv  = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($vector, 'aes-256-cbc', $key, 0, $iv);
$payload = base64_encode($iv . $encrypted);
// ذخیره‌سازی در پایگاه داده

در زمان بازیابی، همان‌طور که در openssl_decrypt استفاده کنید.

نکات کاربردی برای توسعه‌دهندگان وردپرس

در این بخش، نکات کلیدی برای توسعه‌دهندگان معرفی می‌شود که می‌توانند در پروژه‌های واقعی به‌کار ببرند.

  • استفاده از WP_Query با فیلترهای سفارشی برای ترکیب جستجوی متن و برداری.
  • ایجاد REST API سف

بهینه‌سازی عملکرد جستجوی Embedding با کشینگ و صفحه‌بندی

سرعت پاسخ‌گویی در جستجوی معنایی، عامل کلیدی در رضایت کاربران است. در وردپرس، دو تکنیک اصلی برای بهبود سرعت وجود دارد: کشینگ نتایج پرس‌وجو و صفحه‌بندی. در این بخش، نحوه پیاده‌سازی هر دو را با کد نمونه و نکات عملی بررسی می‌کنیم.

کاشینگ نتایج با Transients API

Transients API وردپرس امکان ذخیره‌سازی موقت داده‌ها را فراهم می‌کند. برای کشینگ بردارهای Embedding و نتایج مشابه، می‌توانید از کد زیر استفاده کنید:

function wp_embed_query_cache( $query ) {
    $cache_key = 'embed_q_' . md5( $query );
    $cached = get_transient( $cache_key );
    if ( $cached !== false ) {
        return $cached; // بازگرداندن نتایج کش‌شده
    }
    $results = wp_do_embedding_search( $query ); // تابع سفارشی
    set_transient( $cache_key, $results, HOUR_IN_SECONDS ); // کش برای یک ساعت
    return $results;
}

نکته: اگر دیتابیس وردپرس شما در حالت replication باشد، از Object Cache (مانند Redis) برای اشتراک‌گذاری کش بین سرورها استفاده کنید.

صفحه‌بندی نتایج برای جلوگیری از بارگیری زیاد

برای خروجی‌های بزرگ، استفاده از WP_Query با پارامترهای posts_per_page و paged مفید است. مثال:

$paged = max( 1, get_query_var('paged') );
$args = [
    'post_type'      => 'post',
    'posts_per_page' => 10,
    'paged'          => $paged,
    'meta_query'     => [
        [
            'key'     => 'embedding_vector',
            'value'   => serialize( $query_vector ),
            'compare' => 'LIKE',
        ],
    ],
];
$embed_query = new WP_Query( $args );

به‌کارگیری WP_Query باعث می‌شود فقط ۱۰ رکورد در هر صفحه بارگیری شود و سرور کمتر بار سنگین شود.

ساخت یک Shortcode سفارشی برای جستجوی Embedding در فرانت‌اند

برای ارائه تجربه کاربری ساده، می‌توانید یک Shortcode تعریف کنید که فرم جستجو و نتایج را در یک صفحه نمایش دهد. در این بخش، نحوه ایجاد این Shortcode و استایل‌دهی ساده را توضیح می‌دهیم.

تعریف Shortcode در functions.php

function wp_embed_search_shortcode( $atts ) {
    ob_start();
    ?>
    

دکمه AJAX برای فراخوانی سرور

در functions.php نیز باید یک هاندلر AJAX اضافه کنید:

function wp_embed_search_ajax_handler() {
    $query = sanitize_text_field( $_POST['q'] );
    $results = wp_do_embedding_search( $query ); // تابع سفارشی
    foreach ( $results as $post_id ) {
        $post = get_post( $post_id );
        echo '

' . esc_html( $post->post_title ) . '

';
echo '

' . wp_trim_words( $post->post_content, 30 ) . '

';
}
wp_die();
}
add_action( 'wp_ajax_nopriv_wp_embed_search_ajax', 'wp_embed_search_ajax_handler' );
add_action( 'wp_ajax_wp_embed_search_ajax', 'wp_embed_search_ajax_handler' );

نظارت و لاگ‌گیری نمره‌های شباهت Embedding

برای بهینه‌سازی مدل و تشخیص خطاهای احتمالی، لاگ‌گیری دقیق نمره‌های شباهت (similarity scores) ضروری است. در این بخش، روش‌های ذخیره‌سازی لاگ در دیتابیس و تحلیل آن را بررسی می‌کنیم.

ساخت جدول سفارشی برای لاگ‌ها

function wp_create_embed_log_table() {
    global $wpdb;
    $table_name = $wpdb->prefix . 'embed_logs';
    $charset_collate = $wpdb->get_charset_collate();

    $sql = "CREATE TABLE $table_name (
        id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
        query VARCHAR(255) NOT NULL,
        result_id BIGINT(20) UNSIGNED NOT NULL,
        similarity FLOAT NOT NULL,
        timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) $charset_collate;";

    require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
    dbDelta( $sql );
}
add_action( 'init', 'wp_create_embed_log_table' );

ثبت