Udostępnij za pośrednictwem


Uzupełnianie czatu

Po zakończeniu czatu można symulować rozmowę z agentem sztucznej inteligencji. Jest to oczywiście przydatne do tworzenia czatbotów, ale może być również używany do tworzenia autonomicznych agentów, którzy mogą wykonywać procesy biznesowe, generować kod i nie tylko. Jako podstawowy typ modelu udostępniany przez openAI, Google, Mistral, Facebook i inne, uzupełnianie czatu jest najpopularniejszą usługą sztucznej inteligencji, którą dodasz do projektu Semantic Kernel.

Podczas wybierania modelu uzupełniania czatu należy wziąć pod uwagę następujące kwestie:

  • Jakie modalności obsługuje model (np. tekst, obraz, dźwięk itp.)?
  • Czy obsługuje ona wywoływanie funkcji?
  • Jak szybko odbiera i generuje tokeny?
  • Ile kosztuje każdy token?

Ważne

Spośród wszystkich powyższych pytań najważniejsze jest to, czy model obsługuje wywoływanie funkcji. Jeśli tak nie jest, nie będzie można wywołać istniejącego kodu przy użyciu modelu. Większość najnowszych modeli z platform OpenAI, Google, Mistral i Amazon obsługuje wywoływanie funkcji. Obsługa modeli małych języków jest jednak nadal ograniczona.

Konfigurowanie środowiska lokalnego

Niektóre usługi sztucznej inteligencji mogą być hostowane lokalnie i mogą wymagać konfiguracji. Poniżej znajdują się instrukcje dla tych, którzy to wspierają.

Brak konfiguracji lokalnej.

Instalowanie niezbędnych pakietów

Przed dodaniem ukończenia czatu do jądra należy zainstalować niezbędne pakiety. Poniżej przedstawiono pakiety, które należy zainstalować dla każdego dostawcy usług sztucznej inteligencji.

dotnet add package Microsoft.SemanticKernel.Connectors.AzureOpenAI

Tworzenie usług uzupełniania czatu

Po zainstalowaniu niezbędnych pakietów możesz utworzyć usługi uzupełniania czatów. Poniżej przedstawiono kilka sposobów tworzenia usług uzupełniania czatów przy użyciu semantycznego jądra.

Dodawanie bezpośrednio do jądra

Aby dodać usługę uzupełniania czatu, możesz użyć następującego kodu, aby dodać go do wewnętrznego dostawcy usług jądra.

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();

Korzystanie z wstrzykiwania zależności

Jeśli używasz wstrzykiwania zależności, prawdopodobnie chcesz dodać usługi sztucznej inteligencji bezpośrednio do dostawcy usług. Jest to przydatne, jeśli chcesz utworzyć pojedynczetony usług sztucznej inteligencji i użyć ich ponownie w przejściowych jądrach.

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);
});

Tworzenie wystąpień autonomicznych

Na koniec możesz utworzyć wystąpienia usługi bezpośrednio, aby można było dodać je do jądra później lub użyć ich bezpośrednio w kodzie, nie wstrzykiwając ich do jądra lub dostawcy usług.

using Microsoft.SemanticKernel.Connectors.AzureOpenAI;

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
);

Aby utworzyć usługę uzupełniania czatów, musisz zaimportować niezbędne moduły i utworzyć wystąpienie usługi. Poniżej przedstawiono kroki tworzenia usługi uzupełniania czatu dla każdego dostawcy usług sztucznej inteligencji.

Napiwek

Istnieją trzy metody dostarczania wymaganych informacji do usług sztucznej inteligencji. Możesz przekazać informacje bezpośrednio za pośrednictwem konstruktora, ustawić niezbędne zmienne środowiskowe lub utworzyć plik env w katalogu projektu zawierający zmienne środowiskowe. Możesz odwiedzić tę stronę, aby znaleźć wszystkie wymagane zmienne środowiskowe dla każdego dostawcy usług sztucznej inteligencji: https://github.com/microsoft/semantic-kernel/blob/main/python/samples/concepts/setup/ALL_SETTINGS.md

from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion

chat_completion_service = AzureChatCompletion(
    deployment_name="my-deployment",  
    api_key="my-api-key",
    endpoint="my-api-endpoint", # Used to point to your service
    service_id="my-service-id", # Optional; for targeting specific services within Semantic Kernel
)

