SemanticSlicer é uma biblioteca C# para dividir dados de texto em pedaços menores enquanto tenta quebrar o texto em limites significativos.
GitHub: https://github.com/drittich/SemanticSlicer
Esta biblioteca aceita texto e o divide em pedaços menores, normalmente útil para criar embeddings LLM AI.
O nome do pacote é drittich.SemanticSlicer
. Você pode instalar isso do Nuget através da linha de comando:
dotnet add package drittich.SemanticSlicer
ou no Console do Gerenciador de Pacotes:
NuGetInstall-Package drittich.SemanticSlicer
Documento de texto simples:
// The default options uses text separators, a max chunk size of 1,000, and
// cl100k_base encoding to count tokens.
var slicer = new Slicer ( ) ;
var text = File . ReadAllText ( " MyDocument.txt " ) ;
var documentChunks = slicer . GetDocumentChunks ( text ) ;
Documento de redução:
// Let's use Markdown separators and reduce the chunk size
var options = new SlicerOptions { MaxChunkTokenCount = 600 , Separators = Separators . Markdown } ;
var slicer = new Slicer ( options ) ;
var text = File . ReadAllText ( " MyDocument.md " ) ;
var documentChunks = slicer . GetDocumentChunks ( text ) ;
Documento HTML:
var options = new SlicerOptions { Separators = Separators . Html } ;
var slicer = new Slicer ( options ) ;
var text = File . ReadAllText ( " MyDocument.html " ) ;
var documentChunks = slicer . GetDocumentChunks ( text ) ;
Removendo tags HTML:
Para qualquer conteúdo, você pode optar por remover tags HTML dos blocos para minimizar o número de tokens. O texto interno é preservado e se houver uma tag <Title>
o título será anexado ao resultado:
// Let's remove the HTML tags as they just consume a lot of tokens without adding much value
var options = new SlicerOptions { Separators = Separators . Html , StripHtml = true } ;
var slicer = new Slicer ( options ) ;
var text = File . ReadAllText ( " MyDocument.html " ) ;
var documentChunks = slicer . GetDocumentChunks ( text ) ;
Separadores personalizados:
Você pode passar em sua própria lista de separadores se desejar, por exemplo, se desejar adicionar suporte para outros documentos.
Os pedaços serão retornados na ordem em que foram encontrados no documento e conterão uma propriedade Index que você pode usar para colocá-los novamente em ordem, se necessário.
Você pode passar quaisquer metadados adicionais que desejar como um dicionário, e eles serão retornados com cada pedaço do documento, por isso é fácil persistir. Você pode usar os metadados para armazenar o ID do documento, título ou data da última modificação.
var slicer = new Slicer ( ) ;
var text = File . ReadAllText ( " MyDocument.txt " ) ;
var metadata = new Dictionary < string , object ? > ( ) ;
metadata [ " Id " ] = 123 ;
metadata [ " FileName " ] = " MyDocument.txt " ;
var documentChunks = slicer . GetDocumentChunks ( text , metadata ) ;
// All chunks returned will have a Metadata property with the data you passed in.
Se desejar, você pode passar um cabeçalho para ser incluído no topo de cada bloco. Exemplos de casos de uso são incluir o título ou tags do documento como parte do conteúdo do bloco para ajudar a manter o contexto.
var slicer = new Slicer ( ) ;
var fileName = " MyDocument.txt " ;
var text = File . ReadAllText ( fileName ) ;
var header = $" FileName: { fileName } " ;
var documentChunks = slicer . GetDocumentChunks ( text , null , header ) ;
Este projeto está licenciado sob a licença MIT - consulte o arquivo LICENSE para obter detalhes.
Se você tiver alguma dúvida ou feedback, abra um problema neste repositório.