כדי ליצור אינדקס חדש או לעדכן אינדקס קיים, צריך לספק וקטורים לחיפוש וקטורים בפורמט ובמבנה שמתוארים בקטעים הבאים.
דרישות מוקדמות
מאחסנים את נתוני הקלט בקטגוריה של Cloud Storage, בפרויקט Google Cloud .
קבצי נתוני הקלט צריכים להיות מאורגנים באופן הבא:
- כל קבוצה של קובצי נתוני קלט צריכה להיות בספרייה אחת ב-Cloud Storage.
- צריך למקם את קובצי הנתונים ישירות מתחת ל-
batch_rootולתת להם שמות עם הסיומות הבאות:.csv,.jsonו-.avro. - יש מגבלה של 5,000 אובייקטים (קבצים) בספריית השורש של החבילה.
- כל קובץ נתונים מתפרש כקבוצה של רשומות. הפורמט של הרשומה נקבע לפי הסיומת של שם הקובץ, והדרישות לגבי הפורמט מתוארות. פורמטים של קובצי נתונים
- כל רשומה צריכה לכלול
id, וקטור תכונות ושדות אופציונליים שנתמכים על ידי Vertex AI Feature Store, כמו restrictions ו-crowding. - יכול להיות שקיימת תת-ספרייה בשם
delete. כל קובץ שנמצא ישירות מתחת ל-batch_root/deleteנחשב לקובץ טקסט שלidרשומות, כשכל שורה מכילהid. - אסור להשתמש בכל שאר תיקיות המשנה.
- אין תמיכה בהמרת קידוד של קבצים דחוסים באמצעות gzip כנתוני קלט.
עיבוד נתוני הקלט
- כל הרשומות מכל קובצי הנתונים, כולל אלה שבקטע
delete, מורכבות מחבילת קלט אחת. - הסדר היחסי של הרשומות בקובץ נתונים לא חשוב.
- מזהה יחיד צריך להופיע רק פעם אחת בחבילה. אם יש כפילות עם אותו מזהה, היא מוצגת כספירה של וקטור אחד.
- מזהה לא יכול להופיע גם בקובץ נתונים רגיל וגם בקובץ נתוני מחיקה.
- כל המזהים מקובץ נתונים שנמצאים במצב מחיקה יוסרו מגרסת האינדקס הבאה.
- רשומות מקובצי נתונים רגילים נכללות בגרסה הבאה, ומחליפות ערך בגרסה ישנה יותר של האינדקס.
דוגמאות להטמעות צפופות, דלילות והיברידיות:
הטמעות צפופות:
{"id": "1", "embedding": [1,1,1]} {"id": "2", "embedding": [2,2,2]}הטמעות דלילות:
{"id": "3", "sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1, 4]}} {"id": "4", "sparse_embedding": {"values": [-0.4, 0.2, -1.3], "dimensions": [10, 20, 20]}}הטמעות היברידיות:
{"id": "5", "embedding": [5, 5, -5], "sparse_embedding": {"values": [0.1], "dimensions": [500]}} {"id": "6", "embedding": [6, 7, -8.1], "sparse_embedding": {"values": [0.1, -0.2], "dimensions": [40, 901]}}
דוגמה לארגון קובץ נתוני קלט תקין:
batch_root/
feature_file_1.csv
feature_file_2.csv
delete/
delete_file.txt
הקבצים feature_file_1.csv ו-feature_file_2.csv מכילים רשומות בפורמט CSV. הקובץ delete_file.txt מכיל רשימה של מזהי רשומות שיימחקו מהגרסה הבאה של האינדקס.
פורמטים של קובצי נתונים
JSON
- מקודדים את קובץ ה-JSON באמצעות UTF-8.
- כל שורה בקובץ ה-JSON תפורש כאובייקט JSON נפרד.
- כל רשומה צריכה לכלול שדה
idכדי לציין את המזהה של הווקטור. - כל רשומה צריכה להכיל לפחות אחד מהערכים
embeddingאוsparse_embedding. - השדה
embeddingהוא מערך שלNמספרים עשרוניים שמייצגים את וקטור התכונות, כאשרNהוא הממד של וקטור התכונות שהוגדר כשנוצר האינדקס. אפשר להשתמש בשדה הזה רק להטמעות צפופות.-
configs.dimensions, שמוגדר בזמן יצירת האינדקס, חייב להיות באורך זהה לזה שלembeddings. הפונקציהconfigs.dimensionsחלה רק עלembedding, ולא עלsparse_embedding.
-
- השדה
sparse_embeddingהוא אובייקט עם השדותvaluesו-dimensions. השדהvaluesהוא רשימה של מספרים עם נקודה עשרונית שמייצגים את וקטור התכונות, והשדהdimensionsהוא רשימה של מספרים שלמים שמייצגים את המימד שבו נמצא הערך התואם. לדוגמה, אפשר לייצג הטמעה דלילה שנראית כך:[0,0.1,0,0,0.2], באופן הבא:"sparse_embedding": {"values": [0.1, 0.2], "dimensions": [1,4]}. אפשר להשתמש בשדה הזה רק להטמעות דלילות.- האורך של
sparse_embedding.valuesחייב להיות זהה לאורך שלsparse_embedding.dimensions. הם לא צריכים להיות באורך זהה ל-configs.dimensions, שמצוין בזמן יצירת האינדקס ולא חל עלsparse_embedding.
- האורך של
- אפשר לכלול שדה אופציונלי
restrictsשמציין מערך של אובייקטיםTokenNamespaceב-restricts. לכל אובייקט:- מציינים שדה
namespaceשהואTokenNamespace.namespace. - אפשר להגדיר שדה אופציונלי
allowכמערך של מחרוזות שהן רשימתTokenNamespace.string_tokens. - אפשר להגדיר שדה אופציונלי
denyכמערך של מחרוזות שהן רשימתTokenNamespace.string_blacklist_tokens. - אם השדה
crowding_tagקיים, הערך שלו חייב להיות מחרוזת.
- מציינים שדה
- אפשר לכלול שדה אופציונלי
numeric_restrictsשמציין מערך שלNumericRestrictNamespace. לכל אובייקט:- מציינים שדה
namespaceשהואNumericRestrictNamespace.namespace. - אחד משדות הערך
value_int,value_floatו-value_double. - אסור שיהיה בו שדה בשם op. השדה הזה מיועד רק לשאילתות.
- מציינים שדה
Avro
- צריך להשתמש בקובץ Avro תקין.
- כדי לייצג נקודת נתונים דלילה בלבד, מספקים הטמעה דלילה בשדה
sparse_embeddingומזינים רשימה ריקה בשדהembedding. יוצרים רשומות לפי הסכימה הבאה:
{ "type": "record", "name": "FeatureVector", "fields": [ { "name": "id", "type": "string" }, { "name": "embedding", "type": { "type": "array", "items": "float" } }, { "name": "sparse_embedding", "type": [ "null", { "type": "record", "name": "sparse_embedding", "fields": [ { "name": "values", "type": { "type": "array", "items": "float" } }, { "name": "dimensions", "type": { "type": "array", "items": "long" } } ] } ] }, { "name": "restricts", "type": [ "null", { "type": "array", "items": { "type": "record", "name": "Restrict", "fields": [ { "name": "namespace", "type": "string" }, { "name": "allow", "type": [ "null", { "type": "array", "items": "string" } ] }, { "name": "deny", "type": [ "null", { "type": "array", "items": "string" } ] } ] } } ] }, { "name": "numeric_restricts", "type": [ "null", { "type": "array", "items": { "name": "NumericRestrict", "type": "record", "fields": [ { "name": "namespace", "type": "string" }, { "name": "value_int", "type": [ "null", "int" ], "default": null }, { "name": "value_float", "type": [ "null", "float" ], "default": null }, { "name": "value_double", "type": [ "null", "double" ], "default": null } ] } } ], "default": null }, { "name": "crowding_tag", "type": [ "null", "string" ] } ] }
CSV
- פורמט:
ID,N feature vector values,Any number of dimension:value sparse values,name=value lists - מקודדים את קובץ ה-CSV באמצעות UTF-8.
- כל שורה בקובץ ה-CSV צריכה להכיל רשומה אחת בדיוק.
- הערך הראשון בכל שורה חייב להיות מזהה הווקטור, שחייב להיות מחרוזת UTF-8 תקינה.
- אחרי המזהה, צריך לציין לפחות הטמעה צפופה אחת או הטמעה דלילה אחת.
- במקרה של הטמעה צפופה,
Nהערכים הבאים מייצגים את וקטור התכונות, כאשרNהוא המימד של וקטור התכונות שהוגדר כשנוצר האינדקס. - בהטמעה דלילה, אפשר לציין כל מספר של
dimension:value, כאשרvalueמנותח כמספר עשרוני ו-dimensionמנותח כ-long. - בהטמעה היברידית שכוללת גם הטמעות צפופות וגם הטמעות דלילות, צריך לציין את ההטמעות הצפופות לפני ההטמעות הדלילות.
- ערכי הווקטור של התכונות צריכים להיות מספרים עשרוניים קבועים, כמו שמוגדר במפרט של שפת Java.
- ערכים נוספים יכולים להיות בפורמט
name=value. - השם
crowding_tagמתפרש כתג ריווח, והוא יכול להופיע רק פעם אחת ברשומה. כל שאר הזוגות
name=valueמפורשים כהגבלות של מרחב שמות של טוקנים. יכול להיות ששם יחזור על עצמו אם יש כמה ערכים במרחב שמות.לדוגמה,
color=red,color=blueמייצג אתTokenNamespace:{ "namespace": "color" "string_tokens": ["red", "blue"] }אם הערך מתחיל ב-
!, שאר המחרוזת מתפרשת כערך מוחרג.לדוגמה,
color=!redמייצג אתTokenNamespace:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
#name=numericValuepairs with number type suffix is interpreted as numeric namespace restricts. הסיומת של סוג המספר היאiעבור int,fעבור float ו-dעבור double. אסור לחזור על אותו שם כי לכל מרחב שמות צריך להיות משויך ערך יחיד.לדוגמה,
#size=3iמייצג אתNumericRestrictNamespace:{ "namespace": "size" "value_int": 3 }#ratio=0.1fמייצג אתNumericRestrictNamespace:{ "namespace": "ratio" "value_float": 0.1 }#weight=0.3dמייצג אתNumericRestriction:{ "namespace": "weight" "value_double": 0.3 }בדוגמה הבאה מוצג נתון עם
id: "6",embedding: [7, -8.1],sparse_embedding: {values: [0.1, -0.2, 0.5], dimensions: [40, 901, 1111]}, תג הצפיפותtest, רשימת הטוקנים המותריםcolor: red, blue, רשימת הטוקנים האסוריםcolor: purpleוההגבלה המספריתratioעם הערך0.1:6,7,-8.1,40:0.1,901:-0.2,1111:0.5,crowding_tag=test,color=red,color=blue,color=!purple,ratio=0.1f