Sdílet prostřednictvím


Ukázkové implementace IChatClient a IEmbeddingGenerator

Knihovny .NET, které poskytují klienty pro jazykové modely a služby, mohou poskytovat implementace rozhraní IChatClient a IEmbeddingGenerator<TInput,TEmbedding>. Všichni uživatelé rozhraní pak můžou bezproblémově spolupracovat s těmito modely a službami prostřednictvím abstrakcí.

Rozhraní IChatClient

Rozhraní IChatClient definuje abstrakci klienta zodpovědnou za interakci se službami AI, které poskytují možnosti chatu. Obsahuje metody pro odesílání a přijímání zpráv s vícemodálním obsahem (například textem, obrázky a zvukem), a to buď jako kompletní sada, nebo streamovaná přírůstkově. Kromě toho umožňuje načítat silně typované služby, které poskytuje klient nebo jeho podpůrné služby.

Následující ukázka implementuje IChatClient, aby zobrazila obecnou strukturu.

using System.Runtime.CompilerServices;
using Microsoft.Extensions.AI;

public sealed class SampleChatClient(Uri endpoint, string modelId)
    : IChatClient
{
    public ChatClientMetadata Metadata { get; } =
        new(nameof(SampleChatClient), endpoint, modelId);

    public async Task<ChatResponse> GetResponseAsync(
        IEnumerable<ChatMessage> chatMessages,
        ChatOptions? options = null,
        CancellationToken cancellationToken = default)
    {
        // Simulate some operation.
        await Task.Delay(300, cancellationToken);

        // Return a sample chat completion response randomly.
        string[] responses =
        [
            "This is the first sample response.",
            "Here is another example of a response message.",
            "This is yet another response message."
        ];

        return new(new ChatMessage(
            ChatRole.Assistant,
            responses[Random.Shared.Next(responses.Length)]
            ));
    }

    public async IAsyncEnumerable<ChatResponseUpdate> GetStreamingResponseAsync(
        IEnumerable<ChatMessage> chatMessages,
        ChatOptions? options = null,
        [EnumeratorCancellation] CancellationToken cancellationToken = default)
    {
        // Simulate streaming by yielding messages one by one.
        string[] words = ["This ", "is ", "the ", "response ", "for ", "the ", "request."];
        foreach (string word in words)
        {
            // Simulate some operation.
            await Task.Delay(100, cancellationToken);

            // Yield the next message in the response.
            yield return new ChatResponseUpdate(ChatRole.Assistant, word);
        }
    }

    public object? GetService(Type serviceType, object? serviceKey) => this;

    public TService? GetService<TService>(object? key = null)
        where TService : class => this as TService;

    void IDisposable.Dispose() { }
}

Realističtější, konkrétní implementace IChatClient, viz:

Rozhraní IEmbeddingGenerator<TInput,TEmbedding>

Rozhraní IEmbeddingGenerator<TInput,TEmbedding> představuje obecný generátor vnoření. Tady TInput je typ vstupních hodnot, které se vkládají, a TEmbedding je typ vygenerovaného vkládání, který dědí z Embedding třídy.

Třída Embedding slouží jako základní třída pro vkládání vytvořená IEmbeddingGenerator<TInput,TEmbedding>. Je navržený tak, aby ukládal a spravoval metadata a data spojená s embedováním. Odvozené typy, jako Embedding<T>, poskytují konkrétní vložená vektorová data. Například Embedding<float> zpřístupňuje ReadOnlyMemory<float> Vector { get; } vlastnost pro přístup ke svým vloženým datům.

Rozhraní IEmbeddingGenerator<TInput,TEmbedding> definuje metodu pro asynchronní generování vkládání pro kolekci vstupních hodnot s volitelnou konfigurací a podporou zrušení. Poskytuje také metadata popisující generátor a umožňuje načtení pevně typovaných služeb, které může generátor nebo jeho základní služby poskytovat.

Následující kód ukazuje, jak SampleEmbeddingGenerator třída implementuje IEmbeddingGenerator<TInput,TEmbedding> rozhraní. Má primární konstruktor, který přijímá ID koncového bodu a modelu, které slouží k identifikaci generátoru. Implementuje také metodu GenerateAsync(IEnumerable<TInput>, EmbeddingGenerationOptions, CancellationToken) pro generování vložených hodnot pro kolekci vstupních hodnot.

using Microsoft.Extensions.AI;

public sealed class SampleEmbeddingGenerator(
    Uri endpoint, string modelId)
        : IEmbeddingGenerator<string, Embedding<float>>
{
    private readonly EmbeddingGeneratorMetadata _metadata =
        new("SampleEmbeddingGenerator", endpoint, modelId);

    public async Task<GeneratedEmbeddings<Embedding<float>>> GenerateAsync(
        IEnumerable<string> values,
        EmbeddingGenerationOptions? options = null,
        CancellationToken cancellationToken = default)
    {
        // Simulate some async operation.
        await Task.Delay(100, cancellationToken);

        // Create random embeddings.
        return [.. from value in values
            select new Embedding<float>(
                Enumerable.Range(0, 384)
                .Select(_ => Random.Shared.NextSingle()).ToArray())];
    }

    public object? GetService(Type serviceType, object? serviceKey) =>
        serviceKey is not null
        ? null
        : serviceType == typeof(EmbeddingGeneratorMetadata)
            ? _metadata
            : serviceType?.IsInstanceOfType(this) is true
                ? this
                : null;

    void IDisposable.Dispose() { }
}

Tato ukázková implementace pouze generuje náhodné vložené vektory. Realističtější konkrétní implementaci najdete v tématu OpenTelemetryEmbeddingGenerator.cs.