RAG ที่มีการควบคุมคุณภาพด้วยฟีเจอร์การค้นหาเวกเตอร์ล่าสุดของ AlloyDB

1. ภาพรวม

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

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

ตอนนี้เรามีความเข้าใจพื้นฐานเกี่ยวกับ 3 สิ่งต่อไปนี้แล้ว

  1. ความหมายของการค้นหาตามบริบทสำหรับตัวแทนและวิธีดำเนินการโดยใช้การค้นหาเวกเตอร์
  2. นอกจากนี้ เรายังเจาะลึกการค้นหาเวกเตอร์ภายในขอบเขตของข้อมูลที่อยู่ในฐานข้อมูลของคุณด้วย (ฐานข้อมูล Google Cloud ทั้งหมดรองรับฟีเจอร์นี้หากคุณยังไม่ทราบ)
  3. เราก้าวไปอีกขั้นกว่าประเทศอื่นๆ ในการบอกวิธีใช้ความสามารถ RAG ของ Vector Search แบบเบาที่มีประสิทธิภาพและคุณภาพสูงด้วยความสามารถของ AlloyDB Vector Search ที่ขับเคลื่อนโดยดัชนี ScaNN

หากคุณยังไม่ได้ทําการทดสอบ RAG ระดับพื้นฐาน ระดับกลาง และระดับขั้นสูงเล็กน้อย เราขอแนะนําให้อ่านบทความทั้ง 3 บทความที่นี่ ที่นี่ และที่นี่ตามลําดับที่ระบุ

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

รูปภาพด้านล่างแสดงขั้นตอนโดยรวมของสิ่งที่เกิดขึ้นในแอปพลิเคชันนี้~ 1c871099f1fde825.png

วัตถุประสงค์

อนุญาตให้ผู้ใช้ค้นหาสิทธิบัตรตามคำอธิบายที่เป็นข้อความที่มีประสิทธิภาพและคุณภาพดีขึ้น พร้อมทั้งประเมินคุณภาพของรายการที่ตรงกันซึ่งสร้างขึ้นโดยใช้ฟีเจอร์ RAG เวอร์ชันล่าสุดของ AlloyDB

สิ่งที่คุณจะสร้าง

ในส่วนนี้ คุณจะได้ทําสิ่งต่อไปนี้

  1. สร้างอินสแตนซ์ AlloyDB และโหลดชุดข้อมูลสาธารณะของสิทธิบัตร
  2. สร้างดัชนีข้อมูลเมตาและดัชนี ScaNN
  3. ใช้การค้นหาเวกเตอร์ขั้นสูงใน AlloyDB โดยใช้วิธีการกรองในบรรทัดของ ScaNN
  4. ใช้ฟีเจอร์การประเมินการเรียกคืน
  5. ประเมินคำตอบของคำค้นหา

ข้อกำหนด

  • เบราว์เซอร์ เช่น Chrome หรือ Firefox
  • โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน

2. ก่อนเริ่มต้น

สร้างโปรเจ็กต์

  1. ในคอนโซล Google Cloud ให้เลือกหรือสร้างโปรเจ็กต์ Google Cloud ในหน้าตัวเลือกโปรเจ็กต์
  2. ตรวจสอบว่าเปิดใช้การเรียกเก็บเงินสำหรับโปรเจ็กต์ Cloud แล้ว ดูวิธีตรวจสอบว่าเปิดใช้การเรียกเก็บเงินในโปรเจ็กต์หรือไม่
  3. คุณจะใช้ Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud คลิก "เปิดใช้งาน Cloud Shell" ที่ด้านบนของคอนโซล Google Cloud

รูปภาพปุ่มเปิดใช้งาน Cloud Shell

  1. เมื่อเชื่อมต่อกับ Cloud Shell แล้ว ให้ตรวจสอบว่าคุณได้รับการตรวจสอบสิทธิ์แล้วและโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์ของคุณโดยใช้คําสั่งต่อไปนี้
gcloud auth list
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project
  1. หากยังไม่ได้ตั้งค่าโปรเจ็กต์ ให้ใช้คําสั่งต่อไปนี้เพื่อตั้งค่า
gcloud config set project <YOUR_PROJECT_ID>
  1. เปิดใช้ API ที่จำเป็น คุณสามารถใช้คำสั่ง gcloud ในเทอร์มินัล Cloud Shell ได้โดยทำดังนี้
