ทำการค้นหาความคล้ายคลึงกันของเวกเตอร์ด้วย Vertex AI

ยินดีต้อนรับสู่การค้นหาแบบเวกเตอร์ที่คล้ายกันของ Firebase Data Connect ซึ่งเป็นการใช้งานการค้นหาเชิงความหมายของ Firebase ที่ผสานรวมกับ Google Vertex AI

หัวใจสําคัญของฟีเจอร์นี้คือการฝังเวกเตอร์ ซึ่งเป็นอาร์เรย์ของตัวเลขทศนิยมที่แสดงความหมายเชิงอรรถศาสตร์ของข้อความหรือสื่อ คุณสามารถค้นหาเนื้อหาทั้งหมดที่คล้ายกันตามความหมายได้ด้วยการเรียกใช้การค้นหาเพื่อนบ้านที่ใกล้ที่สุดโดยใช้การฝังเวกเตอร์อินพุต Data Connect ใช้ส่วนขยายของ PostgreSQL pgvector สำหรับความสามารถนี้

การค้นหาเชิงความหมายที่มีประสิทธิภาพนี้สามารถขับเคลื่อนกรณีการใช้งานต่างๆ เช่น เครื่องมือแนะนำและเครื่องมือค้นหา และยังเป็นส่วนประกอบสําคัญในการสร้างที่เพิ่มการดึงข้อมูลในขั้นตอนของ Generative AI เอกสารประกอบของ Vertex AI เป็นตัวเลือกที่ยอดเยี่ยมในการดูข้อมูลเพิ่มเติม

คุณสามารถใช้การรองรับในตัวของ Data Connect เพื่อสร้างการฝังเวกเตอร์โดยอัตโนมัติโดยใช้ Embeddings API ของ Vertex AI หรือใช้ API ดังกล่าวเพื่อสร้างการฝังด้วยตนเองก็ได้

ข้อกำหนดเบื้องต้น

  • ตั้งค่า Data Connect สําหรับโปรเจ็กต์

  • เปิดใช้ Vertex AI API

ตั้งค่า

คุณสามารถเลือกระหว่างขั้นตอนการพัฒนาในเครื่อง (หากคุณเป็นนักพัฒนาเว็บ, Kotlin, Android หรือ iOS) หรือขั้นตอน IDX (สําหรับนักพัฒนาเว็บ) คุณสามารถใช้ฐานข้อมูลในเครื่องหรือโปรเจ็กต์ Data Connect เวอร์ชันที่ใช้งานจริงและอินสแตนซ์ Cloud SQL สำหรับ PostgreSQL ของโปรเจ็กต์ดังกล่าวสําหรับการพัฒนา

วิธีการเหล่านี้จะถือว่าคุณได้สร้างData Connectโปรเจ็กต์ตามคู่มือเริ่มต้นใช้งานอย่างรวดเร็วแล้ว

ผสานรวมกับ PostgreSQL ในพื้นที่

  1. ตั้งค่าอินสแตนซ์ PostgreSQL ในพื้นที่
  2. มอบบทบาท IAM ของผู้ใช้ Vertex AI ให้กับตัวเอง
  3. ตั้งค่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Google Cloud ในสภาพแวดล้อม
  4. ติดตั้งส่วนขยาย pgvector ในอินสแตนซ์ PostgreSQL บนเครื่อง
  5. เปิดใช้ส่วนขยายโดยใช้ CREATE EXTENSION vector ตามวิธีการของpgvector ที่เก็บ

ผสานรวมกับ IDX

  1. ตั้งค่าเวิร์กสเปซ IDX โดยใช้เทมเพลตการเชื่อมต่อข้อมูล
  2. มอบบทบาท IAM ของผู้ใช้ Vertex AI ให้กับตัวเอง
  3. เปิดใช้ส่วนขยายโดยใช้ CREATE EXTENSION vector ตามวิธีการของpgvector ที่เก็บ

ออกแบบสคีมา

หากต้องการทำการค้นหาเวกเตอร์ ให้เพิ่มช่องใหม่ประเภท Vector ในสคีมา เช่น หากต้องการทําการค้นหาเชิงความหมายโดยใช้คําอธิบายภาพยนตร์ ให้เพิ่มช่องเพื่อเก็บการฝังเวกเตอร์ที่เชื่อมโยงกับคําอธิบายภาพยนตร์ ในสคีมานี้ ระบบจะเพิ่ม descriptionEmbedding เพื่อจัดเก็บการฝังเวกเตอร์สำหรับช่อง description

type Movie @table {
 id: ID! @col(name: "movie_id") @default(id: ID! @col(name: "movie_id") @default(expr: "uuidV4()")
 title: String!
 description: String
 descriptionEmbedding: Vector! @col(size:768)
 // ...
}

สร้างและเรียกข้อมูลการฝัง

Data Connect รองรับการฝังเวกเตอร์แบบรวมด้วยค่าเซิร์ฟเวอร์ _embed ซึ่งจะสั่งให้ Data Connect สร้างการฝังเวกเตอร์โดยการเรียกใช้ Embedding API ของ Vertex AI ภายใน ค่า _embed server สามารถใช้ได้ทั้งใน Mutation และ Query

การกลายพันธุ์

สร้างและจัดเก็บการฝังผ่าน Data Connect

ในแอปการค้นหาเวกเตอร์ คุณอาจต้องการขอให้สร้างการฝังทันทีที่เพิ่มระเบียนลงในฐานข้อมูล createMovie mutation ต่อไปนี้จะเพิ่มระเบียนภาพยนตร์ลงในตาราง Movie และส่งคำอธิบายภาพยนตร์ที่มีการฝัง model ที่ระบุ

mutation createMovie($movieData: Movie_Data! @pick(fields: ["title", "genre", "description"])) {
  movie_insert(data: {
    ...movieData,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $movieData.description}
  })
}

ในบางกรณี คุณอาจต้องอัปเดตคำอธิบายและการฝังภาพยนตร์

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "textembedding-gecko@003", text: $description}
  })
}

วิธีเรียกใช้การกลายพันธุ์แบบหลังจากไคลเอ็นต์

import { updateMovieDescriptionWithEmbed } from 'lib/dataconnect-sdk/';

await updateMovieDescriptionWithEmbed({ id: movieId, description: description});

// Use the response

คำค้นหา

ดึงข้อมูลการฝังเวกเตอร์โดยใช้การค้นหาดังต่อไปนี้ โปรดทราบว่าdescriptionEmbeddingที่การค้นหาแสดงผลเป็นอาร์เรย์ของตัวเลขทศนิยม ซึ่งโดยทั่วไปแล้วมนุษย์อ่านไม่ได้ ดังนั้น SDK ที่ Data Connect สร้างขึ้นจึงไม่รองรับการคืนค่าโดยตรง

คุณสามารถใช้การฝังเวกเตอร์ที่แสดงผลเพื่อทำการค้นหาความคล้ายคลึงตามที่อธิบายไว้ในส่วนถัดไป

query getMovieDescription($id: String!) @auth(is: PUBLIC) {
 movie(id: $id)
   id
   description
   descriptionEmbedding
}

ทำการค้นหาแบบคล้ายกัน

ตอนนี้เราทำการค้นหาที่คล้ายกันได้

สําหรับช่อง Vector แต่ละช่อง Data Connect จะสร้างฟังก์ชัน GraphQL ที่ใช้การค้นหาแบบคล้ายกัน ชื่อของฟังก์ชันที่สร้างขึ้นนี้คือ ${pluralType}_${vectorFieldName}_similarity ซึ่งรองรับพารามิเตอร์ 2-3 รายการดังที่แสดงในตัวอย่างต่อไปนี้และในรายการอ้างอิง

คุณสามารถกําหนดฟังก์ชัน GraphQL ที่เรียกใช้การค้นหาความคล้ายคลึงได้ ดังที่กล่าวไว้ข้างต้น ค่าเซิร์ฟเวอร์ _embed จะกําหนดให้ Data Connect สร้างการฝังเวกเตอร์โดยใช้ Embedding API ของ Vertex AI ในกรณีนี้เพื่อสร้างการฝังสําหรับสตริงการค้นหาที่ใช้เปรียบเทียบกับการฝังคําอธิบายภาพยนตร์

ในตัวอย่างนี้ การค้นหาแบบความคล้ายคลึงจะแสดงภาพยนตร์สูงสุด 5 เรื่องที่มีคำอธิบายใกล้เคียงกับคำค้นหามากที่สุดในแง่ความหมาย ชุดผลลัพธ์จะจัดเรียงตามลำดับจากน้อยไปมากของระยะทาง โดยเริ่มจากใกล้ที่สุดไปจนถึงไกลที่สุด

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "textembedding-gecko@003", text: $query},
      method: L2,
      within: 2,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
      }
  }

เรียกคําค้นหาที่คล้ายกัน

วิธีเรียกใช้การค้นหาความคล้ายคลึงจากโค้ดไคลเอ็นต์

import { searchMovieDescriptionUsingL2similarity} from 'lib/dataconnect-sdk';

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

ใช้การฝังที่กำหนดเอง

Data Connect ยังช่วยให้คุณทํางานกับชิ้นงานแบบฝังโดยตรงเป็น Vector ได้อีกด้วยแทนที่จะใช้ค่าเซิร์ฟเวอร์ _embed เพื่อสร้างชิ้นงาน

จัดเก็บการฝังที่กำหนดเอง

ใช้ Vertex Embeddings API เพื่อระบุโมเดลที่ตรงกันและส่งคําขอการฝังผลลัพธ์ของมิติข้อมูลที่ถูกต้อง

