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
- Assicurati che la versione di node.js sia 18 o successiva.
- Seleziona o crea un progetto Google Cloud.
- Abilita la fatturazione per il progetto.
- Abilita l'API Vertex AI.
- 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.