gcloud services enable alloydb.googleapis.com compute.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com run.googleapis.com cloudbuild.googleapis.com cloudfunctions.googleapis.com aiplatform.googleapis.com

อีกทางเลือกหนึ่งสำหรับคำสั่ง gcloud คือผ่านคอนโซลโดยค้นหาผลิตภัณฑ์แต่ละรายการหรือใช้ลิงก์นี้

โปรดดูคำสั่งและการใช้งาน gcloud ในเอกสารประกอบ

3. การตั้งค่าฐานข้อมูล

ในชั้นนี้ เราจะใช้ AlloyDB เป็นฐานข้อมูลสําหรับข้อมูลสิทธิบัตร โดยจะใช้คลัสเตอร์เพื่อเก็บทรัพยากรทั้งหมด เช่น ฐานข้อมูลและบันทึก แต่ละคลัสเตอร์มีอินสแตนซ์หลักที่เป็นแหล่งเข้าถึงข้อมูล ตารางจะเก็บข้อมูลจริง

มาสร้างคลัสเตอร์ อินสแตนซ์ และตาราง AlloyDB ที่ระบบจะโหลดชุดข้อมูลสิทธิบัตรกัน

สร้างคลัสเตอร์และอินสแตนซ์

  1. ไปยังหน้า AlloyDB ใน Cloud Console วิธีที่ง่ายในการค้นหาหน้าส่วนใหญ่ใน Cloud Console คือค้นหาโดยใช้แถบค้นหาของคอนโซล
  2. เลือกสร้างคลัสเตอร์จากหน้านั้น

f76ff480c8c889aa.png

  1. คุณจะเห็นหน้าจอดังภาพด้านล่าง สร้างคลัสเตอร์และอินสแตนซ์ด้วยค่าต่อไปนี้ (ตรวจสอบว่าค่าตรงกันในกรณีที่คุณทำโคลนโค้ดแอปพลิเคชันจากรีโป)
  • cluster id: "vector-cluster"
  • password: "alloydb"
  • PostgreSQL 15 / เวอร์ชันล่าสุดที่แนะนำ
  • ภูมิภาค: "us-central1"
  • เครือข่าย: "default"

538dba58908162fb.png

  1. เมื่อเลือกเครือข่ายเริ่มต้น คุณจะเห็นหน้าจอดังภาพด้านล่าง

เลือกตั้งค่าการเชื่อมต่อ

7939bbb6802a91bf.png

  1. จากนั้นเลือก "ใช้ช่วง IP ที่มีการจัดสรรโดยอัตโนมัติ" แล้วดำเนินการต่อ หลังจากตรวจสอบข้อมูลแล้ว ให้เลือกสร้างการเชื่อมต่อ 768ff5210e79676f.png
  2. เมื่อตั้งค่าเครือข่ายแล้ว คุณก็สร้างคลัสเตอร์ต่อได้ คลิกสร้างคลัสเตอร์เพื่อตั้งค่าคลัสเตอร์ให้เสร็จสมบูรณ์ตามที่แสดงด้านล่าง

e06623e55195e16e.png

อย่าลืมเปลี่ยนรหัสอินสแตนซ์ (ซึ่งคุณจะเห็นเมื่อกำหนดค่าคลัสเตอร์ / อินสแตนซ์) เป็น

vector-instance หากเปลี่ยนไม่ได้ โปรดอย่าลืมใช้รหัสอินสแตนซ์ในการอ้างอิงทั้งหมดที่จะเกิดขึ้น

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

4. การนำเข้าข้อมูล

ตอนนี้ถึงเวลาเพิ่มตารางที่มีข้อมูลเกี่ยวกับร้านค้า ไปที่ AlloyDB เลือกคลัสเตอร์หลัก แล้วเลือก AlloyDB Studio

847e35f1bf8a8bd8.png

คุณอาจต้องรอให้อินสแตนซ์สร้างเสร็จ เมื่อสร้างแล้ว ให้ลงชื่อเข้าใช้ AlloyDB โดยใช้ข้อมูลเข้าสู่ระบบที่คุณสร้างขึ้นเมื่อสร้างคลัสเตอร์ ใช้ข้อมูลต่อไปนี้เพื่อตรวจสอบสิทธิ์ใน PostgreSQL

  • ชื่อผู้ใช้ : "postgres"
  • ฐานข้อมูล : "postgres"
  • รหัสผ่าน : "alloydb"

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

