إجراء بحث عن تشابه المتّجه باستخدام Vertex AI

مرحبًا بك في ميزة البحث عن التشابه في المتّجهات من Firebase Data Connect، وهي ميزة البحث الدلالي التي توفّرها Firebase وتتكامل مع Google Vertex AI.

تستند هذه الميزة إلى تضمينات متجهة، وهي عبارة عن مصفوفات من أرقام الفاصلة العائمة التي تمثّل المعنى الدلالي للنص أو الوسائط. من خلال إجراء بحث عن أقرب جار باستخدام تضمين متجه للإدخال، يمكنك العثور على كل المحتوى المشابه دلاليًا. تستخدم Data Connect إضافة pgvector من PostgreSQL لتوفير هذه الإمكانية.

يمكن أن يؤدي هذا البحث الدلالي الفعّال إلى حالات استخدام مثل محرّكات الاقتراحات ومحرّكات البحث. وهو أيضًا مكوّن أساسي في الجيل المعزّز بالاسترجاع في مسارات الذكاء الاصطناعي التوليدي. يمكنك الاطّلاع على مزيد من المعلومات في مستندات Vertex AI.

يمكنك الاعتماد على الدعم المضمّن في Data Connect لإنشاء تضمينات متجهة تلقائيًا باستخدام Embeddings API من Vertex AI، أو استخدام واجهة برمجة التطبيقات هذه لإنشائها يدويًا.

المتطلبات الأساسية

  • إعداد Data Connect لمشروعك

  • فعِّل واجهات Vertex AI API.

الإعداد

يمكنك الاختيار بين مسار التطوير المحلي (إذا كنت مطوّر ويب أو Kotlin Android أو iOS) أو مسار IDX (لمطوّري الويب). يمكنك استخدام قاعدة بيانات محلية أو مشروع Data Connect الخاص بالإنتاج ومثيل Cloud SQL for PostgreSQL الخاص به للتطوير.

تفترض هذه التعليمات أنّك أنشأت مشروعك Data Connectباتّباع دليل البدء السريع.

الدمج مع PostgreSQL المحلي

  1. إعداد مثيل PostgreSQL محلي
  2. امنح نفسك دور "مستخدم Vertex AI" في إدارة الهوية وإمكانية الوصول.
  3. إعداد بيانات الاعتماد التلقائية للتطبيق في Google Cloud في بيئتك
  4. ثبِّت إضافة pgvector في مثيل PostgreSQL المحلي.
  5. فعِّل الإضافة باستخدام CREATE EXTENSION vector وفقًا لتعليمات pgvector المستودع.

الدمج مع IDX

  1. يمكنك إعداد مساحة عمل IDX باستخدام نموذج Data Connect.
  2. امنح نفسك دور "مستخدم Vertex AI" في إدارة الهوية وإمكانية الوصول.
  3. فعِّل الإضافة باستخدام CREATE EXTENSION vector وفقًا لتعليمات pgvector المستودع.

تصميم المخطط

لإجراء البحث المتّجه، أضِف حقلًا جديدًا من النوع Vector إلى المخطّط. على سبيل المثال، إذا أردت إجراء بحث دلالي باستخدام أوصاف الأفلام، أضِف حقلًا لتخزين التضمينات المتجهة المرتبطة بوصف الفيلم. في هذا المخطط، تتم إضافة descriptionEmbedding لتخزين تضمينات المتجهات الخاصة بالحقل description.

type Movie @table {
 id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
 title: String!
 description: String
 descriptionEmbedding: Vector! @col(size:768)
 // ...
}

إنشاء عمليات تضمين واستردادها

توفّر Data Connect دعمًا مدمجًا لعمليات تضمين المتجهات باستخدام قيمة الخادم _embed. يؤدي ذلك إلى توجيه Data Connect لإنشاء تضمينات متجهة من خلال استدعاء واجهات برمجة التطبيقات الخاصة بالتضمين في Vertex AI داخليًا. يمكن استخدام قيمة الخادم _embed في كل من عمليات التغيير والاستعلامات.

