Build5Nines.SharpVector
é uma biblioteca de banco de dados vetorial na memória projetada para aplicativos .NET. Ele permite armazenar, pesquisar e gerenciar dados de texto usando representações vetoriais. A biblioteca é personalizável e extensível, permitindo suporte para diferentes métodos de comparação de vetores, técnicas de pré-processamento e estratégias de vetorização.
Bancos de dados vetoriais são usados com soluções de IA generativa, aumentando o LLM (Large Language Model) com a capacidade de carregar dados de contexto adicionais com o prompt de IA usando o padrão de design RAG (Retrieval-Augmented Generation).
Embora existam muitos bancos de dados grandes que podem ser usados para construir bancos de dados vetoriais (como Azure CosmosDB, PostgreSQL com pgvector, Azure AI Search, Elasticsearch e muito mais), não há muitas opções para um banco de dados vetorial leve que possa ser incorporado em qualquer aplicativo .NET.
O projeto Build5Nines SharpVector fornece um banco de dados vetorial leve na memória para uso em qualquer aplicativo .NET.
"Para o banco de dados vetorial na memória, estamos usando o Build5Nines.SharpVector, um excelente projeto de código aberto de Chris Pietschmann. O SharpVector facilita o armazenamento e a recuperação de dados vetorizados, tornando-o uma escolha ideal para nossa implementação RAG de amostra."
— Tulika Chaudharie, gerente principal de produtos da Microsoft para Azure App Service
Um banco de dados vetorial na memória como Build5Nines.SharpVector
oferece diversas vantagens em relação a um servidor de banco de dados vetorial tradicional, especialmente em cenários que podem exigir alto desempenho, baixa latência e uso eficiente de recursos.
Aqui está uma lista de vários cenários de uso onde Build5Nines.SharpVector
pode ser útil:
Aqui estão alguns links de tutoriais úteis com documentação adicional e exemplos sobre como usar Build5Nines.SharpVector
em seus próprios projetos:
A biblioteca Build5Nines.SharpVector
está disponível como um pacote Nuget para incluir facilmente em seus projetos .NET:
dotnet add package Build5Nines.SharpVector
Você pode visualizá-lo em Nuget.org aqui: https://www.nuget.org/packages/Build5Nines.SharpVector/
Para obter compatibilidade máxima, a biblioteca Build5Nines.SharpVector
é criada sem usar dependências externas além das disponíveis no .NET e foi criada para direcionar o .NET 6 e versões posteriores.
Como você pode ver no exemplo de uso da biblioteca Build5Nines.SharpVector
a seguir, em apenas algumas linhas de código você pode incorporar um banco de dados vetorial na memória em qualquer aplicativo .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 ) ;
}
}
A classe Build5Nines.SharpVector.BasicMemoryVectorDatabase
usa uma estratégia de vetorização Bag of Words, com similaridade de cosseno, um armazenamento de vocabulário de dicionário e um pré-processador de texto básico. A biblioteca contém classes genéricas e muitos pontos de extensão para criar implementações personalizadas de banco de dados vetoriais, se necessário.
Além disso, o TextDataLoader
pode ser usado para ajudar a carregar documentos de texto no banco de dados vetorial com suporte para vários métodos diferentes de agrupamento 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 + " " } " ;
}
} ) ;
O RetrieveMetadata
aceita uma função lambda que pode ser usada para definir facilmente os metadados dos mandris à medida que são carregados.
O aplicativo de console de exemplo neste repositório mostra um exemplo de uso de Build5Nines.SharpVector.dll
Ele carrega uma lista de títulos e descrições de filmes de um arquivo JSON e permite que o usuário digite prompts para pesquisar no banco de dados e retornar as melhores correspondências.
Aqui está uma captura de tela do aplicativo do console de teste em execução:
BasicMemoryVectorDatabase
agora oferece suporte a operações síncronas e assíncronas.Async
funcionarão perfeitamente.Async
de classes para suportar multithreading.AddText()
e .AddTextAsync()
IVectorSimilarityCalculator
para IVectorComparer
e CosineVectorSimilarityCalculatorAsync
para CosineSimilarityVectorComparerAsync
EuclideanDistanceVectorComparerAsync
MemoryVectorDatabase
para não exigir mais o tipo genérico TId
não utilizadoVectorSimilarity
e Similarity
para VectorComparison
TextDataLoader
para fornecer suporte para diferentes métodos de agrupamento de texto ao carregar documentos no banco de dados vetorial.BasicMemoryVectorDatabase
como as implementações básicas do banco de dados vetorial que usa uma estratégia de vetorização Bag of Words, com similaridade de cosseno, um armazenamento de vocabulário de dicionário e um pré-processador de texto básico.VectorTextResultItem.Similarity
para que o código consumido possa inspecionar a similaridade do Texto nos resultados da pesquisa vetorial..Search
para suportar paginação de resultados de pesquisa e suporte de limite para comparação de similaridadeO projeto Build5Nines SharpVector é mantido por Chris Pietschmann, Microsoft MVP e Embaixador da HashiCorp.