Udostępnij za pośrednictwem


Sesje interpretera kodu bezserwerowego w usłudze Azure Container Apps

Sesje dynamiczne usługi Azure Container Apps zapewniają szybki i skalowalny dostęp do interpretera kodu. Każda sesja interpretera kodu jest w pełni odizolowana przez granicę funkcji Hyper-V i jest przeznaczona do uruchamiania niezaufanego kodu.

Zastosowania dla sesji interpretera kodu

Sesje interpretera kodu są idealne w scenariuszach, w których należy uruchomić kod, który jest potencjalnie złośliwy lub może spowodować szkodę dla systemu hosta lub innych użytkowników, takich jak:

  • Kod generowany przez duży model językowy (LLM).
  • Kod przesłany przez użytkownika końcowego w aplikacji internetowej lub SaaS.

W przypadku popularnych struktur LLM, takich jak LangChain, LlamaIndex lub Semantic Kernel, można używać narzędzi i wtyczek do integrowania aplikacji sztucznej inteligencji z sesjami interpretera kodu.

Aplikacje mogą również integrować się z sesją interpretera kodu przy użyciu interfejsu API REST. Interfejs API umożliwia wykonywanie kodu w sesji i pobieranie wyników. Możesz również przekazywać i pobierać pliki do i z sesji. Możesz przekazywać i pobierać pliki kodu wykonywalnego lub pliki danych, które może przetwarzać kod.

Wbudowane sesje interpretera kodu obsługują najbardziej typowe scenariusze wykonywania kodu bez konieczności zarządzania infrastrukturą lub kontenerami. Jeśli potrzebujesz pełnej kontroli nad środowiskiem wykonywania kodu lub masz inny scenariusz, który wymaga odizolowanych piaskownic, możesz użyć niestandardowych sesji interpretera kodu.

Pula sesji interpretera kodu

Aby korzystać z sesji interpretera kodu, potrzebny jest zasób platformy Azure nazywany pulą sesji sesji, która definiuje konfigurację sesji interpretera kodu. W puli sesji można określić ustawienia, takie jak maksymalna liczba równoczesnych sesji i czas bezczynności sesji przed zakończeniem sesji.

Pulę sesji można utworzyć przy użyciu witryny Azure Portal, interfejsu wiersza polecenia platformy Azure lub szablonów usługi Azure Resource Manager. Po utworzeniu puli sesji można użyć punktów końcowych interfejsu API zarządzania puli do zarządzania i wykonywania kodu wewnątrz sesji.

Tworzenie puli sesji przy użyciu interfejsu wiersza polecenia platformy Azure

Aby utworzyć pulę sesji interpretera kodu przy użyciu interfejsu wiersza polecenia platformy Azure, upewnij się, że masz najnowsze wersje interfejsu wiersza polecenia platformy Azure i rozszerzenie Azure Container Apps za pomocą następujących poleceń:

# Upgrade the Azure CLI
az upgrade

# Install or upgrade the Azure Container Apps extension
az extension add --name containerapp --upgrade --allow-preview true -y

Użyj polecenia , az containerapps sessionpool create aby utworzyć pulę. Poniższy przykład tworzy pulę sesji interpretera kodu języka Python o nazwie my-session-pool. Przed uruchomieniem polecenia pamiętaj, aby zastąpić <RESOURCE_GROUP> ciąg nazwą grupy zasobów.

az containerapp sessionpool create \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --location westus2 \
    --container-type PythonLTS \
    --max-sessions 100 \
    --cooldown-period 300 \
    --network-status EgressDisabled

Podczas tworzenia puli sesji można zdefiniować następujące ustawienia:

Ustawienie opis
--container-type Typ interpretera kodu do użycia. Jedyną obsługiwaną wartością jest PythonLTS.
--max-sessions Maksymalna liczba przydzielonych sesji dozwolonych współbieżnie. Wartość maksymalna to 600.
--cooldown-period Liczba dozwolonych bezczynności sekund przed zakończeniem. Okres bezczynności jest resetowany za każdym razem, gdy interfejs API sesji jest wywoływany. Dozwolony zakres to między 300 i 3600.
--network-status Określa, czy wychodzący ruch sieciowy jest dozwolony z sesji. Prawidłowe wartości to EgressDisabled (wartość domyślna) i EgressEnabled.

