Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Deze zelfstudie laat zien hoe u agentische mogelijkheden toevoegt aan een bestaande datagestuurde Spring Boot WebFlux CRUD-toepassing. Dit doet u met behulp van Microsoft Semantic Kernel en Foundry Agent Service.
Als uw webtoepassing al nuttige functies heeft, zoals winkelen, hotelreservering of gegevensbeheer, is het relatief eenvoudig om agentfunctionaliteit toe te voegen aan uw webtoepassing door deze functies in een invoegtoepassing (voor LangGraph) of als een OpenAPI-eindpunt (voor Foundry Agent Service) te verpakken. In deze handleiding begint u met een eenvoudige to-do lijstapp. Aan het einde kunt u taken maken, bijwerken en beheren met een agent in een App Service-app.
Met zowel Semantic Kernel als Foundry Agent Service kunt u agentische webtoepassingen bouwen met AI-gestuurde mogelijkheden. In de volgende tabel ziet u enkele overwegingen en afwegingen:
| Overweging | Semantische Kernel | Foundry Agentendienst |
|---|---|---|
| Performance | Snel (lokaal uitgevoerd) | Trager (beheerde, externe service) |
| Ontwikkeling | Volledige code, maximaal beheer | Low-code, snelle integratie |
| Testing | Handmatige/eenheidstests in code | Ingebouwde speeltuin voor snel testen |
| Schaalbaarheid | App-managed | Door Azure beheerd, automatisch geschaald |
| Veiligheidsrails | Aangepaste implementatie vereist | Ingebouwde inhoudsveiligheid en toezicht |
| Identiteit | Aangepaste implementatie vereist | Ingebouwde agent-id en verificatie |
| Enterprise | Aangepaste integratie vereist | Ingebouwde microsoft 365/Teams-implementatie en geïntegreerde hulpprogramma-aanroepen van Microsoft 365. |
In deze handleiding leer je hoe je:
- Bestaande app-functionaliteit converteren naar een invoegtoepassing voor Semantic Kernel.
- Voeg de invoegtoepassing toe aan een Semantic Kernel-agent en gebruik deze in een web-app.
- Bestaande app-functionaliteit converteren naar een OpenAPI-eindpunt voor Foundry Agent Service.
- Roep een Foundry-agent aan in een web-app.
- Wijs de vereiste machtigingen toe voor connectiviteit met beheerde identiteiten.
Prerequisites
- Een Azure-account met een actief abonnement: maak gratis een account.
- GitHub-account voor het gebruik van GitHub Codespaces - Meer informatie over GitHub Codespaces.
Het voorbeeld openen met Codespaces
De eenvoudigste manier om aan de slag te gaan is door GitHub Codespaces te gebruiken. Dit biedt een volledige ontwikkelomgeving met alle vereiste hulpprogramma's die vooraf zijn geïnstalleerd.
Navigeer naar de GitHub-opslagplaats op https://github.com/Azure-Samples/app-service-agentic-semantic-kernel-java.
Klik op de knop Code, selecteer het tabblad Codespaces en selecteer Codespace op main maken.
Wacht even totdat uw Codespace is geïnitialiseerd. Wanneer u klaar bent, ziet u een volledig geconfigureerde ontwikkelomgeving in uw browser.
Voer de toepassing lokaal uit:
mvn spring-boot:runWanneer u ziet dat uw toepassing actief is op poort 8080, selecteer Openen in Browser en voeg een paar taken toe.
De agentcode controleren
De Semantic Kernel-agent wordt geïnitialiseerd in src/main/java/com/example/crudtaskswithagent/controller/AgentController.java wanneer de gebruiker de eerste prompt invoert in een nieuwe browsersessie.
U vindt de initialisatiecode in de SemanticKernelAgentService constructor (in src/main/java/com/example/crudtaskswithagent/service/SemanticKernelAgentService.java). De initialisatiecode doet het volgende:
- Hiermee maakt u een kernel met chatvoltooiing.
- Voegt een kernelinvoegtoepassing toe die de functionaliteit van de CRUD-toepassing inkapselt (in src/main/java/com/example/crudtaskswithagent/plugin/TaskCrudPlugin.java). De interessante onderdelen van de invoegtoepassing zijn de
DefineKernelFunctionannotaties in de methodeverklaringen en dedescriptionenreturnTypeparameters die de kernel helpen de invoegtoepassing intelligent aan te roepen. - Hiermee maakt u een chatvoltooiingsagent en configureert u deze zodat het AI-model automatisch functies kan aanroepen (
FunctionChoiceBehavior.auto(true)). - Hiermee maakt u een agentthread waarmee de chatgeschiedenis automatisch wordt beheerd.
// 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();
Telkens wanneer de prompt wordt ontvangen, gebruikt de servercode ChatCompletionAgent.invokeAsync() om de agent aan te roepen met de gebruikersprompt en de agentthread. De agentthread houdt de chatgeschiedenis bij.
// 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());
});
De voorbeeldtoepassing implementeren
De voorbeeldopslagplaats bevat een AZD-sjabloon (Azure Developer CLI), waarmee een App Service-app met beheerde identiteit wordt gemaakt en uw voorbeeldtoepassing wordt geïmplementeerd.
Meld u in de terminal aan bij Azure met behulp van Azure Developer CLI:
azd auth loginVolg de instructies om het verificatieproces te voltooien.
Implementeer de Azure App Service-app met de AZD-sjabloon:
azd upGeef de volgende antwoorden wanneer u hierom wordt gevraagd:
Question Answer Voer een nieuwe omgevingsnaam in: Voer een unieke naam in. Selecteer een Azure-abonnement dat u wilt gebruiken: Selecteer het abonnement. Kies een resourcegroep die u wilt gebruiken: Selecteer Een nieuwe resourcegroep maken. Selecteer een locatie waarin u de resourcegroep wilt maken in: Selecteer Zweden - centraal. Voer een naam in voor de nieuwe resourcegroep: Typ Enter. Zoek in de AZD-uitvoer de URL van uw app en navigeer ernaar in de browser. De URL ziet er in de AZD-uitvoer zo uit:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Open het automatisch gegenereerde OpenAPI-schema op het
https://....azurewebsites.net/api/schemapad. U heeft dit schema later nodig.U hebt nu een App Service-app met een door het systeem toegewezen beheerde identiteit.
De Microsoft Foundry-resource maken en configureren
Maak in het Foundry-portaal een project.
Een model van uw keuze implementeren (zie Snelstartgids voor Microsoft Foundry: Resources maken).
Kopieer de naam van het model vanaf de bovenkant van de modelspeelplaats.
Kopieer op de startpagina het Azure OpenAI-eindpunt voor later.
Vereiste machtigingen toewijzen
Selecteer in het Foundry-portaal Beheren in het bovenste menu.
Selecteer in Project details de Ouderresource van je project en selecteer vervolgens Open in Azure portal.
Vanuit het Azure-portaal kun je rolgebaseerde toegang voor de resource toewijzen.
Voeg de volgende rol toe voor zowel de beheerde identiteit van de App Service-app als de gebruiker waarmee je werkt
az login:Doelresource Vereiste rol Vereist voor Gieterij Cognitive Services OpenAI-gebruiker De voltooiingsservice voor chats in Microsoft Agent Framework. Zie Azure-rollen toewijzen via Azure Portal voor instructies.
Verbindingsvariabelen configureren in uw voorbeeldtoepassing
Open src/main/resources/application.properties. Configureer de volgende variabelen met behulp van de waarden die u eerder hebt gekopieerd uit de Foundry-portal:
Variable Description azure.openai.endpointAzure OpenAI endpoint (gekopieerd van de Foundry portal homepage). azure.openai.deploymentModelnaam in de implementatie (gekopieerd uit de modelspeeltuin in de nieuwe Foundry-portal). Note
Als u de zelfstudie eenvoudig wilt houden, gebruikt u deze variabelen in .env in plaats van ze te overschrijven met app-instellingen in App Service.
Note
Als u de zelfstudie eenvoudig wilt houden, gebruikt u deze variabelen in src/main/resources/application.properties in plaats van ze te overschrijven met app-instellingen in App Service.
Meld u aan bij Azure met de Azure CLI:
az loginHierdoor kan de Azure Identity-clientbibliotheek in de voorbeeldcode een verificatietoken ontvangen voor de aangemelde gebruiker. Houd er rekening mee dat u de vereiste rol voor deze gebruiker eerder hebt toegevoegd.
Voer de toepassing lokaal uit:
mvn spring-boot:runWanneer u ziet dat uw toepassing beschikbaar is op poort 8080, selecteert u Openen in de browser.
Probeer de chatinterface uit. Als u een antwoord krijgt, maakt uw toepassing verbinding met de Microsoft Foundry-resource.
Implementeer uw app-wijzigingen in de GitHub-codespace.
azd upGa opnieuw naar de geïmplementeerde toepassing en test de chatagents.
Veelgestelde vragen
Hoe voeg ik retrieval augmented generation (RAG) toe aan de Foundry-agent?
Deze richtlijn geldt voor het Foundry Agent Service-pad in deze tutorial. Het verandert niet de implementaties van LangGraph, Semantic Kernel of Microsoft Agent Framework die in het andere tabblad worden getoond.
Maak of selecteer een kennisbank van Foundry IQ, en verbind deze vervolgens met de Foundry Agent Service-agent. De verbinding wordt voor de agent beschikbaar gesteld als een beheerde MCP-kennistool.
De App Service-code blijft dezelfde agent bij naam aanroepen via zijn bestaande Foundry-client en agent_reference. De webapp heeft geen directe integratie met Azure AI Zoeken of een eigen MCP-client nodig. Als de gebruikersinterface bronnen toont, verwerk dan de citatie-annotaties die door de agent zijn teruggegeven.
De hulpbronnen opschonen
Wanneer u klaar bent met de toepassing, kunt u de App Service-resources verwijderen om verdere kosten te voorkomen:
azd down --purge
Aangezien de AZD-sjabloon de Microsoft Foundry-resources niet bevat, moet u ze desgewenst handmatig verwijderen.