291 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
|  * Copyright 2025 coze-dev Authors
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| package vikingdb
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/cloudwego/eino-ext/components/embedding/openai"
 | |
| 	"github.com/cloudwego/eino/components/retriever"
 | |
| 	"github.com/cloudwego/eino/schema"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/volcengine/volc-sdk-golang/service/vikingdb"
 | |
| 
 | |
| 	"github.com/coze-dev/coze-studio/backend/infra/contract/document"
 | |
| 	"github.com/coze-dev/coze-studio/backend/infra/contract/document/searchstore"
 | |
| 	"github.com/coze-dev/coze-studio/backend/infra/impl/embedding/wrap"
 | |
| 	"github.com/coze-dev/coze-studio/backend/pkg/lang/ptr"
 | |
| )
 | |
| 
 | |
| func TestVikingEmbeddingIntegration(t *testing.T) {
 | |
| 	if os.Getenv("ENABLE_VIKINGDB_INTEGRATION_TEST") != "true" {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	ctx := context.Background()
 | |
| 	svc := vikingdb.NewVikingDBService(
 | |
| 		"api-vikingdb.volces.com",
 | |
| 		"cn-beijing",
 | |
| 		os.Getenv("VIKING_DB_AK"),
 | |
| 		os.Getenv("VIKING_DB_SK"),
 | |
| 		"https",
 | |
| 	)
 | |
| 
 | |
| 	cfg := &ManagerConfig{
 | |
| 		Service:        svc,
 | |
| 		IndexingConfig: nil,
 | |
| 		EmbeddingConfig: &VikingEmbeddingConfig{
 | |
| 			UseVikingEmbedding: true,
 | |
| 			EnableHybrid:       false,
 | |
| 			ModelName:          ModelNameDoubaoEmbedding,
 | |
| 			ModelVersion:       ModelNameDoubaoEmbedding.ModelVersion(),
 | |
| 			DenseWeight:        nil,
 | |
| 			BuiltinEmbedding:   nil,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	mgr, err := NewManager(cfg)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	collectionName := "test_coze_coll_1"
 | |
| 
 | |
| 	t.Run("create", func(t *testing.T) {
 | |
| 		err = mgr.Create(ctx, &searchstore.CreateRequest{
 | |
| 			CollectionName: collectionName,
 | |
| 			Fields: []*searchstore.Field{
 | |
| 				{
 | |
| 					Name:      searchstore.FieldID,
 | |
| 					Type:      searchstore.FieldTypeInt64,
 | |
| 					IsPrimary: true,
 | |
| 				},
 | |
| 				{
 | |
| 					Name: searchstore.FieldCreatorID,
 | |
| 					Type: searchstore.FieldTypeInt64,
 | |
| 				},
 | |
| 				{
 | |
| 					Name: "document_id",
 | |
| 					Type: searchstore.FieldTypeInt64,
 | |
| 				},
 | |
| 				{
 | |
| 					Name:     searchstore.FieldTextContent,
 | |
| 					Type:     searchstore.FieldTypeText,
 | |
| 					Indexing: true,
 | |
| 				},
 | |
| 			},
 | |
| 			CollectionMeta: nil,
 | |
| 		})
 | |
| 		assert.NoError(t, err)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("store", func(t *testing.T) {
 | |
| 		ss, err := mgr.GetSearchStore(ctx, collectionName)
 | |
| 		assert.NoError(t, err)
 | |
| 
 | |
| 		ids, err := ss.Store(ctx, []*schema.Document{
 | |
| 			{
 | |
| 				ID:      "101",
 | |
| 				Content: "埃菲尔铁塔:位于法国巴黎,是世界上最著名的地标之一,由居斯塔夫・埃菲尔设计并建于 1889 年。",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(567),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				ID:      "102",
 | |
| 				Content: "长城:位于中国,是世界七大奇迹之一,从秦至明代修筑而成,全长超过 2 万公里",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(567),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				ID:      "103",
 | |
| 				Content: "罗马斗兽场:位于意大利罗马,于公元 70-80 年间建成,是古罗马帝国最大的圆形竞技场。",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(568),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 		}, searchstore.WithIndexingFields([]string{searchstore.FieldTextContent}))
 | |
| 		assert.NoError(t, err)
 | |
| 		fmt.Println(ids)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("retrieve", func(t *testing.T) {
 | |
| 		ss, err := mgr.GetSearchStore(ctx, collectionName)
 | |
| 		assert.NoError(t, err)
 | |
| 
 | |
| 		dsl := &searchstore.DSL{
 | |
| 			Op:    searchstore.OpIn,
 | |
| 			Field: "creator_id",
 | |
| 			Value: int64(111),
 | |
| 		}
 | |
| 		opts := []retriever.Option{
 | |
| 			searchstore.WithRetrieverPartitionKey("document_id"),
 | |
| 			searchstore.WithPartitions([]string{"567"}),
 | |
| 			retriever.WithDSLInfo(dsl.DSL()),
 | |
| 		}
 | |
| 		resp, err := ss.Retrieve(ctx, "旅游景点推荐", opts...)
 | |
| 		assert.NoError(t, err)
 | |
| 		fmt.Println(resp)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("drop", func(t *testing.T) {
 | |
| 		assert.NoError(t, mgr.Drop(ctx, &searchstore.DropRequest{CollectionName: collectionName}))
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func TestBuiltinEmbeddingIntegration(t *testing.T) {
 | |
| 	if os.Getenv("ENABLE_VIKINGDB_INTEGRATION_TEST") != "true" {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	ctx := context.Background()
 | |
| 	svc := vikingdb.NewVikingDBService(
 | |
| 		"api-vikingdb.volces.com",
 | |
| 		"cn-beijing",
 | |
| 		os.Getenv("VIKING_DB_AK"),
 | |
| 		os.Getenv("VIKING_DB_SK"),
 | |
| 		"https",
 | |
| 	)
 | |
| 
 | |
| 	embConfig := &openai.EmbeddingConfig{
 | |
| 		APIKey:     os.Getenv("OPENAI_EMBEDDING_API_KEY"),
 | |
| 		ByAzure:    true,
 | |
| 		BaseURL:    os.Getenv("OPENAI_EMBEDDING_BASE_URL"),
 | |
| 		Model:      os.Getenv("OPENAI_EMBEDDING_MODEL"),
 | |
| 		Dimensions: ptr.Of(1024),
 | |
| 	}
 | |
| 	emb, err := wrap.NewOpenAIEmbedder(ctx, embConfig, 1024)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	cfg := &ManagerConfig{
 | |
| 		Service:        svc,
 | |
| 		IndexingConfig: nil,
 | |
| 		EmbeddingConfig: &VikingEmbeddingConfig{
 | |
| 			UseVikingEmbedding: false,
 | |
| 			BuiltinEmbedding:   emb,
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	mgr, err := NewManager(cfg)
 | |
| 	assert.NoError(t, err)
 | |
| 
 | |
| 	collectionName := "test_coze_coll_2"
 | |
| 
 | |
| 	t.Run("create", func(t *testing.T) {
 | |
| 		err = mgr.Create(ctx, &searchstore.CreateRequest{
 | |
| 			CollectionName: collectionName,
 | |
| 			Fields: []*searchstore.Field{
 | |
| 				{
 | |
| 					Name:      searchstore.FieldID,
 | |
| 					Type:      searchstore.FieldTypeInt64,
 | |
| 					IsPrimary: true,
 | |
| 				},
 | |
| 				{
 | |
| 					Name: searchstore.FieldCreatorID,
 | |
| 					Type: searchstore.FieldTypeInt64,
 | |
| 				},
 | |
| 				{
 | |
| 					Name: "document_id",
 | |
| 					Type: searchstore.FieldTypeInt64,
 | |
| 				},
 | |
| 				{
 | |
| 					Name:     searchstore.FieldTextContent,
 | |
| 					Type:     searchstore.FieldTypeText,
 | |
| 					Indexing: true,
 | |
| 				},
 | |
| 			},
 | |
| 			CollectionMeta: nil,
 | |
| 		})
 | |
| 		assert.NoError(t, err)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("store", func(t *testing.T) {
 | |
| 		ss, err := mgr.GetSearchStore(ctx, collectionName)
 | |
| 		assert.NoError(t, err)
 | |
| 
 | |
| 		ids, err := ss.Store(ctx, []*schema.Document{
 | |
| 			{
 | |
| 				ID:      "101",
 | |
| 				Content: "埃菲尔铁塔:位于法国巴黎,是世界上最著名的地标之一,由居斯塔夫・埃菲尔设计并建于 1889 年。",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(567),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				ID:      "102",
 | |
| 				Content: "长城:位于中国,是世界七大奇迹之一,从秦至明代修筑而成,全长超过 2 万公里",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(567),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			{
 | |
| 				ID:      "103",
 | |
| 				Content: "罗马斗兽场:位于意大利罗马,于公元 70-80 年间建成,是古罗马帝国最大的圆形竞技场。",
 | |
| 				MetaData: map[string]any{
 | |
| 					document.MetaDataKeyCreatorID: int64(111),
 | |
| 					document.MetaDataKeyExternalStorage: map[string]any{
 | |
| 						"document_id": int64(568),
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 		}, searchstore.WithIndexingFields([]string{searchstore.FieldTextContent}))
 | |
| 		assert.NoError(t, err)
 | |
| 		fmt.Println(ids)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("retrieve", func(t *testing.T) {
 | |
| 		ss, err := mgr.GetSearchStore(ctx, collectionName)
 | |
| 		assert.NoError(t, err)
 | |
| 
 | |
| 		dsl := &searchstore.DSL{
 | |
| 			Op:    searchstore.OpIn,
 | |
| 			Field: "creator_id",
 | |
| 			Value: int64(111),
 | |
| 		}
 | |
| 		opts := []retriever.Option{
 | |
| 			searchstore.WithRetrieverPartitionKey("document_id"),
 | |
| 			searchstore.WithPartitions([]string{"567"}),
 | |
| 			retriever.WithDSLInfo(dsl.DSL()),
 | |
| 		}
 | |
| 		resp, err := ss.Retrieve(ctx, "旅游景点推荐", opts...)
 | |
| 		assert.NoError(t, err)
 | |
| 		fmt.Println(resp)
 | |
| 	})
 | |
| 
 | |
| 	t.Run("drop", func(t *testing.T) {
 | |
| 		assert.NoError(t, mgr.Drop(ctx, &searchstore.DropRequest{CollectionName: collectionName}))
 | |
| 	})
 | |
| 
 | |
| }
 |