# You can do the following if you have set the necessary environment variables or created a .env file
chat_completion_service = AzureChatCompletion(service_id="my-service-id")

Uwaga

Usługa AzureChatCompletion obsługuje również uwierzytelnianie Microsoft Entra. Jeśli nie podasz klucza interfejsu API, usługa podejmie próbę uwierzytelnienia przy użyciu tokenu Entra.

Możesz od razu rozpocząć korzystanie z usługi uzupełniania lub dodać usługę uzupełniania czatu do jądra. Aby dodać usługę do jądra, możesz użyć następującego kodu.

from semantic_kernel import Kernel

# Initialize the kernel
kernel = Kernel()

# Add the chat completion service created above to the kernel
kernel.add_service(chat_completion_service)

Możesz utworzyć wystąpienia usługi uzupełniania czatu bezpośrednio i dodać je do jądra lub użyć ich bezpośrednio w kodzie bez wstrzykiwania ich do jądra. Poniższy kod pokazuje, jak utworzyć usługę uzupełniania czatu i dodać ją do jądra.

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();

Pobieranie usług uzupełniania czatów

Po dodaniu usług uzupełniania czatów do jądra można je pobrać przy użyciu metody get service. Poniżej przedstawiono przykład sposobu pobierania usługi uzupełniania czatu z jądra.

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

# Retrieve the chat completion service by type
chat_completion_service = kernel.get_service(type=ChatCompletionClientBase)

# Retrieve the chat completion service by id
chat_completion_service = kernel.get_service(service_id="my-service-id")

# Retrieve the default inference settings
execution_settings = kernel.get_prompt_execution_settings_from_service_id("my-service-id")
ChatCompletionService chatCompletionService = kernel.getService(ChatCompletionService.class);

Napiwek

Dodanie usługi uzupełniania czatu do jądra nie jest wymagane, jeśli nie musisz używać innych usług w jądrze. Możesz użyć usługi uzupełniania czatu bezpośrednio w kodzie.

Korzystanie z usług uzupełniania czatu

Teraz, gdy masz usługę uzupełniania czatów, możesz jej użyć do generowania odpowiedzi z agenta sztucznej inteligencji. Istnieją dwa główne sposoby korzystania z usługi uzupełniania czatu:

  • bez przesyłania strumieniowego: czekasz, aż usługa wygeneruje całą odpowiedź przed zwróceniem jej do użytkownika.
  • przesyłanie strumieniowe: poszczególne fragmenty odpowiedzi są generowane i zwracane do użytkownika w miarę ich tworzenia.

Przed rozpoczęciem należy ręcznie utworzyć wystąpienie ustawień wykonywania, aby korzystać z usługi uzupełniania czatów, jeśli usługa nie została zarejestrowana w jądrze.

from semantic_kernel.connectors.ai.open_ai import OpenAIChatPromptExecutionSettings

execution_settings = OpenAIChatPromptExecutionSettings()

Napiwek

Aby zobaczyć, co można skonfigurować w ustawieniach wykonywania, możesz sprawdzić definicję klasy w kodu źródłowego lub zapoznać się z dokumentacją interfejsu API .

Poniżej przedstawiono dwa sposoby generowania odpowiedzi przy użyciu usługi uzupełniania czatów.

Uzupełnianie czatu bez przesyłania strumieniowego

Aby użyć uzupełniania czatu bez przesyłania strumieniowego, możesz użyć następującego kodu, aby wygenerować odpowiedź od agenta sztucznej inteligencji.

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,
    settings=execution_settings,
)
ChatHistory history = new ChatHistory();
history.addUserMessage("Hello, how are you?");

InvocationContext optionalInvocationContext = null;

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

Uzupełnianie czatu przesyłania strumieniowego

Aby użyć uzupełniania czatu przesyłania strumieniowego, możesz użyć następującego kodu, aby wygenerować odpowiedź od agenta sztucznej inteligencji.

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,
    settings=execution_settings,
)

async for chunk in response:
    print(chunk, end="")

Uwaga

Semantyczne jądro dla języka Java nie obsługuje modelu odpowiedzi przesyłania strumieniowego.

Następne kroki

Po dodaniu usług uzupełniania czatu do projektu Semantic Kernel możesz rozpocząć tworzenie konwersacji z agentem sztucznej inteligencji. Aby dowiedzieć się więcej na temat korzystania z usługi uzupełniania czatów, zapoznaj się z następującymi artykułami: