Aller au contenu

Images dans Azure Blob Storage

AI generated translation.

Il est possible d’utiliser le SDK Azure Node.JS pour télécharger des images depuis Azure Blob Storage et les utiliser dans l’invite. La fonction defImages supporte le type [Buffer] de node.js.

Installez les packages @azure/storage-blob et @azure/identity.

Fenêtre de terminal
npm install -D @azure/storage-blob @azure/identity

Assurez-vous de vous connecter avec Azure CLI et de définir l’abonnement.

Fenêtre de terminal
az login

Ouvrez une connexion au Azure Blob Storage et obtenez un client pour le conteneur. Nous déconstruisons account et container de l’objet env.vars afin qu’ils puissent être définis via le cli.

import { BlobServiceClient } from "@azure/storage-blob"
import { DefaultAzureCredential } from "@azure/identity"
const { account = "myblobs", container = "myimages" } = env.vars
const blobServiceClient = new BlobServiceClient(
`https://${account}.blob.core.windows.net`,
new DefaultAzureCredential()
)
const containerClient = blobServiceClient.getContainerClient(container)

Si vous n’avez pas un blob spécifique en tête, vous pouvez parcourir les blobs et les télécharger dans un buffer (buf).

import { buffer } from "node:stream/consumers"
for await (const blob of containerClient.listBlobsFlat()) {
const blockBlobClient = containerClient.getBlockBlobClient(blob.name)
const downloadBlockBlobResponse = await blockBlobClient.download(0)
const body = await downloadBlockBlobResponse.readableStreamBody
const image = await buffer(body)
...

Le buffer image peut être passé dans defImages pour être utilisé dans l’invite.

defImages(image, { detail: "low" })

Cependant, puisque les images peuvent être “lourdes”, vous devrez très probablement utiliser des prompts en ligne pour les diviser en requêtes plus petites. (Notez l’utilisation de _.)

for await (const blob of containerClient.listBlobsFlat()) {
...
const res = await runPrompt(_ => {
_.defImages(image, { detail: "low" })
_.$`Describe the image.`
})
// res contains the LLM response for the inner prompt
...

Pour résumer toutes les images, nous stockons chaque résumé d’image en utilisant la fonction def et ajoutons une sollicitation pour résumer les descriptions.

...
def("IMAGES_SUMMARY", { filename: blob.name, content: res.text })
}
$`Summarize IMAGES_SUMMARY.`
azure-blobs.genai.mts
import { BlobServiceClient } from "@azure/storage-blob";
import { DefaultAzureCredential } from "@azure/identity";
import { buffer } from "node:stream/consumers";
script({
parameters: {
account: {
description: "Azure Storage Account Name",
default: "genaiscript",
type: "string",
},
container: {
description: "Azure Storage Container Name",
default: "images",
type: "string",
},
},
});
const { account, container } = env.vars;
const url = `https://${account}.blob.core.windows.net`;
console.log(`analyzing images in ${account}/${container} at ${url}`);
const blobServiceClient = new BlobServiceClient(url, new DefaultAzureCredential());
const containerClient = blobServiceClient.getContainerClient(container);
for await (const blob of containerClient.listBlobsFlat()) {
console.log(`blob: ` + blob.name);
const blockBlobClient = containerClient.getBlockBlobClient(blob.name);
const downloadBlockBlobResponse = await blockBlobClient.download(0);
const body = await downloadBlockBlobResponse.readableStreamBody;
const image = await buffer(body);
const res = await runPrompt((_) => {
_.defImages(image, { detail: "low" });
_.$`Describe the images.`;
});
def("IMAGES_SUMMARY", { filename: blob.name, content: res.text });
}
$`Summarize IMAGES_SUMMARY.`;