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

1. بررسی اجمالی

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

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

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

هدف

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

چیزی که خواهی ساخت

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

  1. یک نمونه AlloyDB ایجاد کنید و داده های مجموعه داده عمومی Patents را بارگیری کنید
  2. pgvector و پسوندهای مدل AI مولد را در AlloyDB فعال کنید
  3. جاسازی‌هایی را از بینش‌ها ایجاد کنید
  4. جستجوی شباهت کسینوس در زمان واقعی را برای متن جستجوی کاربر انجام دهید
  5. راه حل را در توابع ابری بدون سرور مستقر کنید

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

8b73c40a0d12e194.png

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

الزامات

  • مرورگری مانند کروم یا فایرفاکس
  • یک پروژه Google Cloud با فعال کردن صورت‌حساب.

2. قبل از شروع

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

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

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

  1. پس از اتصال به Cloud Shell، با استفاده از دستور زیر بررسی می‌کنید که قبلاً احراز هویت شده‌اید و پروژه به ID پروژه شما تنظیم شده است:
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 به اسناد مراجعه کنید.

3. پایگاه داده 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 یک جدول ایجاد کنید:

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;

ROLE کاربر Vertex AI را به حساب سرویس AlloyDB اعطا کنید

از کنسول Google Cloud IAM، به حساب سرویس AlloyDB (که شبیه این است: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) اجازه دسترسی به نقش "کاربر Vertex AI" بدهید. 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 برای ذخیره سازی جاسازی ها اضافه شود

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

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

4. داده های ثبت اختراع را در پایگاه داده بارگذاری کنید

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

  1. در کنسول Google Cloud، صفحه AlloyDB را باز کنید.
  2. خوشه تازه ایجاد شده خود را انتخاب کنید و روی نمونه کلیک کنید.
  3. در منوی مسیریابی AlloyDB، روی AlloyDB Studio کلیک کنید. با اعتبار خود وارد شوید.
  4. با کلیک بر روی نماد برگه جدید در سمت راست، یک برگه جدید باز کنید.
  5. عبارت insert query را از اسکریپت insert_into_patents_data.sql که در بالا ذکر شد در ویرایشگر کپی کنید. شما می توانید 50-100 عبارت درج را برای نمایش سریع این مورد استفاده کپی کنید.
  6. روی Run کلیک کنید. نتایج جستجوی شما در جدول نتایج ظاهر می شود.

5. برای داده های پتنت ها Embeddings ایجاد کنید

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

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

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

25a1d7ef0e49e91e.png

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

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

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

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

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

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

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

  1. متن جستجوی کاربر این است: "یک مدل جدید یادگیری ماشین مرتبط با پردازش زبان طبیعی".
  2. ما آن را با استفاده از مدل: textembedding-gecko@003 به embeddings در متد embedding() تبدیل می کنیم.
  3. "<=>" نشان دهنده استفاده از روش فاصله COSINE SIMILARITY است.
  4. ما در حال تبدیل نتیجه روش embedding به نوع برداری هستیم تا آن را با بردارهای ذخیره شده در پایگاه داده سازگار کنیم.
  5. LIMIT 10 نشان دهنده این است که ما در حال انتخاب 10 نزدیکترین مطابقت متن جستجو هستیم.

در زیر نتیجه را مشاهده می کنید:

8e77af965fc787ae.png

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

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

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

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

a800ee1eb6cb8a5b.png

در صفحه 2/2 از پنجره 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

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

// 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('textembedding-gecko@003', '" + 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 که ایجاد کردید، دستور زیر را از ترمینال 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. به Runtime، ساخت، اتصالات و تنظیمات امنیتی بروید
  2. تایم اوت را به 180 ثانیه افزایش دهید
  3. به تب اتصالات بروید:

4e83ec8a339cda08.png

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

8126ec78c343f199.png

  1. نامی برای اتصال VPC ارائه دهید و مطمئن شوید که منطقه با نمونه شما یکسان است. مقدار Network را به عنوان پیش فرض بگذارید و Subnet را به عنوان محدوده IP سفارشی با محدوده IP 10.8.0.0 یا چیزی مشابه که در دسترس است تنظیم کنید.
  2. SHOW SCALING SETTINGS را باز کنید و مطمئن شوید که پیکربندی دقیقاً روی موارد زیر تنظیم شده است:

7baf980463a86a5c.png

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

8. برنامه را تست کنید

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

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

همچنین می توانید آن را از لیست توابع ابری آزمایش کنید. عملکرد مستقر را انتخاب کنید و به برگه "TESTING" بروید. در کادر متن بخش Configure triggering event برای درخواست json، موارد زیر را وارد کنید:

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

روی دکمه TEST THE FUNCTION کلیک کنید و نتیجه را در سمت راست صفحه مشاهده خواهید کرد:

e21f806d661996ff.png

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

9. پاکسازی کنید

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

  1. در کنسول Google Cloud، به مدیریت بروید
  2. صفحه منابع
  3. در لیست پروژه، پروژه ای را که می خواهید حذف کنید انتخاب کنید و سپس روی Delete کلیک کنید.
  4. در محاوره، شناسه پروژه را تایپ کنید و سپس روی Shut down کلیک کنید تا پروژه حذف شود.

10. تبریک می گویم

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