Ważne

Jeśli włączysz ruch wychodzący, kod uruchomiony w sesji będzie mógł uzyskać dostęp do Internetu. Należy zachować ostrożność, gdy kod jest niezaufany, ponieważ może służyć do wykonywania złośliwych działań, takich jak ataki typu "odmowa usługi".

Uzyskiwanie punktu końcowego interfejsu API zarządzania pulą za pomocą interfejsu wiersza polecenia platformy Azure

Aby używać sesji interpretera kodu z integracją platformy LLM lub bezpośrednio wywołując punkty końcowe interfejsu API zarządzania, potrzebny jest punkt końcowy interfejsu API zarządzania puli. Punkt końcowy ma format https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>.

Aby pobrać punkt końcowy interfejsu API zarządzania dla puli sesji, użyj az containerapps sessionpool show polecenia . Przed uruchomieniem polecenia pamiętaj, aby zastąpić <RESOURCE_GROUP> ciąg nazwą grupy zasobów.

az containerapp sessionpool show \
    --name my-session-pool \
    --resource-group <RESOURCE_GROUP> \
    --query 'properties.poolManagementEndpoint' -o tsv

Wykonywanie kodu w sesji

Po utworzeniu puli sesji aplikacja może wchodzić w interakcje z sesjami w puli przy użyciu integracji z platformą LLM lub bezpośrednio przy użyciu punktów końcowych interfejsu API zarządzania puli.

Identyfikatory sesji

Ważne

Identyfikator sesji jest poufnymi informacjami, które wymagają użycia bezpiecznego procesu do zarządzania jej wartością. Część tego procesu wymaga, aby aplikacja zapewniała każdemu użytkownikowi lub dzierżawie dostęp tylko do własnych sesji. Brak bezpiecznego dostępu do sesji może spowodować nieprawidłowe użycie lub nieautoryzowany dostęp do danych przechowywanych w sesjach użytkowników. Aby uzyskać więcej informacji, zobacz Identyfikatory sesji

W przypadku interakcji z sesjami w puli należy użyć identyfikatora sesji, aby odwołać się do każdej sesji Identyfikator sesji jest ciągiem, który jest unikatowy w puli sesji. Jeśli tworzysz aplikację internetową, możesz użyć identyfikatora użytkownika. Jeśli tworzysz czatbota, możesz użyć identyfikatora konwersacji.

Jeśli istnieje uruchomiona sesja z identyfikatorem, sesja zostanie ponownie użyta. Jeśli nie ma uruchomionej sesji z identyfikatorem, zostanie automatycznie utworzona nowa sesja.

Aby dowiedzieć się więcej na temat identyfikatorów sesji, zobacz Omówienie sesji.

Uwierzytelnianie

Uwierzytelnianie jest obsługiwane przy użyciu tokenów firmy Microsoft Entra (dawniej Azure Active Directory). Prawidłowe tokeny usługi Microsoft Entra są generowane przez tożsamość należącą do funkcji wykonawczej sesji usługi Azure ContainerApps i współautora w puli sesji.

Jeśli używasz integracji platformy LLM, platforma obsługuje generowanie tokenów i zarządzanie nimi. Upewnij się, że aplikacja jest skonfigurowana przy użyciu tożsamości zarządzanej z niezbędnymi przypisaniami ról w puli sesji.

Jeśli bezpośrednio używasz punktów końcowych interfejsu API zarządzania puli, musisz wygenerować token i dołączyć go do Authorization nagłówka żądań HTTP. Oprócz wymienionych wcześniej przypisań ról token musi zawierać oświadczenie odbiorców (aud) o wartości https://dynamicsessions.io.

Aby dowiedzieć się więcej, zobacz Uwierzytelnianie.

Integracje platformy LLM

