Freigeben über


Chatvervollständigung

Nach Abschluss des Chats können Sie eine Hin- und Her-Unterhaltung mit einem KI-Agent simulieren. Dies ist natürlich nützlich für das Erstellen von Chat-Bots, kann aber auch zum Erstellen autonomer Agents verwendet werden, die Geschäftsprozesse abschließen, Code generieren und vieles mehr. Als primärer Modelltyp, der von OpenAI, Google, Mistral, Facebook und anderen bereitgestellt wird, ist der Chatabschluss der am häufigsten verwendete KI-Dienst, den Sie Ihrem Semantik Kernel-Projekt hinzufügen werden.

Beim Auswählen eines Chatabschlussmodells müssen Sie Folgendes berücksichtigen:

  • Welche Modalitäten unterstützt das Modell (z. B. Text, Bild, Audio usw.)?
  • Unterstützt es Funktionsaufrufe?
  • Wie schnell empfangen und generieren Sie Token?
  • Wie viel kostet jedes Token?

Wichtig

Von allen oben genannten Fragen ist am wichtigsten, ob das Modell Funktionsaufrufe unterstützt. Wenn dies nicht der Fall ist, können Sie das Modell nicht verwenden, um Ihren vorhandenen Code aufzurufen. Die meisten der neuesten Modelle von OpenAI, Google, Mistral und Amazon unterstützen funktionsaufrufe. Die Unterstützung von kleinen Sprachmodellen ist jedoch weiterhin begrenzt.

Installieren der erforderlichen Pakete

Vor dem Hinzufügen des Chatabschlusses zu Ihrem Kernel müssen Sie die erforderlichen Pakete installieren. Nachfolgend finden Sie die Pakete, die Sie für jeden KI-Dienstanbieter installieren müssen.

dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI

Erstellen von Chatabschlussdiensten

Nachdem Sie nun die erforderlichen Pakete installiert haben, können Sie Chatabschlussdienste erstellen. Nachfolgend finden Sie die verschiedenen Möglichkeiten zum Erstellen von Chatabschlussdiensten mithilfe des semantischen Kernels.

Direktes Hinzufügen zum Kernel

Um einen Chatabschlussdienst hinzuzufügen, können Sie ihn mit dem folgenden Code dem internen Dienstanbieter des Kernels hinzufügen.

dotnet add package Microsoft.SemanticKernel.Connectors.OpenAI
using Microsoft.SemanticKernel;

IKernelBuilder kernelBuilder = Kernel.CreateBuilder();
kernelBuilder.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    serviceId: "YOUR_SERVICE_ID", // Optional; for targeting specific services within Semantic Kernel
    httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);
Kernel kernel = kernelBuilder.Build();

Verwenden der Abhängigkeitsinjektion

Wenn Sie abhängigkeitsinjektion verwenden, sollten Sie Ihre KI-Dienste wahrscheinlich direkt dem Dienstanbieter hinzufügen. Dies ist hilfreich, wenn Sie Singletons Ihrer KI-Dienste erstellen und sie in vorübergehenden Kerneln wiederverwenden möchten.

using Microsoft.SemanticKernel;

var builder = Host.CreateApplicationBuilder(args);

builder.Services.AddAzureOpenAIChatCompletion(
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    serviceId: "YOUR_SERVICE_ID" // Optional; for targeting specific services within Semantic Kernel
);

builder.Services.AddTransient((serviceProvider)=> {
    return new Kernel(serviceProvider);
});

Erstellen eigenständiger Instanzen

Schließlich können Sie Instanzen des Diensts direkt erstellen, damit Sie sie einem Kernel später hinzufügen oder direkt in Ihrem Code verwenden können, ohne sie jemals in den Kernel oder in einen Dienstanbieter einzufügen.

using Microsoft.SemanticKernel.Connectors.OpenAI;

AzureOpenAIChatCompletionService chatCompletionService = new (
    deploymentName: "NAME_OF_YOUR_DEPLOYMENT",
    apiKey: "YOUR_API_KEY",
    endpoint: "YOUR_AZURE_ENDPOINT",
    modelId: "gpt-4", // Optional name of the underlying model if the deployment name doesn't match the model name
    httpClient: new HttpClient() // Optional; if not provided, the HttpClient from the kernel will be used
);

Um einen Chatabschlussdienst hinzuzufügen, können Sie ihn mit dem folgenden Code dem Kernel hinzufügen.

from semantic_kernel import Kernel
from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

# Initialize the kernel
kernel = Kernel()

# Add the Azure OpenAI chat completion service
kernel.add_service(AzureChatCompletion(
    deployment_name="my-deployment",
    api_key="my-api-key",
    base_url="https://my-deployment.azurewebsites.net", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
))

