Vektör yerleştirilmiş öğeleri kullanarak arama

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örlerle DOT_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şittir
  • in
  • 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.
  • Verileri önceden filtrelemek için eşitsizlik filtrelerini kullanamazsınız.
  • Vektör aramasını yalnızca Python ve Node.js istemci kitaplıkları destekler.

Sırada ne var?