פיתוח אפליקציה לחיפוש פטנטים באמצעות AlloyDB, Vector Search ו-Vertex AI!

1. סקירה כללית

במגוון תעשיות, מחקר פטנטים הוא כלי חשוב להבנת הסביבה התחרותית, לזיהוי הזדמנויות פוטנציאליות לרישוי או לרכישה ולמניעת הפרה של פטנטים קיימים.

מחקר פטנטים הוא נרחב ומורכב. החיפוש בין אינספור תקצירים טכניים כדי למצוא חידושים רלוונטיים הוא משימה לא פשוטה. חיפושים מסורתיים שמבוססים על מילות מפתח הם לרוב לא מדויקים וגוזלים זמן רב. התקצירים ארוכים וטכניים, ולכן קשה להבין במהירות את הרעיון המרכזי. כתוצאה מכך, חוקרים עלולים לפספס פטנטים חשובים או לבזבז זמן על תוצאות לא רלוונטיות.

הסוד מאחורי המהפכה הזו הוא חיפוש וקטורי. במקום להסתמך על התאמה פשוטה של מילות מפתח, חיפוש וקטורי הופך טקסט לייצוגים מספריים (הטמעה). כך אנחנו יכולים לחפש על סמך המשמעות של השאילתה, ולא רק על סמך המילים הספציפיות שבה. בעולם החיפושים בספרות, זהו שינוי משמעותי. דמיינו שאתם מחפשים פטנט על "מד דופק לביש" גם אם הביטוי המדויק לא מופיע במסמך.

מטרה

בסדנת הקוד הזו, נשתמש ב-AlloyDB, בתוסף pgvector וב-Gemini 1.5 Pro, ב-Embeddings וב-Vector Search כדי להפוך את תהליך החיפוש של פטנטים למהיר, אינטואיטיבי ומדויק במיוחד.

מה תפַתחו

במסגרת שיעור ה-Lab הזה:

  1. יצירת מכונת AlloyDB וטעינת נתונים ממערך הנתונים הציבורי של פטנטים
  2. הפעלת תוספים של pgvector ומודלים של AI גנרטיבי ב-AlloyDB
  3. יצירת הטמעות מהתובנות
  4. ביצוע חיפוש בזמן אמת של דמיון קוסינוס לטקסט החיפוש של המשתמש
  5. פריסת הפתרון ב-Cloud Functions ללא שרת

בתרשים הבא מוצג תהליך הנתונים והשלבים שנדרשים להטמעה.

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.

תמונה של לחצן Activate 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.

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

נותנים לחשבון השירות של AlloyDB את התפקיד Vertex AI User

במסוף IAM של 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(3072);

4. טעינת נתוני פטנטים למסד הנתונים

נשתמש ב-Google Patents Public Datasets ב-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 שצוין למעלה אל העורך. אפשר להעתיק 50-100 הצהרות insert כדי ליצור הדגמה מהירה של תרחיש השימוש הזה.
  6. לוחצים על Run. התוצאות של השאילתה יופיעו בטבלה Results.

5. יצירת הטמעות לנתוני פטנטים

קודם נבדוק את פונקציית ההטמעה על ידי הרצת השאילתה לדוגמה הבאה:

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);

6. ביצוע חיפוש וקטורי

עכשיו, אחרי שהטבלה, הנתונים וההטמעות מוכנים, אפשר לבצע את חיפוש הווקטור בזמן אמת של טקסט החיפוש של המשתמש. כדי לבדוק את זה, מריצים את השאילתה הבאה:

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.
  3. ‫"<=>" מייצג את השימוש בשיטת המרחק COSINE SIMILARITY.
  4. אנחנו ממירים את התוצאה של שיטת ההטמעה לסוג וקטור כדי שתהיה תואמת לווקטורים שמאוחסנים במסד הנתונים.
  5. הערך LIMIT 10 מייצג את 10 ההתאמות הכי קרובות של טקסט החיפוש.

