Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
.NET-Bibliotheken, die Clients für Sprachmodelle und -dienste bereitstellen, können Implementierungen der IChatClient- und der IEmbeddingGenerator<TInput,TEmbedding>-Schnittstellen bereitstellen. Alle Verbraucher der Schnittstellen können dann nahtlos mit diesen Modellen und Diensten über die Abstraktionen zusammenarbeiten.
Die IChatClient
-Schnittstelle
Die IChatClient-Schnittstelle definiert eine Client-Abstraktion, die für die Interaktion mit KI-Diensten verantwortlich ist, die Chatfunktionen bereitstellen. Es enthält Methoden zum Senden und Empfangen von Nachrichten mit multimodalem Inhalt (wie z. B. Text, Bilder und Audio), entweder als kompletter Satz oder inkrementell gestreamt. Darüber hinaus ermöglicht es das Abrufen stark typisierter Dienste, die vom Client oder seinen zugrunde liegenden Diensten bereitgestellt werden.
Das folgende Beispiel implementiert IChatClient
, um die allgemeine Struktur zu zeigen.
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() { }
}
Für realistischere, konkrete Umsetzungen von IChatClient
, siehe:
Die IEmbeddingGenerator<TInput,TEmbedding>
-Schnittstelle
Die Schnittstelle IEmbeddingGenerator<TInput,TEmbedding> stellt einen generischen Generator für Einbettungen dar. Dabei ist TInput
der Typ der einzubettenden Eingabewerte und TEmbedding
der Typ der generierten Einbettung, die von der Klasse Embedding erbt.
Die Klasse Embedding
dient als Basisklasse für Einbettungen, die von einer IEmbeddingGenerator<TInput,TEmbedding>
generiert werden. Es wurde entwickelt, um die Metadaten und Daten zu speichern und zu verwalten, die mit Einbettungen verknüpft sind. Abgeleitete Typen, wie Embedding<T>
, stellen die konkreten Einbettungsvektordaten bereit. Beispielsweise stellt ein Embedding<float>
eine ReadOnlyMemory<float> Vector { get; }
-Eigenschaft bereit, um auf die eingebetteten Daten zuzugreifen.
Die Schnittstelle IEmbeddingGenerator<TInput,TEmbedding>
definiert eine Methode zur asynchronen Generierung von Einbettungen für eine Sammlung von Eingabewerten, mit optionaler Unterstützung für Konfiguration und Abbruch. Außerdem werden Metadaten bereitgestellt, die den Generator beschreiben, und es ermöglicht den Abruf von stark typisierten Diensten, die entweder vom Generator selbst oder von seinen zugrunde liegenden Diensten bereitgestellt werden können.
Der folgende Code zeigt, wie die SampleEmbeddingGenerator
Klasse die IEmbeddingGenerator<TInput,TEmbedding>
Schnittstelle implementiert. Er verfügt über einen primären Konstruktor, der einen Endpunkt und eine Modell-ID akzeptiert, die zum Identifizieren des Generators verwendet werden. Außerdem wird die GenerateAsync(IEnumerable<TInput>, EmbeddingGenerationOptions, CancellationToken) Methode implementiert, um Einbettungen für eine Sammlung von Eingabewerten zu generieren.
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() { }
}
Diese Beispielimplementierung generiert nur zufällige Einbettungsvektoren. Eine realistischere, konkretere Umsetzung finden Sie unter OpenTelemetryEmbeddingGenerator.cs.