التحوّلات

إنشاء تضمين وتخزينه من خلال Data Connect

في تطبيق البحث المتّجهي، من المحتمل أنّك تريد طلب إنشاء عمليات التضمين فور إضافة سجلّات إلى قاعدة البيانات. في ما يلي createMovie تعديل يضيف سجلّ فيلم إلى جدول Movie ويمرّر أيضًا وصفًا للفيلم مع تضمين model محدّد.

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

في بعض الحالات، قد تحتاج إلى تعديل وصف الفيلم وتضمينه.

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

لاستدعاء عملية التغيير الأخيرة من العميل، اتّبِع الخطوات التالية:

import { updateMovieDescription } from 'lib/dataconnect-sdk/';

await updateMovieDescription({ id: movieId, description: description});

// Use the response

طلبات البحث

يمكنك جلب تضمينات المتجهات باستخدام طلب بحث مثل ما يلي. يُرجى العِلم أنّ descriptionEmbedding الذي يعرضه طلب البحث هو مصفوفة من الأرقام العشرية، وهي عادةً ما تكون غير قابلة للقراءة من قِبل الإنسان. وبالتالي، لا تتيح حِزم SDK التي تم إنشاؤها Data Connect إمكانية إرجاعها مباشرةً.

يمكنك استخدام تضمينات المتجهات التي تم إرجاعها لإجراء بحث عن التشابه، كما هو موضّح في القسم التالي.

query getMovieDescription($id: String!) @auth(level: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

إجراء بحث عن صور مشابهة

يمكننا الآن إجراء بحث عن التشابه.

بالنسبة إلى كل حقل Vector، تنشئ Data Connect دالة GraphQL تنفّذ البحث عن التشابه. اسم هذه الدالة التي تم إنشاؤها هو ${pluralType}_${vectorFieldName}_similarity. وهي تتوافق مع بعض المَعلمات كما هو موضّح في الأمثلة التالية وفي قائمة المراجع.

يمكنك تحديد دالة GraphQL تستدعي البحث عن التشابه. كما ذكرنا أعلاه، توجّه قيمة الخادم _embed Data Connect إلى إنشاء تضمينات متجهة باستخدام واجهات Embedding API من Vertex AI، وذلك لإنشاء تضمينات لسلسلة البحث المستخدَمة للمقارنة مع تضمينات أوصاف الأفلام.

في هذا المثال، سيعرض البحث عن الصور المشابهة ما يصل إلى 5 أفلام يكون وصفها الأقرب دلاليًا إلى طلب البحث المُدخَل. يتم ترتيب مجموعة النتائج تصاعديًا حسب المسافة، أي من الأقرب إلى الأبعد.

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
      }
  }

ضبط طلب البحث عن التشابه

تحقّق القيم التلقائية لمَعلمات البحث، مثل method وwithin، أداءً جيدًا في معظم حالات الاستخدام. ومع ذلك، إذا لاحظت أنّ طلب البحث يعرض نتائج غير متشابهة إلى حد كبير، أو أنّه لا يعرض نتائج تريد تضمينها، حاوِل تعديل هذه المَعلمات.

للعثور على قيمة مناسبة لـ within، يمكننا إضافة _metadata.distance إلى الحقول المحدّدة لمعرفة مدى بُعد كل نتيجة عن متجه طلب البحث. استنادًا إلى قيم distance التي تم إرجاعها، يمكننا ضبط المَعلمة within، وسيتم تضمين النتائج التي تقل مسافتها عن قيمة within فقط:

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      within: 2,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

يمكنك أيضًا تجربة دوال مسافة مختلفة من خلال ضبط المَعلمة method.

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      within: .5,
      method: COSINE,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

يُرجى العِلم أنّ الطرق المختلفة تعرض قيمًا مختلفة جدًا للمسافة: إذا كنت قد ضبطت within، عليك ضبط هذه القيمة مرة أخرى بعد تغيير method.

استدعاء طلب البحث عن التشابه

