כדי ליצור אינדקס חדש או לעדכן אינדקס קיים, צריך לספק וקטורים לחיפוש וקטורים בפורמט ובמבנה שמתוארים בקטעים הבאים.
דרישות מוקדמות
אחסון נתוני הקלט בקטגוריה של Cloud Storage בפרויקט Google Cloud .
קבצי נתוני הקלט צריכים להיות מאורגנים באופן הבא:
- כל קבוצה של קובצי נתוני קלט צריכה להיות בספרייה אחת ב-Cloud Storage.
- צריך למקם את קובצי הנתונים ישירות מתחת ל-
batch_rootולתת להם שמות עם הסיומות הבאות:.csv,.jsonו-.avro. - יש מגבלה של 5,000 אובייקטים (קבצים) בספריית השורש של האצווה.
- כל קובץ נתונים מתפרש כקבוצה של רשומות. הפורמט של הרשומה נקבע לפי הסיומת של שם הקובץ, והדרישות לגבי הפורמט מתוארות. פורמטים של קובצי נתונים
- לכל רשומה צריכים להיות
id, וקטור תכונות והשדות האופציונליים שלכם שנתמכים על ידי Feature Store של Gemini Enterprise Agent Platform, כמו הגבלות וצפיפות. - יכולה להיות ספריית משנה בשם
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=numericValueעם סיומת של סוג מספר מפורשים כמגבלות של מרחב שמות מספרי. סיומת של סוג מספר היא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