ปลั๊กอิน Vertex AI

ปลั๊กอิน Vertex AI มีอินเทอร์เฟซสำหรับบริการ AI หลายรายการ ดังนี้

การติดตั้ง

npm i --save @genkit-ai/vertexai

หากต้องการเรียกใช้โฟลว์ที่ใช้ปลั๊กอินนี้ในเครื่อง คุณจะต้องติดตั้งเครื่องมือ Google Cloud CLI ด้วย

การกำหนดค่า

หากต้องการใช้ปลั๊กอินนี้ ให้ระบุเมื่อเริ่มต้น Genkit

import { genkit } from 'genkit';
import { vertexAI } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [
    vertexAI({ location: 'us-central1' }),
  ],
});

ปลั๊กอินกำหนดให้คุณระบุรหัสโปรเจ็กต์ Google Cloud, ภูมิภาคที่คุณต้องการส่งคำขอ Vertex API และข้อมูลเข้าสู่ระบบโปรเจ็กต์ Google Cloud

  • คุณสามารถระบุรหัสโปรเจ็กต์ Google Cloud ได้โดยการตั้งค่า projectId ในการกำหนดค่า vertexAI() หรือตั้งค่าตัวแปรสภาพแวดล้อม GCLOUD_PROJECT หากคุณเรียกใช้โฟลว์จากสภาพแวดล้อม Google Cloud (Cloud Functions, Cloud Run และอื่นๆ) ระบบจะตั้งค่า GCLOUD_PROJECT เป็นรหัสโปรเจ็กต์ของสภาพแวดล้อมโดยอัตโนมัติ
  • คุณสามารถระบุตำแหน่ง API ได้โดยการตั้งค่า location ในการกำหนดค่า vertexAI() หรือตั้งค่าตัวแปรสภาพแวดล้อม GCLOUD_LOCATION
  • หากต้องการระบุข้อมูลเข้าสู่ระบบ API คุณต้องตั้งค่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Google Cloud

    1. วิธีระบุข้อมูลเข้าสู่ระบบ

      • หากคุณเรียกใช้โฟลว์จากสภาพแวดล้อม Google Cloud (Cloud Functions, Cloud Run และอื่นๆ) ระบบจะตั้งค่านี้โดยอัตโนมัติ
      • ในสภาพแวดล้อมการทํางานแบบสํารวจในเครื่อง ให้ทําดังนี้

        gcloud auth application-default login
      • สําหรับสภาพแวดล้อมอื่นๆ โปรดดูเอกสารข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน

    2. นอกจากนี้ โปรดตรวจสอบว่าบัญชีได้รับบทบาท IAM ผู้ใช้ Vertex AI (roles/aiplatform.user) โปรดดูเอกสารการควบคุมการเข้าถึงของ Vertex AI

การใช้งาน

โมเดล Generative AI

ปลั๊กอินนี้จะส่งออกข้อมูลอ้างอิงไปยังโมเดล Generative AI ที่รองรับแบบคงที่

import { gemini15Flash, gemini15Pro, imagen3 } from '@genkit-ai/vertexai';

คุณสามารถใช้ข้อมูลอ้างอิงเหล่านี้เพื่อระบุโมเดลที่ ai.generate() ใช้

const ai = genkit({
  plugins: [vertexAI({ location: 'us-central1' })],
});

const llmResponse = await ai.generate({
  model: gemini15Flash,
  prompt: 'What should I do when I visit Melbourne?',
});

นอกจากนี้ ปลั๊กอินนี้ยังรองรับการยึดโยงคำตอบที่เป็นข้อความของ Gemini โดยใช้ Google Search หรือข้อมูลของคุณเอง

ตัวอย่าง

const ai = genkit({
  plugins: [vertexAI({ location: 'us-central1' })],
});

await ai.generate({
  model: gemini15Flash,
  prompt: '...',
  config: {
    googleSearchRetrieval: {
      disableAttribution: true,
    }
    vertexRetrieval: {
      datastore: {
        projectId: 'your-cloud-project',
        location: 'us-central1',
        collection: 'your-collection',
      },
      disableAttribution: true,
    }
  }
})