لإجراء بحث مشابه من رمز العميل، اتّبِع الخطوات التالية:

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

استخدام عمليات تضمين مخصّصة

تتيح لك السمة Data Connect أيضًا استخدام عمليات التضمين مباشرةً كـ Vector بدلاً من استخدام قيمة الخادم _embed لإنشائها.

تخزين تضمين مخصّص

باستخدام Vertex Embeddings API، حدِّد نموذج مطابقة واطلب نتائج التضمين ذات البُعد الصحيح.

بعد ذلك، يمكنك تحويل مصفوفة الأرقام العشرية التي تم إرجاعها إلى Vector لتمريرها إلى عملية التعديل للتخزين.

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

إجراء بحث عن التشابه باستخدام عمليات التضمين المخصّصة

نفِّذ العملية نفسها لاسترداد التضمينات لعبارات البحث وتحويلها إلى Vectors.

بعد ذلك، استخدِم طلب البحث _similarity لتنفيذ كل عملية بحث.

query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare: $compare,
      method: L2,
      within: $within,
      where: {content: {ne: $excludesContent}}, limit: $limit)
      {
        id
        title
        description
      }
  }

النشر في مرحلة الإنتاج

نشر المخطط والموصّل

تتمثّل الخطوة الأخيرة في عملية Data Connect نموذجية في نشر أصولك في مرحلة الإنتاج.

عند نشر المخطط الذي يحتوي على أنواع Vector إلى CloudSQL باستخدام الأمر firebase deploy، تتّخذ واجهة سطر الأوامر Firebase الخطوات اللازمة لتفعيل إنشاء عمليات التضمين المستندة إلى Vertex AI على مثيل CloudSQL.

firebase deploy --only dataconnect

إذا أردت تفعيل ميزة التضمين في مثيل CloudSQL يدويًا أو واجهت خطأ في واجهة سطر الأوامر، اتّبِع هذه التعليمات.

بنية البحث عن المتّجهات

إضافات المخطط

يتوافق نوع بيانات Data Connect مع النوع vector في PostgreSQL على النحو المحدّد في الإضافة pgvector. يتم تخزين النوع vector في pgvector كمصفوفة من أرقام الفاصلة العائمة ذات الدقة الفردية في PostgreSQL.Vector

في Data Connect، يتم تمثيل النوع Vector كصفيفة من أرقام JSON. يتم تحويل المدخلات إلى مصفوفة من قيم float32. إذا تعذّر التحويل، سيتم عرض رسالة خطأ.

استخدِم مَعلمة الحجم في توجيه @col لضبط أبعاد الرسومات المتجهة.

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

لا تتوفّر size إلا لأنواع Vector. تتطلّب عمليات Vector، مثل البحث عن التشابه، أن تحتوي جميع Vector على العدد نفسه من السمات.

directive @col(
  # … existing args
  """
  Defines a fixed column size for certain scalar types.

  - For Vector, size is required.
  - For all other types, size is currently unsupported and hence supplying it will result in a schema error.
  """
  size: Int
) on FIELD_DEFINITION

قيمة الخادم _embed لطلبات البحث وعمليات التعديل

_embed

توجّه قيمة الخادم هذه خدمة Data Connect لإنشاء وتخزين عمليات التضمين باستخدام واجهات برمجة التطبيقات الخاصة بالتضمين في Vertex AI. يمكن استخدام قيمة الخادم هذه في كلّ من طلبات البحث وعمليات التغيير.

المَعلمات الخاصة بالبحث عن صور مشابهة

method: COSINE|INNER_PRODUCT|L2

دالة المسافة المستخدَمة للبحث عن المواقع الجغرافية المجاورة الخوارزميات المتوافقة حاليًا هي مجموعة فرعية من خوارزميات البحث pgvector.

within: float

قيد على المسافة التي يتم ضمنها إجراء البحث عن أقرب جار.

where: FDC filter condition

اطّلِع على دليل المخططات وعمليات البحث والتعديل.

limit: int

عدد النتائج المطلوب عرضها.