זו התוצאה:

8e77af965fc787ae.png

כפי שאפשר לראות בתוצאות, ההתאמות קרובות מאוד לטקסט החיפוש.

7. העברת האפליקציה לאינטרנט

מוכנים להעביר את האפליקציה הזו לאינטרנט? כך עושים זאת:

  1. עוברים אל Cloud Shell Editor ולוחצים על הסמל Cloud Code — Sign in (Cloud Code – כניסה) בפינה הימנית למטה (סרגל המצב) של העורך. בוחרים את הפרויקט הנוכחי ב-Google Cloud שבו החיוב מופעל, ומוודאים שאתם מחוברים לאותו פרויקט גם מ-Gemini (בפינה השמאלית של שורת המצב).
  2. לוחצים על סמל Cloud Code ומחכים עד שתיבת הדו-שיח של Cloud Code תופיע. בוחרים באפשרות 'אפליקציה חדשה' ובחלון הקופץ 'יצירת אפליקציה חדשה' בוחרים באפשרות 'אפליקציית Cloud Functions':

a800ee1eb6cb8a5b.png

בדף 2 מתוך 2 בחלון הקופץ Create New Application (יצירת אפליקציה חדשה), בוחרים באפשרות Java: Hello World (ג'אווה: שלום עולם), מזינים את שם הפרויקט כ-alloydb-pgvector במיקום המועדף ולוחצים על OK (אישור):

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('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 Functions שיצרתם, מריצים את הפקודה הבאה בטרמינל של 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. מעבר להגדרות של זמן הריצה, ה-build, החיבורים והאבטחה
  2. הארכת משך הזמן הקצוב לתפוגה ל-180 שניות
  3. עוברים לכרטיסייה 'חיבורים':

4e83ec8a339cda08.png

  1. בהגדרות Ingress, מוודאים שהאפשרות Allow all traffic (התרת כל התנועה) נבחרה.
  2. בקטע Egress settings (הגדרות יציאה), לוחצים על התפריט הנפתח Network (רשת) ובוחרים באפשרות Add New VPC Connector (הוספת מחבר VPC חדש). פועלים לפי ההוראות שמופיעות בתיבת הדו-שיח שקופצת:

8126ec78c343f199.png

  1. מזינים שם למחבר ה-VPC ומוודאים שהאזור זהה לאזור של המכונה הווירטואלית. משאירים את ערך הרשת כברירת מחדל ומגדירים את תת-הרשת כטווח 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

אפשר גם לבדוק אותה מרשימת Cloud Functions. בוחרים את הפונקציה שפרסתם ועוברים לכרטיסייה 'בדיקה'. בתיבת הטקסט של הקטע Configure triggering event (הגדרת אירוע הפעלה) בשדה request json (בקשת JSON), מזינים את הטקסט הבא:

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

לוחצים על הלחצן TEST THE FUNCTION (בדיקת הפונקציה) והתוצאה מופיעה בצד שמאל של הדף:

e21f806d661996ff.png

זהו! זה כל מה שצריך כדי לבצע חיפוש דמיון וקטורי באמצעות מודל ה-Embeddings בנתוני AlloyDB.

9. הסרת המשאבים

כדי לא לצבור חיובים לחשבון Google Cloud על המשאבים שבהם השתמשתם במאמר הזה:

  1. במסוף Google Cloud, עוברים אל Manage
  2. בדף resources.
  3. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  4. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

10. מזל טוב

מעולה! ביצעתם בהצלחה חיפוש דמיון באמצעות AlloyDB, ‏ pgvector וחיפוש וקטורי. שילוב היכולות של AlloyDB,‏ Vertex AI ו-Vector Search מאפשר לנו לעשות קפיצת מדרגה משמעותית ולהפוך את החיפושים בספרות לנגישים, יעילים ומבוססים על משמעות.