ساخت اپلیکیشن جستجوی پتنت با AlloyDB، Vector Search & Vertex AI!

۱. مرور کلی

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

تحقیقات ثبت اختراع گسترده و پیچیده است. بررسی چکیده‌های فنی بی‌شمار برای یافتن نوآوری‌های مرتبط، کاری دلهره‌آور است. جستجوهای سنتی مبتنی بر کلمات کلیدی اغلب نادرست و زمان‌بر هستند. چکیده‌ها طولانی و فنی هستند و درک سریع ایده اصلی را دشوار می‌کنند. این امر می‌تواند منجر به از دست رفتن پتنت‌های کلیدی توسط محققان یا اتلاف وقت برای نتایج نامربوط شود.

راز نهفته در این انقلاب در جستجوی برداری نهفته است. جستجوی برداری به جای تکیه بر تطبیق ساده کلمات کلیدی، متن را به نمایش‌های عددی (جاسازی‌ها) تبدیل می‌کند. این به ما امکان می‌دهد بر اساس معنای عبارت جستجو شده، نه فقط کلمات خاص استفاده شده، جستجو کنیم. در دنیای جستجوهای ادبی، این یک تغییر اساسی است. تصور کنید که یک حق ثبت اختراع برای "مانیتور ضربان قلب پوشیدنی" پیدا کنید، حتی اگر عبارت دقیق در سند استفاده نشده باشد.

هدف

در این آزمایشگاه کد، ما با بهره‌گیری از AlloyDB، افزونه pgvector و Gemini 1.5 Pro داخلی، Embeddings و Vector Search، تلاش خواهیم کرد تا فرآیند جستجوی پتنت را سریع‌تر، شهودی‌تر و فوق‌العاده دقیق‌تر کنیم.

آنچه خواهید ساخت

به عنوان بخشی از این آزمایشگاه، شما:

  1. یک نمونه AlloyDB ایجاد کنید و داده‌های مجموعه داده‌های عمومی ثبت اختراعات را بارگذاری کنید
  2. فعال‌سازی افزونه‌های pgvector و مدل‌های هوش مصنوعی مولد در AlloyDB
  3. ایجاد جاسازی‌ها از بینش‌ها
  4. جستجوی شباهت کسینوسی را به صورت بلادرنگ برای متن جستجوی کاربر انجام دهید
  5. راهکار را در توابع ابری بدون سرور مستقر کنید

نمودار زیر جریان داده‌ها و مراحل پیاده‌سازی را نشان می‌دهد.

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

الزامات

  • یک مرورگر، مانند کروم یا فایرفاکس
  • یک پروژه گوگل کلود با قابلیت پرداخت.

۲. قبل از شروع

ایجاد یک پروژه

  1. در کنسول گوگل کلود ، در صفحه انتخاب پروژه، یک پروژه گوگل کلود را انتخاب یا ایجاد کنید.
  2. مطمئن شوید که صورتحساب برای پروژه ابری شما فعال است. یاد بگیرید که چگونه بررسی کنید که آیا صورتحساب در یک پروژه فعال است یا خیر .
  3. شما از Cloud Shell ، یک محیط خط فرمان که در Google Cloud اجرا می‌شود و bq از قبل روی آن بارگذاری شده است، استفاده خواهید کرد. روی Activate Cloud Shell در بالای کنسول Google Cloud کلیک کنید.

تصویر دکمه فعال کردن Cloud Shell

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی می‌کنید که آیا از قبل احراز هویت شده‌اید و پروژه روی شناسه پروژه شما تنظیم شده است یا خیر:
gcloud auth list
  1. دستور زیر را در Cloud Shell اجرا کنید تا تأیید شود که دستور gcloud از پروژه شما اطلاع دارد.
gcloud config list project
  1. اگر پروژه شما تنظیم نشده است، از دستور زیر برای تنظیم آن استفاده کنید:
gcloud config set project <YOUR_PROJECT_ID>
  1. API های مورد نیاز را فعال کنید. می‌توانید از دستور gcloud در ترمینال Cloud Shell استفاده کنید:
gcloud services enable alloydb.googleapis.com \ 
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

جایگزین دستور gcloud از طریق کنسول با جستجوی هر محصول یا استفاده از این لینک است.

برای دستورات و نحوه‌ی استفاده از gcloud به مستندات مراجعه کنید.

۳. پایگاه داده AlloyDB خود را آماده کنید

بیایید یک کلاستر، نمونه و جدول AlloyDB ایجاد کنیم که مجموعه داده‌های ثبت اختراع در آن بارگذاری شود.

ایجاد اشیاء AlloyDB

یک کلاستر و نمونه با شناسه کلاستر " patent-cluster "، رمز عبور " alloydb "، سازگار با PostgreSQL 15 و منطقه " us-central1 " و شبکه " default " ایجاد کنید. شناسه نمونه را روی " patent-instance " تنظیم کنید. روی CREATE CLUSTER کلیک کنید. جزئیات ایجاد یک کلاستر در این لینک موجود است: https://cloud.google.com/alloydb/docs/cluster-create .

ایجاد یک جدول

شما می‌توانید با استفاده از دستور DDL زیر در AlloyDB Studio یک جدول ایجاد کنید:

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT) ;

فعال کردن افزونه‌ها

برای ساخت برنامه جستجوی اختراع، از افزونه‌های pgvector و google_ml_integration استفاده خواهیم کرد. افزونه pgvector به شما امکان می‌دهد جاسازی‌های برداری را ذخیره و جستجو کنید. افزونه google_ml_integration توابعی را ارائه می‌دهد که برای دسترسی به نقاط پایانی پیش‌بینی هوش مصنوعی Vertex برای دریافت پیش‌بینی‌ها در SQL استفاده می‌کنید. این افزونه‌ها را با اجرای DDL های زیر فعال کنید :

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

اعطای مجوز

برای اعطای مجوز اجرا به تابع "embedding"، دستور زیر را اجرا کنید:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

اعطای نقش کاربری Vertex AI به حساب سرویس AlloyDB

از کنسول IAM گوگل کلود، به حساب سرویس AlloyDB (که چیزی شبیه به این است: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) دسترسی به نقش "Vertex AI User" را بدهید. PROJECT_NUMBER شماره پروژه شما را خواهد داشت.

همچنین می‌توانید با استفاده از دستور gcloud دسترسی را اعطا کنید:

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

جدول را تغییر دهید تا یک ستون Vector برای ذخیره سازی Embeddings اضافه شود.

DDL زیر را اجرا کنید تا فیلد abstract_embeddings به جدولی که ایجاد کردیم اضافه شود. این ستون امکان ذخیره‌سازی مقادیر برداری متن را فراهم می‌کند:

ALTER TABLE patents_data ADD column abstract_embeddings vector(3072);

۴. بارگذاری داده‌های ثبت اختراع در پایگاه داده

مجموعه داده‌های عمومی Google Patents در BigQuery به عنوان مجموعه داده ما استفاده خواهد شد. ما از AlloyDB Studio برای اجرای کوئری‌های خود استفاده خواهیم کرد. مخزن alloydb-pgvector شامل اسکریپت insert_into_patents_data.sql است که ما برای بارگذاری داده‌های پتنت اجرا خواهیم کرد.

  1. در کنسول Google Cloud، صفحه AlloyDB را باز کنید.
  2. کلاستر تازه ایجاد شده خود را انتخاب کنید و روی نمونه کلیک کنید.
  3. در منوی ناوبری AlloyDB، روی AlloyDB Studio کلیک کنید. با اطلاعات کاربری خود وارد شوید.
  4. با کلیک روی نماد برگه جدید در سمت راست، یک برگه جدید باز کنید.
  5. عبارت پرس‌وجوی insert را از اسکریپت insert_into_patents_data.sql که در بالا ذکر شد، در ویرایشگر کپی کنید. می‌توانید ۵۰ تا ۱۰۰ عبارت درج را برای نمایش سریع این مورد استفاده کپی کنید.
  6. روی «اجرا» کلیک کنید. نتایج پرس‌وجوی شما در جدول نتایج ظاهر می‌شود.

۵. ایجاد جاسازی‌ها برای داده‌های ثبت اختراع

ابتدا بیایید تابع جاسازی را با اجرای کوئری نمونه زیر آزمایش کنیم:

SELECT embedding( 'gemini-embedding-001', 'AlloyDB is a managed, cloud-hosted SQL database service.');

این باید بردار جاسازی‌ها را که شبیه آرایه‌ای از اعداد اعشاری است، برای متن نمونه در پرس‌وجو برگرداند. به این شکل است:

25a1d7ef0e49e91e.png

فیلد بردار abstract_embeddings را به‌روزرسانی کنید

DML زیر را اجرا کنید تا خلاصه اختراعات در جدول با جاسازی‌های مربوطه به‌روزرسانی شود:

UPDATE patents_data set abstract_embeddings = embedding( 'gemini-embedding-001', abstract);

۶. جستجوی برداری انجام دهید

حالا که جدول، داده‌ها و جاسازی‌ها آماده هستند، بیایید جستجوی برداری بلادرنگ (real-time Vector Search) را برای متن جستجوی کاربر انجام دهیم. می‌توانید این را با اجرای کوئری زیر آزمایش کنید:

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('gemini-embedding-001', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

در این پرس و جو،

  1. متن جستجوی کاربر این است: «یک مدل یادگیری ماشینی جدید مرتبط با پردازش زبان طبیعی».
  2. ما آن را در متد embedding() با استفاده از مدل gemini-embedding-001 به embedding تبدیل می‌کنیم.
  3. «<=>» نشان دهنده استفاده از روش فاصله تشابه کسینوس است.
  4. ما نتیجه متد جاسازی را به نوع بردار تبدیل می‌کنیم تا با بردارهای ذخیره شده در پایگاه داده سازگار شود.
  5. LIMIT 10 نشان می‌دهد که ما 10 مورد از نزدیک‌ترین تطابق‌ها با متن جستجو را انتخاب می‌کنیم.

نتیجه در زیر آمده است:

8e77af965fc787ae.png

همانطور که در نتایج خود مشاهده می‌کنید، نتایج جستجو بسیار نزدیک به متن جستجو هستند.

۷. برنامه را به وب ببرید

آماده‌اید که این برنامه را به وب ببرید؟ مراحل زیر را دنبال کنید:

  1. به ویرایشگر Cloud Shell بروید و روی نماد "Cloud Code — Sign in" در گوشه پایین سمت چپ (نوار وضعیت) ویرایشگر کلیک کنید. پروژه فعلی Google Cloud خود را که صورتحساب آن فعال است انتخاب کنید و مطمئن شوید که از Gemini نیز به همان پروژه وارد شده‌اید (در گوشه سمت راست نوار وضعیت).
  2. روی آیکون Cloud Code کلیک کنید و منتظر بمانید تا پنجره Cloud Code ظاهر شود. گزینه New Application را انتخاب کنید و در پنجره Create New Application، برنامه Cloud Functions را انتخاب کنید:

a800ee1eb6cb8a5b.png

در صفحه ۲/۲ از پنجره باز شده Create New Application، گزینه Java: Hello World را انتخاب کنید و نام پروژه خود را "alloydb-pgvector" در محل دلخواه خود وارد کنید و روی OK کلیک کنید:

5b09446ecf7d4f8d.png

  1. در ساختار پروژه حاصل، به دنبال pom.xml بگردید و آن را با محتویات فایل repo جایگزین کنید. این فایل باید علاوه بر چند مورد دیگر، این وابستگی‌ها را نیز داشته باشد:

2b3a3cdd75a57711.png

  1. فایل HelloWorld.java را با محتوای فایل repo جایگزین کنید.

توجه داشته باشید که باید مقادیر زیر را با مقادیر واقعی خود جایگزین کنید:

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

توجه داشته باشید که تابع، متن جستجو را به عنوان پارامتر ورودی با کلید "search" دریافت می‌کند و در این پیاده‌سازی، ما فقط یک مورد منطبق نزدیک را از پایگاه داده برمی‌گردانیم:

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('tgemini-embedding-001', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. برای استقرار تابع ابری که ایجاد کرده‌اید، دستور زیر را از ترمینال Cloud Shell اجرا کنید. به یاد داشته باشید که ابتدا با استفاده از دستور زیر به پوشه پروژه مربوطه بروید:
cd alloydb-pgvector

سپس دستور را اجرا کنید:

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

مرحله مهم:

پس از آماده شدن برای استقرار، باید بتوانید توابع را در کنسول Google Cloud Run Functions مشاهده کنید. تابع تازه ایجاد شده را جستجو کرده و آن را باز کنید، پیکربندی‌ها را ویرایش کرده و موارد زیر را تغییر دهید:

  1. به تنظیمات زمان اجرا، ساخت، اتصالات و امنیت بروید
  2. افزایش زمان انتظار به ۱۸۰ ثانیه
  3. به برگه اتصالات بروید:

4e83ec8a339cda08.png

  1. در تنظیمات Ingress، مطمئن شوید که گزینه «Allow all traffic» انتخاب شده است.
  2. در تنظیمات Egress، روی منوی کشویی Network کلیک کنید و گزینه "Add New VPC Connector" را انتخاب کنید و دستورالعمل‌های نمایش داده شده در کادر محاوره‌ای را دنبال کنید:

8126ec78c343f199.png

  1. یک نام برای رابط VPC انتخاب کنید و مطمئن شوید که منطقه آن با منطقه شما یکسان است. مقدار Network را به صورت پیش‌فرض رها کنید و Subnet را روی Custom IP Range با محدوده IP 10.8.0.0 یا چیزی مشابه آن که در دسترس است، تنظیم کنید.
  2. SHOW SCALINING SETTINGS را باز کنید و مطمئن شوید که پیکربندی دقیقاً روی موارد زیر تنظیم شده است:

7baf980463a86a5c.png

  1. روی CREATE کلیک کنید و این کانکتور اکنون باید در تنظیمات خروجی فهرست شده باشد.
  2. کانکتور تازه ایجاد شده را انتخاب کنید
  3. انتخاب کنید که تمام ترافیک از طریق این کانکتور VPC هدایت شود.

۸. برنامه را آزمایش کنید

پس از استقرار، باید نقطه پایانی را در قالب زیر مشاهده کنید:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

می‌توانید با اجرای دستور زیر، آن را از ترمینال Cloud Shell آزمایش کنید:

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

نتیجه:

da3dcfac7d024031.png

همچنین می‌توانید آن را از فهرست توابع ابری آزمایش کنید. تابع پیاده‌سازی‌شده را انتخاب کنید و به برگه «آزمایش» بروید. در کادر متنی بخش پیکربندی رویداد راه‌اندازی برای درخواست json، موارد زیر را وارد کنید:

{"search": "A new Natural Language Processing related Machine Learning Model"}

روی دکمه‌ی «تست عملکرد» کلیک کنید تا نتیجه را در سمت راست صفحه مشاهده کنید:

e21f806d661996ff.png

همین! انجام جستجوی بردار شباهت با استفاده از مدل Embeddings روی داده‌های AlloyDB به همین سادگی است.

۹. تمیز کردن

برای جلوگیری از تحمیل هزینه به حساب Google Cloud خود برای منابع استفاده شده در این پست، این مراحل را دنبال کنید:

  1. در کنسول گوگل کلود، به بخش مدیریت بروید
  2. صفحه منابع .
  3. در لیست پروژه‌ها، پروژه‌ای را که می‌خواهید حذف کنید انتخاب کنید و سپس روی «حذف» کلیک کنید.
  4. در کادر محاوره‌ای، شناسه پروژه را تایپ کنید و سپس برای حذف پروژه، روی خاموش کردن کلیک کنید.

۱۰. تبریک

تبریک! شما با موفقیت جستجوی شباهت را با استفاده از AlloyDB، pgvector و Vector search انجام دادید. با ترکیب قابلیت‌های AlloyDB ، Vertex AI و Vector Search ، ما جهش بزرگی در قابل دسترس، کارآمد و واقعاً معنادار کردن جستجوهای متون علمی برداشته‌ایم.