91a86d9469d499c4.png

คุณจะป้อนคำสั่งสำหรับ AlloyDB ในหน้าต่างเครื่องมือแก้ไขโดยใช้ตัวเลือกเรียกใช้ รูปแบบ และล้างตามความจำเป็น

เปิดใช้ส่วนขยาย

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

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

หากต้องการตรวจสอบส่วนขยายที่เปิดใช้ในฐานข้อมูล ให้เรียกใช้คําสั่ง SQL นี้

select extname, extversion from pg_extension;

สร้างตาราง

คุณสามารถสร้างตารางโดยใช้คำสั่ง DDL ด้านล่างใน AlloyDB Studio

CREATE TABLE patents_data ( id VARCHAR(25), type VARCHAR(25), number VARCHAR(20), country VARCHAR(2), date VARCHAR(20), abstract VARCHAR(300000), title VARCHAR(100000), kind VARCHAR(5), num_claims BIGINT, filename VARCHAR(100), withdrawn BIGINT, abstract_embeddings vector(768)) ;

คอลัมน์ abstract_embeddings จะอนุญาตให้จัดเก็บค่าเวกเตอร์ของข้อความ

ให้สิทธิ์

เรียกใช้คำสั่งด้านล่างเพื่ออนุญาตให้ดำเนินการกับฟังก์ชัน "embedding"

GRANT EXECUTE ON FUNCTION embedding TO postgres;

มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ AlloyDB

จากคอนโซล IAM ของ Google Cloud ให้มอบสิทธิ์เข้าถึงบทบาท "ผู้ใช้ Vertex AI" ให้กับบัญชีบริการ AlloyDB (ซึ่งมีลักษณะดังนี้ service-<<PROJECT_NUMBER >>@gcp-sa-alloydb.iam.gserviceaccount.com) PROJECT_NUMBER จะมีหมายเลขโปรเจ็กต์ของคุณ

หรือจะเรียกใช้คําสั่งด้านล่างจากเทอร์มินัล Cloud Shell ก็ได้

PROJECT_ID=$(gcloud config get-value project)


gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

โหลดข้อมูลสิทธิบัตรลงในฐานข้อมูล

เราจะใช้ชุดข้อมูลสาธารณะของ Google Patents ใน BigQuery เป็นชุดข้อมูล เราจะใช้ AlloyDB Studio เพื่อเรียกใช้การค้นหา ข้อมูลจะมาจากไฟล์ insert_scripts.sql นี้ และเราจะเรียกใช้ไฟล์นี้เพื่อโหลดข้อมูลสิทธิบัตร

  1. เปิดหน้า AlloyDB ในคอนโซล Google Cloud
  2. เลือกคลัสเตอร์ที่สร้างขึ้นใหม่ แล้วคลิกอินสแตนซ์
  3. ในเมนูการนำทางของ AlloyDB ให้คลิก AlloyDB Studio ลงชื่อเข้าใช้ด้วยข้อมูลเข้าสู่ระบบ
  4. เปิดแท็บใหม่โดยคลิกไอคอนแท็บใหม่ทางด้านขวา
  5. คัดลอกคำสั่งการค้นหา insert จากสคริปต์ insert_scripts.sql ที่กล่าวถึงข้างต้นไปยังเครื่องมือแก้ไข คุณคัดลอกคำสั่งแทรก 10-50 รายการเพื่อสาธิตกรณีการใช้งานนี้อย่างรวดเร็วได้
  6. คลิกเรียกใช้ ผลการค้นหาจะปรากฏในตารางผลลัพธ์

หมายเหตุ: คุณอาจเห็นว่าสคริปต์แทรกมีข้อมูลจำนวนมาก เนื่องจากเราได้รวมการฝังไว้ในสคริปต์การแทรก คลิก "ดูไฟล์ข้อมูล RAW" ในกรณีที่คุณพบปัญหาในการโหลดไฟล์ใน GitHub การดำเนินการนี้จะช่วยคุณประหยัดเวลา (ในขั้นตอนถัดไป) ในการสร้างการฝังมากกว่า 2-3 รายการ (สูงสุด 20-25 รายการ) ในกรณีที่คุณใช้บัญชีการเรียกเก็บเงินเครดิตช่วงทดลองใช้สำหรับ Google Cloud

5. สร้างการฝังสําหรับข้อมูลสิทธิบัตร

