教學:在 Azure App 服務 中使用 LangGraph 或 Foundry Agent Service(Python)建立代理型網頁應用

本教學課程示範如何將代理程式功能新增到現有的資料驅動型 FastAPI CRUD 應用程式。 它採用兩種不同的方法:LangGraph 與 Foundry Agent Service。

如果你的網頁應用程式已有實用功能,例如購物、飯店預訂或資料管理,透過外掛(LangGraph)或 OpenAPI 端點(Foundry Agent Service)來加入代理功能相對簡單。 本教學課程會從簡單的待辦事項清單應用程式開始。 最後,您將能夠在 App Service 應用程式使用代理程式建立、更新和管理工作。

LangGraph 與 Foundry Agent Service 皆能讓你打造具備 AI 驅動功能的代理型網頁應用程式。 LangGraph 類似於 Microsoft Agent Framework,是一個 SDK。 下表列出幾種考量和取捨方向:

考量事項 LangGraph 或 Microsoft 代理框架 鑄造代理服務
Performance 快速 (在本機執行) 較慢 (受控的遠端服務)
發展 完整程式碼,最大控制權 低度程式碼,快速整合
Testing 在程式碼進行手動/單元測試 內建環境,可快速測試
Scalability 應用程式受控 Azure 受控、自動調整
安全護欄 需要自訂實作 內建內容安全與管理
身份 需要自訂實作 內建代理識別碼與認證
Enterprise 自訂整合需求 內建 Microsoft 365/Teams 部署及 Microsoft 365 整合工具的呼叫功能。

在本教學課程中,您將瞭解如何:

  • 將現有應用程式功能轉換為 LangGraph 的外掛程式。
  • 將外掛程式新增至 LangGraph 代理程式,並在 Web 應用程式使用。
  • 將現有應用程式功能轉換為 Foundry Agent Service 的 OpenAPI 端點。
  • 在網頁應用程式中打電話給 Foundry 的代理人。
  • 指派受控身分識別連線所需的權限。

先決條件

以 Codespaces 開啟範例

最簡單的開始方式是使用 GitHub Codespaces,它提供完整的開發環境,並預先安裝所有必要工具。

  1. 前往 GitHub 存放庫,網址為 https://github.com/Azure-Samples/app-service-agentic-langgraph-foundry-python。

  2. 選取 [程式碼] 按鈕,選取 [Codespaces] 索引標籤,然後選取 [在主頁建立 codespace]。

  3. 稍候片刻,讓 Codespace 初始化。 準備就緒後,您會在瀏覽器看到已完整設定的開發環境。

  4. 在本機執行應用程式:

    python3 -m venv venv
    source venv/bin/activate
    pip install -r requirements.txt
    uvicorn src.app:app --host 0.0.0.0 --port 3000
    
  5. 看到 [您在連接埠 3000 執行的應用程式已可用] 時,請選取 [在瀏覽器中開啟] 並新增幾項工作。

    代理程式尚未完全設定,因此還無法運作。 您稍後會設定它們。

檢視代理程式的程式碼

這兩種方法都使用相同的實作模式,不過代理程式是在應用程式啟動時初始化,並透過 POST 請求回應使用者訊息。

LangGraphTaskAgent 是在 src/agents/langgraph_task_agent.py 的建構函式初始化。 初始化程式碼會執行下列動作:

  • 使用環境變數設定 AzureChatOpenAI 用戶端。
  • 建立預建的 ReAct 代理程式,並附有記憶體及一組 CRUD 工具用於任務管理(參見 LangGraph 快速入門)。
  • 選擇一個伺服器管理的對話線程作為已驗證的樣本。
self.memory = InMemorySaver()
# App Service authentication protects this sample, which intentionally
# keeps one server-managed conversation thread per worker process.
self.thread_id = "authenticated-conversation"

try:
    endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    deployment_name = os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME")
    
    if not endpoint or not deployment_name:
        print("Azure OpenAI configuration missing for LangGraph agent")
        return
    
    # Initialize Azure OpenAI client
    credential = DefaultAzureCredential()
    azure_ad_token_provider = get_bearer_token_provider(
        credential, "https://cognitiveservices.azure.com/.default"
    )
    
    self.llm = AzureChatOpenAI(
        azure_endpoint=endpoint,
        azure_deployment=deployment_name,
        azure_ad_token_provider=azure_ad_token_provider,
        api_version="2024-10-21"
    )
    
    # Define tools
    tools = [
        self._create_task_tool(),
        self._get_tasks_tool(),
        self._get_task_tool(),
        self._update_task_tool(),
        self._delete_task_tool()
    ]
    
    # Create the agent
    self.agent = create_react_agent(self.llm, tools, checkpointer=self.memory)

處理使用者訊息時,代理程式會使用由伺服器管理的執行緒 ID 呼叫 ainvoke():

config = {"configurable": {"thread_id": self.thread_id}}

# Process the message
result = await self.agent.ainvoke(
    {"messages": [("user", message)]},
    config=config
)

瀏覽器請求僅包含訊息。 它無法透過提供會話或對話識別碼來選擇其他執行緒。

部署範例應用程式