นอกจากนี้ ปลั๊กอินนี้จะส่งออกการอ้างอิงไปยังรูปแบบการฝังข้อความ Gecko แบบคงที่ด้วย

import { textEmbedding004 } from '@genkit-ai/vertexai';

คุณสามารถใช้ข้อมูลอ้างอิงนี้เพื่อระบุตัวฝังที่เครื่องมือจัดทำดัชนีหรือเครื่องมือดึงข้อมูลใช้ เช่น หากคุณใช้ Chroma DB ให้ทำดังนี้

const ai = genkit({
  plugins: [
    chroma([
      {
        embedder: textEmbedding004,
        collectionName: 'my-collection',
      },
    ]),
  ],
});

หรือจะสร้างการฝังโดยตรงก็ได้ โดยทำดังนี้

const ai = genkit({
  plugins: [vertexAI({ location: 'us-central1' })],
});

const embedding = await ai.embed({
  embedder: textEmbedding004,
  content: 'How many widgets do you have in stock?',
});

โมเดล Imagen3 อนุญาตให้สร้างรูปภาพจากพรอมต์ของผู้ใช้

import { imagen3 } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [vertexAI({ location: 'us-central1' })],
});

const response = await ai.generate({
  model: imagen3,
  output: { format: 'media' },
  prompt: 'a banana riding a bicycle',
});

return response.media();

และแม้แต่การแก้ไขขั้นสูงของรูปภาพที่มีอยู่

const ai = genkit({
  plugins: [vertexAI({ location: 'us-central1' })],
});

const baseImg = fs.readFileSync('base.png', { encoding: 'base64' });
const maskImg = fs.readFileSync('mask.png', { encoding: 'base64' });

const response = await ai.generate({
  model: imagen3,
  output: { format: 'media' },
  prompt: [
    { media: { url: `data:image/png;base64,${baseImg}` }},
    {
      media: { url: `data:image/png;base64,${maskImg}` },
      metadata: { type: 'mask' },
    },
    { text: 'replace the background with foo bar baz' },
  ],
  config: {
    editConfig: {
      editMode: 'outpainting',
    },
  },
});

return response.media();

ดูตัวเลือกโดยละเอียดได้ในเอกสารประกอบเกี่ยวกับโมเดล Imagen

Anthropic Claude 3 ใน Vertex AI Model Garden

หากมีสิทธิ์เข้าถึงโมเดล Claude 3 (haiku, sonnet หรือ opus) ใน Vertex AI Model Garden คุณจะใช้โมเดลดังกล่าวกับ Genkit ได้

ตัวอย่างการกําหนดค่าเพื่อเปิดใช้โมเดลใน Model Garden ของ Vertex AI มีดังนี้

import { genkit } from 'genkit';
import {
  claude3Haiku,
  claude3Sonnet,
  claude3Opus,
  vertexAIModelGarden,
} from '@genkit-ai/vertexai/modelgarden';

const ai = genkit({
  plugins: [
    vertexAIModelGarden({
      location: 'us-central1',
      models: [claude3Haiku, claude3Sonnet, claude3Opus],
    }),
  ],
});

จากนั้นใช้รูปแบบดังกล่าวเป็นรูปแบบปกติ

const llmResponse = await ai.generate({
  model: claude3Sonnet,
  prompt: 'What should I do when I visit Melbourne?',
});

Llama 3.1 405b ใน Model Garden ของ Vertex AI

ก่อนอื่น คุณต้องเปิดใช้บริการ Llama 3.1 API ใน Vertex AI Model Garden

ตัวอย่างการกําหนดค่าสําหรับ Llama 3.1 405b ในปลั๊กอิน Vertex AI มีดังนี้

import { genkit } from 'genkit';
import { llama31, vertexAIModelGarden } from '@genkit-ai/vertexai/modelgarden';

const ai = genkit({
  plugins: [
    vertexAIModelGarden({
      location: 'us-central1',
      models: [llama31],
    }),
  ],
});

จากนั้นใช้รูปแบบเป็นโมเดลปกติ

const llmResponse = await ai.generate({
  model: llama31,
  prompt: 'Write a function that adds two numbers together',
});