ก่อนอื่นมาทดสอบฟังก์ชันการฝังโดยเรียกใช้การค้นหาตัวอย่างต่อไปนี้

SELECT embedding('text-embedding-005', 'AlloyDB is a managed, cloud-hosted SQL database service.');

ซึ่งจะแสดงผลเวกเตอร์การฝังที่ดูเหมือนอาร์เรย์ของตัวเลขทศนิยมสำหรับข้อความตัวอย่างในการค้นหา มีลักษณะดังนี้

25a1d7ef0e49e91e.png

อัปเดตฟิลด์เวกเตอร์ abstract_embeddings

เรียกใช้ DML ด้านล่างเพื่ออัปเดตข้อมูลสรุปของสิทธิบัตรในตารางด้วยข้อมูลการฝังที่เกี่ยวข้องเฉพาะในกรณีที่คุณไม่ได้แทรกข้อมูล abstract_embeddings เป็นส่วนหนึ่งของสคริปต์การแทรก

UPDATE patents_data set abstract_embeddings = embedding( 'text-embedding-005', abstract);

คุณอาจพบปัญหาในการสร้างการฝังมากกว่า 2-3 รายการ (สูงสุด 20-25 รายการ) หากใช้บัญชีการเรียกเก็บเงินเครดิตช่วงทดลองใช้สำหรับ Google Cloud ด้วยเหตุนี้ เราจึงรวมการฝังไว้ในสคริปต์การแทรกแล้ว และคุณควรโหลดข้อมูลไว้ในตารางแล้วหากทำตามขั้นตอน "โหลดข้อมูลสิทธิบัตรลงในฐานข้อมูล" เสร็จแล้ว

6. ดำเนินการ RAG ขั้นสูงด้วยฟีเจอร์ใหม่ของ AlloyDB

เมื่อตาราง ข้อมูล และการฝังพร้อมแล้ว ให้ทําการค้นหาเวกเตอร์แบบเรียลไทม์สําหรับข้อความค้นหาของผู้ใช้ คุณสามารถทดสอบได้โดยเรียกใช้การค้นหาด้านล่าง

SELECT id || ' - ' || title as title FROM patents_data ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

ในข้อความค้นหานี้

  1. ข้อความที่ผู้ใช้ค้นหาคือ "การวิเคราะห์ความรู้สึก"
  2. เรากําลังแปลงเป็นองค์ประกอบในเมธอด embedding() โดยใช้โมเดล text-embedding-005
  3. "<=>" แสดงถึงการใช้วิธีการวัดระยะทางแบบ COSINE SIMILARITY
  4. เรากําลังแปลงผลลัพธ์ของวิธีการฝังเป็นประเภทเวกเตอร์เพื่อให้เข้ากันได้กับเวกเตอร์ที่จัดเก็บไว้ในฐานข้อมูล
  5. LIMIT 10 แสดงว่าเรากำลังเลือกข้อความค้นหาที่ตรงกันมากที่สุด 10 รายการ

AlloyDB ยกระดับ RAG ของ Vector Search ไปอีกขั้น ดังนี้

มีสิ่งใหม่ๆ มากมายที่เปิดตัว 2 รายการที่มุ่งเน้นนักพัฒนาแอป ได้แก่

  1. การกรองในบรรทัด
  2. ผู้ประเมินการเรียกคืน

การกรองในบรรทัด

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

การกรองในบรรทัดเหมาะสําหรับกรณีที่มีความเฉพาะเจาะจงปานกลาง เมื่อ AlloyDB ค้นหาผ่านดัชนีเวกเตอร์ ระบบจะคํานวณเฉพาะระยะทางของเวกเตอร์ที่ตรงกับเงื่อนไขการกรองข้อมูลเมตา (ตัวกรองฟังก์ชันในการค้นหามักจะจัดการในประโยค WHERE) ซึ่งจะปรับปรุงประสิทธิภาพการค้นหาเหล่านี้ได้อย่างมาก นอกเหนือจากข้อดีของการกรองหลังการค้นหาหรือการกรองล่วงหน้า

  1. ติดตั้งหรืออัปเดตส่วนขยาย pgvector
CREATE EXTENSION IF NOT EXISTS vector WITH VERSION '0.8.0.google-3';

หากติดตั้งส่วนขยาย pgvector ไว้แล้ว ให้อัปเกรดส่วนขยายเวกเตอร์เป็นเวอร์ชัน 0.8.0.google-3 ขึ้นไปเพื่อรับความสามารถของเครื่องมือประเมินการจํา

ALTER EXTENSION vector UPDATE TO '0.8.0.google-3';

ขั้นตอนนี้ต้องดำเนินการเฉพาะในกรณีที่ส่วนขยายเวกเตอร์เป็น <0.8.0.google-3>

หมายเหตุสำคัญ: หากจํานวนแถวน้อยกว่า 100 รายการ คุณไม่จําเป็นต้องสร้างดัชนี ScaNN ตั้งแต่แรก เนื่องจากดัชนีนี้จะใช้กับแถวที่มีจํานวนน้อยกว่าไม่ได้ ในกรณีนี้ โปรดข้ามขั้นตอนต่อไปนี้

  1. หากต้องการสร้างดัชนี ScaNN ให้ติดตั้งส่วนขยาย alloydb_scann
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. ก่อนอื่น ให้เรียกใช้คำค้นหาเวกเตอร์โดยไม่ใช้ดัชนีและโดยไม่เปิดใช้ตัวกรองในบรรทัด
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

ผลลัพธ์ควรคล้ายกับตัวอย่างต่อไปนี้

6989de0fc3f0f753.png

  1. เรียกใช้ Explain Analyze กับ URL ดังกล่าว (ไม่มีดัชนีหรือการกรองในบรรทัด)

908dcf87c7f00ed4.png

เวลาดำเนินการคือ 2.4 มิลลิวินาที

  1. มาสร้างดัชนีปกติในช่อง num_claims เพื่อให้เรากรองตามดัชนีนั้นได้
CREATE INDEX idx_patents_data_num_claims ON patents_data (num_claims);
  1. มาสร้างดัชนี SCANN สําหรับแอปพลิเคชันการค้นหาสิทธิบัตรกัน เรียกใช้คำสั่งต่อไปนี้จาก AlloyDB Studio
CREATE INDEX patent_index ON patents_data 
USING scann (abstract_embeddings cosine)
WITH (num_leaves=32);

หมายเหตุสำคัญ: (num_leaves=32) มีผลกับชุดข้อมูลทั้งหมดที่มีแถวมากกว่า 1,000 แถว หากจํานวนแถวน้อยกว่า 100 รายการ คุณไม่จําเป็นต้องสร้างดัชนีตั้งแต่แรก เนื่องจากดัชนีจะไม่มีผลกับแถวที่มีจํานวนน้อยกว่า

  1. ตั้งค่าการกรองในบรรทัดเปิดใช้ในดัชนี ScaNN โดยทำดังนี้
SET scann.enable_inline_filtering = on
  1. ตอนนี้มาเรียกใช้ข้อความค้นหาเดียวกันที่มีตัวกรองและการค้นหาเวกเตอร์กัน
SELECT id || ' - ' || title as title FROM patents_data 
WHERE num_claims >= 15 
ORDER BY abstract_embeddings <=> embedding('text-embedding-005', 'Sentiment Analysis')::vector LIMIT 10;

aa54cba2b2ada2cb.png

ดังที่คุณเห็น เวลาที่ใช้ในการดำเนินการลดลงอย่างมากสำหรับการค้นหาเวกเตอร์เดียวกัน การกรองในบรรทัดที่มีดัชนี ScaNN ใน Vector Search ทําให้เป็นไปได้

ต่อไปมาประเมินการเรียกคืนของ Vector Search ที่เปิดใช้ ScaNN นี้กัน

ผู้ประเมินการเรียกคืน

