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