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

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

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

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

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

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

الإعداد

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

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

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

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

الدمج مع IDX

  1. إعداد مساحة عمل IDX باستخدام نموذج "ربط البيانات"
  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 إلى إنشاء إدخالات متجهات من خلال الاتصال داخليًا بواجهات برمجة التطبيقات Embedding APIs في Vertex AI. يمكن استخدام قيمة _embed server في كلّ من طلبات التعديل والاستعلامات.

الطفرات

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

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

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

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

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

لاستدعاء عملية التحويل الأخيرة من عميل:

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

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

// Use the response

طلبات البحث

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

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

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

إجراء بحث تشابه

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

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

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

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

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

استدعاء طلب التشابه

لاستدعاء بحث التشابه من رمز العميل:

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 CLI الخطوات اللازمة ل تفعيل إنشاء العناصر المضمّنة المستندة إلى Vertex AI في مثيل CloudSQL.

firebase deploy --only dataconnect

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

بنية البحث في "الأشكال الهندسية"

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

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

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

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

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 لإنشاء وحفظ البيانات المضمّنة باستخدام واجهات برمجة تطبيقات Embedding API في Vertex AI. يمكن استخدام قيمة الخادم هذه في كلّ من طلبات البحث والطفرات.

المَعلمات لميزة "البحث عن المحتوى المشابه"

method: COSINE|INNER_PRODUCT|L2

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

within: float

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

where: FDC filter condition

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

limit: int

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