1. סקירה כללית
במגוון תחומים, מחקר פטנטים הוא כלי חיוני להבנת התחרות, לזיהוי הזדמנויות פוטנציאליות לרישוי או לרכישה ולמניעת הפרה של פטנטים קיימים.
מחקר פטנטים הוא נרחב ומורכב. סינון של מאמרים טכניים רבים כדי למצוא חידושים רלוונטיים הוא משימה קשה. חיפושים מסורתיים שמבוססים על מילות מפתח הם לרוב לא מדויקים ופוגעים בזמן. תקצירים ארוכים וטכניים, ולכן קשה להבין במהירות את הרעיון המרכזי. כתוצאה מכך, חוקרים עלולים לפספס פטנטים חשובים או לבזבז זמן על תוצאות לא רלוונטיות.
הסוד מאחורי המהפכה הזו טמון בחיפוש וקטורים. במקום להסתמך על התאמה פשוטה של מילות מפתח, חיפוש באמצעות וקטורים הופך טקסט לייצוגים מספריים (embeddings). כך אנחנו יכולים לחפש על סמך המשמעות של השאילתה, ולא רק על סמך המילים הספציפיות שבהן השתמשו. בעולם החיפושים בספרות, מדובר בשינוי משמעותי. נניח שמצאתם פטנט על 'מד דופק לביש', גם אם הביטוי המדויק לא מופיע במסמך.
מטרה
בסדנת הקוד הזו נלמד איך להשתמש ב-AlloyDB, בתוסף pgvector וב-Gemini 1.5 Pro, Embeddings ו-Vector Search במקום, כדי להפוך את תהליך החיפוש של פטנטים למהיר יותר, אינטואיטיבי ומדויק יותר.
מה תפַתחו
במסגרת שיעור ה-Lab הזה תלמדו:
- יצירת מכונה של AlloyDB וטעינה של נתונים מ-Patents Public Dataset
- הפעלת התוספים pgvector ו-AI גנרטיבי ב-AlloyDB
- יצירת הטמעות (embeddings) מהתובנות
- ביצוע חיפוש בזמן אמת של דמיון קוסינוס לטקסט החיפוש של המשתמש
- פריסת הפתרון ב-Cloud Functions ללא שרת (serverless)
התרשים הבא מייצג את זרימת הנתונים והשלבים שקשורים להטמעה.
High level diagram representing the flow of the Patent Search Application with AlloyDB
דרישות
2. לפני שמתחילים
יצירת פרויקט
- בדף לבחירת הפרויקט במסוף Google Cloud, בוחרים או יוצרים פרויקט ב-Google Cloud.
- הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט
- נשתמש ב-Cloud Shell, סביבת שורת פקודה שפועלת ב-Google Cloud ומגיעה עם bq טעון מראש. לוחצים על Activate Cloud Shell בחלק העליון של מסוף Google Cloud.
- אחרי שמתחברים ל-Cloud Shell, בודקים שכבר בוצע אימות ושהמזהה של הפרויקט מוגדר כפרויקט באמצעות הפקודה הבאה:
gcloud auth list
- מריצים את הפקודה הבאה ב-Cloud Shell כדי לוודא שהפקודה gcloud מכירה את הפרויקט.
gcloud config list project
- אם הפרויקט לא מוגדר, משתמשים בפקודה הבאה כדי להגדיר אותו:
gcloud config set project <YOUR_PROJECT_ID>
- מפעילים את ממשקי ה-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;
מתן הרשאה
מריצים את ההצהרה הבאה כדי להעניק הרשאת הפעלה לפונקציה 'הטמעה':
GRANT EXECUTE ON FUNCTION embedding TO postgres;
הקצאת התפקיד Vertex AI User לחשבון השירות של AlloyDB
במסוף 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"
משנים את הטבלה כך שתכלול עמודה Vector לאחסון הטמעות (Embeddings)
מריצים את ה-DDL הבא כדי להוסיף את השדה abstract_embeddings לטבלה שיצרנו. העמודה הזו תאפשר אחסון של ערכי הווקטור של הטקסט:
ALTER TABLE patents_data ADD column abstract_embeddings vector(768);
4. טעינת נתוני פטנטים במסד הנתונים
מערכי הנתונים הציבוריים של Google Patents ב-BigQuery ישמשו כמערך הנתונים שלנו. נשתמש ב-AlloyDB Studio כדי להריץ את השאילתות שלנו. המאגר alloydb-pgvector כולל את הסקריפט insert_into_patents_data.sql
שאנחנו מריצים כדי לטעון את נתוני הפטנטים.
- במסוף Google Cloud, פותחים את הדף AlloyDB.
- בוחרים את האשכולות החדשים שנוצרו ולוחצים על המכונה.
- בתפריט הניווט של AlloyDB, לוחצים על AlloyDB Studio. נכנסים באמצעות פרטי הכניסה.
- לוחצים על הסמל כרטיסייה חדשה בצד שמאל כדי לפתוח כרטיסייה חדשה.
- מעתיקים את ביטוי השאילתה
insert
מהסקריפטinsert_into_patents_data.sql
שצוין למעלה לעורך. אפשר להעתיק 50-100 משפטי insert כדי להציג הדגמה מהירה של תרחיש לדוגמה הזה. - לוחצים על Run. התוצאות של השאילתה מופיעות בטבלה Results.
5. יצירת הטמעות (embeddings) לנתוני פטנטים
קודם נבדוק את פונקציית ההטמעה על ידי הרצת השאילתה לדוגמה הבאה:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
הפונקציה הזו אמורה להחזיר את וקטור הטמעת הטקסט, שנראה כמו מערך של מספרים שגופים (floats), עבור טקסט לדוגמה בשאילתה. כך זה נראה:
עדכון שדה הווקטורים 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;
בשאילתה הזו,
- טקסט החיפוש של המשתמש הוא: "מודל חדש של למידת מכונה שקשור לעיבוד שפה טבעית".
- אנחנו ממירים אותו להטמעות (embeddings) בשיטה embedding() באמצעות המודל: textembedding-gecko@003.
- "<=>" מייצג את השימוש בשיטת המרחק COSINE SIMILARITY.
- אנחנו ממירים את התוצאה של שיטת ההטמעה לסוג וקטור כדי שהיא תהיה תואמת לווקטורים ששמורים במסד הנתונים.
- LIMIT 10 מייצג שאנחנו בוחרים את 10 ההתאמות הקרובות ביותר לטקסט החיפוש.
התוצאה מופיעה בהמשך:
כפי שניתן לראות בתוצאות, ההתאמות דומות מאוד לטקסט החיפוש.
7. העברת האפליקציה לאינטרנט
רוצים להעביר את האפליקציה הזו לאינטרנט? כך עושים זאת:
- נכנסים ל-Cloud Shell Editor ולוחצים על הסמל 'Cloud Code – Sign in' (Cloud Code – כניסה) בפינה הימנית התחתונה (סרגל הסטטוס) של העורך. בוחרים את הפרויקט הנוכחי ב-Google Cloud שבו החיוב מופעל, ומוודאים שנכנסתם לאותו פרויקט גם ב-Gemini (בפינה השמאלית של שורת הסטטוס).
- לוחצים על סמל Cloud Code וממתינים עד שתיבת הדו-שיח של Cloud Code תופיע. בוחרים באפשרות 'אפליקציה חדשה' ובחלון הקופץ 'יצירת אפליקציה חדשה', בוחרים באפליקציית Cloud Functions:
בדף 2 מתוך 2 בחלון הקופץ Create New Application (יצירת אפליקציה חדשה), בוחרים באפשרות Java: Hello World ומזינים את שם הפרויקט alloydb-pgvector במיקום המועדף, ולוחצים על OK (אישור):
- במבנה הפרויקט שנוצר, מחפשים את הקובץ pom.xml ומחליפים אותו בתוכן מקובץ המאגר. צריכים להיות לו יחסי התלות הבאים, בנוסף לכמה יחסי תלות נוספים:
- מחליפים את הקובץ 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('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);
}
- כדי לפרוס את פונקציית 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. מחפשים את הפונקציה החדשה שנוצרה ופותחים אותה, עורכים את ההגדרות ומשנים את הפרטים הבאים:
- מעבר להגדרות של סביבת זמן ריצה, build, חיבורים ואבטחה
- הגדלת הזמן הקצוב לתפוגה ל-180 שניות
- עוברים לכרטיסייה CONNECTIONS (חיבורים):
- בהגדרות Ingress, מוודאים שהאפשרות Allow all traffic (אישור כל התנועה) מסומנת.
- בקטע Egress settings (הגדרות תעבורת נתונים יוצאת), לוחצים על התפריט הנפתח Network (רשת) ובוחרים באפשרות Add New VPC Connector (הוספת מחבר VPC חדש). פועלים לפי ההוראות שמופיעות בתיבת הדו-שיח הקופצת:
- נותנים שם למחבר VPC ומוודאים שהאזור זהה לאזור של המכונה. משאירים את הערך של Network כברירת מחדל ומגדירים את Subnet כטווח IP מותאם אישית עם טווח ה-IP 10.8.0.0 או משהו דומה שזמין.
- מרחיבים את האפשרות SHOW SCALING SETTINGS (הצגת הגדרות התאמה לעומס) ומוודאים שההגדרות מוגדרות בדיוק כך:
- לוחצים על 'יצירה' והמחבר הזה אמור להופיע בהגדרות תעבורת הנתונים היוצאת.
- בוחרים את המחבר החדש שנוצר.
- בוחרים שכל התנועה תנותב דרך המחבר הזה של 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"}'
תוצאה:
אפשר גם לבדוק אותה מהרשימה Cloud Functions. בוחרים את הפונקציה שנפרסה ועוברים לכרטיסייה 'בדיקה'. בתיבת הטקסט של הקטע Configure triggering event (הגדרת אירוע הטריגר) עבור request json, מזינים את הטקסט הבא:
{"search": "A new Natural Language Processing related Machine Learning Model"}
לוחצים על הלחצן 'בדיקת הפונקציה' ותוצאת הבדיקה תוצג בצד שמאל של הדף:
זהו! כך פשוט לבצע חיפוש דמיון וקטורי באמצעות מודל הטמעת הנתונים (Embeddings) בנתונים של AlloyDB.
9. הסרת המשאבים
כדי להימנע מצבירת חיובים בחשבון Google Cloud על המשאבים שבהם השתמשתם בפוסט הזה, פועלים לפי השלבים הבאים:
10. מזל טוב
מעולה! ביצעתם חיפוש דמיון באמצעות AlloyDB, pgvector ו-Vector search. שילוב היכולות של AlloyDB, Vertex AI ו-Vector Search אפשר לנו לקחת צעד ענק קדימה ביצירת חיפושים של ספרות שיהיו נגישים, יעילים ומבוססי-משמעות.