โมเดล Mistral ใน Model Garden ของ Vertex AI

หากมีสิทธิ์เข้าถึงโมเดล Mistral (Mistral Large, Mistral Nemo หรือ Codestral) ใน Model Garden ของ Vertex AI คุณจะใช้โมเดลดังกล่าวกับ Genkit ได้

ตัวอย่างการกําหนดค่าสําหรับการเปิดใช้โมเดลใน Model Garden ของ Vertex AI มีดังนี้

import { genkit } from 'genkit';
import {
  mistralLarge,
  mistralNemo,
  codestral,
  vertexAIModelGarden,
} from '@genkit-ai/vertexai/modelgarden';

const ai = genkit({
  plugins: [
    vertexAIModelGarden({
      location: 'us-central1',
      models: [mistralLarge, mistralNemo, codestral],
    }),
  ],
});

จากนั้นใช้รูปแบบดังกล่าวเป็นรูปแบบปกติ

const llmResponse = await ai.generate({
  model: mistralLarge,
  prompt: 'Write a function that adds two numbers together',
  config: {
    version: 'mistral-large-2411', // Optional: specify model version
    temperature: 0.7,              // Optional: control randomness (0-1)
    maxOutputTokens: 1024,         // Optional: limit response length
    topP: 0.9,                     // Optional: nucleus sampling parameter
    stopSequences: ['###'],        // Optional: stop generation at sequences
  }
});

โดยรองรับรุ่นต่อไปนี้ - mistralLarge: รุ่น Mistral ขนาดใหญ่รุ่นล่าสุดที่มาพร้อมความสามารถในการเรียกใช้ฟังก์ชัน - mistralNemo: เพิ่มประสิทธิภาพเพื่อการทำงานที่รวดเร็วและมีประสิทธิภาพ - codestral: ออกแบบมาเพื่องานการสร้างโค้ดโดยเฉพาะ

แต่ละรูปแบบรองรับการตอบกลับแบบสตรีมและการเรียกใช้ฟังก์ชัน ดังนี้

const response = await ai.generateStream({
  model: mistralLarge,
  prompt: 'What should I cook tonight?',
  tools: ['recipe-finder'],
  config: {
    version: 'mistral-large-2411',
    temperature: 1,
  },
});

for await (const chunk of response.stream) {
  console.log(chunk.text);
}

ผู้ประเมิน

หากต้องการใช้เครื่องมือประเมินจากการประเมินอย่างรวดเร็วของ Vertex AI ให้เพิ่มบล็อก evaluation ลงในการกำหนดค่าปลั๊กอิน vertexAI

import { genkit } from 'genkit';
import {
  vertexAIEvaluation,
  VertexAIEvaluationMetricType,
} from '@genkit-ai/vertexai/evaluation';

const ai = genkit({
  plugins: [
    vertexAIEvaluation({
      location: 'us-central1',
      metrics: [
        VertexAIEvaluationMetricType.SAFETY,
        {
          type: VertexAIEvaluationMetricType.ROUGE,
          metricSpec: {
            rougeType: 'rougeLsum',
          },
        },
      ],
    }),
  ],
});

การกําหนดค่าด้านบนจะเพิ่มเครื่องมือประเมินสําหรับเมตริก Safety และ ROUGE ตัวอย่างนี้แสดง 2 แนวทาง โดยเมตริก Safety ใช้ข้อกําหนดเริ่มต้น ส่วนเมตริก ROUGE ระบุข้อกําหนดที่กำหนดเองซึ่งตั้งค่าประเภท Rouge เป็น rougeLsum

เครื่องมือประเมินทั้ง 2 รายการสามารถเรียกใช้ได้โดยใช้คําสั่ง genkit eval:run กับชุดข้อมูลที่เข้ากันได้ ซึ่งก็คือชุดข้อมูลที่มีช่อง output และ reference นอกจากนี้ คุณยังเรียกใช้เครื่องมือประเมิน Safety โดยใช้คำสั่ง genkit eval:flow -e vertexai/safety ได้ด้วย เนื่องจากต้องใช้เพียง output

ตัวจัดทําดัชนีและเครื่องมือดึงข้อมูล