範例儲存庫包含一個 Azure 開發者 CLI(AZD)範本,該範本可建立 App Service 應用程式並部署您的範例應用程式。 App Service 系統指派的管理身份會保留給 Azure AI 外撥通話。 獨立的使用者指派的受控識別與同盟識別認證,可讓 App Service 驗證做為產生的 Microsoft Entra 應用程式,而無需用戶端秘密。

  1. 在終端機中,請使用 Azure Developer CLI 登入Azure:

    azd auth login
    

    請遵循指示來完成驗證程式。

  2. 使用 AZD 範本部署 Azure App 服務 應用程式:

    azd up
    
  3. 出現提示時,請提供下列答案:

    Question 回答
    輸入新的環境名稱: 輸入唯一名稱。
    選取要使用的 Azure 訂用帳戶: 選取訂用帳戶。
    挑選要使用的資源群組: 選取 [建立新的資源群組]。
    選取要建立資源群組的位置: 選取 [瑞典中部]。
    輸入新資源群組的名稱: 輸入 Enter。
  4. 在 AZD 輸出中,找到您應用程式的 URL,然後在瀏覽器中打開該 URL。 另外,請複製 Foundry OpenAPI 管理身份受眾 的值以備後用。 輸出看起來像這樣:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <URL>
    
     Foundry OpenAPI managed identity audience:
         api://<generated-client-id>
     
  5. 當 Microsoft 提示你時,請用部署租戶中的帳號登入,並確認任務清單是否載入。

  6. 在同一個認證過的瀏覽器中,附加 /openapi.json 到 App Service 端點。 複製或儲存產生的 OpenAPI 架構以備後用。

    備註

    App Service 驗證會對未認證的瀏覽器要求傳回 HTTP 302 重新導向。 此範例包含瀏覽器介面與 API,因此重定向提供可用的登入體驗。 僅支援 API 的應用程式通常會使用 HTTP 401。

建立並設定 Microsoft Foundry 資源

  1. 在 Foundry 入口網站中,建立一個專案。

  2. 部署你選擇的模型(參見 Microsoft Foundry 快速入門:建立資源)。

  3. 從模型遊樂場頂端複製模型名稱。

  4. 在首頁複製 Azure OpenAI 端點以備後用。

指派所需的權限

  1. 在 Foundry 入口網站中,請在頂方選單選擇 管理 。

  2. 在 專案詳細資料 中,選取您的專案的 父資源,然後選取 在 Azure 入口網站中開啟。

    從 Azure 入口網站,你可以為該資源指派基於角色的存取權限。

  3. 為 App Service 應用程式的受控識別以及您搭配 az login 使用的使用者新增以下角色:

    目標資源 必要角色 所需
    鑄造廠 認知服務 OpenAI 使用者 Microsoft Agent Framework 中的聊天完成服務。

    如需操作指示,請參閱使用 Azure 入口網站指派 Azure 角色。

在範例應用程式設定連線變數

  1. 開啟 .env。 利用你之前從 Foundry 入口複製的數值,設定以下變數:

    Variable Description
    AZURE_OPENAI_ENDPOINT Azure OpenAI 端點(從 Foundry 入口網站首頁複製)。
    AZURE_OPENAI_DEPLOYMENT_NAME 部署中的模型名稱 (從新 Foundry 入口網站的模型遊樂場複製)。

    備註

    為簡化教學課程,您會在 .env 使用這些變數,而不是在 App Service 使用應用程式設定覆寫變數。

    備註

    為簡化教學課程,您會在 .env 使用這些變數,而不是在 App Service 使用應用程式設定覆寫變數。

    .env 裡的值用來設定應用程式對 Foundry 的外站連線。 AZURE_AI_FOUNDRY_ACCOUNT_CLIENT_ID 會設定獨立的輸入 Foundry 到 App Service 的 OpenAPI 連線,並存放在 AZD 環境中。

  2. 使用 Azure CLI 登入 Azure:

    az login
    

    這可讓範例程式碼的 Azure 身分識別用戶端程式庫接收登入使用者的驗證權杖。 別忘了您之前已為此使用者新增了必要角色。

  3. 在本機執行應用程式:

    source venv/bin/activate
    uvicorn src.app:app --host 0.0.0.0 --port 3000
    
  4. 看到 [您在連接埠 3000 執行的應用程式已可用] 時,請選取 [在瀏覽器中開啟]。

  5. 分別驗證兩個樞軸:

    • LangGraph: 選擇 LangGraph Agent,並請代理建立任務。 LangGraph 會呼叫進行中的工作工具。
    • Foundry Agent 服務: 選擇 Foundry Agent,並要求代理程式建立任務。 遠端 Foundry 代理程式會使用受控識別來呼叫已部署且受保護的 /api/tasks 端點。

    Foundry 代理所建立的任務會出現在已部署的 App Service 實例中,而非本地 SQLite 資料庫。 Foundry OpenAPI 工具始終使用嵌入在 OpenAPI 架構中的伺服器 URL。

  6. 返回 GitHub codespace 部署應用程式變更。

    azd up
    
  7. 再次進入已部署的應用程式,測試兩個聊天代理。 瀏覽器只會傳送訊息文字;它不會傳送任何一個客服的會話 ID 或對話 ID。

常見問題

如何為 Foundry 代理程式新增檢索增強生成(RAG)?

本指南指引適用於本教學中的 Foundry Agent 服務 路徑。 它不會改變另一個分頁中顯示的 LangGraph、語意核心 或 Microsoft Agent Framework 實作。

建立或選擇一個 Foundry IQ 知識庫,然後 將該知識庫連接到 Foundry 代理服務代理程式。 連線以管理型 MCP 知識工具的形式暴露給代理。

App Service 程式碼會繼續透過其現有的 Foundry 用戶端和 agent_reference,以名稱叫用相同的代理程式。 這個網頁應用程式不需要直接的 Azure AI 搜尋服務 整合或自己的 MCP 用戶端。 若使用者介面顯示來源,請處理代理回傳的引用註解。

清理資源

操作完應用程式後,您就可以刪除 App Service 資源,以免產生後續成本:

azd down --purge

AZD postdown 掛鉤也會刪除為 App Service 認證所建立的租戶層級 Microsoft Entra 應用程式。

然後,如果該 Foundry 資源是你另外建立的,請將其刪除。

更多資源