إنشاء تطبيق للبحث عن براءات الاختراع باستخدام AlloyDB وVector Search & Vertex AI

1. نظرة عامة

في مختلف المجالات، تشكّل أبحاث براءات الاختراع أداة أساسية لفهم المشهد التنافسي وتحديد فرص الترخيص أو الاستحواذ المحتملة وتجنُّب انتهاك براءات الاختراع الحالية.

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

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

الهدف

في هذا البرنامج التعليمي حول رموز البرامج، سنعمل على تسريع عملية البحث عن براءات الاختراع وجعلها أكثر سهولة ودقة من خلال الاستفادة من AlloyDB وإضافة pgvector وGemini 1.5 Pro وEmbeddings وVector Search في الوقت الفعلي.

ما ستُنشئه

كجزء من هذا الدرس التطبيقي، عليك تنفيذ ما يلي:

  1. إنشاء مثيل AlloyDB وتحميل بيانات مجموعة بيانات Patents Public Dataset
  2. تفعيل الإضافات الخاصة بنموذج الذكاء الاصطناعي التوليدي وpgvector في AlloyDB
  3. إنشاء عمليات تضمين من الإحصاءات
  4. إجراء بحث في الوقت الفعلي عن تشابه جيب التمام لنص بحث المستخدِم
  5. نشر الحلّ في دوال Cloud بدون خادم

يمثّل الرسم البياني التالي تدفّق البيانات والخطوات المُتعلّقة بالتنفيذ.

8b73c40a0d12e194.png

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

المتطلبات

  • متصفّح، مثل Chrome أو Firefox
  • مشروع على Google Cloud تم تفعيل الفوترة فيه

2. قبل البدء

إنشاء مشروع

  1. في Google Cloud Console، في صفحة أداة اختيار المشاريع، اختَر مشروعًا على Google Cloud أو أنشِئه.
  2. تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع .
  3. ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومزوّدة مسبقًا بـ bq. انقر على "تفعيل 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. فعِّل واجهات برمجة التطبيقات المطلوبة. يمكنك استخدام أمر 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". انقر على "إنشاء مجموعة". يمكنك الاطّلاع على تفاصيل إنشاء مجموعة في هذا الرابط: 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 AI للحصول على توقّعات في SQL. فعِّل هذه الإضافات من خلال تنفيذ عبارات DDL التالية:

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

منح الإذن

شغِّل العبارة أدناه لمنح الإذن بتنفيذ الدالة "embedding":

GRANT EXECUTE ON FUNCTION embedding TO postgres;

منح دور مستخدم Vertex AI لحساب خدمة AlloyDB

من وحدة تحكّم "إدارة الهوية وإمكانية الوصول" في Google Cloud، امنح حساب خدمة 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"

عدِّل الجدول لإضافة عمود "مصفوفة متجهّة" لتخزين "عمليات التضمين".

نفِّذ لغة 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 Console، افتح صفحة AlloyDB.
  2. اختَر المجموعة التي تم إنشاؤها حديثًا وانقر على المثيل.
  3. في قائمة التنقّل في AlloyDB، انقر على AlloyDB Studio. سجِّل الدخول باستخدام بيانات الاعتماد.
  4. افتح علامة تبويب جديدة بالنقر على رمز علامة تبويب جديدة على يسار الصفحة.
  5. انسخ عبارة طلب البحث insert من النص البرمجي insert_into_patents_data.sql المذكور أعلاه إلى المحرِّر. يمكنك نسخ 50 إلى 100 عبارة إدراج لإجراء عرض توضيحي سريع لهذه الحالة.
  6. انقر على تشغيل. تظهر نتائج طلب البحث في جدول النتائج.

5- إنشاء عمليات تضمين لبيانات براءات الاختراع

أولاً، لنختبر دالة التضمين من خلال تنفيذ نموذج الاستعلام التالي:

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

من المفترض أن يعرض هذا الطلب متجه "العناصر المضمّنة"، الذي يبدو مثل صفيف من الأعداد العشرية، لعينة النص في الطلب. يظهر على النحو التالي:

25a1d7ef0e49e91e.png

تعديل حقل Vector في abstract_embeddings

شغِّل طلب البحث المحدَّد بتنسيق DML أدناه لتعديل ملخّصات براءات الاختراع في الجدول باستخدام عمليات التضمين المقابلة:

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

6- إجراء بحث في Vector

بعد أن أصبح الجدول والبيانات والعناصر المضمّنة جاهزة، لننفِّذ "البحث بالاستناد إلى المتجهات" في الوقت الفعلي عن نص بحث المستخدم. يمكنك اختبار ذلك من خلال تنفيذ الاستعلام أدناه:

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. نحن نحوّلها إلى عناصر مضمّنة في الطريقة embedding() باستخدام النموذج: textembedding-gecko@003.
  3. يشير "<=>" إلى استخدام طريقة المسافة "تشابه جيب التمام".
  4. نحن بصدد تحويل نتيجة طريقة التضمين إلى نوع متجه لجعلها متوافقة مع المتجهات المخزّنة في قاعدة البيانات.
  5. يشير LIMIT 10 إلى أنّنا نختار أقرب 10 نتائج تتطابق مع نص البحث.

في ما يلي النتيجة:

8e77af965fc787ae.png

كما يمكنك ملاحظة ذلك في النتائج، فإنّ المطابقات قريبة جدًا من نص البحث.

7- نقل التطبيق إلى الويب

هل أنت مستعد لنشر هذا التطبيق على الويب؟ يُرجى اتّباع الخطوات التالية:

  1. انتقِل إلى "أداة تعديل Cloud Shell"، وانقر على رمز "Cloud Code - تسجيل الدخول" في أسفل يمين الصفحة (شريط الحالة) في أداة التعديل. اختَر مشروعك الحالي على Google Cloud الذي تم تفعيل الفوترة فيه وتأكَّد من تسجيل الدخول إلى المشروع نفسه من Gemini أيضًا (في الزاوية اليمنى من شريط الحالة).
  2. انقر على رمز Cloud Code وانتظِر إلى أن يظهر مربّع حوار Cloud Code. اختَر "تطبيق جديد"، وفي النافذة المنبثقة "إنشاء تطبيق جديد"، اختَر تطبيق "دوات Cloud":

a800ee1eb6cb8a5b.png

في الصفحة 2 من النافذة المنبثقة "إنشاء تطبيق جديد"، اختَر Java: Hello World وأدخِل اسم مشروعك على النحو التالي: "alloydb-pgvector" في الموقع الجغرافي المفضّل لديك وانقر على "حسنًا":

5b09446ecf7d4f8d.png

  1. في بنية المشروع الناتجة، ابحث عن pom.xml واستبدِله بمحتوى من ملف المستودع. يجب أن يتضمّن هذه التبعيات بالإضافة إلى بضعة عناصر أخرى:

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

خطوة مهمة:

بعد تحديد موعد النشر، من المفترض أن تتمكّن من الاطّلاع على الدوال في وحدة تحكّم Cloud Run Functions في Google. ابحث عن الدالة التي تم إنشاؤها حديثًا وافتحها، وعدِّل الإعدادات وغيِّر ما يلي:

  1. الانتقال إلى "وقت التشغيل" و"الإصدار" و"عمليات الربط" وإعدادات الأمان
  2. زيادة مهلة الانتظار إلى 180 ثانية
  3. انتقِل إلى علامة التبويب "عمليات الربط":

4e83ec8a339cda08.png

  1. ضمن إعدادات Ingress (الدخول)، تأكَّد من اختيار "Allow all traffic" (السماح بكل الزيارات).
  2. ضمن إعدادات "الخروج"، انقر على القائمة المنسدلة "الشبكة" واختَر "إضافة موصل VPC جديد" واتّبِع التعليمات التي تظهر في مربّع الحوار المنبثق:

8126ec78c343f199.png

  1. أدخِل اسمًا لموصِّل VPC وتأكَّد من أنّ المنطقة هي نفسها التي تستخدمها في المثيل. اترك قيمة "الشبكة" على الإعداد التلقائي واضبط "الشبكة الفرعية" على "نطاق IP مخصّص" باستخدام نطاق IP‏ 10.8.0.0 أو أي نطاق مشابه متاح.
  2. وسِّع قسم "عرض إعدادات التكبير/التصغير" وتأكَّد من ضبط الإعدادات على ما يلي بالضبط:

7baf980463a86a5c.png

  1. انقر على "إنشاء"، ومن المفترض أن يظهر هذا الموصّل في إعدادات الخروج الآن.
  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

يمكنك أيضًا اختبارها من قائمة وظائف السحابة الإلكترونية. اختَر الدالة المنشورة وانتقِل إلى علامة التبويب "اختبار". في مربّع نص قسم "ضبط الحدث المشغِّل" لطلب json، أدخِل ما يلي:

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

انقر على زر "اختبار الدالة" وستظهر لك النتيجة على يسار الصفحة:

e21f806d661996ff.png

هذا كل شيء! بهذه البساطة، يمكنك إجراء "بحث متّجه التشابه" باستخدام نموذج "عمليات التضمين" على بيانات AlloyDB.

9. تَنظيم

لتجنُّب تحصيل رسوم من حسابك على Google Cloud مقابل الموارد المستخدَمة في هذه المشاركة، اتّبِع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى إدارة .
  2. صفحة الموارد
  3. في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
  4. في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.

10. تهانينا

تهانينا! لقد أجريت بنجاح عملية بحث عن التشابه باستخدام AlloyDB وpgvector وVector search. من خلال الجمع بين إمكانات AlloyDB وVertex AI والبحث عن المتّجهات، حققنا قفزة كبيرة إلى الأمام في تسهيل عمليات البحث عن المراجع وجعلها أكثر فعالية وتوجيهها نحو المعنى.