ปลั๊กอิน Vertex AI ของ Genkit ประกอบด้วยการติดตั้งใช้งานเครื่องมือจัดทำดัชนีและเครื่องมือดึงข้อมูลซึ่งใช้บริการการค้นหาเวกเตอร์ของ Vertex AI

(ดูหน้าการสร้างที่เพิ่มการดึงข้อมูลเพื่อดูวิธีใช้เครื่องมือจัดทำดัชนีและเครื่องมือดึงข้อมูลในการใช้งาน RAG)

บริการ Vertex AI Vector Search คือดัชนีเอกสารที่ทำงานร่วมกับที่เก็บเอกสารที่คุณเลือก โดยที่เก็บเอกสารมีเนื้อหาของเอกสาร และดัชนี Vertex AI Vector Search มีเวกเตอร์การฝังและข้อมูลอ้างอิงสำหรับเอกสารแต่ละรายการในที่เก็บเอกสาร หลังจากบริการ Vertex AI Vector Search จัดทำดัชนีเอกสารแล้ว บริการจะตอบกลับคำค้นหา แสดงรายการดัชนีในที่จัดเก็บเอกสาร

การติดตั้งใช้งานเครื่องมือจัดทำดัชนีและเครื่องมือดึงข้อมูลซึ่งได้จากปลั๊กอิน Vertex AI จะใช้ Cloud Firestore หรือ BigQuery เป็นที่จัดเก็บเอกสาร นอกจากนี้ ปลั๊กอินยังมีอินเทอร์เฟซที่คุณนำไปใช้เพื่อรองรับที่เก็บเอกสารอื่นๆ ได้ด้วย

