データ インジェストは、ダウンストリーム アプリケーションで使用できるように、ファイル、データベース、API、クラウド サービスなどのさまざまなソースからデータを収集、読み取り、準備するプロセスです。 実用的には、このプロセスは抽出-変換-ロード (ETL) ワークフローに従います。
- PDF、Word 文書、オーディオ ファイル、Web API のいずれであっても、元のソースからデータを抽出します。
- データをクリーニング、チャンクに分割、エンリッチ、またはフォーマットを変換して変形します。
- 取得と分析のために、データベース、ベクター ストア、AI モデルなどの宛先にデータを読み込みます。
AI と機械学習のシナリオ (特に取得拡張生成 (RAG) の場合、データ インジェストは、データを 1 つの形式から別の形式に変換することだけではありません。 インテリジェント アプリケーションでデータを使用できるようにします。 つまり、構造と意味を保持する方法でドキュメントを表し、それらを管理しやすいチャンクに分割し、メタデータまたは埋め込みで強化し、迅速かつ正確に取得できるように格納します。
AI アプリケーションでデータ インジェストが重要な理由
会社の膨大なドキュメントのコレクション全体で従業員が情報を見つけられるように、RAG を利用したチャットボットを構築しているとします。 これらのドキュメントには、PDF、Word ファイル、PowerPoint プレゼンテーション、さまざまなシステムに散在する Web ページが含まれる場合があります。
チャットボットは、正確でコンテキストに応じた回答を提供するために、何千ものドキュメントを理解して検索する必要があります。 しかし、未加工のドキュメントは AI システムには適していません。 検索および取得可能にしながら、意味を保持する形式に変換する必要があります。
ここで、データ インジェストが重要になります。 さまざまなファイル形式からテキストを抽出し、大きなドキュメントを AI モデルの制限内に収まる小さなチャンクに分割し、メタデータを使用してコンテンツを強化し、セマンティック検索用の埋め込みを生成し、高速な取得を可能にする方法ですべてを格納する必要があります。 各手順では、元の意味とコンテキストを保持する方法を慎重に検討する必要があります。
データ インジェストの構成要素
Microsoft.Extensions.DataIngestion ライブラリは、完全なデータ処理パイプラインを作成するために連携するいくつかの主要なコンポーネントを中心に構築されています。 このセクションでは、各コンポーネントとその組み合わせについて説明します。
ドキュメントとドキュメントリーダー
ライブラリの基礎となるのは IngestionDocument 型であり、重要な情報を失うことなく任意のファイル形式を表す統一された方法を提供します。
IngestionDocument は Markdown 中心です。これは、大規模な言語モデルが Markdown の書式設定に最も適しているためです。
IngestionDocumentReader抽象化では、ローカル ファイルまたはストリームを問わず、さまざまなソースからのドキュメントの読み込みを処理します。 いくつかのリーダーが利用可能です。
今後、より多くの読者 ( LlamaParse や Azure ドキュメント インテリジェンスを含む) が追加される予定です。
この設計は、同じ一貫性のある API を使用して異なるソースのドキュメントを操作できることを意味し、コードの保守性と柔軟性を高めることができます。
ドキュメント処理
ドキュメント プロセッサは、ドキュメント レベルで変換を適用して、コンテンツを強化および準備します。 ライブラリは、 ImageAlternativeTextEnricher クラスを、大きな言語モデルを使用してドキュメント内の画像の代替テキストを生成する組み込みプロセッサとして提供します。
チャンクとチャンク処理戦略
ドキュメントを読み込んだら、通常はチャンクと呼ばれる小さな部分に分割する必要があります。 チャンクは、AI システムによって効率的に処理、格納、および取得できるドキュメントのサブセクションを表します。 このチャンク プロセスは、最も関連性の高い情報をすばやく見つける必要がある、検索拡張生成シナリオに不可欠です。
ライブラリには、さまざまなユース ケースに合わせていくつかのチャンク戦略が用意されています。
- ヘッダーで 分割するヘッダーベースのチャンク。
- セクションごとに分割するセクションベースのチャンク化 (ページなど)。
- 完全な考えを保持するためのセマンティック対応チャンク。
これらのチャンク戦略は、Microsoft.ML.Tokenizers ライブラリに基づいて構築され、テキストを適切なサイズにインテリジェントに分割し、大規模な言語モデルで適切に動作します。 適切なチャンク戦略は、ドキュメントの種類と情報の取得方法によって異なります。
Tokenizer tokenizer = TiktokenTokenizer.CreateForModel("gpt-5");
IngestionChunkerOptions options = new(tokenizer)
{
MaxTokensPerChunk = 2000,
OverlapTokens = 0
};
IngestionChunker<string> chunker = new HeaderChunker(options);
チャンク処理とエンリッチメント
ドキュメントがチャンクに分割されたら、プロセッサを適用することでコンテンツを強化および充実できます。 チャンク プロセッサは個々の部分で動作し、次の処理を実行できます。
- 自動概要 ()、感情分析 (
SummaryEnricher)、キーワード抽出 (SentimentEnricher) を含むKeywordEnricher。 - 定義済みのカテゴリ () に基づく自動コンテンツ分類の
ClassificationEnricher。
これらのプロセッサは、大規模な言語モデルを活用してインテリジェントなコンテンツ変換を行うために、Microsoft.Extensions.AI.Abstractions を使用します。これにより、チャンクは後続のAIアプリケーションでより有用になります。
ドキュメント ライターとストレージ
IngestionChunkWriter<T> は、後で取得できるように、処理されたチャンクをデータ ストアに格納します。 Microsoft.Extensions.AIとMicrosoft.Extensions.VectorDataを使用するライブラリは、VectorStoreWriter<T> クラスを提供します。 このライターでは、でサポートされている任意のMicrosoft.Extensions.VectorDataにチャンクを格納できます。
ベクター ストアには、Qdrant、SQL Server、CosmosDB、MongoDB、ElasticSearch などの一般的なオプションが含まれます。 プロバイダーの詳細については、「即利用可能なベクターストアプロバイダー」を参照してください。 (パッケージ名に "SemanticKernel" が含まれているにもかかわらず、これらのプロバイダーはセマンティック カーネルとは関係なく、Agent Framework を含む .NET のどこでも使用できます)。
ライターは、 Microsoft.Extensions.AIを使用してチャンクの埋め込みを自動的に生成し、セマンティック検索と取得のシナリオに対応することもできます。
OpenAIClient openAIClient = new(
new ApiKeyCredential(Environment.GetEnvironmentVariable("OPENAI_API_KEY")!));
IEmbeddingGenerator<string, Embedding<float>> embeddingGenerator =
openAIClient.GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator();
using SqliteVectorStore vectorStore = new(
"Data Source=vectors.db;Pooling=false",
new()
{
EmbeddingGenerator = embeddingGenerator
});
// The writer requires the embedding dimension count to be specified.
// For OpenAI's `text-embedding-3-small`, the dimension count is 1536.
using VectorStoreWriter<string> writer = new(vectorStore, dimensionCount: 1536);
ドキュメント処理パイプライン
IngestionPipeline<T> API を使用すると、さまざまなデータ インジェスト コンポーネントを完全なワークフローにまとめることができます。 次の組み合わせが可能です。
- さまざまなソースからドキュメントを読み込む閲覧者。
- ドキュメント コンテンツを変換およびエンリッチするプロセッサ。
- ドキュメントを管理しやすい部分に分割するチャンカー。
- 選択したデータ ストアに最終的な結果を格納するためのライター。
このパイプライン アプローチにより、定型コードが削減され、複雑なデータ インジェスト ワークフローの構築、テスト、保守が簡単になります。
using IngestionPipeline<string> pipeline = new(reader, chunker, writer, loggerFactory: loggerFactory)
{
DocumentProcessors = { imageAlternativeTextEnricher },
ChunkProcessors = { summaryEnricher }
};
await foreach (var result in pipeline.ProcessAsync(new DirectoryInfo("."), searchPattern: "*.md"))
{
Console.WriteLine($"Completed processing '{result.DocumentId}'. Succeeded: '{result.Succeeded}'.");
}
1つのドキュメント インジェスト エラーでパイプライン全体を失敗させるべきではありません。 そのため、 IngestionPipeline<T>.ProcessAsync は IAsyncEnumerable<IngestionResult>を返すことによって部分的な成功を実装します。 呼び出し元は、エラーの処理を担当します (たとえば、失敗したドキュメントの再試行や最初のエラー時の停止など)。
.NET