Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Lernprogramm wird veranschaulicht, wie Sie einer vorhandenen datengesteuerten Express.js CRUD-Anwendung agentische Funktionen hinzufügen. Dazu werden zwei verschiedene Ansätze verwendet: LangGraph und Foundry Agent Service.
Wenn Ihre Webanwendung bereits nützliche Funktionen wie Shopping, Hotelbuchung oder Datenverwaltung aufweist, ist es relativ einfach, Ihrer Webanwendung Agent-Funktionen hinzuzufügen, indem diese Funktionen in ein Plug-In (für LangGraph) oder als OpenAPI-Endpunkt (für Foundry Agent Service) eingeschlossen werden. In diesem Lernprogramm beginnen Sie mit einer einfachen To-Do-Listen-App. Am Ende können Sie Aufgaben mit einem Agent in einer App Service-App erstellen, aktualisieren und verwalten.
Sowohl der LangGraph- als auch der Foundry-Agent-Dienst ermöglichen es Ihnen, agentische Webanwendungen mit KI-gesteuerten Funktionen zu erstellen. LangGraph ähnelt dem Microsoft Semantic Kernel und ist ein SDK, aber Der semantische Kernel unterstützt derzeit kein JavaScript. In der folgenden Tabelle sind einige der Überlegungen und Kompromisse aufgeführt:
| Consideration | LangGraph | Gießerei-Agentendienst |
|---|---|---|
| Performance | Schnell (wird lokal ausgeführt) | Langsamer (verwalteter, Remotedienst) |
| Development | Vollständiger Code, maximale Steuerung | Geringer Code, schnelle Integration |
| Testing | Manuelle Tests/Komponententests im Code | Integrierter Playground für schnelle Tests |
| Scalability | App-verwaltet | Von Azure verwaltet, automatisch skaliert |
| Sicherheitsschutzschienen | Benutzerdefinierte Implementierung erforderlich | Integrierte Sicherheit und Moderation von Inhalten |
| Identität | Benutzerdefinierte Implementierung erforderlich | Integrierte Agent-ID und Authentifizierung |
| Enterprise | Benutzerdefinierte Integration erforderlich | Integrierte Microsoft 365/Teams-Bereitstellung und Integrierte Microsoft 365-Toolaufrufe. |
In diesem Tutorial lernen Sie Folgendes:
- Konvertieren Sie vorhandene App-Funktionen in ein Plug-In für LangGraph.
- Fügen Sie das Plug-In einem LangGraph-Agent hinzu, und verwenden Sie es in einer Web-App.
- Konvertieren Sie vorhandene App-Funktionen in einen OpenAPI-Endpunkt für den Foundry Agent Service.
- Rufen Sie einen Foundry-Agent in einer Web-App auf.
- Weisen Sie die erforderlichen Berechtigungen für verwaltete Identitätskonnektivität zu.
Prerequisites
- Ein Azure-Konto mit einem aktiven Abonnement – Kostenlos ein Konto erstellen.
- GitHub-Konto zur Verwendung von GitHub Codespaces – Erfahren Sie mehr über GitHub Codespaces.
Öffnen des Beispiels mit Codespaces
Die einfachste Möglichkeit für die ersten Schritte ist die Verwendung von GitHub Codespaces, die eine vollständige Entwicklungsumgebung mit allen erforderlichen Tools vorinstalliert bietet.
Navigieren Sie zum GitHub-Repository unter https://github.com/Azure-Samples/app-service-agentic-langgraph-foundry-node.
Wählen Sie die Schaltfläche "Code ", dann die Registerkarte " Codespaces " und dann " Codespace erstellen" im Hauptfeld aus.
Warten Sie einige Augenblicke, bis Der Codespace initialisiert wird. Wenn Sie bereit sind, wird eine vollständig konfigurierte Entwicklungsumgebung in Ihrem Browser angezeigt.
Führen Sie die Anwendung lokal aus:
npm install npm run build npm startWenn Sie sehen, dass Ihre Anwendung auf Port 3000 ausgeführt wird, wählen Sie "Im Browser öffnen" aus, und fügen Sie einige Aufgaben hinzu.
Die Agents sind nicht vollständig konfiguriert, sodass sie noch nicht funktionieren. Sie konfigurieren sie später.
Überprüfen des Agenten-Codes
Beide Ansätze verwenden dasselbe Implementierungsmuster, bei dem der Agent beim Starten der Anwendung initialisiert wird, und antwortet von POST-Anforderungen auf Benutzernachrichten.
Die LangGraphTaskAgent Initialisierung erfolgt im Konstruktor in "src/agents/LangGraphTaskAgent.ts". Der Initialisierungscode führt folgendes aus:
- Konfiguriert den AzureChatOpenAI-Client mithilfe von Umgebungsvariablen.
- Erstellt den vordefinierten ReAct-Agent mit einer Reihe von CRUD-Tools für die Aufgabenverwaltung (siehe LangGraph: Verwenden des vordefinierten ReAct-Agents).
- Richtet die Speicherverwaltung ein (siehe LangGraph: Hinzufügen von Arbeitsspeicher zum vordefinierten ReAct-Agent).
constructor(taskService: TaskService) {
this.taskService = taskService;
this.memory = new MemorySaver();
try {
const endpoint = process.env.AZURE_OPENAI_ENDPOINT;
const deploymentName = process.env.AZURE_OPENAI_DEPLOYMENT_NAME;
if (!endpoint || !deploymentName) {
console.warn('Azure OpenAI configuration missing for LangGraph agent');
return;
}
// Initialize Azure OpenAI client
const credential = new DefaultAzureCredential();
const azureADTokenProvider = getBearerTokenProvider(credential, "https://cognitiveservices.azure.com/.default");
this.llm = new AzureChatOpenAI({
azureOpenAIEndpoint: endpoint,
azureOpenAIApiDeploymentName: deploymentName,
azureADTokenProvider: azureADTokenProvider,
azureOpenAIApiVersion: "2024-10-21"
});
// Define tools directly in the array
const tools = [
tool(
async ({ title, isComplete = false }) => {
const task = await this.taskService.addTask(title, isComplete);
return `Task created successfully: "${task.title}" (ID: ${task.id})`;
},
{
name: 'createTask',
description: 'Create a new task',
schema: z.object({
title: z.string(),
isComplete: z.boolean().optional()
}) as any
}
),
tool(
async () => {
const tasks = await this.taskService.getAllTasks();
if (tasks.length === 0) {
return 'No tasks found.';
}
return `Found ${tasks.length} tasks:\n` +
tasks.map(t => `- ${t.id}: ${t.title} (${t.isComplete ? 'Complete' : 'Incomplete'})`).join('\n');
},
{
name: 'getTasks',
description: 'Get all tasks',
schema: z.object({}) as any
}
),
tool(
async ({ id }) => {
const task = await this.taskService.getTaskById(id);
if (!task) {
return `Task with ID ${id} not found.`;
}
return `Task ${task.id}: "${task.title}" - Status: ${task.isComplete ? 'Complete' : 'Incomplete'}`;
},
{
name: 'getTask',
description: 'Get a specific task by ID',
schema: z.object({
id: z.number()
}) as any
}
),
tool(
async ({ id, title, isComplete }) => {
const updated = await this.taskService.updateTask(id, title, isComplete);
if (!updated) {
return `Task with ID ${id} not found.`;
}
return `Task ${id} updated successfully.`;
},
{
name: 'updateTask',
description: 'Update an existing task',
schema: z.object({
id: z.number(),
title: z.string().optional(),
isComplete: z.boolean().optional()
}) as any
}
),
tool(
async ({ id }) => {
const deleted = await this.taskService.deleteTask(id);
if (!deleted) {
return `Task with ID ${id} not found.`;
}
return `Task ${id} deleted successfully.`;
},
{
name: 'deleteTask',
description: 'Delete a task',
schema: z.object({
id: z.number()
}) as any
}
)
];
// Create the ReAct agent with memory
this.agent = createReactAgent({
llm: this.llm,
tools,
checkpointSaver: this.memory,
stateModifier: `You are an AI assistant that manages tasks using CRUD operations.
You have access to tools for creating, reading, updating, and deleting tasks.
Always use the appropriate tool for any task management request.
Be helpful and provide clear responses about the actions you take.
If you need more information to complete a request, ask the user for it.`
});
} catch (error) {
console.error('Error initializing LangGraph agent:', error);
}
}
Beim Verarbeiten von Benutzernachrichten wird der Agent mit invoke() der Nachrichten- und Sitzungskonfiguration des Benutzers für die Unterhaltungskontinuität aufgerufen:
const result = await this.agent.invoke(
{
messages: [
{ role: 'user', content: message }
]
},
{
configurable: {
thread_id: currentSessionId
}
}
);
Bereitstellen der Beispielanwendung
Das Beispiel-Repository enthält eine Azure Developer CLI (AZD)-Vorlage, die eine App Service-App mit verwalteter Identität erstellt und Ihre Beispielanwendung bereitstellt.
Melden Sie sich im Terminal mit Azure Developer CLI bei Azure an:
azd auth loginFolgen Sie den Anweisungen, um den Authentifizierungsprozess abzuschließen.
Stellen Sie die Azure App Service-App mit der AZD-Vorlage bereit:
azd upWenn Sie dazu aufgefordert werden, geben Sie die folgenden Antworten:
Question Answer Geben Sie einen neuen Umgebungsnamen ein: Geben Sie einen eindeutigen Namen ein. Wählen Sie ein Azure-Abonnement aus, das Sie verwenden möchten: Wählen Sie das Abonnement aus. Wählen Sie eine zu verwendende Ressourcengruppe aus: Wählen Sie Eine neue Ressourcengruppe erstellen aus. Wählen Sie einen Speicherort aus, in dem die Ressourcengruppe erstellt werden soll: Wählen Sie "Schweden Zentral" aus. Geben Sie einen Namen für die neue Ressourcengruppe ein: Geben Sie Eingeben ein. Suchen Sie in der AZD-Ausgabe die URL für Ihre App, und navigieren Sie im Browser dorthin. Die URL sieht in der AZD-Ausgabe wie folgt aus:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <URL>
Öffnen Sie das automatisch generierte OpenAPI-Schema im
https://....azurewebsites.net/api/schemaPfad. Sie benötigen dieses Schema später.Sie verfügen jetzt über eine App Service-App mit einer vom System zugewiesenen verwalteten Identität.
Erstellen und Konfigurieren der Microsoft Foundry-Ressource
Vergewissern Sie sich im Foundry-Portal, dass die obere Neue Foundry-Schaltfläche auf aktiv festgelegt ist und erstellen Sie ein Projekt.
Stellen Sie ein Modell Ihrer Wahl bereit (siehe Schnellstart von Microsoft Foundry: Erstellen von Ressourcen).
Kopieren Sie den Namen des Modells aus dem oberen Bereich des Modell-Playrounds.
Die einfachste Möglichkeit zum Abrufen des Azure OpenAI-Endpunkts ist noch aus dem klassischen Portal. Wählen Sie die Schaltfläche Neues Foundry, dann Azure OpenAI und kopieren Sie die URL in Azure OpenAI Endpunkt für später.
Zuweisen erforderlicher Berechtigungen
Wählen Sie im oberen Menü des neuen Gießereiportals "Betreiben" und dann "Administrator" aus. In der Zeile für Ihr Foundry-Projekt sollten zwei Links angezeigt werden. Die Ressource in der Spalte Name ist die Projektressource von Foundry, und die Ressource in der Spalte Übergeordnete Ressource ist die Foundry-Ressource.
Wählen Sie die Foundry-Ressource in der übergeordneten Ressource aus, und wählen Sie dann im Azure-Portal "Diese Ressource verwalten" aus. Im Azure-Portal können Sie der bereitgestellten Web-App rollenbasierten Zugriff für die Ressource zuweisen.
Fügen Sie die folgende Rolle für die verwaltete Identität der App Service-Anwendung hinzu:
Zielressource Erforderliche Rolle Erforderlich für Gießerei Kognitive Dienste OpenAI-Nutzer Der Chatabschlussdienst in Microsoft Agent Framework. Anweisungen hierzu finden Sie unter Zuweisen von Azure-Rollen über das Azure-Portal.
Konfigurieren von Verbindungsvariablen in Ihrer Beispielanwendung
Öffnen Sie .env. Konfigurieren Sie mithilfe der Werte, die Sie zuvor aus dem Foundry-Portal kopiert haben, die folgenden Variablen:
Variable Description AZURE_OPENAI_ENDPOINTAzure OpenAI-Endpunkt (kopiert aus dem klassischen Foundry-Portal). AZURE_OPENAI_DEPLOYMENT_NAMEModellname in der Bereitstellung (kopiert aus dem Modell-Playground im New Foundry Portal). Note
Um das Lernprogramm einfach zu halten, verwenden Sie diese Variablen in env , anstatt sie mit App-Einstellungen in App Service zu überschreiben.
Note
Um das Lernprogramm einfach zu halten, verwenden Sie diese Variablen in env , anstatt sie mit App-Einstellungen in App Service zu überschreiben.
Melden Sie sich mit der Azure CLI bei Azure an:
az loginDadurch kann die Azure Identity-Clientbibliothek im Beispielcode ein Authentifizierungstoken für den angemeldeten Benutzer empfangen. Denken Sie daran, dass Sie die erforderliche Rolle für diesen Benutzer zuvor hinzugefügt haben.
Führen Sie die Anwendung lokal aus:
npm run build npm startWenn Sie sehen, dass Ihre Anwendung auf Port 3000 ausgeführt wird, wählen Sie "Im Browser öffnen" aus.
Wählen Sie den Link "LangGraph Agent " und den Link " Foundry Agent " aus, um die Chatschnittstelle auszuprobieren. Wenn Sie eine Antwort erhalten, stellt Ihre Anwendung eine erfolgreiche Verbindung mit der Microsoft Foundry-Ressource her.
Stellen Sie ihre App-Änderungen wieder im GitHub-Codespace bereit.
azd upNavigieren Sie erneut zur bereitgestellten Anwendung, und testen Sie die Chat-Agents.
Bereinigen von Ressourcen
Wenn Sie mit der Anwendung fertig sind, können Sie die App Service-Ressourcen löschen, um weitere Kosten zu vermeiden:
azd down --purge
Da die AZD-Vorlage die Microsoft Foundry-Ressourcen nicht enthält, müssen Sie sie bei Bedarf manuell löschen.