Microsoft Agent Framework Microsoft.Extensions.AI Created: 27 Feb 2026 Updated: 27 Feb 2026

IEmbeddingGenerator: Basic Embedding Generation

IEmbeddingGenerator<TInput, TEmbedding> is the standard .NET abstraction for generating vector embeddings (defined in Microsoft.Extensions.AI). An embedding is a fixed-length array of floating-point numbers that represents the semantic meaning of a piece of text. Texts with similar meaning produce vectors that are close together in vector space.

For text, the concrete type is IEmbeddingGenerator<string, Embedding<float>>. Each Embedding<float> exposes a ReadOnlyMemory<float> Vector property containing the embedding coordinates.

Key Concepts

1. Creating the Generator for OpenAI

Use the OpenAI EmbeddingClient and the AsIEmbeddingGenerator() extension method:

IEmbeddingGenerator<string, Embedding<float>> generator =
new OpenAIClient(apiKey)
.GetEmbeddingClient("text-embedding-3-small")
.AsIEmbeddingGenerator();

2. Batch Generation — GenerateAsync

Pass multiple strings at once to generate all embeddings in a single API call. Returns GeneratedEmbeddings<Embedding<float>>, which is an indexed list of embeddings in the same order as the inputs:

GeneratedEmbeddings<Embedding<float>> embeddings =
await generator.GenerateAsync(["Senior Software Engineer", "Marketing Manager"]);

foreach (Embedding<float> emb in embeddings)
{
Console.WriteLine($"Dims: {emb.Vector.Length}");
Console.WriteLine($"First value: {emb.Vector.Span[0]}");
}

3. Single Input — GenerateVectorAsync

A convenience extension method for generating a single embedding vector directly:

ReadOnlyMemory<float> vector =
await generator.GenerateVectorAsync("Cloud Infrastructure Architect");

Console.WriteLine($"Dimensions: {vector.Length}");

Full Example

using Microsoft.Extensions.AI;
using OpenAI;

namespace MicrosoftAgentFrameworkLesson.ConsoleApp.Embeddings;

/// <summary>
/// Demonstrates IEmbeddingGenerator: GenerateAsync (batch) and GenerateVectorAsync (single).
/// Scenario: Tagging job descriptions with vector embeddings.
/// </summary>
public static class BasicEmbeddingDemo
{
public static async Task RunAsync()
{
var apiKey = Environment.GetEnvironmentVariable("OPEN_AI_KEY")
?? throw new InvalidOperationException("Set OPEN_AI_KEY environment variable.");

IEmbeddingGenerator<string, Embedding<float>> generator =
new OpenAIClient(apiKey)
.GetEmbeddingClient("text-embedding-3-small")
.AsIEmbeddingGenerator();

Console.WriteLine("====== IEmbeddingGenerator — Basic Embedding Generation ======\n");

// Demo 1: Batch generation — multiple inputs at once
Console.WriteLine("--- Demo 1: Batch Generation (GenerateAsync) ---");
string[] jobTitles =
[
"Senior Software Engineer",
"Marketing Manager",
"Data Scientist"
];

GeneratedEmbeddings<Embedding<float>> embeddings =
await generator.GenerateAsync(jobTitles);

for (int i = 0; i < jobTitles.Length; i++)
{
float[] vec = embeddings[i].Vector.ToArray();
Console.WriteLine($" \"{jobTitles[i]}\"");
Console.WriteLine($" Dimensions : {vec.Length}");
Console.WriteLine($" First 4 : [{string.Join(", ", vec.Take(4).Select(v => v.ToString("F4")))}]");
Console.WriteLine();
}

// Demo 2: Single input — convenience method
Console.WriteLine("--- Demo 2: Single Input (GenerateVectorAsync) ---");
ReadOnlyMemory<float> vector =
await generator.GenerateVectorAsync("Cloud Infrastructure Architect");

Console.WriteLine($" \"Cloud Infrastructure Architect\"");
Console.WriteLine($" Dimensions : {vector.Length}");
Console.WriteLine($" First 4 : [{string.Join(", ", vector.Span.ToArray().Take(4).Select(v => v.ToString("F4")))}]");
Console.WriteLine();
}
}
Share this lesson: