github.com/weaviate/weaviate@v1.24.6/modules/text2vec-openai/vectorizer/class_settings_test.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  	"testing"
    16  
    17  	"github.com/pkg/errors"
    18  	"github.com/stretchr/testify/assert"
    19  	"github.com/weaviate/weaviate/entities/models"
    20  	"github.com/weaviate/weaviate/entities/moduletools"
    21  	"github.com/weaviate/weaviate/entities/schema"
    22  	"github.com/weaviate/weaviate/usecases/modules"
    23  )
    24  
    25  func Test_classSettings_Validate(t *testing.T) {
    26  	class := &models.Class{
    27  		Class: "test",
    28  		Properties: []*models.Property{
    29  			{
    30  				DataType: []string{schema.DataTypeText.String()},
    31  				Name:     "test",
    32  			},
    33  		},
    34  	}
    35  	tests := []struct {
    36  		name    string
    37  		cfg     moduletools.ClassConfig
    38  		wantErr error
    39  	}{
    40  		{
    41  			name: "text-embedding-3-small",
    42  			cfg: &fakeClassConfig{
    43  				classConfig: map[string]interface{}{
    44  					"model": "text-embedding-3-small",
    45  				},
    46  			},
    47  		},
    48  		{
    49  			name: "text-embedding-3-small, 512 dimensions",
    50  			cfg: &fakeClassConfig{
    51  				classConfig: map[string]interface{}{
    52  					"model":      "text-embedding-3-small",
    53  					"dimensions": 512,
    54  				},
    55  			},
    56  		},
    57  		{
    58  			name: "text-embedding-3-small, wrong dimensions",
    59  			cfg: &fakeClassConfig{
    60  				classConfig: map[string]interface{}{
    61  					"model":      "text-embedding-3-small",
    62  					"dimensions": 1,
    63  				},
    64  			},
    65  			wantErr: errors.New("wrong dimensions setting for text-embedding-3-small model, available dimensions are: [512 1536]"),
    66  		},
    67  		{
    68  			name: "text-embedding-3-large",
    69  			cfg: &fakeClassConfig{
    70  				classConfig: map[string]interface{}{
    71  					"model": "text-embedding-3-large",
    72  				},
    73  			},
    74  		},
    75  		{
    76  			name: "text-embedding-3-large, 512 dimensions",
    77  			cfg: &fakeClassConfig{
    78  				classConfig: map[string]interface{}{
    79  					"model":      "text-embedding-3-large",
    80  					"dimensions": 1024,
    81  				},
    82  			},
    83  		},
    84  		{
    85  			name: "text-embedding-3-large, wrong dimensions",
    86  			cfg: &fakeClassConfig{
    87  				classConfig: map[string]interface{}{
    88  					"model":      "text-embedding-3-large",
    89  					"dimensions": 512,
    90  				},
    91  			},
    92  			wantErr: errors.New("wrong dimensions setting for text-embedding-3-large model, available dimensions are: [256 1024 3072]"),
    93  		},
    94  		{
    95  			name: "text-embedding-ada-002",
    96  			cfg: &fakeClassConfig{
    97  				classConfig: map[string]interface{}{
    98  					"model":        "ada",
    99  					"modelVersion": "002",
   100  				},
   101  			},
   102  		},
   103  		{
   104  			name: "text-embedding-ada-002 - dimensions error",
   105  			cfg: &fakeClassConfig{
   106  				classConfig: map[string]interface{}{
   107  					"model":      "ada",
   108  					"dimensions": 512,
   109  				},
   110  			},
   111  			wantErr: errors.New("dimensions setting can only be used with V3 embedding models: [text-embedding-3-small text-embedding-3-large]"),
   112  		},
   113  		{
   114  			name: "text-embedding-ada-002 - wrong model version",
   115  			cfg: &fakeClassConfig{
   116  				classConfig: map[string]interface{}{
   117  					"model":        "ada",
   118  					"modelVersion": "003",
   119  				},
   120  			},
   121  			wantErr: errors.New("unsupported version 003"),
   122  		},
   123  		{
   124  			name: "wrong model name",
   125  			cfg: &fakeClassConfig{
   126  				classConfig: map[string]interface{}{
   127  					"model": "unknown-model",
   128  				},
   129  			},
   130  			wantErr: errors.New("wrong OpenAI model name, available model names are: [ada babbage curie davinci text-embedding-3-small text-embedding-3-large]"),
   131  		},
   132  		{
   133  			name: "wrong properties",
   134  			cfg: &fakeClassConfig{
   135  				classConfig: map[string]interface{}{
   136  					"model":      "text-embedding-3-large",
   137  					"properties": "wrong-properties",
   138  				},
   139  			},
   140  			wantErr: errors.New("properties field needs to be of array type, got: string"),
   141  		},
   142  	}
   143  	for _, tt := range tests {
   144  		t.Run(tt.name, func(t *testing.T) {
   145  			cs := NewClassSettings(tt.cfg)
   146  			err := cs.Validate(class)
   147  			if tt.wantErr != nil {
   148  				assert.EqualError(t, err, tt.wantErr.Error())
   149  			} else {
   150  				assert.NoError(t, err)
   151  			}
   152  		})
   153  	}
   154  }
   155  
   156  func Test_classSettings(t *testing.T) {
   157  	t.Run("with target vector and properties", func(t *testing.T) {
   158  		targetVector := "targetVector"
   159  		propertyToIndex := "someProp"
   160  		class := &models.Class{
   161  			Class: "MyClass",
   162  			VectorConfig: map[string]models.VectorConfig{
   163  				targetVector: {
   164  					Vectorizer: map[string]interface{}{
   165  						"my-module": map[string]interface{}{
   166  							"vectorizeClassName": false,
   167  							"properties":         []interface{}{propertyToIndex},
   168  						},
   169  					},
   170  					VectorIndexType: "hnsw",
   171  				},
   172  			},
   173  			Properties: []*models.Property{
   174  				{
   175  					Name: propertyToIndex,
   176  					ModuleConfig: map[string]interface{}{
   177  						"my-module": map[string]interface{}{
   178  							"skip":                  true,
   179  							"vectorizePropertyName": true,
   180  						},
   181  					},
   182  				},
   183  				{
   184  					Name: "otherProp",
   185  				},
   186  			},
   187  		}
   188  
   189  		cfg := modules.NewClassBasedModuleConfig(class, "my-module", "tenant", targetVector)
   190  		ic := NewClassSettings(cfg)
   191  
   192  		assert.True(t, ic.PropertyIndexed(propertyToIndex))
   193  		assert.True(t, ic.VectorizePropertyName(propertyToIndex))
   194  		assert.False(t, ic.PropertyIndexed("otherProp"))
   195  		assert.False(t, ic.VectorizePropertyName("otherProp"))
   196  		assert.False(t, ic.VectorizeClassName())
   197  	})
   198  }