การเรียกคืนในการค้นหาแบบคล้ายกันคือเปอร์เซ็นต์ของอินสแตนซ์ที่เกี่ยวข้องซึ่งดึงมาจากการค้นหา เช่น จํานวนผลบวกจริง เมตริกนี้เป็นเมตริกที่ใช้กันมากที่สุดในการวัดคุณภาพการค้นหา แหล่งที่มาของอัตราความจำที่เสียไปอย่างหนึ่งมาจากความแตกต่างระหว่างการค้นหาเพื่อนบ้านที่ใกล้ที่สุดแบบใกล้เคียงหรือ aNN กับการค้นหาเพื่อนบ้านที่ใกล้ที่สุดแบบ k (ตรงทั้งหมด) หรือ kNN ดัชนีเวกเตอร์อย่าง ScaNN ของ AlloyDB ใช้อัลกอริทึม aNN ซึ่งช่วยให้คุณค้นหาเวกเตอร์ในชุดข้อมูลขนาดใหญ่ได้เร็วขึ้น แต่ประสิทธิภาพการเรียกคืนจะลดลงเล็กน้อย ตอนนี้ AlloyDB ช่วยให้คุณวัดการแลกเปลี่ยนนี้ในฐานข้อมูลได้โดยตรงสําหรับการค้นหาแต่ละรายการ และช่วยให้มั่นใจว่าข้อมูลจะเสถียรเมื่อเวลาผ่านไป คุณสามารถอัปเดตพารามิเตอร์การค้นหาและดัชนีตามข้อมูลนี้เพื่อให้ได้ผลลัพธ์และประสิทธิภาพที่ดียิ่งขึ้น

ตรรกะเบื้องหลังการเรียกคืนผลการค้นหาคืออะไร

ในบริบทของการค้นหาเวกเตอร์ การเรียกคืนหมายถึงเปอร์เซ็นต์ของเวกเตอร์ที่ดัชนีแสดงผลซึ่งเป็นจุดข้อมูลข้างเคียงที่อยู่ใกล้กันที่สุด เช่น หากการค้นหาเพื่อนบ้านที่อยู่ใกล้ที่สุดสำหรับเพื่อนบ้านที่อยู่ใกล้ที่สุด 20 รายแสดงผลเพื่อนบ้านที่อยู่ใกล้ที่สุดตามความเป็นจริง 19 ราย ค่าการเรียกคืนคือ 19/20x100 = 95% การเรียกคืนคือเมตริกที่ใช้วัดคุณภาพการค้นหา และหมายถึงเปอร์เซ็นต์ของผลลัพธ์ที่แสดงซึ่งใกล้เคียงกับเวกเตอร์การค้นหามากที่สุดอย่างเป็นกลาง

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

หมายเหตุสำคัญ:

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

  1. ตั้งค่า Flag เปิดใช้การสแกนดัชนีในดัชนี ScaNN และดัชนี HNSW
SET scann.enable_indexscan = on
SET hnsw.enable_index_scan = on
  1. เรียกใช้การค้นหาต่อไปนี้ใน AlloyDB Studio
SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 25 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

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

การเรียกคืนสำหรับคำค้นหาด้วยเวกเตอร์ที่เราใช้อยู่

c98f38fbe6a0b6c5.png

เราเห็นว่าการเรียกคืนคือ 70% ตอนนี้ฉันใช้ข้อมูลนี้เพื่อเปลี่ยนพารามิเตอร์ดัชนี วิธีการ พารามิเตอร์การค้นหา และปรับปรุงการเรียกคืนสำหรับ Vector Search นี้ได้

7. ทดสอบด้วยพารามิเตอร์การค้นหาและดัชนีที่แก้ไขแล้ว

ตอนนี้มาทดสอบการค้นหาโดยแก้ไขพารามิเตอร์การค้นหาตามการเรียกคืนที่ได้รับ

  1. เราได้แก้ไขจำนวนแถวในชุดผลลัพธ์เป็น 7 (จากเดิม 25) และพบว่าการเรียกคืนดีขึ้นเป็น 86%

c12f7b92b8481ceb.png

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

  1. ลองอีกครั้งโดยแก้ไขพารามิเตอร์ดัชนี ดังนี้

ในการทดสอบนี้ เราจะใช้ฟังก์ชันระยะทางความคล้ายคลึง "L2 Distance" แทนฟังก์ชันระยะทางความคล้ายคลึง "Cosine" นอกจากนี้ เราจะเปลี่ยนขีดจํากัดของคําค้นหาเป็น 10 เพื่อแสดงให้เห็นว่าคุณภาพของผลการค้นหาดีขึ้นหรือไม่ แม้ว่าจะมีจํานวนชุดผลการค้นหาเพิ่มขึ้น

[ก่อน] การค้นหาที่ใช้ฟังก์ชันระยะทางความคล้ายคลึงของ Cosine

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <=> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

หมายเหตุสำคัญมาก: คุณอาจสงสัยว่า "เราจะรู้ได้อย่างไรว่าคำค้นหานี้ใช้ความคล้ายคลึงแบบ COSINE" คุณระบุฟังก์ชันระยะทางได้โดยใช้ "<=>" เพื่อแสดงระยะทาง Cosine

