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

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

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

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

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

מטרה

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

מה תפַתחו

במסגרת ה-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, בדף לבחירת הפרויקט, בוחרים או יוצרים פרויקט ב-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. מפעילים את ממשקי ה-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. טקסט החיפוש של המשתמש הוא: "A new Natural Language Processing related Machine Learning Model" (מודל חדש של למידת מכונה שקשור לעיבוד שפה טבעית).
  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

שימו לב שהפונקציה מצפה לקבל את טקסט החיפוש כפרמטר קלט עם המפתח 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 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. עוברים לכרטיסייה CONNECTIONS (חיבורים):

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 Terminal על ידי הפעלת הפקודה הבאה:

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

תוצאה:

da3dcfac7d024031.png

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

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

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

e21f806d661996ff.png

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

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

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

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

10. מזל טוב

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