Zamiast bezpośrednio korzystać z interfejsu API zarządzania pulą sesji, następujące struktury LLM zapewniają integrację z sesjami interpretera kodu:

Framework Pakiet Samouczek
LangChain Python: langchain-azure-dynamic-sessions Samouczek
LlamaIndex Python: llama-index-tools-azure-code-interpreter Samouczek
Jądro semantyczne Python: semantic-kernel (wersja 0.9.8-b1 lub nowsza) Samouczek

Punkty końcowe interfejsu API zarządzania

Jeśli nie korzystasz z integracji platformy LLM, możesz korzystać z puli sesji bezpośrednio przy użyciu punktów końcowych interfejsu API zarządzania.

Następujące punkty końcowe są dostępne do zarządzania sesjami w puli:

Ścieżka punktu końcowego Metoda opis
code/execute POST Wykonywanie kodu w sesji.
files/upload POST Przekaż plik do sesji.
files/content/{filename} GET Pobierz plik z sesji.
files GET Wyświetl listę plików w sesji.

Utwórz pełny adres URL dla każdego punktu końcowego, łącząc punkt końcowy interfejsu API zarządzania pulą ze ścieżką punktu końcowego. Ciąg zapytania musi zawierać identifier parametr zawierający identyfikator sesji i api-version parametr z wartością 2024-02-02-preview.

Na przykład: https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<IDENTIFIER>.

Wykonywanie kodu w sesji

Aby wykonać kod w sesji, wyślij POST żądanie do code/execute punktu końcowego za pomocą kodu do uruchomienia w treści żądania. Ten przykład wyświetla tekst "Hello, world!" w języku Python.

Przed wysłaniem żądania zastąp symbole zastępcze między <> nawiasami odpowiednimi wartościami dla puli sesji i identyfikatorem sesji.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "print('Hello, world!')"
    }
}

Aby ponownie użyć sesji, określ ten sam identyfikator sesji w kolejnych żądaniach.

Przekazywanie pliku do sesji

Aby przekazać plik do sesji, wyślij POST żądanie do uploadFile punktu końcowego w żądaniu danych formularza wieloczęściowego. Uwzględnij dane pliku w treści żądania. Plik musi zawierać nazwę pliku.

Przekazane pliki są przechowywane w systemie plików sesji w /mnt/data katalogu .

Przed wysłaniem żądania zastąp symbole zastępcze między <> nawiasami wartościami specyficznymi dla żądania.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Pobieranie pliku z sesji

Aby pobrać plik z katalogu sesji /mnt/data , wyślij GET żądanie do punktu końcowego file/content/{filename} . Odpowiedź zawiera dane pliku.

Przed wysłaniem żądania zastąp symbole zastępcze między <> nawiasami wartościami specyficznymi dla żądania.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

Wyświetlanie listy plików w sesji

Aby wyświetlić listę plików w katalogu sesji /mnt/data , wyślij GET żądanie do punktu końcowego files .

Przed wysłaniem żądania zastąp symbole zastępcze między <> nawiasami wartościami specyficznymi dla żądania.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

Odpowiedź zawiera listę plików w sesji.

Poniższa lista przedstawia przykładową odpowiedź, której można oczekiwać od żądania zawartości sesji.

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

Wstępnie zainstalowane pakiety

Sesje interpretera kodu języka Python obejmują popularne pakiety języka Python, takie jak NumPy, pandas i scikit-learn.

Aby wyświetlić listę wstępnie zainstalowanych pakietów, wywołaj code/execute punkt końcowy przy użyciu następującego kodu.

Przed wysłaniem żądania zastąp symbole zastępcze między <> nawiasami wartościami specyficznymi dla żądania.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
    }
}

Rejestrowanie

Sesje interpretera kodu nie obsługują rejestrowania bezpośrednio. Aplikacja, która współdziała z sesjami, może rejestrować żądania do interfejsu API zarządzania pulą sesji i odpowiedzi.

Rozliczenia

Sesje interpretera kodu są rozliczane na podstawie czasu trwania każdej sesji. Aby uzyskać więcej informacji, zobacz Rozliczenia .

Następne kroki