Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku pokazano, jak dodać funkcję agenta do istniejącej aplikacji Spring Boot WebFlux CRUD opartej na danych. Robi to przy użyciu usługi Microsoft Semantic Kernel and Foundry Agent Service.
Jeśli aplikacja internetowa ma już przydatne funkcje, takie jak zakupy, rezerwacja hotelowa lub zarządzanie danymi, stosunkowo proste jest dodanie funkcji agenta do aplikacji internetowej przez opakowywanie tych funkcji w wtyczki (dla LangGraph) lub jako punkt końcowy OpenAPI (dla usługi Agenta Foundry). W tym samouczku zaczniesz od prostej aplikacji typu lista to-do. Na koniec będziesz mieć możliwość tworzenia, aktualizowania i zarządzania zadaniami za pomocą agenta w aplikacji usługi App Service.
Zarówno Semantic Kernel, jak i Foundry Agent Service umożliwiają tworzenie internetowych aplikacji agentowych z funkcjami kierowanymi przez sztuczną inteligencję. W poniższej tabeli przedstawiono niektóre zagadnienia i kompromisy:
| Kwestie wymagające rozważenia | Jądro semantyczne | Usługa agenta programu Foundry |
|---|---|---|
| Performance | Szybkie (działa lokalnie) | Wolniejsze (zarządzana, zdalna usługa) |
| Rozwój | Pełny kod, maksymalna kontrolka | Niski kod, szybka integracja |
| Testing | Testy ręczne/jednostkowe w kodzie | Wbudowany plac zabaw do szybkiego testowania |
| Skalowalność | App-managed | Zarządzane przez platformę Azure, autoskalowane |
| Mechanizmy zabezpieczeń | Wymagana niestandardowa implementacja | Wbudowane bezpieczeństwo i moderowanie zawartości |
| Tożsamość | Wymagana niestandardowa implementacja | Wbudowany identyfikator agenta i uwierzytelnianie |
| Enterprise | Wymagana niestandardowa integracja | Wbudowane wdrożenie platformy Microsoft 365/Teams i zintegrowane wywołania narzędzi platformy Microsoft 365. |
W tym poradniku nauczysz się, jak:
- Przekonwertuj istniejące funkcje aplikacji na wtyczkę dla jądra semantycznego.
- Dodaj wtyczkę do agenta jądra semantycznego i użyj jej w aplikacji internetowej.
- Przekonwertuj istniejące funkcje aplikacji na punkt końcowy interfejsu OpenAPI dla usługi Foundry Agent Service.
- Wywołaj agenta Foundry w aplikacji internetowej.
- Przyznaj wymagane uprawnienia dla łączności tożsamości zarządzanej.
Prerequisites
- Konto platformy Azure z aktywną subskrypcją — utwórz bezpłatne konto.
- Konto usługi GitHub do korzystania z usługi GitHub Codespaces — dowiedz się więcej o usłudze GitHub Codespaces.
Otwieranie przykładu za pomocą usługi Codespaces
Najprostszym sposobem rozpoczęcia pracy jest użycie usługi GitHub Codespaces, która udostępnia kompletne środowisko programistyczne ze wszystkimi wymaganymi wstępnie zainstalowanymi narzędziami.
Przejdź do repozytorium GitHub pod adresem https://github.com/Azure-Samples/app-service-agentic-semantic-kernel-java.
Wybierz przycisk Kod , wybierz kartę Codespaces i wybierz pozycję Utwórz przestrzeń kodu w obszarze głównym.
Zaczekaj chwilę na zainicjowanie usługi Codespace. Gdy wszystko będzie gotowe, zobaczysz w przeglądarce w pełni skonfigurowane środowisko programistyczne.
Uruchom aplikację lokalnie:
mvn spring-boot:runGdy zobaczysz, że aplikacja uruchomiona na porcie 8080 jest dostępna, wybierz pozycję Otwórz w przeglądarce i dodaj kilka zadań.
Przeanalizować kod agenta
Agent Semantic Kernel jest inicjowany w src/main/java/com/example/crudtaskswithagent/controller/AgentController.java, gdy użytkownik wprowadzi pierwszy monit w nowej sesji przeglądarki.
Kod inicjowania można znaleźć w konstruktorze SemanticKernelAgentService (w pliku src/main/java/com/example/crudtaskswithagent/service/SemanticKernelAgentService.java). Kod inicjowania wykonuje następujące czynności:
- Tworzy jądro z funkcją dokończenia rozmowy.
- Dodaje wtyczkę do jądra, która zamyka funkcjonalność aplikacji CRUD (w pliku src/main/java/com/example/crudtaskswithagent/plugin/TaskCrudPlugin.java). Interesujące części wtyczki to
DefineKernelFunctionadnotacje na deklaracjach metod oraz parametrydescriptionireturnType, które pomagają kernelowi mądrze wywołać wtyczkę. - Tworzy agenta uzupełniania czatu i konfiguruje go tak, aby umożliwić modelowi sztucznej inteligencji automatyczne wywoływanie funkcji (
FunctionChoiceBehavior.auto(true)). - Tworzy wątek agenta, który automatycznie zarządza historią czatu.
// Create OpenAI client
OpenAIAsyncClient openAIClient = new OpenAIClientBuilder()
.endpoint(endpoint)
.credential(new DefaultAzureCredentialBuilder().build())
.buildAsyncClient();
// Create chat completion service
OpenAIChatCompletion chatCompletion = OpenAIChatCompletion.builder()
.withOpenAIAsyncClient(openAIClient)
.withModelId(deployment)
.build();
// Create kernel plugin from the task plugin
KernelPlugin kernelPlugin = KernelPluginFactory.createFromObject(taskCrudPlugin, "TaskPlugin");
// Create kernel with TaskCrudPlugin and chat completion service
Kernel kernel = Kernel.builder()
.withAIService(OpenAIChatCompletion.class, chatCompletion)
.withPlugin(kernelPlugin)
.build();
// Use automatic function calling
InvocationContext invocationContext = InvocationContext.builder()
.withFunctionChoiceBehavior(FunctionChoiceBehavior.auto(true))
.build();
// Create ChatCompletionAgent
configuredAgent = ChatCompletionAgent.builder()
.withKernel(kernel)
.withName("TaskAgent")
.withInvocationContext(invocationContext)
.withInstructions(
"You are an agent that manages tasks using CRUD operations. " +
"Use the TaskCrudPlugin functions to create, read, update, and delete tasks. " +
"Always call the appropriate plugin function for any task management request. " +
"Don't try to handle any requests that are not related to task management."
)
.build();
} catch (Exception e) {
logger.error("Error initializing SemanticKernelAgentService: {}", e.getMessage(), e);
}
}
this.agent = configuredAgent;
// Initialize thread for this instance
this.thread = ChatHistoryAgentThread.builder().build();
Za każdym razem, gdy otrzymany zostanie monit, kod serwera używa ChatCompletionAgent.invokeAsync() do wywołania agenta, wykorzystując monit użytkownika i wątek agenta. Wątek agenta monitoruje historię czatu.
// Use the agent to process the message with automatic function calling
return agent.invokeAsync(userMessageContent, thread)
.<String>map(responses -> {
if (responses != null && !responses.isEmpty()) {
// Process all responses and concatenate them
StringBuilder combinedResult = new StringBuilder();
for (int i = 0; i < responses.size(); i++) {
var response = responses.get(i);
// Update thread with the last response thread (as per Microsoft docs)
if (i == responses.size() - 1) {
var responseThread = response.getThread();
if (responseThread instanceof ChatHistoryAgentThread) {
this.thread = (ChatHistoryAgentThread) responseThread;
}
}
// Get response content
ChatMessageContent<?> content = response.getMessage();
String responseContent = content != null ? content.getContent() : "";
if (!responseContent.isEmpty()) {
if (combinedResult.length() > 0) {
combinedResult.append("\n\n"); // Separate multiple responses
}
combinedResult.append(responseContent);
}
}
String result = combinedResult.toString();
if (result.isEmpty()) {
result = "No content returned from agent.";
}
return result;
} else {
return "I'm sorry, I couldn't process your request. Please try again.";
}
})
.onErrorResume(throwable -> {
logger.error("Error in processMessage: {}", throwable.getMessage(), throwable);
return Mono.just("Error processing message: " + throwable.getMessage());
});
Wdrażanie aplikacji przykładowej
Przykładowe repozytorium zawiera szablon interfejsu wiersza polecenia dla deweloperów platformy Azure (AZD), który tworzy aplikację usługi App Service z tożsamością zarządzaną i wdraża przykładową aplikację.
W terminalu zaloguj się do platformy Azure przy użyciu interfejsu wiersza polecenia dla deweloperów platformy Azure:
azd auth loginPostępuj zgodnie z instrukcjami, aby ukończyć proces uwierzytelniania.
Wdróż aplikację usługi Azure App Service przy użyciu szablonu AZD:
azd upPo wyświetleniu monitu podaj następujące odpowiedzi:
Question Answer Wprowadź nową nazwę środowiska: Wpisz unikatową nazwę. Wybierz subskrypcję platformy Azure do użycia: Wybierz subskrypcję. Wybierz grupę zasobów do użycia: Wybierz pozycję Utwórz nową grupę zasobów. Wybierz lokalizację, w ramach których chcesz utworzyć grupę zasobów: Wybierz pozycję Szwecja Środkowa. Wprowadź nazwę nowej grupy zasobów: Wpisz Enter. W wynikach AZD znajdź URL swojej aplikacji i otwórz go w przeglądarce. Adres URL wygląda następująco w danych wyjściowych usługi AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Otwórz automatycznie wygenerowany schemat OpenAPI w ścieżce
https://....azurewebsites.net/api/schema. Ten schemat będzie potrzebny później.Masz teraz aplikację usługi App Service z tożsamością zarządzaną przypisaną przez system.
Tworzenie i konfigurowanie zasobu rozwiązania Microsoft Foundry
W portalu Foundry upewnij się, że górny przycisk radiowy New Foundry jest ustawiony na aktywny i utwórz projekt.
Wdróż wybrany model (zobacz Przewodnik Szybki start firmy Microsoft Foundry: tworzenie zasobów).
W górnej części placu zabaw modelu skopiuj nazwę modelu.
Najłatwiejszym sposobem na uzyskanie punktu końcowego Azure OpenAI jest wciąż skorzystanie z klasycznego portalu. Wybierz przycisk radiowy New Foundry, następnie pozycję Azure OpenAI, a potem skopiuj adres URL z punktu końcowego usługi Azure OpenAI na później.
Przypisywanie wymaganych uprawnień
W górnym menu nowego portalu Foundry wybierz pozycję Obsługa, a następnie wybierz pozycję Administrator. W wierszu projektu Foundry powinny zostać wyświetlone dwa linki. Element w kolumnie Name to zasób projektu Foundry, natomiast ten w kolumnie Zasób nadrzędny to zasób Foundry.
Wybierz zasób Foundry w zasobie nadrzędnym , a następnie wybierz pozycję Zarządzaj tym zasobem w witrynie Azure Portal. W witrynie Azure Portal możesz przypisać dostęp oparty na rolach dla zasobu do wdrożonej aplikacji internetowej.
Dodaj następującą rolę dla zarządzanej tożsamości aplikacji App Service.
Zasób docelowy Wymagana rola Wymagane do Odlewnia Użytkownik Usług Cognitive Services OpenAI Usługa uzupełniania czatu w programie Microsoft Agent Framework. Aby uzyskać instrukcje, zobacz temat Przypisywanie ról platformy Azure za pomocą witryny Azure Portal.
Konfigurowanie zmiennych połączenia w przykładowej aplikacji
Otwórz plik src/main/resources/application.properties. Korzystając z wartości skopiowanych wcześniej z portalu Foundry, skonfiguruj następujące zmienne:
Variable Description azure.openai.endpointPunkt końcowy usługi Azure OpenAI (skopiowany z klasycznego portalu Foundry). azure.openai.deploymentNazwa modelu we wdrożeniu (skopiowana ze środowiska testowego modelu w nowym portalu Foundry). Note
Aby zachować prostotę samouczka, użyjesz tych zmiennych w pliku env zamiast zastępowania ich ustawieniami aplikacji w usłudze App Service.
Note
Aby zachować prostotę samouczka, użyjesz tych zmiennych w pliku src/main/resources/application.properties zamiast zastępowania ich ustawieniami aplikacji w usłudze App Service.
Zaloguj się do platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure:
az loginDzięki temu biblioteka klienta tożsamości platformy Azure w przykładowym kodzie może odbierać token uwierzytelniania dla zalogowanego użytkownika. Pamiętaj, że wcześniej dodano wymaganą rolę dla tego użytkownika.
Uruchom aplikację lokalnie:
mvn spring-boot:runGdy zobaczysz, że aplikacja uruchomiona na porcie 8080 jest dostępna, wybierz pozycję Otwórz w przeglądarce.
Wypróbuj interfejs czatu. Jeśli otrzymasz odpowiedź, aplikacja łączy się pomyślnie z zasobem Microsoft Foundry.
W usłudze GitHub codespace wdróż zmiany aplikacji.
azd upPrzejdź ponownie do wdrożonej aplikacji i przetestuj agentów czatu.
Uprzątnij zasoby
Po zakończeniu pracy z aplikacją możesz usunąć zasoby usługi App Service, aby uniknąć ponoszenia dodatkowych kosztów:
azd down --purge
Ponieważ szablon AZD nie zawiera zasobów rozwiązania Microsoft Foundry, należy je usunąć ręcznie, jeśli chcesz.