Sie können instanzen des Diensts auch direkt erstellen, damit Sie sie einem Kernel später hinzufügen oder direkt in Ihrem Code verwenden können, ohne sie in den Kernel einzufügen.

from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

chat_completion_service = AzureChatCompletion(
    deployment_name="my-deployment",
    api_key="my-api-key",
    base_url="https://my-deployment.azurewebsites.net", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)

Sie können Instanzen des Chatabschlussdiensts direkt erstellen und entweder einem Kernel hinzufügen oder sie direkt in Ihrem Code verwenden, ohne sie in den Kernel einzufügen. Der folgende Code zeigt, wie Sie einen Chatabschlussdienst erstellen und dem Kernel hinzufügen.

import com.azure.ai.openai.OpenAIAsyncClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.microsoft.semantickernel.Kernel;
import com.microsoft.semantickernel.services.chatcompletion.ChatCompletionService;

// Create the client
OpenAIAsyncClient client = new OpenAIClientBuilder()
    .credential(azureOpenAIClientCredentials)
    .endpoint(azureOpenAIClientEndpoint)
    .buildAsyncClient();

// Create the chat completion service
ChatCompletionService openAIChatCompletion = OpenAIChatCompletion.builder()
    .withOpenAIAsyncClient(client)
    .withModelId(modelId)
    .build();

// Initialize the kernel
Kernel kernel = Kernel.builder()
    .withAIService(ChatCompletionService.class, openAIChatCompletion)
    .build();

Abrufen von Chatabschlussdiensten

Nachdem Sie Ihrem Kernel Chatabschlussdienste hinzugefügt haben, können Sie sie mithilfe der Get-Service-Methode abrufen. Nachfolgend finden Sie ein Beispiel, wie Sie einen Chatabschlussdienst aus dem Kernel abrufen können.

var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
from semantic_kernel.connectors.ai.chat_completion_client_base import ChatCompletionClientBase

chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)
ChatCompletionService chatCompletionService = kernel.getService(ChatCompletionService.class);

Verwenden von Chatabschlussdiensten

Nachdem Sie nun über einen Chatabschlussdienst verfügen, können Sie ihn verwenden, um Antworten von einem KI-Agent zu generieren. Es gibt zwei Hauptmethoden für die Verwendung eines Chatabschlussdiensts:

  • Nicht-Streaming: Sie warten, bis der Dienst eine gesamte Antwort generiert, bevor Sie sie an den Benutzer zurückgeben.
  • Streaming: Einzelne Blöcke der Antwort werden generiert und beim Erstellen an den Benutzer zurückgegeben.

Im Folgenden finden Sie die beiden Möglichkeiten, wie Sie einen Chatabschlussdienst verwenden können, um Antworten zu generieren.

Abschluss des Nicht-Streaming-Chats

Um den Abschluss eines Nicht-Streaming-Chats zu verwenden, können Sie den folgenden Code verwenden, um eine Antwort vom KI-Agent zu generieren.

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = await chatCompletionService.GetChatMessageContentAsync(
    history,
    kernel: kernel
);
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = await chat_completion.get_chat_message_content(
    chat_history=history,
    kernel=kernel,
)
ChatHistory history = new ChatHistory();
history.addUserMessage("Hello, how are you?");

InvocationContext optionalInvocationContext = null;

List<ChatMessageContent<?>> response = chatCompletionService.getChatMessageContentsAsync(
    history,
    kernel,
    optionalInvocationContext
);

Abschluss des Streaming-Chats

Um den Abschluss des Streamingchats zu verwenden, können Sie den folgenden Code verwenden, um eine Antwort vom KI-Agent zu generieren.

ChatHistory history = [];
history.AddUserMessage("Hello, how are you?");

var response = chatCompletionService.GetStreamingChatMessageContentsAsync(
    chatHistory: history,
    kernel: kernel
);

await foreach (var chunk in response)
{
    Console.Write(chunk);
}
chat_history = ChatHistory()
chat_history.add_user_message("Hello, how are you?")

response = chat_completion.get_streaming_chat_message_content(
    chat_history=history,
    kernel=kernel,
)

async for chunk in response:
    print(chunk)

Hinweis

Der semantische Kernel für Java unterstützt das Streaming-Antwortmodell nicht.

Nächste Schritte

Nachdem Sie Ihrem semantischen Kernelprojekt Chatabschlussdienste hinzugefügt haben, können Sie mit dem Erstellen von Unterhaltungen mit Ihrem KI-Agent beginnen. Weitere Informationen zur Verwendung eines Chatabschlussdiensts finden Sie in den folgenden Artikeln: