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

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

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

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

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

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

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

  • เปิดใช้ Vertex AI API

ตั้งค่า

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

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

ผสานรวมกับ PostgreSQL ในเครื่อง

  1. ตั้งค่าอินสแตนซ์ PostgreSQL ในเครื่อง

  2. ให้สิทธิ์ บทบาท IAM ผู้ใช้ Vertex AI

  3. ตั้งค่า Google Cloudข้อมูลรับรองเริ่มต้นของแอปพลิเคชันในสภาพแวดล้อม

  4. ติดตั้งส่วนขยาย pgvector ในอินสแตนซ์ PostgreSQL ในเครื่อง

  5. เปิดใช้ส่วนขยายโดยใช้ CREATE EXTENSION vector ตามวิธีการในที่เก็บ pgvector

ผสานรวมกับ IDX

  1. ตั้งค่าพื้นที่ทำงาน IDX โดยใช้เทมเพลต SQL Connect

  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)
 // ...
}

สร้างและดึงข้อมูลการฝัง

SQL Connect รองรับการฝังเวกเตอร์แบบผสานรวมด้วย ค่าเซิร์ฟเวอร์ _embed ซึ่งจะสั่งให้ SQL Connect สร้าง การฝังเวกเตอร์โดยเรียกใช้ Vertex AI's Embedding APIs ภายใน ค่าเซิร์ฟเวอร์ _embed สามารถใช้ได้ทั้งในการเปลี่ยนแปลงและการค้นหา

การเปลี่ยนแปลง

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

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

mutation createMovie($title: String!, $description: String!) {
  movie_insert(data: {
    title: $title,
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

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

mutation updateDescription($id: String!, $description: String!) {
  movie_update(id: $id, data: {
    description: $description,
    descriptionEmbedding_embed: {model: "text-embedding-005", text: $description}
  })
}

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

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

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

// Use the response

คำค้นหา

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

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

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

ทำการค้นหาความคล้ายคลึง

ตอนนี้เราสามารถทำการค้นหาความคล้ายคลึงได้แล้ว

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

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

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

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

ปรับแต่งคำค้นหาความคล้ายคลึง

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

หากต้องการค้นหาค่าที่เหมาะสมสำหรับ within เราสามารถเพิ่ม _metadata.distance ลงใน ฟิลด์ที่เลือกเพื่อดูว่าผลลัพธ์แต่ละรายการอยู่ห่างจากเวกเตอร์คำค้นหาเท่าใด จาก ค่า distance ที่แสดงผล เราสามารถตั้งค่าพารามิเตอร์ within ได้ โดยระบบจะรวมเฉพาะผลลัพธ์ที่มี ระยะทางน้อยกว่าค่าของ within ไว้เท่านั้น

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

นอกจากนี้ คุณยังทดลองใช้ฟังก์ชันระยะทางต่างๆ ได้โดยการตั้งค่าพารามิเตอร์ method

query searchMovieDescriptionUsingL2Similarity ($query: String!) @auth(level: PUBLIC) {
    movies_descriptionEmbedding_similarity(
      compare_embed: {model: "text-embedding-005", text: $query},
      within: .5,
      method: COSINE,
      where: {content: {ne: "No info available for this movie."}}, limit: 5)
      {
        id
        title
        description
        _metadata {
          distance
        }
      }
  }

โปรดทราบว่าวิธีการต่างๆ จะแสดงค่าระยะทางที่แตกต่างกันมาก หากคุณตั้งค่า within ไว้ คุณจะต้องปรับค่าดังกล่าวอีกครั้งหลังจากเปลี่ยน method

เรียกใช้คำค้นหาความคล้ายคลึง

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

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

const response = await searchMovieDescriptionUsingL2similarity({ query });

// Use the response

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

SQL Connect ยังช่วยให้คุณทำงานกับการฝังโดยตรงเป็น Vectors แทนที่จะใช้ค่าเซิร์ฟเวอร์ _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
      }
  }

นำไปใช้งานจริง

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

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

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

firebase deploy --only dataconnect

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

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

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

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

ใน SQL 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

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

พารามิเตอร์สำหรับการค้นหาความคล้ายคลึง

method: COSINE|INNER_PRODUCT|L2

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

within: float

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

where: FDC filter condition

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

limit: int

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