วิธีใช้การค้นหาแบบเวกเตอร์ของ Vertex AI

  1. เลือกรูปแบบการฝัง โมเดลนี้มีหน้าที่สร้างการฝังเวกเตอร์จากข้อความ ผู้ใช้ขั้นสูงอาจใช้โมเดลการฝังที่เพิ่มประสิทธิภาพสำหรับชุดข้อมูลหนึ่งๆ แต่สำหรับผู้ใช้ส่วนใหญ่ โมเดล text-embedding-004 ของ Vertex AI เป็นตัวเลือกที่ดีสำหรับข้อความภาษาอังกฤษ และโมเดล text-multilingual-embedding-002 เหมาะสำหรับข้อความหลายภาษา
  2. ในส่วน Vector Search ของคอนโซล Google Cloud ให้สร้างดัชนีใหม่ การตั้งค่าที่สําคัญที่สุดมีดังนี้

    • มิติข้อมูล: ระบุมิติข้อมูลของเวกเตอร์ที่โมเดลการฝังที่คุณเลือกสร้างขึ้น รุ่น text-embedding-004 และ text-multilingual-embedding-002 จะสร้างเวกเตอร์ 768 มิติ
    • วิธีการอัปเดต: เลือกการอัปเดตสตรีมมิง

    หลังจากสร้างดัชนีแล้ว ให้นำไปติดตั้งใช้งานกับปลายทางมาตรฐาน (สาธารณะ)

  3. รับเครื่องมือจัดทำดัชนีและดึงข้อมูลเอกสารสำหรับที่เก็บเอกสารที่ต้องการใช้

    Cloud Firestore

    import { getFirestoreDocumentIndexer, getFirestoreDocumentRetriever } from '@genkit-ai/vertexai/vectorsearch';
    
    import { initializeApp } from 'firebase-admin/app';
    import { getFirestore } from 'firebase-admin/firestore';
    
    initializeApp({ projectId: PROJECT_ID });
    const db = getFirestore();
    
    const firestoreDocumentRetriever = getFirestoreDocumentRetriever(db, FIRESTORE_COLLECTION);
    const firestoreDocumentIndexer = getFirestoreDocumentIndexer(db, FIRESTORE_COLLECTION);
    

    BigQuery

    import { getBigQueryDocumentIndexer, getBigQueryDocumentRetriever } from '@genkit-ai/vertexai/vectorsearch';
    import { BigQuery } from '@google-cloud/bigquery';
    
    const bq = new BigQuery({ projectId: PROJECT_ID });
    
    const bigQueryDocumentRetriever = getBigQueryDocumentRetriever(bq, BIGQUERY_TABLE, BIGQUERY_DATASET);
    const bigQueryDocumentIndexer = getBigQueryDocumentIndexer(bq, BIGQUERY_TABLE, BIGQUERY_DATASET);
    

    อื่นๆ

    หากต้องการรองรับที่เก็บเอกสารอื่นๆ คุณสามารถระบุการติดตั้งใช้งาน DocumentRetriever และ DocumentIndexer ของคุณเองได้ ดังนี้

    const myDocumentRetriever = async (neighbors) => {
      // Return the documents referenced by `neighbors`.
      // ...
    }
    const myDocumentIndexer = async (documents) => {
      // Add `documents` to storage.
      // ...
    }
    

    ดูตัวอย่างได้ที่ตัวอย่างเครื่องมือดึงข้อมูลและเครื่องมือจัดทำดัชนีของปลั๊กอิน Vertex AI ที่มีไฟล์ในเครื่อง

  4. เพิ่มบล็อก vectorSearchOptions ลงในการกำหนดค่าปลั๊กอิน vertexAI

    import { genkit } from 'genkit';
    import { textEmbedding004 } from '@genkit-ai/vertexai';
    import { vertexAIVectorSearch } from '@genkit-ai/vertexai/vectorsearch';
    
    const ai = genkit({
      plugins: [
        vertexAIVectorSearch({
          projectId: PROJECT_ID,
          location: LOCATION,
          vectorSearchOptions: [
            {
              indexId: VECTOR_SEARCH_INDEX_ID,
              indexEndpointId: VECTOR_SEARCH_INDEX_ENDPOINT_ID,
              deployedIndexId: VECTOR_SEARCH_DEPLOYED_INDEX_ID,
              publicDomainName: VECTOR_SEARCH_PUBLIC_DOMAIN_NAME,
              documentRetriever: firestoreDocumentRetriever,
              documentIndexer: firestoreDocumentIndexer,
              embedder: textEmbedding004,
            },
          ],
        }),
      ],
    });
    

    ระบุเครื่องมือฝังที่คุณเลือกในขั้นตอนแรก รวมถึงเครื่องมือจัดทำดัชนีและดึงข้อมูลเอกสารที่คุณสร้างในขั้นตอนก่อนหน้า

    หากต้องการกําหนดค่าปลั๊กอินให้ใช้ดัชนีการค้นหาด้วยเวกเตอร์ที่คุณสร้างไว้ก่อนหน้านี้ คุณต้องระบุค่าหลายค่า ซึ่งดูได้ในส่วนการค้นหาด้วยเวกเตอร์ของคอนโซล Google Cloud ดังนี้

    • indexId: แสดงในแท็บดัชนี
    • indexEndpointId: แสดงในแท็บปลายทางการจัดทําดัชนี
    • deployedIndexId และ publicDomainName: แสดงอยู่ในหน้า "ข้อมูลดัชนีที่ติดตั้งใช้งาน" ซึ่งเปิดได้โดยคลิกชื่อดัชนีที่ติดตั้งใช้งานในแท็บใดแท็บหนึ่งข้างต้น
  5. เมื่อกําหนดค่าทุกอย่างแล้ว คุณจะใช้เครื่องมือจัดทําดัชนีและเครื่องมือดึงข้อมูลในแอปพลิเคชัน Genkit ได้โดยทำดังนี้

    import {
      vertexAiIndexerRef,
      vertexAiRetrieverRef,
    } from '@genkit-ai/vertexai/vectorsearch';
    
    // ... inside your flow function:
    
    await ai.index({
      indexer: vertexAiIndexerRef({
        indexId: VECTOR_SEARCH_INDEX_ID,
      }),
      documents,
    });
    
    const res = await ai.retrieve({
      retriever: vertexAiRetrieverRef({
        indexId: VECTOR_SEARCH_INDEX_ID,
      }),
      query: queryDocument,
    });
    

ดูตัวอย่างโค้ดสำหรับ

การแคชบริบท

