SemanticSlicer — это библиотека C# для разбиения текстовых данных на более мелкие фрагменты при попытке разбить текст на значимые границы.
GitHub: https://github.com/drittich/SemanticSlicer
Эта библиотека принимает текст и разбивает его на более мелкие фрагменты, что обычно полезно при создании внедрений LLM AI.
Имя пакета — drittich.SemanticSlicer
. Вы можете установить это из Nuget через командную строку:
dotnet add package drittich.SemanticSlicer
или из консоли диспетчера пакетов:
NuGetInstall-Package drittich.SemanticSlicer
Простой текстовый документ:
// 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 ) ;
Документ с уценкой:
// 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 ) ;
HTML-документ:
var options = new SlicerOptions { Separators = Separators . Html } ;
var slicer = new Slicer ( options ) ;
var text = File . ReadAllText ( " MyDocument.html " ) ;
var documentChunks = slicer . GetDocumentChunks ( text ) ;
Удаление HTML-тегов:
Для любого контента вы можете удалить HTML-теги из фрагментов, чтобы минимизировать количество токенов. Внутренний текст сохраняется, и если есть тег <Title>
заголовок будет добавлен к результату:
// 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 ) ;
Пользовательские разделители:
Если хотите, вы можете передать свой собственный список разделителей, например, если вы хотите добавить поддержку других документов.
Фрагменты будут возвращены в том порядке, в котором они были найдены в документе, и будут содержать свойство Index, которое можно использовать, чтобы при необходимости вернуть их в порядок.
Вы можете передать любые дополнительные метаданные в виде словаря, и они будут возвращены с каждым фрагментом документа, поэтому их легко сохранить. Вы можете использовать метаданные для хранения идентификатора документа, названия или даты последнего изменения.
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.
Если вы хотите, вы можете передать заголовок, который будет включен в начало каждого фрагмента. Примеры вариантов использования – включение заголовка или тегов документа в состав содержимого фрагмента для поддержания контекста.
var slicer = new Slicer ( ) ;
var fileName = " MyDocument.txt " ;
var text = File . ReadAllText ( fileName ) ;
var header = $" FileName: { fileName } " ;
var documentChunks = slicer . GetDocumentChunks ( text , null , header ) ;
Этот проект лицензируется по лицензии MIT — подробности см. в файле ЛИЦЕНЗИИ.
Если у вас есть какие-либо вопросы или отзывы, пожалуйста, откройте вопрос в этом репозитории.