Build5Nines.SharpVector
es una biblioteca de bases de datos vectoriales en memoria diseñada para aplicaciones .NET. Le permite almacenar, buscar y administrar datos de texto utilizando representaciones vectoriales. La biblioteca es personalizable y extensible, lo que permite admitir diferentes métodos de comparación de vectores, técnicas de preprocesamiento y estrategias de vectorización.
Las bases de datos vectoriales se utilizan con soluciones de IA generativa que aumentan el LLM (modelo de lenguaje grande) con la capacidad de cargar datos de contexto adicionales con el mensaje de IA utilizando el patrón de diseño RAG (generación aumentada de recuperación).
Si bien hay muchas bases de datos grandes que se pueden usar para crear bases de datos vectoriales (como Azure CosmosDB, PostgreSQL con pgvector, Azure AI Search, Elasticsearch y más), no hay muchas opciones para una base de datos vectorial liviana que pueda integrarse en cualquier aplicación .NET.
El proyecto Build5Nines SharpVector proporciona una base de datos vectorial en memoria liviana para usar en cualquier aplicación .NET.
"Para la base de datos de vectores en memoria, utilizamos Build5Nines.SharpVector, un excelente proyecto de código abierto de Chris Pietschmann. SharpVector facilita el almacenamiento y la recuperación de datos vectorizados, lo que lo convierte en una opción ideal para nuestra implementación RAG de muestra".
— Tulika Chaudharie, directora principal de productos de Microsoft para Azure App Service
Una base de datos vectorial en memoria como Build5Nines.SharpVector
proporciona varias ventajas sobre un servidor de base de datos vectorial tradicional, particularmente en escenarios que pueden exigir alto rendimiento, baja latencia y uso eficiente de recursos.
A continuación se muestra una lista de varios escenarios de uso en los que Build5Nines.SharpVector
puede resultar útil:
Aquí hay un par de enlaces de tutoriales útiles con documentación adicional y ejemplos sobre el uso de Build5Nines.SharpVector
en sus propios proyectos:
La biblioteca Build5Nines.SharpVector
está disponible como un paquete Nuget para incluirla fácilmente en sus proyectos .NET:
dotnet add package Build5Nines.SharpVector
Puede verlo en Nuget.org aquí: https://www.nuget.org/packages/Build5Nines.SharpVector/
Para lograr una máxima compatibilidad, la biblioteca Build5Nines.SharpVector
no utiliza dependencias externas distintas de las disponibles en .NET y está diseñada para .NET 6 y versiones posteriores.
Como puede ver con el siguiente ejemplo de uso de la biblioteca Build5Nines.SharpVector
, con solo un par de líneas de código puede incrustar una base de datos vectorial en memoria en cualquier aplicación .NET:
// Create a Vector Database with metadata of type string
var vdb = new BasicMemoryVectorDatabase ( ) ;
// The Metadata is declared using generics, so you can store whatever data you need there.
// Load Vector Database with some sample text data
// Text is the movie description, and Metadata is the movie title with release year in this example
vdb . AddText ( " Iron Man (2008) is a Marvel Studios action, adventure, and sci-fi movie about Tony Stark (Robert Downey Jr.), a billionaire inventor and weapons developer who is kidnapped by terrorists and forced to build a weapon. Instead, Tony uses his ingenuity to build a high-tech suit of armor and escape, becoming the superhero Iron Man. He then returns to the United States to refine the suit and use it to fight crime and terrorism. " , " Iron Man (2008) " ) ;
vdb . AddText ( " The Lion King is a 1994 Disney animated film about a young lion cub named Simba who is the heir to the throne of an African savanna. " , " The Lion King (1994) " ) ;
vdb . AddText ( " Aladdin is a 2019 live-action Disney adaptation of the 1992 animated classic of the same name about a street urchin who finds a magic lamp and uses a genie's wishes to become a prince so he can marry Princess Jasmine. " , " Alladin (2019) " ) ;
vdb . AddText ( " The Little Mermaid is a 2023 live-action adaptation of Disney's 1989 animated film of the same name. The movie is about Ariel, the youngest of King Triton's daughters, who is fascinated by the human world and falls in love with Prince Eric. " , " The Little Mermaid " ) ;
vdb . AddText ( " Frozen is a 2013 Disney movie about a fearless optimist named Anna who sets off on a journey to find her sister Elsa, whose icy powers have trapped their kingdom in eternal winter. " , " Frozen (2013) " ) ;
// Perform a Vector Search
var result = vdb . Search ( newPrompt , pageCount : 5 ) ; // return the first 5 results
if ( result . HasResults )
{
Console . WriteLine ( " Similar Text Found: " ) ;
foreach ( var item in result . Texts )
{
Console . WriteLine ( item . Metadata ) ;
Console . WriteLine ( item . Text ) ;
}
}
La clase Build5Nines.SharpVector.BasicMemoryVectorDatabase
utiliza una estrategia de vectorización Bag of Words, con similitud de coseno, un almacén de vocabulario de diccionario y un preprocesador de texto básico. La biblioteca contiene clases genéricas y muchos puntos de extensión para crear implementaciones de bases de datos vectoriales personalizadas si es necesario.
Además, TextDataLoader
se puede utilizar para ayudar a cargar documentos de texto en Vector Database con soporte para múltiples métodos diferentes de fragmentación de texto:
/// Paragraph Chunking
var loader = new TextDataLoader < int , string > ( vdb ) ;
loader . AddDocument ( document , new TextChunkingOptions < string >
{
Method = TextChunkingMethod . Paragraph ,
RetrieveMetadata = ( chunk ) => {
// add some basic metadata since this can't be null
return " { chuckSize: " " + chunk . Length + " " } " ;
}
} ) ;
/// Sentence Chunking
var loader = new TextDataLoader < int , string > ( vdb ) ;
loader . AddDocument ( document , new TextChunkingOptions < string >
{
Method = TextChunkingMethod . Sentence ,
RetrieveMetadata = ( chunk ) => {
// add some basic metadata since this can't be null
return " { chuckSize: " " + chunk . Length + " " } " ;
}
} ) ;
/// Fixed Length Chunking
var loader = new TextDataLoader < int , string > ( vdb ) ;
loader . AddDocument ( document , new TextChunkingOptions < string >
{
Method = TextChunkingMethod . FixedLength ,
ChunkSize = 150 ,
RetrieveMetadata = ( chunk ) => {
// add some basic metadata since this can't be null
return " { chuckSize: " " + chunk . Length + " " } " ;
}
} ) ;
RetrieveMetadata
acepta una función lambda que se puede utilizar para definir fácilmente los metadatos de los mandriles a medida que se cargan.
La aplicación de consola de muestra en este repositorio muestra el uso de ejemplo de Build5Nines.SharpVector.dll
Carga una lista de títulos y descripciones de películas desde un archivo JSON, luego permite al usuario escribir indicaciones para buscar en la base de datos y devolver las mejores coincidencias.
Aquí hay una captura de pantalla de la aplicación de la consola de prueba ejecutándose:
BasicMemoryVectorDatabase
ahora admite operaciones sincrónicas y asincrónicas.Async
funcionarán bien.Async
de clases para admitir subprocesos múltiples.AddText()
y .AddTextAsync()
IVectorSimilarityCalculator
a IVectorComparer
y CosineVectorSimilarityCalculatorAsync
a CosineSimilarityVectorComparerAsync
EuclideanDistanceVectorComparerAsync
MemoryVectorDatabase
para que ya no requiera el tipo genérico TId
no utilizadoVectorSimilarity
y Similarity
a VectorComparison
TextDataLoader
para brindar soporte para diferentes métodos de fragmentación de texto al cargar documentos en la base de datos vectorial.BasicMemoryVectorDatabase
como las implementaciones básicas de la base de datos de vectores que utiliza una estrategia de vectorización de bolsa de palabras, con similitud de coseno, un almacén de vocabulario de diccionario y un preprocesador de texto básico.VectorTextResultItem.Similarity
para que el código consumidor pueda inspeccionar la similitud del texto en los resultados de búsqueda de vectores..Search
para admitir la paginación de resultados de búsqueda y el soporte de umbrales para la comparación de similitudesEl mantenimiento del proyecto Build5Nines SharpVector corre a cargo de Chris Pietschmann, MVP de Microsoft y embajador de HashiCorp.