ลิงก์เอกสารสำหรับฟังก์ชันระยะทางของ Vector Search

ผลการค้นหาข้างต้นคือ

c62ef8922d6bf0b2.png

ดังที่คุณเห็น การเรียกคืนคือ 70% โดยไม่มีการเปลี่ยนแปลงตรรกะดัชนี จำดัชนี ScaNN ที่เราสร้างไว้ในขั้นตอนที่ 6 ของส่วนการกรองในบรรทัด "patent_index " ได้ไหม ดัชนีเดียวกันนี้ยังคงมีผลอยู่ขณะที่เราเรียกใช้การค้นหาข้างต้น

ตอนนี้มาสร้างดัชนีที่มีการค้นหาฟังก์ชันระยะทางแบบอื่นกัน ระยะทาง L2: <->

drop index patent_index;

CREATE INDEX patent_index_L2 ON patents_data 
USING scann (abstract_embeddings L2)
WITH (num_leaves=32);

คำสั่ง DROP INDEX มีไว้เพื่อตรวจสอบว่าไม่มีดัชนีที่ไม่จำเป็นในตาราง

ตอนนี้ฉันสามารถเรียกใช้การค้นหาต่อไปนี้เพื่อประเมินการเรียกคืนหลังจากเปลี่ยนฟังก์ชันระยะทางของฟังก์ชันการค้นหาเวกเตอร์

[หลังจาก] การค้นหาที่ใช้ฟังก์ชันระยะทางความคล้ายคลึงของ Cosine

SELECT
  *
FROM
  evaluate_query_recall($$
  SELECT
    id || ' - ' || title AS title,
    abstract
  FROM
    patents_data
    where num_claims >= 15
  ORDER BY
    abstract_embeddings <-> embedding('text-embedding-005',
      'sentiment analysis')::vector
  LIMIT 10 $$,
    '{"scann.num_leaves_to_search":1, "scann.pre_reordering_num_neighbors":10}',
    ARRAY['scann']);

ผลการค้นหาข้างต้นคือ

6c163dd08cf4d693.png

ค่าการจดจําเพิ่มขึ้นถึง 90% เลย

คุณเปลี่ยนพารามิเตอร์อื่นๆ ในดัชนีได้ เช่น num_leaves เป็นต้น โดยอิงตามค่าการเรียกคืนที่ต้องการและชุดข้อมูลที่แอปพลิเคชันใช้

8. ล้างข้อมูล

โปรดทำตามขั้นตอนต่อไปนี้เพื่อเลี่ยงไม่ให้เกิดการเรียกเก็บเงินกับบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในโพสต์นี้

  1. ในคอนโซล Google Cloud ให้ไปที่หน้าเครื่องมือจัดการทรัพยากร
  2. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  3. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์
  4. หรือจะลบคลัสเตอร์ AlloyDB (เปลี่ยนตำแหน่งในไฮเปอร์ลิงก์นี้หากคุณไม่ได้เลือก us-central1 สำหรับคลัสเตอร์ ณ เวลาที่กําหนดค่า) ที่เราเพิ่งสร้างขึ้นสําหรับโปรเจ็กต์นี้โดยคลิกปุ่ม "ลบคลัสเตอร์" ก็ได้

9. ขอแสดงความยินดี

ยินดีด้วย คุณสร้างคำค้นหาเกี่ยวกับสิทธิบัตรตามบริบทด้วยเครื่องมือค้นหาเวกเตอร์ขั้นสูงของ AlloyDB เรียบร้อยแล้วเพื่อให้มีประสิทธิภาพสูงและเพื่อให้คำค้นหาทำงานตามความหมายอย่างแท้จริง เราได้รวบรวมแอปพลิเคชันเอนทิตีหลายเครื่องมือที่ควบคุมคุณภาพซึ่งใช้ ADK และ AlloyDB ทั้งหมดที่เราได้พูดคุยกันที่นี่เพื่อสร้างเอเจนต์การค้นหาและวิเคราะห์เวกเตอร์สิทธิบัตรที่มีประสิทธิภาพและมีคุณภาพสูง ซึ่งคุณสามารถดูได้ที่นี่ https://youtu.be/Y9fvVY0yZTY

หากต้องการดูวิธีสร้างตัวแทนดังกล่าว โปรดดูcodelab นี้

เริ่มต้นใช้งานเลย