ยินดีต้อนรับสู่การค้นหาแบบเวกเตอร์ที่คล้ายกันของ 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 ในพื้นที่
- ตั้งค่าอินสแตนซ์ PostgreSQL ในพื้นที่
- มอบบทบาท IAM ของผู้ใช้ Vertex AI ให้กับตัวเอง
- ตั้งค่าข้อมูลเข้าสู่ระบบเริ่มต้นของแอปพลิเคชัน Google Cloud ในสภาพแวดล้อม
- ติดตั้งส่วนขยาย
pgvector
ในอินสแตนซ์ PostgreSQL บนเครื่อง - เปิดใช้ส่วนขยายโดยใช้
CREATE EXTENSION vector
ตามวิธีการของpgvector
ที่เก็บ
ผสานรวมกับ IDX
- ตั้งค่าเวิร์กสเปซ IDX โดยใช้เทมเพลตการเชื่อมต่อข้อมูล
- มอบบทบาท IAM ของผู้ใช้ Vertex AI ให้กับตัวเอง
- เปิดใช้ส่วนขยายโดยใช้
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
จำนวนผลลัพธ์ที่จะแสดง