ปลั๊กอิน Genkit ของ Vertex AI รองรับการแคชบริบท ซึ่งช่วยให้โมเดลนำเนื้อหาที่แคชไว้ก่อนหน้านี้มาใช้ซ้ำเพื่อเพิ่มประสิทธิภาพการใช้โทเค็นเมื่อจัดการกับเนื้อหาจำนวนมากได้ ฟีเจอร์นี้มีประโยชน์อย่างยิ่งสำหรับขั้นตอนการสนทนาหรือสถานการณ์ที่โมเดลอ้างอิงเนื้อหาจำนวนมากอย่างสอดคล้องกันในคําขอหลายรายการ

วิธีใช้การแคชบริบท

หากต้องการเปิดใช้การแคชบริบท โปรดตรวจสอบว่าโมเดลของคุณรองรับการแคช เช่น gemini15Flash และ gemini15Pro เป็นรุ่นที่รองรับการแคชบริบท และคุณจะต้องระบุหมายเลขเวอร์ชัน 001

คุณกำหนดกลไกการแคชในแอปพลิเคชันได้โดยทำดังนี้

const ai = genkit({
  plugins: [googleAI()],
});

const llmResponse = await ai.generate({
  messages: [
    {
      role: 'user',
      content: [{ text: 'Here is the relevant text from War and Peace.' }],
    },
    {
      role: 'model',
      content: [
        {
          text: 'Based on War and Peace, here is some analysis of Pierre Bezukhov’s character.',
        },
      ],
      metadata: {
        cache: {
          ttlSeconds: 300, // Cache this message for 5 minutes
        },
      },
    },
  ],
  model: gemini15Flash,
  prompt: 'Describe Pierre’s transformation throughout the novel.',
});

ในการตั้งค่านี้ - messages: อนุญาตให้คุณส่งประวัติการสนทนา - metadata.cache.ttlSeconds: ระบุ Time to Live (TTL) สําหรับการแคชการตอบกลับที่เฉพาะเจาะจง

ตัวอย่าง: ใช้ประโยชน์จากข้อความขนาดใหญ่ด้วยบริบท

สําหรับแอปพลิเคชันที่อ้างอิงเอกสารที่มีความยาว เช่น สงครามและสันติภาพหรือลอร์ดออฟเดอะริง คุณสามารถจัดโครงสร้างการค้นหาเพื่อใช้บริบทที่แคชไว้ซ้ำได้ ดังนี้


const textContent = await fs.readFile('path/to/war_and_peace.txt', 'utf-8');

const llmResponse = await ai.generate({
  messages: [
    {
      role: 'user',
      content: [{ text: textContent }], // Include the large text as context
    },
    {
      role: 'model',
      content: [
        {
          text: 'This analysis is based on the provided text from War and Peace.',
        },
      ],
      metadata: {
        cache: {
          ttlSeconds: 300, // Cache the response to avoid reloading the full text
        },
      },
    },
  ],
  model: gemini15Flash,
  prompt: 'Analyze the relationship between Pierre and Natasha.',
});

ประโยชน์ของการจัดเก็บแคชบริบท

  1. ประสิทธิภาพที่ดีขึ้น: ลดความจำเป็นในการประมวลผลอินพุตขนาดใหญ่ซ้ำๆ
  2. ประหยัดค่าใช้จ่าย: ลดการใช้ API สําหรับข้อมูลที่ซ้ำซ้อนเพื่อเพิ่มประสิทธิภาพการใช้โทเค็น
  3. เวลาในการตอบสนองที่ดีขึ้น: เพิ่มความเร็วในการตอบกลับสำหรับคำค้นหาซ้ำหรือที่เกี่ยวข้อง

รุ่นที่รองรับการแคชบริบท

เฉพาะบางรุ่นเท่านั้นที่รองรับการแคชบริบท เช่น gemini15Flash และ gemini15Pro และปัจจุบันรองรับเฉพาะหมายเลขเวอร์ชัน 001 เท่านั้น หากใช้รูปแบบที่ระบบไม่รองรับ ระบบจะแสดงข้อผิดพลาดที่ระบุว่าใช้การแคชไม่ได้

อ่านเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการแคชบริบทใน Vertex AI ในเอกสารประกอบ