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 }