כדי ליצור אינדקס חדש או לעדכן אינדקס קיים, צריך לספק וקטורים לחיפוש וקטורים בפורמט ובמבנה שמתוארים בקטעים הבאים.
דרישות מוקדמות
אחסון נתוני הקלט בקטגוריה של Cloud Storage בפרויקט Cloud de Confiance .
קבצי נתוני הקלט צריכים להיות מאורגנים באופן הבא:
- כל קבוצה של קובצי נתוני קלט צריכה להיות בספרייה אחת ב-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