Guida rapida all'SDK Vertex AI per Node.js

L'SDK Vertex AI per Node.js consente di utilizzare l'API Vertex AI Gemini per creare funzionalità e applicazioni basate sull'IA.

Per esempi dettagliati utilizzando l'SDK Node.js di Vertex AI, consulta il repository degli esempi su GitHub.

Per l'elenco più recente dei modelli Gemini disponibili su Vertex AI, consulta la pagina Informazioni sul modello nella documentazione di Vertex AI.

Prima di iniziare

  1. Assicurati che la versione di node.js sia 18 o successiva.
  2. Seleziona o crea un progetto Google Cloud.
  3. Abilita la fatturazione per il progetto.
  4. Abilita l'API Vertex AI.
  5. Configura l'autenticazione con un account di servizio in modo da poter accedere all'API dalla workstation locale.

Installa l'SDK

Installa l'SDK Vertex AI per Node.js eseguendo questo comando:

npm install @google-cloud/vertexai

Inizializza il corso VertexAI

Per utilizzare l'SDK Vertex AI per Node.js, crea un'istanza di VertexAI trasmettendola l'ID progetto e la località Google Cloud. Quindi crea un riferimento a un modello generativo.

const {
  FunctionDeclarationSchemaType,
  HarmBlockThreshold,
  HarmCategory,
  VertexAI
} = require('@google-cloud/vertexai');

const project = 'your-cloud-project';
const location = 'us-central1';
const textModel =  'gemini-1.0-pro';
const visionModel = 'gemini-1.0-pro-vision';

const vertexAI = new VertexAI({project: project, location: location});

// Instantiate Gemini models
const generativeModel = vertexAI.getGenerativeModel({
    model: textModel,
    // The following parameters are optional
    // They can also be passed to individual content generation requests
    safetySettings: [{category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE}],
    generationConfig: {maxOutputTokens: 256},
  });

const generativeVisionModel = vertexAI.getGenerativeModel({
    model: visionModel,
});

const generativeModelPreview = vertexAI.preview.getGenerativeModel({
    model: textModel,
});

Invia richieste di prompt di testo

Puoi inviare richieste di prompt di testo utilizzando generateContentStream per le risposte fluite o generateContent per le risposte non dinamiche.

Ricevi risposte di testo in streaming

La risposta viene restituita in blocchi durante la generazione, per ridurre la percezione della latenza da parte di un lettore umano.

async function streamGenerateContent() {
  const request = {
    contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
  };
  const streamingResult = await generativeModel.generateContentStream(request);
  for await (const item of streamingResult.stream) {
    console.log('stream chunk: ', JSON.stringify(item));
  }
  const aggregatedResponse = await streamingResult.response;
  console.log('aggregated response: ', JSON.stringify(aggregatedResponse));
};

streamGenerateContent();

Ricevere risposte testuali non in streaming

La risposta viene restituita tutta insieme.

async function generateContent() {
  const request = {
    contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
  };
  const result = await generativeModel.generateContent(request);
  const response = result.response;
  console.log('Response: ', JSON.stringify(response));
};

generateContent();

Invia richieste di chat in più passaggi

Le richieste di chat utilizzano i messaggi precedenti come contesto quando rispondono a nuovi prompt. Per inviare richieste di chat in più passaggi, utilizza sendMessageStream per le risposte dinamiche o sendMessage per le risposte non in streaming.

Ricevere risposte in streaming alla chat

La risposta viene restituita in blocchi durante la generazione, per ridurre la percezione della latenza da parte di un lettore umano.

async function streamChat() {
  const chat = generativeModel.startChat();
  const chatInput = "How can I learn more about Node.js?";
  const result = await chat.sendMessageStream(chatInput);
  for await (const item of result.stream) {
      console.log("Stream chunk: ", item.candidates[0].content.parts[0].text);
  }
  const aggregatedResponse = await result.response;
  console.log('Aggregated response: ', JSON.stringify(aggregatedResponse));
}

streamChat();

Ricevere risposte chat non in streaming

La risposta viene restituita tutta insieme.

