إنشاء سوق للمركبات مستند إلى الذكاء الاصطناعي باستخدام BigQuery ونماذج Gemini

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستنشئ الخلفية وتنشر الواجهة الأمامية لتطبيق "Cymbal Autos"، وهو سوق على الإنترنت للمركبات. ستستخدم BigQuery ونماذج Gemini على منصة Gemini Enterprise Agent لفحص صور المركبات، والتنبؤ بالأسعار باستخدام BigQuery ML، ورصد الإعلانات المخادعة باستخدام التضمينات المتجهة، واحتساب نتائج الصفقات المركّبة. أخيرًا، ستعرض هذه الإحصاءات على واجهة مستخدم Next.js تم نشرها على Cloud Run.

مخطّط هندسي يوضّح عملية التواصل بين BigQuery وAgent Platform وعرض واجهة أمامية Next.js Cloud Run

الإجراءات التي ستنفذّها

  • ربط BigQuery بصور Cloud Storage غير المنظَّمة باستخدام ObjectRef
  • استخراج سمات المركبات من الصور باستخدام BigQuery مع نماذج Gemini
  • توقُّع أسعار السوق العادلة من خلال تدريب نموذج انحدار XGBoost باستخدام BigQuery ML
  • تحديد بيانات المركبات الموثوقة والمحتمل أن تكون عمليات خداع من خلال تضمين أوصاف المركبات وإجراء VECTOR_SEARCH
  • احتساب "نتيجة الصفقة" شاملة لكل مركبة مُدرَجة، مع تضمين إشارات الحالة من وصف البائع باستخدام AI.SCORE
  • تصدير البيانات ونشر تطبيق السوق Next.js على Google Cloud Run

المتطلبات

  • متصفّح ويب، مثل Chrome
  • مشروع Google Cloud تم تفعيل الفوترة فيه
  • معرفة أساسية بلغة SQL وPython وGoogle Cloud
  • أذونات كافية في "إدارة الهوية وإمكانية الوصول" (IAM) لتفعيل واجهات برمجة التطبيقات وإنشاء الموارد وتعيين الأذونات (مثل "مالك المشروع")

هذا الدرس التطبيقي حول الترميز مخصّص للمطوّرين ذوي الخبرة المتوسطة.

يجب أن تكون تكلفة الموارد التي تم إنشاؤها في هذا الدرس التطبيقي حول الترميز أقل من 5 دولارات أمريكية.

2. قبل البدء

إنشاء مشروع على Google Cloud

  1. في Google Cloud Console، في صفحة اختيار المشروع، اختَر مشروعًا على السحابة الإلكترونية أو أنشِئ مشروعًا على السحابة الإلكترونية.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Cloud. كيفية التحقّق من تفعيل الفوترة في مشروع

بدء Cloud Shell

ستستخدم Google Cloud Shell لتنزيل الرمز البرمجي وتشغيل نصوص الإعداد البرمجية ونشر التطبيق.

  1. انقر على تفعيل Cloud Shell في أعلى وحدة تحكّم Google Cloud.

فتح Cloud Shell

  1. بعد الاتصال بـ Cloud Shell، عليك مصادقة جلستك للتأكّد من أنّ تطبيقك يمكنه الوصول إلى واجهات Google Cloud APIs. اتّبِع التعليمات الظاهرة على الشاشة للسماح باستخدام Cloud Shell:
gcloud auth application-default login
  1. اضبط رقم تعريف مشروع Google Cloud واسمًا فريدًا لحزمة Google Cloud Storage (المكان الذي ستخزّن فيه البيانات الأولية):
export PROJECT_ID=$(gcloud config get-value project)
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"

gcloud config set project $PROJECT_ID

من المفترض أن تظهر لك رسالة مشابهة للرسالة أدناه:

Your active configuration is: [cloudshell-####]
Updated property [core/project]

تفعيل واجهات برمجة التطبيقات

نفِّذ هذا الأمر في Cloud Shell لتفعيل جميع واجهات برمجة التطبيقات المطلوبة لهذا الدرس التطبيقي حول الترميز:

gcloud services enable \
  aiplatform.googleapis.com \
  artifactregistry.googleapis.com \
  bigquery.googleapis.com \
  bigqueryconnection.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

عند التنفيذ بنجاح، من المفترض أن تظهر لك رسالة مشابهة للرسالة الموضّحة أدناه:

Operation "operations/..." finished successfully.

3- الحصول على الرمز وإعداد البيانات

أولاً، نزِّل مواد العرض التجريبية واضبط المتغيرات البيئية.

  1. من Cloud Shell، استنسِخ مستودع devrel-demos وانتقِل إلى دليل المشروع:
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git
cd devrel-demos/data-analytics/cymbal-autos-multimodal
  1. شغِّل النص البرمجي لنسخ البيانات إلى بيئتك. يعمل هذا النص البرمجي على مزامنة مجموعات بيانات المستودع المحلي مع حزمة Cloud Storage الشخصية واسترداد صور المركبات من حزمة عامة:
chmod +x scripts/setup/*.sh
./scripts/setup/00_copy_data.sh

بعد ذلك، من المفترض أن تظهر لك رسالة مشابهة لما يلي:

Average throughput: 87.8MiB/s
Data copy complete!
  1. بعد ذلك، يمكنك إعداد "اتصال موارد السحابة الإلكترونية" في BigQuery. لتحليل الصور غير المنظَّمة في Cloud Storage واستدعاء نماذج "منصة الوكيل" مباشرةً من طلبات بحث SQL، يجب أن تفوّض BigQuery أذونات "إدارة الهوية وإمكانية الوصول" إلى حساب خدمة أساسي. ينشئ هذا النص البرمجي هذا الاتصال الآمن ويمنحه أدوار "مستخدم Vertex AI" و"مستهلك استخدام الخدمة" اللازمة (ويستغرق ذلك حوالي دقيقة واحدة):
./scripts/setup/01_setup_api_connection.sh

من المفترض أن تظهر لك رسالة مشابهة لما يلي:

Environment setup complete! Your BigQuery connection is ready.
  1. أخيرًا، أنشئ مجموعة بيانات BigQuery الأولية وحمِّل البيانات الجدولية الأولية. يؤدي ذلك إلى إنشاء مجموعة بيانات model_dev وتعبئة الجداول الأولية، ما يضع الأساس قبل كتابة أي استعلامات تعلُّم آلي:
./scripts/setup/02_load_to_bq.sh

من المفترض أن تظهر لك رسالة مشابهة لما يلي:

=================================================================
BigQuery load complete!
=================================================================

4. استخراج المعلومات من الصور المتعددة الوسائط

قبل تقييم بيانات المركبات، عليك استخراج بيانات منظَّمة (مثل اللون أو التصميم الخارجي أو الأضرار المرئية) من مئات الصور الأولية. من خلال الاستفادة من وظائف ObjectRef ونماذج Gemini المستضافة في Agent Platform، يمكنك إنشاء هذه الميزات بدون نقل أي ملفات أو كتابة مسارات معقّدة للبيانات. تتيح عملية الاستخراج هذه عرض شارة ✨ الحالة المرئية مباشرةً في تطبيق الواجهة الأمامية.

  1. افتح BigQuery Studio في علامة تبويب متصفّح جديدة.
  2. انقر على الزر + إنشاء طلب بحث جديد. ستستخدم "محرر SQL" للتفاعل مع رمز SQL البرمجي خلال هذا الدرس التطبيقي حول الترميز.
  3. قبل إنشاء أدوات استخراج البيانات المستندة إلى تعلُّم الآلة، يمكنك إلقاء نظرة سريعة على الصور الأولية. نفِّذ طلب البحث التالي لعرض مصفوفة معرّفات الموارد المنتظمة (URI) للصور المخزَّنة في Google Cloud Storage لكل بطاقة بيانات:
SELECT auction_id, item_name, description, images 
FROM `model_dev.vehicle_metadata` LIMIT 5;
  1. الآن، في "محرّر SQL" في BigQuery Studio، ألصِق عبارة SQL التالية لإنشاء جدول جديد يتضمّن عمود image_ref. انقر على تشغيل.
CREATE OR REPLACE TABLE `model_dev.vehicle_multimodal` AS
SELECT 
  *,
  ARRAY(
    SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF(uri, 'us.conn')) 
    FROM UNNEST(images) AS uri
  ) AS image_ref
FROM `model_dev.vehicle_metadata`;
  1. ألقِ نظرة على عمود image_ref ObjectRef الجديد الذي أنشأته للتوّ. يحتوي الجدول الجديد الآن على عمود ObjectRef يتضمّن أذونات التنفيذ على الصور نفسها. نفِّذ الاستعلام التالي لعرضه:
SELECT auction_id, item_name, description, image_ref 
FROM `model_dev.vehicle_multimodal` LIMIT 5;
  1. ستستخدم الآن AI.GENERATE وAI.CLASSIFY لتحليل الصور. تستخرج AI.GENERATE درجة حالة المركبة وملخّصًا من جملة واحدة عن الأضرار من خلال توجيه طلب إلى Gemini، بينما تصنّف AI.CLASSIFY بدقة التصميم الخارجي للمركبة ولونها.

نفِّذ طلب البحث التالي لاستخراج هذه الإحصاءات في جدول ميزات مخصّص. من المفترض أن يستغرق إكمال هذا الاستطلاع 3 دقائق تقريبًا.

CREATE OR REPLACE TABLE `model_dev.vehicle_vision_features` AS
WITH generated_data AS (
   SELECT
   auction_id,
   AI.GENERATE(
     prompt => ('Rate the condition of this car on a scale from 0-100. Output a 1 sentence description of any glaring red flags', image_ref),
     output_schema => 'condition INT64, description_summary STRING'
   ).* EXCEPT(full_response,status)
 FROM
   `model_dev.vehicle_multimodal`
),

-- Object-centric Classifications
classified_data AS (
 SELECT
   auction_id,
   AI.CLASSIFY(
     ('What type of automobile is this?', image_ref[0]),
     categories => ['Truck', 'Sedan', 'SUV']) AS body_style,
   AI.CLASSIFY(
     ('Color of the exterior of the automobile', image_ref[0]),
     categories => ['Black', 'White', 'Silver', 'Gray', 'Red', 'Blue', 'Brown', 'Green', 'Beige', 'Gold']) AS color,
   AI.CLASSIFY(
     ('Color of the interior of the automobile', image_ref[0]),
     categories => ['Black', 'Gray', 'Beige', 'Tan', 'Brown', 'White', 'Red']) AS interior
 FROM `model_dev.vehicle_multimodal`
)

-- Join the AI insights back together into the final feature table
SELECT
 g.auction_id,
 g.condition,
 g.description_summary,
 c.body_style,
 c.color,
 c.interior
FROM generated_data g
JOIN classified_data c ON g.auction_id = c.auction_id;
  1. للاطّلاع على الميزات التي تم إنشاؤها بنفسك، نفِّذ طلب البحث التالي أو اطّلِع على لقطة الشاشة أدناه:
SELECT auction_id, condition, description_summary, body_style, color, interior FROM `model_dev.vehicle_vision_features` LIMIT 5;

الاستخراج المتعدد الوسائط

ملخّص القسم: لقد وصلت إلى الصور الأولية مباشرةً من BigQuery واستخدمت نماذج Gemini لاستخراج ميزات مرئية منظَّمة بدون نقل أي ملفات.

5- التسعير التوقّعي باستخدام XGBoost

لاحتساب ما إذا كانت المركبة صفقة جيدة حقًا، يجب توفّر أساس موثوق به لقيمتها السوقية العادلة. بدلاً من استخراج البيانات إلى نصوص برمجية أو دفاتر ملاحظات محلية لتدريب نموذج، يمكنك تدريب نموذج XGBoost مباشرةً داخل BigQuery باستخدام الإصدار العادي من لغة SQL. يؤدي توقّع السعر هذا إلى تشغيل منطق 📈 القيمة السوقية العادلة في تطبيق الواجهة الأمامية.

  1. ارجع إلى علامة التبويب BigQuery Studio.
  2. أولاً، ألقِ نظرة على مجموعة بيانات التدريب. على عكس بيانات المركبات النشطة، يحتوي جدول synthetic_cars هذا على 100,000 عملية بيع سابقة سيتم استخدامها لتدريب النموذج. يمكنك تشغيل هذا الاستعلام السريع لإلقاء نظرة:
SELECT
  *
FROM
  `model_dev.synthetic_cars`
LIMIT 10;
  1. الآن، نفِّذ عبارة SQL التالية لتدريب نموذج انحدار XGBoost. يتعلّم هذا النموذج كيف تؤثّر سمات مثل المسافة المقطوعة وسنة الصنع والعلامة التجارية والحالة المرئية في السعر من خلال هذه السجلات السابقة البالغ عددها 100,000 سجلّ:
CREATE OR REPLACE MODEL `model_dev.car_price_model`
OPTIONS(
  MODEL_TYPE = 'BOOSTED_TREE_REGRESSOR',
  INPUT_LABEL_COLS = ['selling_price'],
  MAX_ITERATIONS = 15,
  TREE_METHOD = 'HIST'
) AS
SELECT
  * EXCEPT(vin, sale_date, market_value, seller)
FROM
  `model_dev.synthetic_cars`;
  1. قبل توقّع الأسعار لبيانات المركبات الحالية والمستمرة، عليك جمع كل ميزات الإدخال ذات الصلة في مكان واحد. نفِّذ SQL هذا لدمج البيانات الوصفية المنظَّمة للمركبة مع الميزات التي استخرجتها للتو من الصور:
CREATE OR REPLACE TABLE `model_dev.vehicle_prediction_features` AS
SELECT
  meta.auction_id,
  meta.model_year,
  meta.make,
  meta.model,
  meta.mileage,
  meta.transmission_type,
  meta.state,
  COALESCE(vision.body_style, 'Unknown') AS body_style,
  COALESCE(vision.condition, 50) AS condition,
  COALESCE(meta.color, vision.color, 'Unknown') AS color,
  COALESCE(vision.interior, 'Unknown') AS interior
FROM `model_dev.vehicle_metadata` meta
LEFT JOIN `model_dev.vehicle_vision_features` vision 
  ON meta.auction_id = vision.auction_id;
  1. أخيرًا، يمكنك التنبّؤ بالقيمة السوقية العادلة لكل إعلان مستمر عن مركبة. نفِّذ الاستعلام التالي لتغذية الميزات المجمّعة في النموذج الذي تم تدريبه حديثًا وحفظ النتائج الرقمية في جدول توقّعات آمن:
CREATE OR REPLACE TABLE `model_dev.vehicle_price_predictions` AS
SELECT 
  auction_id,
  ROUND(predicted_selling_price, 2) AS predicted_market_value
FROM ML.PREDICT(
  MODEL `model_dev.car_price_model`,
  (SELECT * FROM `model_dev.vehicle_prediction_features`)
);
  1. الآن، تحقَّق من ناتج النموذج. نفِّذ طلب البحث السريع هذا لمعاينة قيم السوق المتوقّعة لبيانات المركبات الحالية:
SELECT * FROM `model_dev.vehicle_price_predictions` LIMIT 5;

توقّعات XGBoost

ملخّص القسم: درّبت نموذج انحدار XGBoost باستخدام 100,000 معاملة نموذجية، ونفّذت استنتاجًا مجمّعًا لتوقّع القيمة السوقية العادلة لكل بطاقة بيانات مركبة نشطة في مجموعة البيانات.

6. الترميز الدلالي واكتشاف الأصالة

في هذا القسم، ستنفّذ مسارَي تضمين مختلفَين لتفعيل الميزات الذكية في سوق المركبات:

  1. البحث بالصور المتعددة الوسائط: ترجمة صور المركبات الأولية إلى مساحة متجهة للسماح للمستخدمين بالبحث باستخدام اللغة الطبيعية (مثل "شاحنة عمل موثوقة")
  2. تضمينات النصوص والبحث عن التشابه: ترجمة أوصاف المركبات المكتوبة إلى تضمينات متّجهة لمقارنة قوائم المركبات النشطة بملفات شخصية معروفة لمحتالين محتملين أو مهتمين بالمركبات باستخدام VECTOR_SEARCH يتم احتساب 🔍 نتيجة المصداقية التي تظهر للمشترين على التطبيق.
  1. عليك أولاً إنشاء تضمينات متعددة الوسائط لبيانات المركبات. باستخدام نموذج gemini-embedding-2-preview، يمكنك إدخال الصور والنصوص في عملية التضمين نفسها. على الرغم من أنّ هذا النموذج قادر تمامًا على معالجة وسائط متعددة في الوقت نفسه، في هذه الحالة المحدّدة، نحن نضمّن صور المركبات فقط. يوفّر ذلك شريط "البحث الدلالي" لتطبيق الواجهة الأمامية، ما يتيح للمشترين استخدام اللغة الطبيعية (مثل "شاحنة صغيرة موثوقة") واسترداد النتائج المطابقة بسرعة. نفِّذ طلب البحث هذا لإنشاء متّجهات متعدّدة الوسائط باستخدام AI.EMBED:
CREATE OR REPLACE TABLE `model_dev.vehicle_images_embedded` AS
SELECT
  auction_id,
  AI.EMBED(
    STRUCT(image_ref),
    endpoint => 'gemini-embedding-2-preview').result AS multimodal_embedding
FROM `model_dev.vehicle_multimodal`
WHERE ARRAY_LENGTH(image_ref) > 0;
  1. بعد ذلك، ستفحص بيانات ملف المخاطر التي تم تحميلها سابقًا. يُرجى العِلم أنّها تحتوي على كلّ من تصنيفات عمليات الخداع المعروفة وقوائم العيّنات الشرعية الخاصة بالمتحمّسين. نفِّذ الاستعلام التالي لعرض ملفات تعريف خط الأساس:
SELECT profile_id, profile_type, description
FROM `model_dev.seller_risk_profiles`;
  1. الآن، عليك ترجمة أوصاف المخاطر الأولية إلى تضمينات متجهة. يمكنك استخدام نموذج متخصص لتضمين النص (text-embedding-005) لتقييم اللغة المكتوبة التي عاينتها للتو بدقة. الصِق عبارة SQL التالية وانقر على "تنفيذ" لتضمين ملفات تعريف خط الأساس:
CREATE OR REPLACE TABLE `model_dev.seller_risk_profiles_embedded` AS
SELECT 
  profile_id, 
  description AS content, 
  profile_type, 
  AI.EMBED(description, endpoint => 'text-embedding-005').result AS text_embedding
FROM `model_dev.seller_risk_profiles`;
  1. بعد ذلك، أنشئ تضمينات قابلة للمقارنة لمخزون المركبات المباشر الفعلي. نفِّذ طلب البحث هذا لترجمة وصف HTML الأولي لكل مركبة إلى مساحة متجهة حتى يمكن مقارنتها بالملفات الأساسية:
CREATE OR REPLACE TABLE `model_dev.vehicle_descriptions_embedded` AS
SELECT 
  auction_id,
  description AS content,
  AI.EMBED(description, endpoint => 'text-embedding-005').result AS text_embedding
FROM `model_dev.vehicle_metadata`
WHERE description IS NOT NULL;
  1. أخيرًا، نفِّذ عملية البحث المتّجهي لحساب المسافة الدلالية بين البطاقات المباشرة وملفات البيانات الأساسية. نفِّذ عبارة SQL التالية لإجراء عملية الربط. تشير المسافة الرياضية الأقل إلى أنّ البيانات تشبه إلى حد كبير مجموعة عمليات احتيال معروفة، بينما تشير المسافة الأكبر إلى أنّ الوصف مشروع.
CREATE OR REPLACE TABLE `model_dev.vehicle_authenticity_scores` AS
SELECT 
  scam_search.query.auction_id,
  CAST(
    GREATEST(0.0, LEAST(100.0, ROUND((MIN(scam_search.distance) - 0.33) / 0.12 * 100.0))) 
    AS INT64
  ) AS authenticity_score
FROM VECTOR_SEARCH(
  TABLE `model_dev.seller_risk_profiles_embedded`,
  'text_embedding',
  (
      SELECT text_embedding, auction_id 
      FROM `model_dev.vehicle_descriptions_embedded`
  ),
  top_k => 15,
  distance_type => 'COSINE'
) AS scam_search
WHERE scam_search.base.profile_type = 'scam'
GROUP BY 1;

قد يبدو محتوى هذا الجدول كما يلي:

توقُّع نتيجة الأصالة

ملخّص القسم: أنشأت عمليات تضمين متعددة الوسائط لشريط البحث في الواجهة الأمامية، واستخدمت البحث المتّجه مباشرةً داخل BigQuery لتقييم قوائم نص HTML الأولي مقارنةً بملفات شخصية معروفة لعمليات الاحتيال.

7. تقييم الصفقات التوليدي

تتوفّر لديك الآن مجموعات بيانات منظَّمة تم إنشاؤها باستخدام تقنيات متعدّدة ومختلفة لتعلُّم الآلة، وكلّها منسَّقة بالكامل ضِمن BigQuery: استخراج المعلومات المرئية، ونموذج XGBoost لتوقُّع القيمة السوقية العادلة، وعمليات تضمين البحث عن المتّجهات.

الخطوة الأخيرة هي دمج إشارات الذكاء الاصطناعي هذه في طريقة عرض موحّدة باعتبارها نتيجة الصفقة النهائية لتطبيق الواجهة الأمامية.

  1. أولاً، ادمج البيانات الوصفية الأولية مع ميزات الرؤية المستخرَجة من الذكاء الاصطناعي ونتائج الأسعار التوقعية ونتائج صحة المعنى. نفِّذ عبارة SQL التالية:
CREATE OR REPLACE TABLE `model_dev.vehicle_features_enhanced` AS
SELECT
  meta.auction_id,
  meta.item_name,
  meta.model_year,
  meta.make,
  meta.model,
  meta.mileage,
  meta.current_bid,
  meta.listing_url,
  meta.transmission_type,
  meta.description,
  meta.state,
  COALESCE(vision.body_style, 'Unknown') AS body_style,
  COALESCE(vision.condition, 50) AS condition,
  COALESCE(meta.color, vision.color, 'Unknown') AS color,
  COALESCE(vision.interior, 'Unknown') AS interior,
  COALESCE(scam.authenticity_score, 100) AS authenticity_score,
  vision.description_summary,
  prices.predicted_market_value
FROM `model_dev.vehicle_metadata` meta
LEFT JOIN `model_dev.vehicle_vision_features` vision 
  ON meta.auction_id = vision.auction_id
LEFT JOIN `model_dev.vehicle_price_predictions` prices
  ON meta.auction_id = prices.auction_id
LEFT JOIN `model_dev.vehicle_authenticity_scores` scam
  ON meta.auction_id = scam.auction_id;
  1. بعد ذلك، احسب نتيجة الصفقة من 0 إلى 100 من خلال الجمع بين أربع إشارات مميّزة مستندة إلى الذكاء الاصطناعي. توازن هذه الصيغة بين القيمة والجودة والمخاطر لعرض أفضل البيانات:
    • نتيجة السعر (40%): تقيس هذه النتيجة مقدار التوفير مقارنةً بالقيمة السوقية العادلة.
    • نتيجة الرؤية (‫30%): إحصاءات من تحليل الصور السابق
    • نتيجة الأصالة (‫15%): تقييم مخاطر الاحتيال
    • نتيجة الحالة (‫15%): يتم استنتاجها في الوقت الفعلي من وصف البائع من خلال AI.SCORE.
    نفِّذ طلب البحث التالي:
CREATE OR REPLACE TABLE `model_dev.marketplace_listings` AS
WITH score_elements AS (
  SELECT 
    *,
    -- 1. SELLER DESCRIPTION SCORE (use AI.SCORE on seller description)
      AI.SCORE(
        FORMAT("Rate the vehicle condition (0-100) based ONLY on this text: '%s'", description)
    ) AS description_score,

    -- 2. PRICE SCORE
    -- Higher impact for underpricing, lower impact for overpricing.
    CAST(LEAST(100.0, GREATEST(0.0, 
      75.0 + (
        IF((predicted_market_value - current_bid) > 0, 
           ((predicted_market_value - current_bid) / NULLIF(predicted_market_value, 0)) * 250.0,
           ((predicted_market_value - current_bid) / NULLIF(predicted_market_value, 0)) * 40.0
        )
      )
    )) AS INT64) AS price_score
  FROM `model_dev.vehicle_features_enhanced`
),
final_calcs AS (
  SELECT 
    *,
    
    -- 3. Combine scores: Price (40%), Condition (30%), Description (15%), Authenticity (15%)
    ROUND(
      (
        (price_score * 0.40) + 
        (CAST(condition AS INT64) * 0.30) + 
        (COALESCE(description_score, 50) * 0.15) + 
        (CAST(authenticity_score AS INT64) * 0.15)
      )
      -- Authenticity penalty for scores below 50.
      * (IF(CAST(authenticity_score AS INT64) < 50, 0.20, 1.05)) 
    ) AS raw_score
  FROM score_elements
)
SELECT 
  * EXCEPT(raw_score),
  
  -- 4. Set floor values: low authenticity scores drop to 10; others floor at 35.
  CAST(GREATEST(
    (IF(CAST(authenticity_score AS INT64) < 50, 10, 35)), 
    LEAST(100, raw_score)
  ) AS INT64) AS deal_score
FROM final_calcs;

لضمان تقديم اقتراحات عالية الجودة، يطبّق طلب البحث طبقتَي منطق محدّدتين:

  1. حظر المحتوى غير الأصلي: إذا تم الإبلاغ عن بطاقة بيانات على أنّها "عالية الخطورة" (نتيجة أقل من 50)، يتم تلقائيًا خفض إجمالي "نتيجة الصفقة" بنسبة% 80 لمنع الترويج لبطاقات البيانات المشبوهة.
  2. التحسين"الكنز المخفي": تستخدم الصيغة منطقًا مجزّأً لتعزيز التوفير بشكلٍ كبير مع التسامح مع الزيادات في الأسعار، ما يضمن أنّ السيارة ذات السعر المرتفع في حالة ممتازة يمكن أن تحقّق ترتيبًا "جيدًا".

يحتوي الجدول الناتج، model_dev.marketplace_listings، على حقول مثل deal_score، بالإضافة إلى price_score وauthenticity_score.

  1. للاطّلاع على نتائج الصفقات بنفسك، نفِّذ طلب البحث التالي أو اطّلِع على لقطة الشاشة أدناه:
SELECT item_name, model_year, authenticity_score, predicted_market_value, price_score, deal_score FROM `model_dev.marketplace_listings`

نتيجة الصفقة التي تم إنشاؤها

ملخّص القسم: جمعت بين الأسعار التوقعية والميزات المرئية ونتائج الأصالة إلى جانب وصف البائع لحساب "نتيجة الصفقة" واحدة لكل بطاقة بيانات.

8. تفعيل تطبيق الواجهة الأمامية

حان الآن وقت إعداد تطبيق الواجهة الأمامية. يتيح لك ذلك أخيرًا البحث في مستودع بيانات قوائم المركبات والتفاعل مع الإحصاءات من إنشاء الذكاء الاصطناعي التي أنشأتها للتو، مثل "نتيجة الصفقة".

تصدير نتائج الذكاء الاصطناعي إلى الواجهة الأمامية

تعتمد واجهة React الأمامية على حِمل JSON محلي لتحميل الصفحات الأولية بسرعة. لتشغيل السوق، استخرِج "نتائج الصفقات التوليدية" النهائية من BigQuery وأعِد إدخالها في مشروع Next.js.

  1. تأكَّد من أنّ بيئتك جاهزة. إذا انتهت مهلة جلسة Cloud Shell أو انتقلت إلى مجلد آخر، نفِّذ الأمر التالي للرجوع إلى جذر المشروع واستعادة متغيرات البيئة:
cd ~/devrel-demos/data-analytics/cymbal-autos-multimodal && \
export PROJECT_ID=$(gcloud config get-value project) && \
export USER_BUCKET="cymbal-autos-${PROJECT_ID}"
  1. نفِّذ نص Python البرمجي المقدَّم للاستعلام عن طريقة العرض النهائية في BigQuery ودمج "نتائج الصفقات" الجديدة في مستودع البيانات الأساسي للتطبيق:
python3 scripts/setup/08_export_frontend_data.py

ستتلقّى رسالة تأكيد على النحو التالي:

💾 Updated local file: app/src/data/cars.json

نشر التطبيق على Cloud Run

بعد إثراء البيانات بنجاح، يمكنك نشر تطبيق الواجهة الأمامية Next.js على الإنترنت المتاح للجميع باستخدام Cloud Run. تتضمّن واجهة حديثة مع تقييمات الصفقات، ولوحات عرض دوّارة تفاعلية للصور، وشريط بحث دلالي ديناميكي مختلط يستعلم عن BigQuery في الوقت الفعلي.

  1. في Cloud Shell، انتقِل إلى دليل app/ المستودع الذي تم استنساخه. هذا أمر بالغ الأهمية، لأنّ البقاء في دليل الجذر سيؤدي إلى تعذُّر عملية الإنشاء.
cd app
  1. نشر التطبيق كحاوية بدون خادم باستخدام Cloud Run يمرِّر الأمر PROJECT_ID كمتغيّر بيئة لكي تعرف واجهة برمجة تطبيقات Next.js مشروع BigQuery الذي يجب الاستعلام عنه:
gcloud run deploy cymbal-autos-frontend \
  --source . \
  --region us-west1 \
  --allow-unauthenticated \
  --min-instances 1 \
  --set-env-vars PROJECT_ID=$PROJECT_ID \
  --project $PROJECT_ID
  1. عند اكتمال عملية النشر، ستعرض الوحدة الطرفية عنوان URL آمنًا للخدمة. سيبدو على النحو التالي:
Service URL: https://cymbal-autos-frontend-[YOUR-PROJECT-NUMBER].us-west1.run.app/

9. استكشاف تطبيق Cymbal Autos

بعد نقل حاوية الواجهة الأمامية إلى Cloud Run، حان الوقت لاختبار التطبيق.

  1. الانتقال إلى الموقع الإلكتروني: افتح عنوان URL الآمن للخدمة الذي تعرضه Cloud Run.

صفحة Cymbal Autos الرئيسية

  1. إجراء بحث دلالي: حاوِل البحث عن مفهوم مجرّد، مثل "شاحنة عمل موثوقة يمكنها نقل الأحمال والقيادة على الطرق الوعرة". يحوّل تطبيق Next.js النص الأولي إلى تضمين متعدّد الوسائط، ثم يرسل طلب بحث VECTOR_SEARCH في الوقت الفعلي إلى BigQuery، ما يتيح لك مقارنة فكرتك بنظام المركبات المتكامل.

شريط البحث في Cymbal Autos

ملاحظة: يتم ترتيب النتائج حسب التشابه الدلالي.

  1. مراجعة النتائج: حسبت أداة BigQuery المسافة الرياضية الدقيقة بين فكرتك المجردة وميزات المركبة لعرض أقرب النتائج الدلالية.

نتائج البحث في Cymbal Autos

  1. الاطّلاع على التفاصيل: انقر على أي مركبة لفتح ملف بياناتها الكامل.
  2. التحقّق من إشارة الذكاء الاصطناعي: انتقِل إلى التفاصيل للاطّلاع على نتائج تعلُّم الآلة الأولية التي أنشأتها سابقًا في المختبر:
    • 📈 القيمة السوقية العادلة: هي السعر الأساسي الذي يتوقّعه نموذج XGBoost.
    • ✨ حالة الجهاز المرئية: هي تقييم الضرر المادي الذي استخرجته نماذج Gemini.
    • 🔍 مقياس الأصالة: يفصل مقياس متجه الأصالة بين البائعين الشرعيين والمحتالين المحتملين.

نتائج Cymbal Autos Listing

10. تَنظيم

لتجنُّب تكبُّد رسوم مستمرة في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدرس التطبيقي حول الترميز، يمكنك حذف مشروع على السحابة الإلكترونية بأكمله الذي أنشأته لهذا الدرس التطبيقي حول الترميز، أو يمكنك تنفيذ النص البرمجي التالي لإيقاف التشغيل التلقائي.

  1. من وحدة طرفية Cloud Shell، ارجع إلى الدليل الجذري الذي يحتوي على الدليل:
cd ..
  1. نفِّذ النص البرمجي للتنظيف أدناه. سيؤدي ذلك إلى إفراغ حزمة Google Cloud Storage، وإزالة مجموعة بيانات model_dev BigQuery، وحذف عملية الربط في BigQuery، وحذف خدمة Cloud Run.
chmod +x scripts/cleanup/teardown.sh
./scripts/cleanup/teardown.sh

‫11. تهانينا

تهانينا! لقد أنشأت بنجاح سوقًا ذكيًا للمركبات. استخدمت BigQuery لتوحيد تحليل البيانات غير المنظَّمة ونماذج التوقّعات وعمليات تكامل الذكاء الاصطناعي في مساحة عمل واحدة.

ما تعلّمته

  • كيفية ربط BigQuery بصور Cloud Storage غير المنظَّمة باستخدام ObjectRef
  • كيفية استخراج سمات المركبات من الصور باستخدام BigQuery مع نماذج Gemini، مثل الدالتَين AI.GENERATE وAI.CLASSIFY
  • كيفية توقّع أسعار المركبات باستخدام BigQuery ML
  • كيفية التعرّف على بيانات المركبات المُحتمل أن تكون مزيّفة من خلال تضمين أوصاف المركبات وإجراء VECTOR_SEARCH
  • كيفية استخدام AI.SCORE لتقييم البيانات غير المنظَّمة أثناء التنقّل ودمج النتائج في "نتيجة الصفقة" الشاملة
  • كيفية تصدير البيانات ونشر تطبيق السوق Next.js على Cloud Run

الخطوات التالية