Bu sayfada, K-nearest uygulamalarını kullanmak için Cloud Firestore'un nasıl kullanılacağı gösterilmektedir Aşağıdaki teknikleri kullanarak komşu (KNN) vektör aramaları:
- Vektör değerlerini depola
- KNN vektör dizinlerini oluşturma ve yönetme
- Desteklenen vektörlerden birini kullanarak K-en yakın-komşu (KNN) sorgusu yapma mesafe işlevleri
Vektör yerleştirmeleri depolama
Web sayfalarınızdan metin yerleştirmeler gibi vektör değerleri Cloud Firestore verilerini kullanabilir ve Cloud Firestore belgelerinde depolayabilirsiniz.
Vektör yerleştirmeyi içeren yazma işlemi
Aşağıdaki örnekte, bir vektör yerleştirmenin nasıl depolanacağını Cloud Firestore belgesi:
Python
from google.cloud import firestore from google.cloud.firestore_v1.vector import Vector firestore_client = firestore.Client() collection = firestore_client.collection("coffee-beans") doc = { "name": "Kahawa coffee beans", "description": "Information about the Kahawa coffee beans.", "embedding_field": Vector([1.0 , 2.0, 3.0]) } collection.add(doc)
Node.js
import { Firestore, FieldValue, } from "@google-cloud/firestore"; const db = new Firestore(); const coll = db.collection('coffee-beans'); await coll.add({ name: "Kahawa coffee beans", description: "Information about the Kahawa coffee beans.", embedding_field: FieldValue.vector([1.0 , 2.0, 3.0]) });
Cloud Functions işleviyle vektör yerleştirmeleri hesaplayın
Bir doküman güncellendiğinde veya bir Cloud Functions işlevi oluşturabilirsiniz:
Python
@functions_framework.cloud_event def store_embedding(cloud_event) -> None: """Triggers by a change to a Firestore document. """ firestore_payload = firestore.DocumentEventData() payload = firestore_payload._pb.ParseFromString(cloud_event.data) collection_id, doc_id = from_payload(payload) # Call a function to calculate the embedding embedding = calculate_embedding(payload) # Update the document doc = firestore_client.collection(collection_id).document(doc_id) doc.set({"embedding_field": embedding}, merge=True)
Node.js
/** * A vector embedding will be computed from the * value of the `content` field. The vector value * will be stored in the `embedding` field. The * field names `content` and `embedding` are arbitrary * field names chosen for this example. */ async function storeEmbedding(event: FirestoreEvent<any>): Promise<void> { // Get the previous value of the document's `content` field. const previousDocumentSnapshot = event.data.before as QueryDocumentSnapshot; const previousContent = previousDocumentSnapshot.get("content"); // Get the current value of the document's `content` field. const currentDocumentSnapshot = event.data.after as QueryDocumentSnapshot; const currentContent = currentDocumentSnapshot.get("content"); // Don't update the embedding if the content field did not change if (previousContent === currentContent) { return; } // Call a function to calculate the embedding for the value // of the `content` field. const embeddingVector = calculateEmbedding(currentContent); // Update the `embedding` field on the document. await currentDocumentSnapshot.ref.update({ embedding: embeddingVector, }); }
Vektör dizinleri oluşturma ve yönetme
Vektör yerleştirmelerinizi kullanarak en yakın komşu araması yapmadan önce karşılık gelen bir dizin oluşturmanız gerekir. Aşağıdaki örneklerde Vektör dizinleri oluşturmayı ve yönetmeyi öğreneceğiz.
Vektör dizini oluşturma
Bir vektör dizini oluşturmak için,
gcloud alpha firestore indexes composite create
:
gcloud
gcloud alpha firestore indexes composite create \ --collection-group=collection-group \ --query-scope=COLLECTION \ --field-config field-path=vector-field,vector-config='vector-configuration' \ --database=database-id
Bu örnekte:
- collection-group, koleksiyon grubunun kimliğidir.
- vector-field, vektör yerleştirmeyi içeren alanın adıdır.
- database-id, veritabanının kimliğidir.
- vector-configuration,
dimension
vektörünü ve dizin türünü içeriyor.dimension
, 2048'e kadar olan bir tam sayıdır. Dizin türüflat
olmalıdır. Dizin yapılandırmasını şu şekilde biçimlendirin:{"dimension":"DIMENSION", "flat": "{}"}
.
Aşağıdaki örnek, vector-field
alanı için bir vektör dizini içeren bileşik bir dizin oluşturur
ve color
alanı için artan bir dizin. Bu dizin türünü, önceden filtre uygulamak için kullanabilirsiniz
verilerini görebilirsiniz.
gcloud
gcloud alpha firestore indexes composite create \ --collection-group=collection-group \ --query-scope=COLLECTION \ --field-config=order=ASCENDING,field-path="color" \ --field-config field-path=vector-field,vector-config='{"dimension":"1024", "flat": "{}"}' \ --database=database-id
Tüm vektör dizinlerini listeleme
gcloud
gcloud alpha firestore indexes composite list --database=database-id
database-id değerini veritabanının kimliğiyle değiştirin.
Vektör dizinini silme
gcloud
gcloud alpha firestore indexes composite delete index-id --database=database-id
Bu örnekte:
- index-id, silinecek dizinin kimliğidir.
Dizin kimliğini almak için
indexes composite list
işlevini kullanın. - database-id, veritabanının kimliğidir.
Vektör endeksini açıklama
gcloud
gcloud alpha firestore indexes composite describe index-id --database=database-id
Bu örnekte:
- index-id, açıklanacak dizin kimliğidir. veya
Dizin kimliğini almak için
indexes composite list
. - database-id, veritabanının kimliğidir.
En yakın komşu sorgusu oluşturma
Bir yerin en yakın komşularını bulmak için benzerlik araması yapabilirsiniz. vektör yerleştirme. Benzerlik aramaları için vektör dizinleri gerekir. Dizin yoksa Cloud Firestore, oluşturulması için bir dizin önerir kullanarak gcloud KSA'yı kullanabilirsiniz.
Python
from google.cloud.firestore_v1.base_vector_query import DistanceMeasure collection = collection("coffee-beans") # Requires vector index collection.find_nearest( vector_field="embedding_field", query_vector=Vector([3.0, 1.0, 2.0]), distance_measure=DistanceMeasure.EUCLIDEAN, limit=5)
Node.js
import { Firestore, FieldValue, VectorQuery, VectorQuerySnapshot, } from "@google-cloud/firestore"; // Requires single-field vector index const vectorQuery: VectorQuery = coll.findNearest('embedding_field', FieldValue.vector([3.0, 1.0, 2.0]), { limit: 5, distanceMeasure: 'EUCLIDEAN' }); const vectorQuerySnapshot: VectorQuerySnapshot = await vectorQuery.get();
Vektör mesafeleri
En yakın komşu sorgular, vektör mesafesi için aşağıdaki seçenekleri destekler:
EUCLIDEAN
: Vektörler arasındaki EUCLIDEAN mesafesini ölçer. Daha fazla bilgi edinmek için bkz. Öklid.COSINE
: Vektörleri aralarındaki açıya göre karşılaştırır. Bu sayede, Vektörlerin büyüklüğüne dayalı olmayan benzerliği ölçmek yerine, birim normalleştirilmiş vektörlerleDOT_PRODUCT
kullanmanızı öneririz Daha iyi ile matematiksel olarak eşdeğer olan COSINE mesafesi bazı yolları da görmüştük. Daha fazla bilgi edinmek için bkz. Öğrenmek için kosinüs benzerliği daha fazla.DOT_PRODUCT
:COSINE
ile benzerdir ancak vektörleri alır. Daha fazla bilgi edinmek için bkz. Nokta çarpım.
Verileri ön filtrele
En yakın komşuları bulmadan önce verileri önceden filtrelemek için
eşitsizlik filtreleri hariç diğer filtrelerle benzerlik araması and
ve
or
bileşik filtre destekleniyor. Alan filtreleri için aşağıdaki
desteklenen filtreler şunlardır:
==
eşittirin
array_contains
array_contains_any
Python
# Similarity search with pre-filter # Requires composite vector index collection.where("color", "==", "red").find_nearest( vector_field="embedding_field", query_vector=Vector([3.0, 1.0, 2.0]), distance_measure=DistanceMeasure.EUCLIDEAN, limit=5)
Node.js
// Similarity search with pre-filter // Requires composite vector index const preFilteredVectorQuery: VectorQuery = coll .where("color", "==", "red") .findNearest("embedding_field", FieldValue.vector([3.0, 1.0, 2.0]), { limit: 5, distanceMeasure: "EUCLIDEAN", }); vectorQueryResults = await preFilteredVectorQuery.get();
Sınırlamalar
Vektör yerleştirmeleriyle çalışırken aşağıdaki sınırlamaları göz önünde bulundurun:
- Desteklenen maksimum yerleştirme boyutu 2048'dir. Daha büyük dizinleri depolamak için boyutlandırma azaltma.
- En yakın komşu sorgudan döndürülecek maksimum doküman sayısı 1.000'dir.
- Vektör arama, gerçek zamanlı anlık görüntü işleyicileri desteklemez.
- Vektör aramasını yalnızca Python ve Node.js istemci kitaplıkları destekler.
Sırada ne var?
- Cloud Firestore ile ilgili en iyi uygulamalar hakkında bilgi edinin.
- Geniş ölçekte okuma ve yazma işlemlerini anlama