async function sendChat() {
  const chat = generativeModel.startChat();
  const chatInput = "How can I learn more about Node.js?";
  const result = await chat.sendMessage(chatInput);
  const response = result.response;
  console.log('response: ', JSON.stringify(response));
}

sendChat();

Includi immagini o video nella richiesta di prompt

Le richieste di prompt possono includere un'immagine o un video oltre al testo. Per maggiori informazioni, consulta Inviare richieste di prompt multimodali nella documentazione di Vertex AI.

Includi un'immagine

Puoi includere immagini nel prompt specificando l'URI Cloud Storage in cui si trova l'immagine o includendo una codifica Base64 dell'immagine.

Specifica un URI Cloud Storage dell'immagine

Puoi specificare l'URI Cloud Storage dell'immagine in fileUri.

async function multiPartContent() {
    const filePart = {fileData: {fileUri: "gs://generativeai-downloads/images/scones.jpg", mimeType: "image/jpeg"}};
    const textPart = {text: 'What is this picture about?'};
    const request = {
        contents: [{role: 'user', parts: [textPart, filePart]}],
      };
    const streamingResult = await generativeVisionModel.generateContentStream(request);
    for await (const item of streamingResult.stream) {
      console.log('stream chunk: ', JSON.stringify(item));
    }
    const aggregatedResponse = await streamingResult.response;
    console.log(aggregatedResponse.candidates[0].content);
}

multiPartContent();

Specifica una stringa di codifica dell'immagine Base64

Puoi specificare la stringa di codifica dell'immagine Base64 in data.

async function multiPartContentImageString() {
    // Replace this with your own base64 image string
    const base64Image = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==';
    const filePart = {inline_data: {data: base64Image, mimeType: 'image/jpeg'}};
    const textPart = {text: 'What is this picture about?'};
    const request = {
        contents: [{role: 'user', parts: [textPart, filePart]}],
      };
    const streamingResult = await generativeVisionModel.generateContentStream(request);
    const contentResponse = await streamingResult.response;
    console.log(contentResponse.candidates[0].content.parts[0].text);
}

multiPartContentImageString();

Includi un video

Puoi includere video nel prompt specificando l'URI Cloud Storage in cui si trova il video in fileUri.

async function multiPartContentVideo() {
    const filePart = {fileData: {fileUri: 'gs://cloud-samples-data/video/animals.mp4', mimeType: 'video/mp4'}};
    const textPart = {text: 'What is in the video?'};
    const request = {
        contents: [{role: 'user', parts: [textPart, filePart]}],
      };
    const streamingResult = await generativeVisionModel.generateContentStream(request);
    for await (const item of streamingResult.stream) {
      console.log('stream chunk: ', JSON.stringify(item));
    }
    const aggregatedResponse = await streamingResult.response;
    console.log(aggregatedResponse.candidates[0].content);
}

multiPartContentVideo();

Chiamata di funzione

L'SDK Vertex AI per Node.js supporta le chiamate di funzione nei metodi sendMessage, sendMessageStream, generateContent e generateContentStream. Ti consigliamo di utilizzare questo metodo tramite i metodi di chat (sendMessage o sendMessageStream), ma di seguito puoi trovare esempi di entrambi gli approcci.

Dichiarare una funzione

I seguenti esempi mostrano come dichiarare una funzione.

const functionDeclarations = [
  {
    functionDeclarations: [
      {
        name: "get_current_weather",
        description: 'get weather in a given location',
        parameters: {
          type: FunctionDeclarationSchemaType.OBJECT,
          properties: {
            location: {type: FunctionDeclarationSchemaType.STRING},
            unit: {
              type: FunctionDeclarationSchemaType.STRING,
              enum: ['celsius', 'fahrenheit'],
            },
          },
          required: ['location'],
        },
      },
    ],
  },
];

const functionResponseParts = [
  {
    functionResponse: {
      name: "get_current_weather",
      response:
          {name: "get_current_weather", content: {weather: "super nice"}},
    },
  },
];

Chiamata di funzione tramite sendMessageStream

Dopo aver dichiarato la funzione, puoi passarla al modello nel parametro tools della richiesta di prompt.

