教學課程:搭配 Azure Container Apps 在 LangChain 中使用程式代碼解釋器會話
LangChain 是一種架構,旨在簡化使用大型語言模型 (LLM) 的應用程式建立。 當您使用 LangChain 建置 AI 代理程式時,LLM 會解譯使用者輸入併產生回應。 AI 代理程式通常需要執行數學和符號推理來產生回應時,通常會苦苦掙扎。 藉由整合 Azure Container Apps 動態會話與 LangChain,您可以為代理程式提供用來 執行特殊工作的程式代碼解釋器 。
在本教學課程中,您將瞭解如何在 Web API 中執行 LangChain AI 代理程式。 API 接受使用者輸入,並傳回 AI 代理程式所產生的回應。 代理程式會在動態會話中使用程式代碼解釋器來執行計算。
注意
Azure Container Apps 動態作業階段目前為預覽狀態。 如需詳細資訊,請參閱 預覽限制 。
必要條件
建立 Azure 資源
本快速入門中的範例應用程式會使用來自 Azure OpenAI 的 LLM。 它也會使用 Azure Container Apps 會話來執行 LLM 所產生的程式代碼。
將 Azure CLI 更新為最新版本。
az upgrade
如果已安裝 Azure Container Apps 延伸模組,並安裝包含會話命令的 Azure Container Apps 擴充功能預覽版本,請移除它:
az extension remove --name containerapp az extension add \ --name containerapp \ --allow-preview true -y
登入 Azure:
az login
設定本快速入門中使用的變數:
RESOURCE_GROUP_NAME=aca-sessions-tutorial AZURE_OPENAI_LOCATION=swedencentral AZURE_OPENAI_NAME=<UNIQUE_OPEN_AI_NAME> SESSION_POOL_LOCATION=eastasia SESSION_POOL_NAME=code-interpreter-pool
將 取代
<UNIQUE_OPEN_AI_NAME>
為唯一的名稱,以建立您的 Azure OpenAI 帳戶。建立資源群組:
az group create --name $RESOURCE_GROUP_NAME --location $SESSION_POOL_LOCATION
建立 Azure OpenAI 帳戶:
az cognitiveservices account create \ --name $AZURE_OPENAI_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $AZURE_OPENAI_LOCATION \ --kind OpenAI \ --sku s0 \ --custom-domain $AZURE_OPENAI_NAME
在 Azure OpenAI 帳戶中建立名為
gpt-35-turbo
的 GPT 3.5 Turbo 模型部署:az cognitiveservices account deployment create \ --resource-group $RESOURCE_GROUP_NAME \ --name $AZURE_OPENAI_NAME \ --deployment-name gpt-35-turbo \ --model-name gpt-35-turbo \ --model-version "1106" \ --model-format OpenAI \ --sku-capacity "100" \ --sku-name "Standard"
建立程式代碼解釋器工作階段集區:
az containerapp sessionpool create \ --name $SESSION_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $SESSION_POOL_LOCATION \ --max-sessions 100 \ --container-type PythonLTS \ --cooldown-period 300
在本機執行範例應用程式
將應用程式部署至 Azure Container Apps 之前,您可以在本機執行應用程式以進行測試。
複製應用程式
複製 Azure Container Apps 作業階段範例存放庫。
git clone https://github.com/Azure-Samples/container-apps-dynamic-sessions-samples.git
變更為包含範例應用程式的目錄:
cd container-apps-dynamic-sessions-samples/langchain-python-webapi
設定應用程式
建立 Python 虛擬環境並加以啟用:
python3.11 -m venv .venv source .venv/bin/activate
如果您使用不同的版本,請變更命令中的 Python 版本。 建議使用 Python 3.10 或更新版本。
注意
如果您使用 Windows,請將 取代
.venv/bin/activate
為.venv\Scripts\activate
。安裝必要 Python 套件:
python -m pip install -r requirements.txt
若要執行應用程式,您必須設定環境變數。
擷取 Azure OpenAI 帳戶端點:
az cognitiveservices account show \ --name $AZURE_OPENAI_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query properties.endpoint \ --output tsv
擷取 Azure Container Apps 會話集區管理端點:
az containerapp sessionpool show \ --name $SESSION_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query properties.poolManagementEndpoint \ --output tsv
.env
在範例應用程式目錄的根目錄中建立檔案(與main.py
相同位置)。 將下列內容新增至該檔案:AZURE_OPENAI_ENDPOINT=<AZURE_OPENAI_ENDPOINT> POOL_MANAGEMENT_ENDPOINT=<SESSION_POOL_MANAGEMENT_ENDPOINT>
將 取代為 Azure OpenAI 帳戶端點,並將
<SESSION_POOL_MANAGEMENT_ENDPOINT>
取代<AZURE_OPENAI_ENDPOINT>
為工作階段集區管理端點。
應用程式會使用
DefaultAzureCredential
向 Azure 服務進行驗證。 在您的本機計算機上,它會使用您目前的 Azure CLI 登入認證。 您必須在 Azure OpenAI 帳戶上提供 認知服務 OpenAI 使用者 角色,應用程式才能存取模型端點,以及 應用程式會話集區上的 Azure ContainerApps 會話執行程式 角色,才能存取會話集區。擷取您的 Azure CLI 使用者名稱:
az account show --query user.name --output tsv
執行下列命令以擷取 Azure OpenAI 帳戶資源識別碼:
az cognitiveservices account show --name $AZURE_OPENAI_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv
將 認知服務 OpenAI 使用者 角色指派給 Azure OpenAI 帳戶上的 Azure CLI 使用者:
az role assignment create --role "Cognitive Services OpenAI User" --assignee <CLI_USERNAME> --scope <AZURE_OPENAI_RESOURCE_ID>
以您的 Azure CLI 使用者名稱和
<AZURE_OPENAI_RESOURCE_ID>
Azure OpenAI 帳戶資源識別碼取代<CLI_USERNAME>
。執行下列命令以擷取工作階段集區資源識別碼:
az containerapp sessionpool show --name $SESSION_POOL_NAME --resource-group $RESOURCE_GROUP_NAME --query id --output tsv
使用其識別碼將 Azure ContainerApps 會話執行程式角色指派給會話集區上的 Azure CLI 使用者:
az role assignment create \ --role "Azure ContainerApps Session Executor" \ --assignee <CLI_USERNAME> \ --scope <SESSION_POOL_RESOURCE_ID>
將 取代為您的 Azure CLI 用戶名稱,並將
<SESSION_POOL_RESOURCE_ID>
取代<CLI_USERNAME>
為工作階段集區資源識別碼。
執行應用程式
執行範例應用程式之前,請在編輯器中開啟 main.py ,然後檢閱程序代碼。 應用程式會使用 FastAPI 來建立 Web API,以接受查詢字串中的使用者訊息。
下列幾行程式代碼會具現化 SessionPythonREPLTool ,並將其提供給 LangChain 代理程式:
repl = SessionsPythonREPLTool(pool_management_endpoint=pool_management_endpoint)
tools = [repl]
prompt = hub.pull("hwchase17/openai-functions-agent")
agent = agents.create_tool_calling_agent(llm, tools, prompt)
當它需要執行計算時,代理程式會使用 SessionPythonREPLTool 來執行程序代碼。 程序代碼會在會話集區的會話中執行。 根據預設,當您具現化工具時,會產生隨機會話標識符。 如果代理程式使用 工具來執行多個 Python 代碼段,則會使用相同的工作階段。 若要確保每個使用者都有唯一的工作階段,請針對每個使用者使用不同的代理程式和工具。
SessionPythonREPLTool 可在套件中使用 langchain-azure-dynamic-sessions
。
執行範例應用程式:
fastapi dev main.py
開啟瀏覽器並巡覽至
http://localhost:8000/docs
。 您會看到範例應用程式的 Swagger UI。展開端點,
/chat
然後選取 [試用]。在
message
欄位中輸入What time is it right now?
,然後選取 [執行]。代理程式會以目前時間回應。 在終端機中,您會看到記錄顯示代理程式產生的 Python 程式代碼,以取得目前的時間,並在程式代碼解釋器會話中執行。
若要停止應用程式,請在終端機中輸入
Ctrl+C
。
選擇性:將範例應用程式部署至 Azure Container Apps
若要將 FastAPI 應用程式部署至 Azure Container Apps,您需要建立容器映射,並將其推送至容器登錄。 然後,您可以將映射部署至 Azure Container Apps。 命令 az containerapp up
會將這些步驟合併成單一命令。
接著,您必須設定應用程式的受控識別,併為其指派適當的角色,以存取 Azure OpenAI 和會話集區。
設定 Container Apps 環境與應用程式名稱的變數:
ENVIRONMENT_NAME=aca-sessions-tutorial-env CONTAINER_APP_NAME=chat-api
建置應用程式並將其部署至 Azure Container Apps:
az containerapp up \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $SESSION_POOL_LOCATION \ --environment $ENVIRONMENT_NAME \ --env-vars "AZURE_OPENAI_ENDPOINT=<OPEN_AI_ENDPOINT>" "POOL_MANAGEMENT_ENDPOINT=<SESSION_POOL_MANAGMENT_ENDPOINT>" \ --source .
將 取代為 Azure OpenAI 帳戶端點,並將
<SESSION_POOL_MANAGMENT_ENDPOINT>
取代<OPEN_AI_ENDPOINT>
為工作階段集區管理端點。為應用程式啟用系統指派的受控識別:
az containerapp identity assign \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --system-assigned
若要讓應用程式存取 Azure OpenAI 和會話集區,您必須將受控識別指派適當的角色。
擷取受控識別的主體標識碼:
az containerapp show \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query identity.principalId \ --output tsv
擷取會話集區資源標識碼:
az containerapp sessionpool show \ --name $SESSION_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query id \ --output tsv
在會話集區上指派 和
Contributor
角色的受控識別Azure ContainerApps Session Executor
:執行下列命令之前,請將 和
<SESSION_POOL_RESOURCE_ID>
取代<PRINCIPAL_ID>
為您在先前步驟中擷取的值。az role assignment create \ --role "Azure ContainerApps Session Executor" \ --assignee <PRINCIPAL_ID> \ --scope <SESSION_POOL_RESOURCE_ID> az role assignment create \ --role "Contributor" \ --assignee <PRINCIPAL_ID> \ --scope <SESSION_POOL_RESOURCE_ID>
擷取 Azure OpenAI 帳戶資源識別碼:
az cognitiveservices account show \ --name $AZURE_OPENAI_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query id \ --output tsv
將 Azure OpenAI 帳戶上的角色指派給受控識別
Cognitive Services OpenAI User
:執行下列命令之前,請將 和
<AZURE_OPENAI_RESOURCE_ID>
取代<PRINCIPAL_ID>
為您在先前步驟中擷取的值。az role assignment create \ --role "Cognitive Services OpenAI User" \ --assignee <PRINCIPAL_ID> \ --scope <AZURE_OPENAI_RESOURCE_ID>
擷取應用程式的完整功能變數名稱 (FQDN):
az containerapp show \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --query properties.configuration.ingress.fqdn \ --output tsv
開啟瀏覽器以
https://<FQDN>/docs
測試已部署的應用程式。
清除資源
當您完成資源時,您可以將其刪除,以避免產生費用:
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait