From 114fa986169b5ef4940e3a0e492254c43b3c7213 Mon Sep 17 00:00:00 2001 From: xbotter Date: Thu, 16 Nov 2023 21:37:53 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=A7=20Update=20ITextEmbedding=20interf?= =?UTF-8?q?ace=20and=20its=20implementations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update ITextEmbedding interface to use async methods for getting vectors - Update KnowledgeService to use async methods for getting vectors - Update TextEmbeddingProvider and fastTextEmbeddingProvider to use async methods for getting vectors - Update IntentClassifier to use async methods for getting vectors - Update SemanticKernelTextEmbeddingProvider to use async methods for getting vectors --- .../MLTasks/ITextEmbedding.cs | 6 ++++-- .../Services/KnowledgeService.cs | 4 ++-- .../Providers/TextEmbeddingProvider.cs | 6 +++--- .../Providers/fastTextEmbeddingProvider.cs | 9 ++++---- .../Providers/IntentClassifier.cs | 8 +++---- .../SemanticKernelTextEmbeddingProvider.cs | 21 +++++++++---------- .../Helpers/SemanticKernelHelper.cs | 5 ++++- 7 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs b/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs index 8a0df8a5..3e53dd0f 100644 --- a/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs +++ b/src/Infrastructure/BotSharp.Abstraction/MLTasks/ITextEmbedding.cs @@ -1,8 +1,10 @@ +using System.Threading; + namespace BotSharp.Abstraction.MLTasks; public interface ITextEmbedding { int Dimension { get; } - float[] GetVector(string text); - List GetVectors(List texts); + Task GetVectorAsync(string text); + Task> GetVectorsAsync(List texts); } diff --git a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs index 8a818534..eef38f63 100644 --- a/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs +++ b/src/Plugins/BotSharp.Plugin.KnowledgeBase/Services/KnowledgeService.cs @@ -31,7 +31,7 @@ public class KnowledgeService : IKnowledgeService await db.CreateCollection(knowledge.AgentId, textEmbedding.Dimension); foreach (var line in lines) { - var vec = textEmbedding.GetVector(line); + var vec = await textEmbedding.GetVectorAsync(line); await db.Upsert(knowledge.AgentId, idStart, vec, line); idStart++; Console.WriteLine($"Saved vector {idStart}/{lines.Count}: {line}\n"); @@ -41,7 +41,7 @@ public class KnowledgeService : IKnowledgeService public async Task GetKnowledges(KnowledgeRetrievalModel retrievalModel) { var textEmbedding = GetTextEmbedding(); - var vector = textEmbedding.GetVector(retrievalModel.Question); + var vector = await textEmbedding.GetVectorAsync(retrievalModel.Question); // Vector search var result = await GetVectorDb().Search(retrievalModel.AgentId, vector, limit: 10); diff --git a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs index 1a485bf1..4a433e7e 100644 --- a/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.LLamaSharp/Providers/TextEmbeddingProvider.cs @@ -15,7 +15,7 @@ public class TextEmbeddingProvider : ITextEmbedding _settings = settings; } - public float[] GetVector(string text) + public Task GetVectorAsync(string text) { if (_embedder == null) { @@ -23,10 +23,10 @@ public class TextEmbeddingProvider : ITextEmbedding _embedder = new LLamaEmbedder(new ModelParams(path)); } - return _embedder.GetEmbeddings(text); + return Task.FromResult(_embedder.GetEmbeddings(text)); } - public List GetVectors(List texts) + public Task> GetVectorsAsync(List texts) { throw new NotImplementedException(); } diff --git a/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs index 3388f04c..9bfecfe4 100644 --- a/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.MetaAI/Providers/fastTextEmbeddingProvider.cs @@ -3,6 +3,7 @@ using BotSharp.Plugin.MetaAI.Settings; using FastText.NetWrapper; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace BotSharp.Plugin.MetaAI.Providers; @@ -26,19 +27,19 @@ public class fastTextEmbeddingProvider : ITextEmbedding } - public float[] GetVector(string text) + public Task GetVectorAsync(string text) { LoadModel(); - return _fastText.GetSentenceVector(text); + return Task.FromResult(_fastText.GetSentenceVector(text)); } - public List GetVectors(List texts) + public async Task> GetVectorsAsync(List texts) { LoadModel(); var vectors = new List(); for (int i = 0; i < texts.Count; i++) { - vectors.Add(GetVector(texts[i])); + vectors.Add(await GetVectorAsync(texts[i])); } return vectors; } diff --git a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs index 977e43bb..089b5168 100644 --- a/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs +++ b/src/Plugins/BotSharp.Plugin.RoutingSpeeder/Providers/IntentClassifier.cs @@ -33,8 +33,8 @@ public class IntentClassifier private string[] _labels; public string[] Labels => _labels == null ? GetLabels() : _labels; - public IntentClassifier(IServiceProvider services, - ClassifierSetting settings, + public IntentClassifier(IServiceProvider services, + ClassifierSetting settings, KnowledgeBaseSettings knowledgeBaseSettings, ILogger logger) { @@ -140,7 +140,7 @@ public class IntentClassifier .FirstOrDefault(x => x.GetType().FullName.EndsWith(knowledgeSettings.TextEmbedding)); var x = np.zeros((1, embedding.Dimension), dtype: np.float32); - x[0] = embedding.GetVector(text); + x[0] = embedding.GetVectorAsync(text).GetAwaiter().GetResult(); return x; } @@ -178,7 +178,7 @@ public class IntentClassifier { var texts = File.ReadAllLines(filePath, Encoding.UTF8).ToList(); - vectorList.AddRange(vector.GetVectors(texts)); + vectorList.AddRange(vector.GetVectorsAsync(texts).GetAwaiter().GetResult()); string fileName = Path.GetFileNameWithoutExtension(filePath); labelList.AddRange(Enumerable.Repeat(fileName, texts.Count).ToList()); } diff --git a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs index 6063cbca..1b62c367 100644 --- a/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs +++ b/src/Plugins/BotSharp.Plugin.SemanticKernel/SemanticKernelTextEmbeddingProvider.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace BotSharp.Plugin.SemanticKernel { @@ -20,29 +21,27 @@ namespace BotSharp.Plugin.SemanticKernel /// /// Constructor of /// - /// public SemanticKernelTextEmbeddingProvider(ITextEmbeddingGeneration embedding, int dimension) { this._embedding = embedding; Dimension = dimension; } + /// public int Dimension { get; } - public float[] GetVector(string text) + /// + public async Task GetVectorAsync(string text) { - return this._embedding.GenerateEmbeddingAsync(text) - .ConfigureAwait(false) - .GetAwaiter() - .GetResult() - .ToArray(); + return (await this._embedding.GenerateEmbeddingAsync(text)).ToArray(); } - public List GetVectors(List texts) + /// + public async Task> GetVectorsAsync(List texts) { - return this._embedding.GenerateEmbeddingsAsync(texts).ConfigureAwait(false).GetAwaiter().GetResult() - .Select(_ => _.ToArray()) - .ToList(); + var embeddings = await this._embedding.GenerateEmbeddingsAsync(texts); + return embeddings.Select(_ => _.ToArray()) + .ToList(); } } } diff --git a/tests/BotSharp.Plugin.SemanticKernel.UnitTests/Helpers/SemanticKernelHelper.cs b/tests/BotSharp.Plugin.SemanticKernel.UnitTests/Helpers/SemanticKernelHelper.cs index ef775f76..1245a4d2 100644 --- a/tests/BotSharp.Plugin.SemanticKernel.UnitTests/Helpers/SemanticKernelHelper.cs +++ b/tests/BotSharp.Plugin.SemanticKernel.UnitTests/Helpers/SemanticKernelHelper.cs @@ -12,6 +12,7 @@ namespace BotSharp.Plugin.SemanticKernel.UnitTests.Helpers { internal class SemanticKernelHelper : IChatCompletion, ITextCompletion, IAIService { + private Dictionary _attributes = new(); private readonly string _excepted; public SemanticKernelHelper(string excepted) @@ -19,6 +20,8 @@ namespace BotSharp.Plugin.SemanticKernel.UnitTests.Helpers this._excepted = excepted; } + public IReadOnlyDictionary Attributes => _attributes; + public ChatHistory CreateNewChat(string? instructions = null) { return new ChatHistory(); @@ -26,7 +29,7 @@ namespace BotSharp.Plugin.SemanticKernel.UnitTests.Helpers public Task> GetChatCompletionsAsync(ChatHistory chat, AIRequestSettings? requestSettings = null, CancellationToken cancellationToken = default) { - return Task.FromResult>( new List { new ResultHelper(_excepted) }); + return Task.FromResult>(new List { new ResultHelper(_excepted) }); } public Task> GetCompletionsAsync(string text, AIRequestSettings? requestSettings = null, CancellationToken cancellationToken = default)