Images dans Azure Blob Storage
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.
Configuration
Section intitulée « Configuration »Installez les packages @azure/storage-blob et @azure/identity.
npm install -D @azure/storage-blob @azure/identity
Assurez-vous de vous connecter avec Azure CLI et de définir l’abonnement.
az login
Lecture des blobs
Section intitulée « Lecture des blobs »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.varsconst 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) ...
Utilisation des images dans l’invite
Section intitulée « Utilisation des images dans l’invite »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 ...
Résumer les résultats
Section intitulée « Résumer les résultats »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.`
Code source complet
Section intitulée « Code source complet »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.`;