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
ממסוף Google Cloud IAM, מעניקים לחשבון השירות AlloyDB (שנראה כך: service-<<PROJECT_NUMBER>>@gcp-sa-alloydb.iam.gserviceaccount.com) לתפקיד 'Vertex AI User'. בשדה 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. יצירת הטמעות לנתוני פטנטים
קודם נבדוק את פונקציית ההטמעה על ידי הרצת השאילתה לדוגמה הבאה:
SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');
הפונקציה הזו אמורה להחזיר את וקטור הטמעת הטקסט, שנראה כמו מערך של מספרים שמוצגים בספרות עשרוניות, עבור הטקסט לדוגמה בשאילתה. כך זה נראה:
עדכון שדה הווקטורים abstract_embeddings
מריצים את ה-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;
בשאילתה הזו,
- טקסט החיפוש של המשתמש הוא: "מודל חדש של למידת מכונה שקשור לעיבוד שפה טבעית".
- אנחנו ממירים אותו ל-embeddings בשיטה embedding() באמצעות המודל: textembedding-gecko@003.
- '<=>' מייצג את השימוש בשיטת המרחק COSINE LOGINITY.
- אנחנו ממירים את התוצאה של שיטת ההטמעה לסוג וקטור, כדי שתהיה תואמת לווקטורים שמאוחסנים במסד הנתונים.
- המשמעות של 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
שלב חשוב:
אחרי שתגדירו את הפריסה, תוכלו לראות את הפונקציות במסוף Google Cloud Run Functions. מחפשים את הפונקציה החדשה שנוצרה ופותחים אותה, עורכים את ההגדרות ומשנים את הפרטים הבאים:
- מעבר להגדרות של סביבת זמן ריצה, 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 אפשר לנו לקחת צעד ענק קדימה ביצירת חיפושים של ספרות שיהיו נגישים, יעילים ומבוססי-משמעות.