Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Библиотеки .NET, предоставляющие клиентам языковые модели и службы, могут предоставлять реализации IChatClient интерфейсов и IEmbeddingGenerator<TInput,TEmbedding> интерфейсов. Затем все потребители интерфейсов могут легко взаимодействовать с этими моделями и службами через абстракции.
Интерфейс IChatClient
Интерфейс IChatClient определяет абстракцию клиента, отвечающую за взаимодействие со службами ИИ, предоставляющими возможности чата. Он включает методы отправки и получения сообщений с мультимодальным содержимым (например, текстом, изображениями и звуком), либо как полный набор, либо передача потоком. Кроме того, он позволяет получать строго типизированные службы, предоставляемые клиентом или его базовыми службами.
Следующий пример реализует IChatClient
для отображения общей структуры.
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() { }
}
Более реалистичные и конкретные реализации IChatClient
см. здесь:
Интерфейс IEmbeddingGenerator<TInput,TEmbedding>
Интерфейс IEmbeddingGenerator<TInput,TEmbedding> представляет универсальный генератор эмбеддингов. Здесь TInput
— это тип внедренных входных значений, а TEmbedding
— это тип созданного внедрения, который наследует от класса Embedding.
Класс Embedding
служит базовым классом для внедрений, созданных IEmbeddingGenerator<TInput,TEmbedding>
. Он предназначен для хранения метаданных и данных, связанных с внедрением, и управления ими. Производные типы, такие как Embedding<T>
, предоставляют конкретные данные векторов вложения. Например, объект Embedding<float>
предоставляет свойство ReadOnlyMemory<float> Vector { get; }
для доступа к его встроенным данным.
Интерфейс IEmbeddingGenerator<TInput,TEmbedding>
определяет метод асинхронной генерации векторных представлений для коллекции входных значений с поддержкой необязательной конфигурации и возможности отмены. Он также предоставляет метаданные, описывающие генератор, и позволяет получить строго типизированные службы, которые могут быть предоставлены генератором или ее базовыми службами.
В следующем коде показано, как SampleEmbeddingGenerator
класс реализует IEmbeddingGenerator<TInput,TEmbedding>
интерфейс. Он имеет основной конструктор, который принимает конечную точку и идентификатор модели, которые используются для идентификации генератора. Он также реализует GenerateAsync(IEnumerable<TInput>, EmbeddingGenerationOptions, CancellationToken) метод для создания внедрения для коллекции входных значений.
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() { }
}
Эта примерная реализация просто создает случайные векторы внедрения. См. более реалистичную, конкретную реализацию в OpenTelemetryEmbeddingGenerator.cs.