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

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

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

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

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

پیش نیازها

راه اندازی

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

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

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

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

ادغام با IDX

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

جهش ها

یک جاسازی از طریق 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 هدایت می کند تا جاسازی های برداری را با استفاده از API های Embedding 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 همچنین به شما امکان می دهد به جای استفاده از مقدار سرور _embed برای تولید آنها، مستقیماً با جاسازی ها به عنوان Vector کار کنید.

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

با استفاده از 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 در نمونه CloudSQL انجام می‌دهد.

firebase deploy --only dataconnect

اگر می خواهید پشتیبانی جاسازی را در نمونه CloudSQL خود به صورت دستی فعال کنید یا با یک خطای CLI مواجه شدید، این دستورالعمل ها را دنبال کنید.

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

پسوند طرحواره

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

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

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

method: COSINE|INNER_PRODUCT|L2

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

within: float

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

where: FDC filter condition

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

limit: int

تعداد نتایج برای بازگشت.