async function functionCallingChat() {
  // Create a chat session and pass your function declarations
  const chat = generativeModel.startChat({
    tools: functionDeclarations,
  });

  const chatInput1 = 'What is the weather in Boston?';

  // This should include a functionCall response from the model
  const streamingResult1 = await chat.sendMessageStream(chatInput1);
  for await (const item of streamingResult1.stream) {
    console.log(item.candidates[0]);
  }
  const response1 = await streamingResult1.response;
  console.log("first aggregated response: ", JSON.stringify(response1));

  // Send a follow up message with a FunctionResponse
  const streamingResult2 = await chat.sendMessageStream(functionResponseParts);
  for await (const item of streamingResult2.stream) {
    console.log(item.candidates[0]);
  }

  // This should include a text response from the model using the response content
  // provided above
  const response2 = await streamingResult2.response;
  console.log("second aggregated response: ", JSON.stringify(response2));
}

functionCallingChat();

Chiamata di funzione tramite generateContentStream

async function functionCallingGenerateContentStream() {
  const request = {
    contents: [
      {role: 'user', parts: [{text: 'What is the weather in Boston?'}]},
      {role: 'model', parts: [{functionCall: {name: 'get_current_weather', args: {'location': 'Boston'}}}]},
      {role: 'user', parts: functionResponseParts}
    ],
    tools: functionDeclarations,
  };
  const streamingResult =
      await generativeModel.generateContentStream(request);
  for await (const item of streamingResult.stream) {
    console.log(item.candidates[0]);
  }
}

functionCallingGenerateContentStream();

Conteggio dei token

async function countTokens() {
  const request = {
      contents: [{role: 'user', parts: [{text: 'How are you doing today?'}]}],
    };
  const response = await generativeModel.countTokens(request);
  console.log('count tokens response: ', JSON.stringify(response));
}

countTokens();

grounding (anteprima)

Il grounding è una funzionalità disponibile solo in anteprima.

Il grounding consente di collegare l'output del modello a fonti di informazioni verificabili per ridurre le allucinazioni. Puoi specificare la Ricerca Google o la ricerca Vertex AI come origine dati per il grounding.

grounding mediante la Ricerca Google (anteprima)

async function generateContentWithGoogleSearchGrounding() {
  const generativeModelPreview = vertexAI.preview.getGenerativeModel({
    model: textModel,
    // The following parameters are optional
    // They can also be passed to individual content generation requests
    safetySettings: [{category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE}],
    generationConfig: {maxOutputTokens: 256},
  });

  const googleSearchRetrievalTool = {
    googleSearchRetrieval: {
      disableAttribution: false,
    },
  };
  const result = await generativeModelPreview.generateContent({
    contents: [{role: 'user', parts: [{text: 'Why is the sky blue?'}]}],
    tools: [googleSearchRetrievalTool],
  })
  const response = result.response;
  const groundingMetadata = response.candidates[0].groundingMetadata;
  console.log("GroundingMetadata is: ", JSON.stringify(groundingMetadata));
}
generateContentWithGoogleSearchGrounding();

grounding mediante Vertex AI Search (anteprima)

async function generateContentWithVertexAISearchGrounding() {
  const generativeModelPreview = vertexAI.preview.getGenerativeModel({
    model: textModel,
    // The following parameters are optional
    // They can also be passed to individual content generation requests
    safetySettings: [{category: HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT, threshold: HarmBlockThreshold.BLOCK_MEDIUM_AND_ABOVE}],
    generationConfig: {maxOutputTokens: 256},
  });

  const vertexAIRetrievalTool = {
    retrieval: {
      vertexAiSearch: {
        datastore: 'projects/.../locations/.../collections/.../dataStores/...',
      },
      disableAttribution: false,
    },
  };
  const result = await generativeModelPreview.generateContent({
    contents: [{role: 'user', parts: [{text: 'Why is the sky blue?'}]}],
    tools: [vertexAIRetrievalTool],
  })
  const response = result.response;
  const groundingMetadata = response.candidates[0].groundingMetadata;
  console.log("Grounding metadata is: ", JSON.stringify(groundingMetadata));
}
generateContentWithVertexAISearchGrounding();

Licenza

I contenuti di questo repository sono concessi in licenza in base alla licenza Apache, versione 2.0.