github.com/weaviate/weaviate@v1.24.6/modules/text2vec-openai/vectorizer/objects.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package vectorizer
    13  
    14  import (
    15  	"context"
    16  
    17  	"github.com/weaviate/weaviate/entities/models"
    18  	"github.com/weaviate/weaviate/entities/moduletools"
    19  	"github.com/weaviate/weaviate/modules/text2vec-openai/ent"
    20  	objectsvectorizer "github.com/weaviate/weaviate/usecases/modulecomponents/vectorizer"
    21  	libvectorizer "github.com/weaviate/weaviate/usecases/vectorizer"
    22  )
    23  
    24  type Vectorizer struct {
    25  	client           Client
    26  	objectVectorizer *objectsvectorizer.ObjectVectorizer
    27  }
    28  
    29  func New(client Client) *Vectorizer {
    30  	return &Vectorizer{
    31  		client:           client,
    32  		objectVectorizer: objectsvectorizer.New(),
    33  	}
    34  }
    35  
    36  type Client interface {
    37  	Vectorize(ctx context.Context, input string,
    38  		config ent.VectorizationConfig) (*ent.VectorizationResult, error)
    39  	VectorizeQuery(ctx context.Context, input []string,
    40  		config ent.VectorizationConfig) (*ent.VectorizationResult, error)
    41  }
    42  
    43  // IndexCheck returns whether a property of a class should be indexed
    44  type ClassSettings interface {
    45  	PropertyIndexed(property string) bool
    46  	VectorizePropertyName(propertyName string) bool
    47  	VectorizeClassName() bool
    48  	Model() string
    49  	Type() string
    50  	ModelVersion() string
    51  	ResourceName() string
    52  	DeploymentID() string
    53  	BaseURL() string
    54  	IsAzure() bool
    55  }
    56  
    57  func (v *Vectorizer) Object(ctx context.Context, object *models.Object,
    58  	comp moduletools.VectorizablePropsComparator, cfg moduletools.ClassConfig,
    59  ) ([]float32, models.AdditionalProperties, error) {
    60  	vec, err := v.object(ctx, object.Class, comp, cfg)
    61  	return vec, nil, err
    62  }
    63  
    64  func (v *Vectorizer) object(ctx context.Context, className string,
    65  	comp moduletools.VectorizablePropsComparator, cfg moduletools.ClassConfig,
    66  ) ([]float32, error) {
    67  	text, vector := v.objectVectorizer.TextsOrVector(ctx, className, comp, NewClassSettings(cfg), cfg.TargetVector())
    68  	if vector != nil {
    69  		// dont' re-vectorize
    70  		return vector, nil
    71  	}
    72  	// vectorize text
    73  	res, err := v.client.Vectorize(ctx, text, v.getVectorizationConfig(cfg))
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  
    78  	if len(res.Vector) > 1 {
    79  		return libvectorizer.CombineVectors(res.Vector), nil
    80  	}
    81  	return res.Vector[0], nil
    82  }
    83  
    84  func (v *Vectorizer) getVectorizationConfig(cfg moduletools.ClassConfig) ent.VectorizationConfig {
    85  	settings := NewClassSettings(cfg)
    86  	return ent.VectorizationConfig{
    87  		Type:         settings.Type(),
    88  		Model:        settings.Model(),
    89  		ModelVersion: settings.ModelVersion(),
    90  		ResourceName: settings.ResourceName(),
    91  		DeploymentID: settings.DeploymentID(),
    92  		BaseURL:      settings.BaseURL(),
    93  		IsAzure:      settings.IsAzure(),
    94  		Dimensions:   settings.Dimensions(),
    95  	}
    96  }