จากนั้นแคสต์อาร์เรย์ของตัวเลขทศนิยมที่แสดงผลเป็น Vector เพื่อส่งไปยังการดำเนินการอัปเดตเพื่อจัดเก็บ

mutation updateDescription($id: String!, $description: String!, $descriptionEmbedding: Vector!) {
  movie_update(id: $id, data: {
    // title, genre...
    description: $description,
    descriptionEmbedding: $descriptionEmbedding
  })
}

ทำการค้นหาแบบคล้ายกันโดยใช้การฝังที่กำหนดเอง

ทําการดำเนินการเดียวกันเพื่อดึงข้อมูลการฝังสําหรับข้อความค้นหาและแคสต์ไปยัง Vectors

จากนั้นเรียกใช้คําค้นหา _similarity เพื่อดําเนินการค้นหาแต่ละรายการ

query searchMovieDescriptionUsingL2Similarity($compare: Vector!, $within: Float, $excludesContent: String, $limit: Int) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare: $compare,
      method: L2,
      within: $within,
      where: {content: {ne: $excludesContent}}, limit: $limit)
      {
        id
        title
        description
      }
  }

ติดตั้งใช้งานในเวอร์ชันที่ใช้งานจริง

ติดตั้งใช้งานสคีมาและตัวเชื่อมต่อ

ขั้นตอนสุดท้ายในการวนซ้ำ Data Connect ทั่วไปคือการทําให้ชิ้นงานใช้งานได้จริง

เมื่อทําให้ใช้งานได้กับสคีมาที่มีประเภท Vector ใน CloudSQL โดยใช้คําสั่ง firebase deploy Firebase CLI จะทําตามขั้นตอนที่จําเป็นเพื่อเปิดใช้การสร้างการฝังตาม Vertex AI ในอินสแตนซ์ CloudSQL

firebase deploy --only dataconnect

หากต้องการเปิดใช้การรองรับการฝังในอินสแตนซ์ CloudSQL ด้วยตนเอง หรือพบข้อผิดพลาดเกี่ยวกับ CLI ให้ทำตามวิธีการเหล่านี้

ไวยากรณ์การค้นหาเวกเตอร์

ส่วนขยายสคีมา

ประเภทข้อมูล Vector ของ Data Connect จะแมปกับประเภท vector ของ PostgreSQL ตามที่ระบุไว้ในส่วนขยาย pgvector ระบบจะจัดเก็บประเภท vector ของ pgvector เป็นอาร์เรย์ของตัวเลขทศนิยมแบบละเอียดเดี่ยวใน PostgreSQL

ใน Data Connect ประเภท Vector จะแสดงเป็นอาร์เรย์ของตัวเลข JSON ระบบจะบังคับให้อินพุตเป็นอาร์เรย์ของค่า float32 หากการบังคับใช้ค่าไม่สําเร็จ ระบบจะแสดงข้อผิดพลาด

ใช้พารามิเตอร์ขนาดของคําแนะนํา @col เพื่อกําหนดขนาดของเวกเตอร์

type Question @table {
    text: String!
    category: String!
    textEmbedding: Vector! @col(size: 768)
}

รองรับ size เฉพาะสำหรับประเภท Vector เท่านั้น การดำเนินการกับ Vector เช่น การค้นหาความคล้ายคลึง กำหนดให้ Vector ทั้งหมดมีจํานวนมิติข้อมูลเท่ากัน

directive @col(
  # … existing args
  """
  Defines a fixed column size for certain scalar types.

  - For Vector, size is required.
  - For all other types, size is currently unsupported and hence supplying it will result in a schema error.
  """
  size: Int
) on FIELD_DEFINITION

ค่าเซิร์ฟเวอร์ _embed สำหรับคำค้นหาและการดัดแปลง

_embed

ค่าเซิร์ฟเวอร์นี้จะกำหนดให้บริการ Data Connect สร้างและจัดเก็บการฝังโดยใช้ Embedding API ของ Vertex AI ค่าเซิร์ฟเวอร์นี้ใช้ได้กับทั้งการค้นหาและการดัดแปลง

พารามิเตอร์สําหรับการค้นหาแบบคล้ายกัน

method: COSINE|INNER_PRODUCT|L2

ฟังก์ชันระยะทางที่ใช้ค้นหาเพื่อนบ้านที่อยู่ใกล้เคียง อัลกอริทึมที่รองรับในปัจจุบันคือชุดย่อยของอัลกอริทึมการค้นหา pgvector

within: float

ข้อจำกัดเกี่ยวกับระยะทางที่ทำการค้นหาเพื่อนบ้านที่ใกล้ที่สุด

where: FDC filter condition

ดูคู่มือสคีมา การค้นหา และการดัดแปลง

limit: int

จำนวนผลลัพธ์ที่จะแสดง