From fff943829480c825f4415b2881ba77128abf6abd Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Thu, 22 Aug 2024 15:23:22 -0500 Subject: [PATCH] refine knowledge settings --- .../Settings/KnowledgeBaseSettings.cs | 20 +++++++++++--- .../MLTasks/ITextEmbedding.cs | 3 ++- .../MLTasks/Settings/LlmModelSetting.cs | 5 ++++ .../Infrastructures/CompletionProvider.cs | 5 ++++ .../Controllers/TextEmbeddingController.cs | 7 +++-- .../Embeddings/EmbeddingInputModel.cs | 2 +- .../Embedding/TextEmbeddingProvider.cs | 27 ++++++++++--------- .../Functions/KnowledgeRetrievalFn.cs | 5 ++-- .../Functions/MemorizeKnowledgeFn.cs | 5 ++-- .../Services/KnowledgeService.Create.cs | 4 +-- .../Services/KnowledgeService.Get.cs | 5 ++-- .../Services/KnowledgeService.cs | 9 ++----- .../BotSharp.Plugin.KnowledgeBase/Using.cs | 3 ++- .../Utilities/KnowledgeSettingUtility.cs | 19 +++++++++++++ .../Providers/TextEmbeddingProvider.cs | 14 +++++++++- .../Providers/fastTextEmbeddingProvider.cs | 25 +++++++++-------- .../Embedding/TextEmbeddingProvider.cs | 27 ++++++++++--------- .../Providers/IntentClassifier.cs | 16 ++++++----- .../SemanticKernelTextEmbeddingProvider.cs | 18 ++++++++++--- src/WebStarter/appsettings.json | 23 ++++++++++++---- 20 files changed, 161 insertions(+), 81 deletions(-) create mode 100644 src/Plugins/BotSharp.Plugin.KnowledgeBase/Utilities/KnowledgeSettingUtility.cs diff --git a/src/Infrastructure/BotSharp.Abstraction/Knowledges/Settings/KnowledgeBaseSettings.cs b/src/Infrastructure/BotSharp.Abstraction/Knowledges/Settings/KnowledgeBaseSettings.cs index 65bf7637..963a2b3b 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Knowledges/Settings/KnowledgeBaseSettings.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Knowledges/Settings/KnowledgeBaseSettings.cs @@ -4,14 +4,28 @@ namespace BotSharp.Abstraction.Knowledges.Settings; public class KnowledgeBaseSettings { - public string DefaultCollection { get; set; } = KnowledgeCollectionName.BotSharp; public string VectorDb { get; set; } public string GraphDb { get; set; } - public KnowledgeModelSetting TextEmbedding { get; set; } + + public DefaultKnowledgeBaseSetting Default { get; set; } + public List Collections { get; set; } = new(); } -public class KnowledgeModelSetting +public class DefaultKnowledgeBaseSetting +{ + public string CollectionName { get; set; } = KnowledgeCollectionName.BotSharp; + public KnowledgeTextEmbeddingSetting TextEmbedding { get; set; } +} + +public class VectorCollectionSetting +{ + public string Name { get; set; } + public KnowledgeTextEmbeddingSetting TextEmbedding { get; set; } +} + +public class KnowledgeTextEmbeddingSetting { public string Provider { get; set; } public string Model { get; set; } + public int Dimension { get; set; } } \ No newline at end of file diff --git a/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs b/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs index 8ad6363e..79b3aff8 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs @@ -6,8 +6,9 @@ public interface ITextEmbedding /// The Embedding provider like Microsoft Azure, OpenAI, ClaudAI /// string Provider { get; } - int Dimension { get; set; } Task GetVectorAsync(string text); Task> GetVectorsAsync(List texts); void SetModelName(string model); + void SetDimension(int dimension); + int GetDimension(); } diff --git a/src/Infrastructure/BotSharp.Abstraction/MLTasks/Settings/LlmModelSetting.cs b/src/Infrastructure/BotSharp.Abstraction/MLTasks/Settings/LlmModelSetting.cs index 16e19a6f..cc7cfba0 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MLTasks/Settings/LlmModelSetting.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MLTasks/Settings/LlmModelSetting.cs @@ -52,6 +52,11 @@ public class LlmModelSetting /// public float CompletionCost { get; set; } + /// + /// Embedding dimension + /// + public int Dimension { get; set; } + public override string ToString() { return $"[{Type}] {Name} {Endpoint}"; diff --git a/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs b/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs index bb10ccf3..874a063e 100644 --- a/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs +++ b/src/Infrastructure/BotSharp.Core/Infrastructures/CompletionProvider.cs @@ -111,7 +111,12 @@ public class CompletionProvider logger.LogError($"Can't resolve completion provider by {provider}"); } + + var llmProviderService = services.GetRequiredService(); + var found = llmProviderService.GetSetting(provider, model); + completer.SetModelName(model); + completer.SetDimension(found.Dimension); return completer; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/TextEmbeddingController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/TextEmbeddingController.cs index 73bfbfcb..1eee6f2d 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/TextEmbeddingController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/TextEmbeddingController.cs @@ -18,7 +18,7 @@ public class TextEmbeddingController : ControllerBase _logger = logger; } - [HttpPost("/text-embedding/generation")] + [HttpPost("/text-embedding/generate")] public async Task> GenerateTextEmbeddings(EmbeddingInputModel input) { var state = _services.GetRequiredService(); @@ -27,7 +27,10 @@ public class TextEmbeddingController : ControllerBase try { var completion = CompletionProvider.GetTextEmbedding(_services, provider: input.Provider ?? "openai", model: input.Model ?? "text-embedding-3-large"); - completion.Dimension = input.Dimension; + if (input.Dimension.HasValue && input.Dimension.Value > 0) + { + completion.SetDimension(input.Dimension.Value); + } var embeddings = await completion.GetVectorsAsync(input.Texts?.ToList() ?? []); return embeddings; diff --git a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Embeddings/EmbeddingInputModel.cs b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Embeddings/EmbeddingInputModel.cs index b01840f0..50559580 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Embeddings/EmbeddingInputModel.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/ViewModels/Embeddings/EmbeddingInputModel.cs @@ -8,6 +8,6 @@ public class EmbeddingInputModel : MessageConfig public IEnumerable Texts { get; set; } = new List(); [JsonPropertyName("dimension")] - public int Dimension { get; set; } = 3072; + public int? Dimension { get; set; } = 3072; } diff --git a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Embedding/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Embedding/TextEmbeddingProvider.cs index 092d62ec..39119050 100644 --- a/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Embedding/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.AzureOpenAI/Providers/Embedding/TextEmbeddingProvider.cs @@ -10,11 +10,10 @@ public class TextEmbeddingProvider : ITextEmbedding private const int DEFAULT_DIMENSION = 3072; protected string _model; + protected int _dimension; public virtual string Provider => "azure-openai"; - public int Dimension { get; set; } - public TextEmbeddingProvider( AzureOpenAiSettings settings, ILogger logger, @@ -50,24 +49,26 @@ public class TextEmbeddingProvider : ITextEmbedding _model = model; } + public void SetDimension(int dimension) + { + _dimension = dimension > 0 ? dimension : DEFAULT_DIMENSION; + } + + public int GetDimension() + { + return _dimension; + } + private EmbeddingGenerationOptions PrepareOptions() { return new EmbeddingGenerationOptions { - Dimensions = GetDimension() + Dimensions = GetDimensionOption() }; } - private int GetDimension() + private int GetDimensionOption() { - var state = _services.GetRequiredService(); - var stateDimension = state.GetState("embedding_dimension"); - var defaultDimension = Dimension > 0 ? Dimension : DEFAULT_DIMENSION; - - if (int.TryParse(stateDimension, out var dimension)) - { - return dimension > 0 ? dimension : defaultDimension; - } - return defaultDimension; + return _dimension > 0 ? _dimension : DEFAULT_DIMENSION; } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs index dcb4650e..060e2150 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/KnowledgeRetrievalFn.cs @@ -17,12 +17,11 @@ public class KnowledgeRetrievalFn : IFunctionCallback { var args = JsonSerializer.Deserialize(message.FunctionArgs ?? "{}"); - var embedding = _services.GetServices().FirstOrDefault(x => x.Provider == _settings.TextEmbedding.Provider); - embedding.SetModelName(_settings.TextEmbedding.Model); + var collectionName = _settings.Default.CollectionName ?? KnowledgeCollectionName.BotSharp; + var embedding = KnowledgeSettingUtility.GetTextEmbeddingSetting(_services, collectionName); var vector = await embedding.GetVectorAsync(args.Question); var vectorDb = _services.GetServices().FirstOrDefault(x => x.Name == _settings.VectorDb); - var collectionName = !string.IsNullOrWhiteSpace(_settings.DefaultCollection) ? _settings.DefaultCollection : KnowledgeCollectionName.BotSharp; var knowledges = await vectorDb.Search(collectionName, vector, new List { KnowledgePayloadName.Text, KnowledgePayloadName.Answer }); if (!knowledges.IsNullOrEmpty()) diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/MemorizeKnowledgeFn.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/MemorizeKnowledgeFn.cs index 728a1be9..f709e3b8 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/MemorizeKnowledgeFn.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Functions/MemorizeKnowledgeFn.cs @@ -17,8 +17,8 @@ public class MemorizeKnowledgeFn : IFunctionCallback { var args = JsonSerializer.Deserialize(message.FunctionArgs ?? "{}"); - var embedding = _services.GetServices().FirstOrDefault(x => x.Provider == _settings.TextEmbedding.Provider); - embedding.SetModelName(_settings.TextEmbedding.Model); + var collectionName = _settings.Default.CollectionName ?? KnowledgeCollectionName.BotSharp; + var embedding = KnowledgeSettingUtility.GetTextEmbeddingSetting(_services, collectionName); var vector = await embedding.GetVectorsAsync(new List { @@ -26,7 +26,6 @@ public class MemorizeKnowledgeFn : IFunctionCallback }); var vectorDb = _services.GetServices().FirstOrDefault(x => x.Name == _settings.VectorDb); - var collectionName = !string.IsNullOrWhiteSpace(_settings.DefaultCollection) ? _settings.DefaultCollection : KnowledgeCollectionName.BotSharp; await vectorDb.CreateCollection(collectionName, vector[0].Length); var result = await vectorDb.Upsert(collectionName, Guid.NewGuid(), vector[0], diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Create.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Create.cs index 391fb5fa..095f08d9 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Create.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Create.cs @@ -13,9 +13,9 @@ public partial class KnowledgeService }); var db = GetVectorDb(); - var textEmbedding = GetTextEmbedding(); + var textEmbedding = GetTextEmbedding(collectionName); - await db.CreateCollection(collectionName, textEmbedding.Dimension); + await db.CreateCollection(collectionName, textEmbedding.GetDimension()); foreach (var line in lines) { var vec = await textEmbedding.GetVectorAsync(line); diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Get.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Get.cs index 4e001954..fb88bbec 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Get.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.Get.cs @@ -1,5 +1,6 @@ using BotSharp.Abstraction.Graph.Models; using BotSharp.Abstraction.VectorStorage.Models; +using System.Collections; namespace BotSharp.Plugin.KnowledgeBase.Services; @@ -43,7 +44,7 @@ public partial class KnowledgeService { try { - var textEmbedding = GetTextEmbedding(); + var textEmbedding = GetTextEmbedding(collectionName); var vector = await textEmbedding.GetVectorAsync(query); // Vector search @@ -82,7 +83,7 @@ public partial class KnowledgeService { try { - var textEmbedding = GetTextEmbedding(); + var textEmbedding = GetTextEmbedding(collectionName); var vector = await textEmbedding.GetVectorAsync(query); var vectorDb = GetVectorDb(); diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs index 1f96042b..eec49891 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs @@ -31,13 +31,8 @@ public partial class KnowledgeService : IKnowledgeService return db; } - private ITextEmbedding GetTextEmbedding() + private ITextEmbedding GetTextEmbedding(string collection) { - var embedding = _services.GetServices().FirstOrDefault(x => x.Provider == _settings.TextEmbedding.Provider); - if (embedding != null) - { - embedding.SetModelName(_settings.TextEmbedding.Model); - } - return embedding; + return KnowledgeSettingUtility.GetTextEmbeddingSetting(_services, collection); } } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Using.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Using.cs index 296d56b5..05a4df99 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Using.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Using.cs @@ -31,4 +31,5 @@ global using BotSharp.Abstraction.Agents.Models; global using BotSharp.Abstraction.Functions.Models; global using BotSharp.Abstraction.Repositories; global using BotSharp.Plugin.KnowledgeBase.Services; -global using BotSharp.Plugin.KnowledgeBase.Enum; \ No newline at end of file +global using BotSharp.Plugin.KnowledgeBase.Enum; +global using BotSharp.Plugin.KnowledgeBase.Utilities; \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Utilities/KnowledgeSettingUtility.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Utilities/KnowledgeSettingUtility.cs new file mode 100644 index 00000000..770e1efa --- /dev/null +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Utilities/KnowledgeSettingUtility.cs @@ -0,0 +1,19 @@ +namespace BotSharp.Plugin.KnowledgeBase.Utilities; + +public static class KnowledgeSettingUtility +{ + public static ITextEmbedding GetTextEmbeddingSetting(IServiceProvider services, string collectionName) + { + var settings = services.GetRequiredService(); + var found = settings.Collections.FirstOrDefault(x => x.Name == collectionName)?.TextEmbedding; + if (found == null) + { + found = settings.Default.TextEmbedding; + } + + var embedding = services.GetServices().FirstOrDefault(x => x.Provider == found.Provider); + embedding.SetModelName(found.Model); + embedding.SetDimension(found.Dimension); + return embedding; + } +} diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs index a2c39d2c..a9288064 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs @@ -7,7 +7,9 @@ public class TextEmbeddingProvider : ITextEmbedding private LLamaEmbedder _embedder; private readonly LlamaSharpSettings _settings; private readonly IServiceProvider _services; - public int Dimension { get; set; } = 4096; + private const int DEFAULT_DIMENSION = 4096; + + protected int _dimension = DEFAULT_DIMENSION; public string Provider => "llama-sharp"; @@ -36,4 +38,14 @@ public class TextEmbeddingProvider : ITextEmbedding } public void SetModelName(string model) { } + + public void SetDimension(int dimension) + { + _dimension = dimension > 0 ? dimension : DEFAULT_DIMENSION; + } + + public int GetDimension() + { + return _dimension; + } } diff --git a/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs index 4de0c5aa..7d9c6141 100644 --- a/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs @@ -14,19 +14,7 @@ public class fastTextEmbeddingProvider : ITextEmbedding private FastTextWrapper _fastText; private readonly IServiceProvider _services; - private int dimension; - public int Dimension - { - get - { - LoadModel(); - return _fastText.GetModelDimension(); - } - set - { - dimension = value; - } - } + private int _dimension; public string Provider => "meta-ai"; @@ -73,4 +61,15 @@ public class fastTextEmbeddingProvider : ITextEmbedding } public void SetModelName(string model) { } + + public void SetDimension(int dimension) + { + LoadModel(); + _dimension = _fastText.GetModelDimension(); + } + + public int GetDimension() + { + return _dimension; + } } diff --git a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Embedding/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Embedding/TextEmbeddingProvider.cs index b86014a4..bebf6853 100644 --- a/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Embedding/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.OpenAI/Providers/Embedding/TextEmbeddingProvider.cs @@ -10,11 +10,10 @@ public class TextEmbeddingProvider : ITextEmbedding private const int DEFAULT_DIMENSION = 3072; protected string _model = "text-embedding-3-large"; + protected int _dimension = DEFAULT_DIMENSION; public virtual string Provider => "openai"; - public int Dimension { get; set; } - public TextEmbeddingProvider( OpenAiSettings settings, ILogger logger, @@ -50,24 +49,26 @@ public class TextEmbeddingProvider : ITextEmbedding _model = model; } + public void SetDimension(int dimension) + { + _dimension = dimension > 0 ? dimension : DEFAULT_DIMENSION; + } + + public int GetDimension() + { + return _dimension; + } + private EmbeddingGenerationOptions PrepareOptions() { return new EmbeddingGenerationOptions { - Dimensions = GetDimension() + Dimensions = GetDimensionOption() }; } - private int GetDimension() + private int GetDimensionOption() { - var state = _services.GetRequiredService(); - var stateDimension = state.GetState("embedding_dimension"); - var defaultDimension = Dimension > 0 ? Dimension : DEFAULT_DIMENSION; - - if (int.TryParse(stateDimension, out var dimension)) - { - return dimension > 0 ? dimension : defaultDimension; - } - return defaultDimension; + return _dimension > 0 ? _dimension : DEFAULT_DIMENSION; } } \ No newline at end of file diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs index c52baf59..e28eb8b6 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs @@ -57,12 +57,13 @@ public class IntentClassifier return; } - var vector = _services.GetServices().FirstOrDefault(x => x.Provider == _knowledgeBaseSettings.TextEmbedding.Provider); - vector.SetModelName(_knowledgeBaseSettings.TextEmbedding.Model); + var embedding = _services.GetServices().FirstOrDefault(x => x.Provider == _knowledgeBaseSettings.Default.TextEmbedding.Provider); + embedding.SetModelName(_knowledgeBaseSettings.Default.TextEmbedding.Model); + embedding.SetDimension(_knowledgeBaseSettings.Default.TextEmbedding.Dimension); var layers = new List { - keras.layers.InputLayer((vector.Dimension), name: "Input"), + keras.layers.InputLayer((embedding.GetDimension()), name: "Input"), keras.layers.Dense(256, activation:"relu"), keras.layers.Dense(256, activation:"relu"), keras.layers.Dense(GetLabels().Length, activation: keras.activations.Softmax) @@ -136,10 +137,11 @@ public class IntentClassifier public NDArray GetTextEmbedding(string text) { var knowledgeSettings = _services.GetRequiredService(); - var embedding = _services.GetServices() .FirstOrDefault(x => x.Provider == knowledgeSettings.TextEmbedding.Provider); - embedding.SetModelName(knowledgeSettings.TextEmbedding.Model); + var embedding = _services.GetServices().FirstOrDefault(x => x.Provider == knowledgeSettings.Default.TextEmbedding.Provider); + embedding.SetModelName(knowledgeSettings.Default.TextEmbedding.Model); + embedding.SetDimension(_knowledgeBaseSettings.Default.TextEmbedding.Dimension); - var x = np.zeros((1, embedding.Dimension), dtype: np.float32); + var x = np.zeros((1, embedding.GetDimension()), dtype: np.float32); x[0] = embedding.GetVectorAsync(text).GetAwaiter().GetResult(); return x; } @@ -186,7 +188,7 @@ public class IntentClassifier // Sort label to keep the same order var uniqueLabelList = labelList.Distinct().OrderBy(x => x).ToArray(); - var x = np.zeros((vectorList.Count, vector.Dimension), dtype: np.float32); + var x = np.zeros((vectorList.Count, vector.GetDimension()), dtype: np.float32); var y = np.zeros((vectorList.Count, 1), dtype: np.float32); for (int i = 0; i < vectorList.Count; i++) diff --git a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs index 79c83f37..5486d972 100644 --- a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs @@ -24,13 +24,13 @@ namespace BotSharp.Plugin.SemanticKernel public SemanticKernelTextEmbeddingProvider(ITextEmbeddingGenerationService embedding, IConfiguration configuration) #pragma warning restore SKEXP0001 // Type is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed. { - this._embedding = embedding; - this._configuration = configuration; - this.Dimension = configuration.GetValue("SemanticKernel:Dimension"); + _embedding = embedding; + _configuration = configuration; + _dimension = configuration.GetValue("SemanticKernel:Dimension"); } /// - public int Dimension { get; set; } + protected int _dimension; public string Provider => "semantic-kernel"; @@ -51,5 +51,15 @@ namespace BotSharp.Plugin.SemanticKernel } public void SetModelName(string model) { } + + public void SetDimension(int dimension) + { + _dimension = dimension > 0 ? dimension : _configuration.GetValue("SemanticKernel:Dimension"); + } + + public int GetDimension() + { + return _dimension; + } } } diff --git a/src/WebStarter/appsettings.json b/src/WebStarter/appsettings.json index 68548aa5..4a9aafbd 100644 --- a/src/WebStarter/appsettings.json +++ b/src/WebStarter/appsettings.json @@ -264,11 +264,24 @@ "KnowledgeBase": { "VectorDb": "Qdrant", "GraphDb": "Default", - "DefaultCollection": "BotSharp", - "TextEmbedding": { - "Provider": "openai", - "Model": "text-embedding-3-small" - } + "Default": { + "CollectionName": "BotSharp", + "TextEmbedding": { + "Provider": "openai", + "Model": "text-embedding-3-small", + "Dimension": 1536 + } + }, + "Collections": [ + { + "Name": "BotSharp", + "TextEmbedding": { + "Provider": "openai", + "Model": "text-embedding-3-small", + "Dimension": 1536 + } + } + ] }, "SparkDesk": {