جستجوی شباهت برداری را با Vertex AI انجام دهید

به جستجوی شباهت برداری Firebase Data Connect خوش آمدید - پیاده‌سازی جستجوی معنایی Firebase که با Google Vertex AI ادغام می‌شود.

در هسته این ویژگی، تعبیه‌های برداری (vector embeddings) قرار دارند که آرایه‌هایی از اعداد اعشاری هستند که معنای معنایی متن یا رسانه را نشان می‌دهند. با اجرای جستجوی نزدیکترین همسایه با استفاده از تعبیه بردار ورودی، می‌توانید تمام محتوای مشابه از نظر معنایی را پیدا کنید. Data Connect برای این قابلیت از افزونه pgvector در PostgreSQL استفاده می‌کند.

این جستجوی معنایی قدرتمند می‌تواند موارد استفاده‌ای مانند موتورهای توصیه و موتورهای جستجو را هدایت کند. همچنین یک جزء کلیدی در تولید افزوده بازیابی در جریان‌های هوش مصنوعی مولد است. مستندات هوش مصنوعی Vertex مکان بسیار خوبی برای یادگیری بیشتر است.

شما می‌توانید برای تولید خودکار جاسازی‌های برداری با استفاده از API جاسازی‌های Vertex AI به پشتیبانی داخلی Data Connect تکیه کنید، یا از آن API برای تولید دستی آنها استفاده کنید.

پیش‌نیازها

راه‌اندازی

شما می‌توانید بین یک جریان توسعه محلی (اگر توسعه‌دهنده وب، کاتلین اندروید یا iOS هستید) یا یک جریان IDX (برای توسعه‌دهندگان وب) یکی را انتخاب کنید. می‌توانید از یک پایگاه داده محلی یا پروژه Data Connect تولیدی خود و نمونه Cloud SQL برای PostgreSQL آن برای توسعه استفاده کنید.

این دستورالعمل‌ها فرض می‌کنند که شما پروژه Data Connect خود را طبق راهنمای شروع سریع ایجاد کرده‌اید.

ادغام با PostgreSQL محلی

  1. یک نمونه محلی PostgreSQL راه‌اندازی کنید.
  2. به خودتان نقش IAM کاربر Vertex AI را اعطا کنید .
  3. اعتبارنامه‌های پیش‌فرض برنامه Google Cloud را در محیط خود تنظیم کنید.
  4. افزونه‌ی pgvector را در نمونه‌ی محلی PostgreSQL خود نصب کنید.
  5. افزونه را با استفاده از CREATE EXTENSION vector طبق دستورالعمل‌های مخزن pgvector فعال کنید.

ادغام با IDX

  1. فضای کاری IDX خود را با استفاده از الگوی Data Connect تنظیم کنید.
  2. به خودتان نقش IAM کاربر 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 هدایت می‌کند تا با فراخوانی داخلی APIهای تعبیه 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 هدایت می‌کند تا جاسازی‌های برداری را با استفاده از APIهای جاسازی Vertex AI تولید کند، در این مورد برای ایجاد جاسازی‌هایی برای رشته جستجو که برای مقایسه با جاسازی‌های توضیحات فیلم استفاده می‌شود.

در این مثال، جستجوی شباهت تا ۵ فیلم را که توضیحات آنها از نظر معنایی به عبارت ورودی نزدیک‌تر است، برمی‌گرداند. مجموعه نتایج به ترتیب صعودی فاصله - از نزدیک‌ترین به دورترین - مرتب شده‌اند.

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
        }
      }
  }

توجه داشته باشید که متدهای مختلف مقادیر بسیار متفاوتی را برای distance برمی‌گردانند: اگر within تنظیم کرده‌اید، باید پس از تغییر method ، آن مقدار را دوباره تنظیم کنید.

فراخوانی پرس و جوی شباهت

برای فراخوانی جستجوی شباهت از کد کلاینت:

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

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

از جاسازی‌های سفارشی استفاده کنید

Data Connect همچنین به شما امکان می‌دهد تا به جای استفاده از مقدار سرور _embed برای تولید جاسازی‌ها، مستقیماً با آنها به عنوان Vector کار کنید.

ذخیره یک جاسازی سفارشی

با استفاده از API مربوط به Vertex Embeddings، یک مدل منطبق را مشخص کنید و نتایج جاسازی با بُعد صحیح را درخواست کنید.

سپس، آرایه‌ی اعشاری بازگشتی را به یک Vector تبدیل (cast) کنید تا برای ذخیره‌سازی به عملیات به‌روزرسانی منتقل شود.

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 خود به صورت دستی فعال کنید، یا با خطای CLI مواجه شدید، این دستورالعمل‌ها را دنبال کنید.

نحو جستجوی برداری

افزونه‌های طرحواره

نوع داده‌ی Vector در Data Connect به نوع vector PostgreSQL که توسط افزونه‌ی pgvector تعریف شده است، نگاشت می‌شود. نوع vector pgvector به صورت آرایه‌ای از اعداد اعشاری با دقت تکی در PostgreSQL ذخیره می‌شود.

در Data Connect ، نوع Vector به صورت آرایه‌ای از اعداد JSON نمایش داده می‌شود. ورودی‌ها به صورت اجباری در آرایه‌ای از مقادیر float32 قرار می‌گیرند. اگر این اجبار با شکست مواجه شود، خطایی رخ می‌دهد.

از پارامتر size در دستورالعمل @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 هدایت می‌کند تا با استفاده از APIهای Embedding مربوط به Vertex AI، جاسازی‌ها را تولید و ذخیره کند. این مقدار سرور می‌تواند هم در کوئری‌ها و هم در جهش‌ها استفاده شود.

پارامترهای جستجوی شباهت

method: COSINE|INNER_PRODUCT|L2

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

within: float

محدودیتی در مورد فاصله‌ای که جستجوی نزدیکترین همسایه در آن انجام می‌شود.

where: FDC filter condition

به راهنمای طرحواره‌ها، پرس‌وجوها و جهش‌ها مراجعه کنید.

limit: int

تعداد نتایجی که باید برگردانده شوند.