diff --git a/CHANGELOG.md b/CHANGELOG.md index a1eb2ec..ce15cf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## vNext +## v2.1.3 Add: +- Added `IBatchEmbeddingsGenerator` and `.AddTextsAsync` to support batch adding of texts to database. +- Added OpenAI support for `IBatchEmbeddingsGenerator` - Added `IVectorTextResultItem.Similarity` and marked `IVectorTextResultItem.VectorComparison` obsolete. `VectorComparison` will be removed in the future. - Added more comment metadata to code diff --git a/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj b/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj index 840abfb..ad68927 100644 --- a/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj +++ b/src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj @@ -9,7 +9,7 @@ Build5Nines.SharpVector.OpenAI https://sharpvector.build5nines.com https://github.com/Build5Nines/SharpVector - 2.0.3 + 2.0.4 Lightweight In-memory Vector Database to embed in any .NET Applications that integrates with OpenAI Embedding model for vector generation. Copyright (c) 2025 Build5Nines LLC README.md @@ -25,7 +25,7 @@ - + diff --git a/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs b/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs index 2d2eb7f..1267715 100644 --- a/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs +++ b/src/Build5Nines.SharpVector.OpenAI/Embeddings/OpenAIEmbeddingsGenerator.cs @@ -5,7 +5,7 @@ namespace Build5Nines.SharpVector.OpenAI.Embeddings; -public class OpenAIEmbeddingsGenerator : IEmbeddingsGenerator //IBatchEmbeddingsGenerator +public class OpenAIEmbeddingsGenerator : IBatchEmbeddingsGenerator { protected EmbeddingClient EmbeddingClient { get; private set; } diff --git a/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj b/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj index c50589d..5434a26 100644 --- a/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj +++ b/src/OpenAIConsoleTest/OpenAIConsoleTest.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs b/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs index 5e8b285..66e2949 100644 --- a/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs +++ b/src/SharpVectorOpenAITest/BasicOpenAIMemoryVectorDatabaseTest.cs @@ -39,6 +39,23 @@ public void Setup() It.IsAny(), It.IsAny())) .ReturnsAsync(clientResult); + + _mockEmbeddingClient + .Setup(c => c.GenerateEmbeddingsAsync( + It.IsAny>(), + It.IsAny(), + It.IsAny())) + .ReturnsAsync((List inputs, EmbeddingGenerationOptions? options, CancellationToken token) => + { + // return OpenAIEmbeddingCollection with same embedding for each input + var embeddings = new List(); + for (int i = 0; i < inputs.Count; i++) + { + embeddings.Add(OpenAIEmbeddingsModelFactory.OpenAIEmbedding(index: i, vector: embeddingVector)); + } + var collection = OpenAIEmbeddingsModelFactory.OpenAIEmbeddingCollection(embeddings); + return ClientResult.FromValue(collection, new TestPipelineResponse()); + }); _database = new BasicOpenAIMemoryVectorDatabase(_mockEmbeddingClient.Object); } @@ -135,5 +152,35 @@ public async Task Test_SaveLoad_TestIds_02() Assert.AreEqual("222", texts[1].Metadata); Assert.AreEqual("333", texts[2].Metadata); } + + [TestMethod] + public async Task Test_SaveLoad_TestIds_Batch_02() + { + await _database.AddTextsAsync(new (string text, string? metadata)[] + { + ("Sample text for testing IDs.", "111"), + ("Another sample text for testing IDs.", "222") + }); + + var results = _database.Search("testing IDs"); + Assert.AreEqual(2, results.Texts.Count()); + + var filename = "openai_test_saveload_testids_batch_02.b59vdb"; +#pragma warning disable CS8604 // Possible null reference argument. + await _database.SaveToFileAsync(filename); +#pragma warning restore CS8604 // Possible null reference argument. + + var newdb = new BasicOpenAIMemoryVectorDatabase(_mockEmbeddingClient.Object); + await newdb.LoadFromFileAsync(filename); + + newdb.AddText("A new text after loading to check ID assignment.", "333"); + + var newResults = newdb.Search("testing IDs"); + Assert.AreEqual(3, newResults.Texts.Count()); + var texts = newResults.Texts.OrderBy(x => x.Metadata).ToArray(); + Assert.AreEqual("111", texts[0].Metadata); + Assert.AreEqual("222", texts[1].Metadata); + Assert.AreEqual("333", texts[2].Metadata); + } } } \ No newline at end of file