Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.