สร้างแอปค้นหาสิทธิบัตรด้วย AlloyDB, การค้นหาแบบเวกเตอร์ และ Vertex AI

1. ภาพรวม

การศึกษาเกี่ยวกับสิทธิบัตรเป็นเครื่องมือสําคัญในการทําความเข้าใจภาพรวมการแข่งขัน ระบุโอกาสในการขอใบอนุญาตหรือซื้อกิจการ และหลีกเลี่ยงการละเมิดสิทธิบัตรที่มีอยู่ ในอุตสาหกรรมต่างๆ

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

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

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

ในโค้ดแล็บนี้ เราจะพยายามทำให้กระบวนการค้นหาสิทธิบัตรรวดเร็วขึ้น ใช้งานง่ายขึ้น และแม่นยำอย่างไม่น่าเชื่อด้วยการใช้ AlloyDB, ส่วนขยาย pgvector และ Gemini 1.5 Pro, การฝัง และ Vector Search ที่มีอยู่

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

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

  1. สร้างอินสแตนซ์ AlloyDB และโหลดข้อมูลชุดข้อมูลสาธารณะของสิทธิบัตร
  2. เปิดใช้ส่วนขยาย pgvector และโมเดล Generative AI ใน AlloyDB
  3. สร้างการฝังจากข้อมูลเชิงลึก
  4. ทำการค้นหาความคล้ายคลึงแบบโคไซน์แบบเรียลไทม์สำหรับข้อความค้นหาของผู้ใช้
  5. ติดตั้งใช้งานโซลูชันใน Cloud Functions แบบ Serverless

แผนภาพต่อไปนี้แสดงขั้นตอนและขั้นตอนต่างๆ ของข้อมูลที่เกี่ยวข้องกับการใช้งาน

8b73c40a0d12e194.png

 High level diagram representing the flow of the Patent Search Application with AlloyDB

ข้อกำหนด

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

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

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

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

สร้างออบเจ็กต์ AlloyDB

สร้างคลัสเตอร์และอินสแตนซ์ที่มีรหัสคลัสเตอร์ "patent-cluster", รหัสผ่าน "alloydb", เข้ากันได้กับ PostgreSQL 15 และภูมิภาคเป็น "us-central1" ตั้งค่าเครือข่ายเป็น "default" ตั้งค่ารหัสอินสแตนซ์เป็น "patent-instance" คลิก "สร้างคลัสเตอร์" โปรดดูรายละเอียดการสร้างคลัสเตอร์ในลิงก์นี้ https://cloud.google.com/alloydb/docs/cluster-create

สร้างตาราง

คุณสามารถสร้างตารางโดยใช้คำสั่ง 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) ;

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

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

CREATE EXTENSION vector;
CREATE EXTENSION google_ml_integration;

ให้สิทธิ์

เรียกใช้คำสั่งด้านล่างเพื่ออนุญาตให้ดำเนินการกับฟังก์ชัน "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 จะมีหมายเลขโปรเจ็กต์ของคุณ

หรือจะให้สิทธิ์เข้าถึงโดยใช้คำสั่ง gcloud ก็ได้ โดยทำดังนี้

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"

แก้ไขตารางเพื่อเพิ่มคอลัมน์เวกเตอร์สำหรับจัดเก็บการฝัง

เรียกใช้ DDL ด้านล่างเพื่อเพิ่มฟิลด์ abstract_embeddings ลงในตารางที่เราเพิ่งสร้างขึ้น คอลัมน์นี้จะอนุญาตให้จัดเก็บค่าเวกเตอร์ของข้อความ

ALTER TABLE patents_data ADD column abstract_embeddings vector(768);

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

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

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

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

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

SELECT embedding( 'textembedding-gecko@003', 'AlloyDB is a managed, cloud-hosted SQL database service.');

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

25a1d7ef0e49e91e.png

อัปเดตช่องเวกเตอร์ abstract_embeddings

เรียกใช้ DML ด้านล่างเพื่ออัปเดตข้อมูลสรุปเกี่ยวกับสิทธิบัตรในตารางด้วยข้อมูลฝังที่เกี่ยวข้อง

UPDATE patents_data set abstract_embeddings = embedding( 'textembedding-gecko@003', abstract);

6. ทำการค้นหาเวกเตอร์

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

SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', 'A new Natural Language Processing related Machine Learning Model')::vector LIMIT 10;

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

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

ผลลัพธ์มีดังนี้

8e77af965fc787ae.png

ดังที่คุณเห็นในผลการค้นหา รายการที่ตรงกันนั้นใกล้เคียงกับข้อความค้นหามาก

7. นำไปใช้กับเว็บ

พร้อมที่จะย้ายแอปนี้ไปยังเว็บไหม โดยทำตามขั้นตอนต่อไปนี้

  1. ไปที่เครื่องมือแก้ไข Cloud Shell แล้วคลิกไอคอน "Cloud Code — ลงชื่อเข้าใช้" ที่มุมซ้ายล่าง (แถบสถานะ) ของเครื่องมือแก้ไข เลือกโปรเจ็กต์ Google Cloud ปัจจุบันที่เปิดใช้การเรียกเก็บเงิน และตรวจสอบว่าคุณได้ลงชื่อเข้าใช้โปรเจ็กต์เดียวกันจาก Gemini ด้วย (ที่มุมขวาของแถบสถานะ)
  2. คลิกไอคอน Cloud Code แล้วรอจนกว่ากล่องโต้ตอบ Cloud Code จะปรากฏขึ้น เลือกแอปพลิเคชันใหม่ และในป๊อปอัปสร้างแอปพลิเคชันใหม่ ให้เลือกแอปพลิเคชัน Cloud Functions

a800ee1eb6cb8a5b.png

ในหน้า 2/2 ของป๊อปอัปสร้างแอปพลิเคชันใหม่ ให้เลือก Java: Hello World แล้วป้อนชื่อโปรเจ็กต์เป็น "alloydb-pgvector" ในตำแหน่งที่ต้องการ แล้วคลิก "ตกลง"

5b09446ecf7d4f8d.png

  1. ในโครงสร้างโปรเจ็กต์ที่ได้ ให้ค้นหา pom.xml แล้วแทนที่ด้วยเนื้อหาจากไฟล์ repo ไฟล์ดังกล่าวควรมีการพึ่งพาต่อไปนี้และอื่นๆ อีก 2-3 อย่าง

2b3a3cdd75a57711.png

  1. แทนที่ไฟล์ HelloWorld.java ด้วยเนื้อหาจากไฟล์ repo

โปรดทราบว่าคุณต้องแทนที่ค่าด้านล่างด้วยค่าจริง

String ALLOYDB_DB = "postgres";
String ALLOYDB_USER = "postgres";
String ALLOYDB_PASS = "*****";
String ALLOYDB_INSTANCE_NAME = "projects/<<YOUR_PROJECT_ID>>/locations/us-central1/clusters/<<YOUR_CLUSTER>>/instances/<<YOUR_INSTANCE>>";
//Replace YOUR_PROJECT_ID, YOUR_CLUSTER, YOUR_INSTANCE with your actual values

โปรดทราบว่าฟังก์ชันนี้ต้องการข้อความค้นหาเป็นพารามิเตอร์อินพุตที่มีคีย์ "search" และในการนำใช้งานนี้ เราจะแสดงผลรายการที่ตรงกันที่สุดเพียงรายการเดียวจากฐานข้อมูล

// Get the request body as a JSON object.
JsonObject requestJson = new Gson().fromJson(request.getReader(), JsonObject.class);
String searchText = requestJson.get("search").getAsString();

//Sample searchText: "A new Natural Language Processing related Machine Learning Model";
BufferedWriter writer = response.getWriter();
String result = "";
HikariDataSource dataSource = AlloyDbJdbcConnector();

try (Connection connection = dataSource.getConnection()) {
   //Retrieve Vector Search by text (converted to embeddings) using "Cosine Similarity" method
   try (PreparedStatement statement = connection.prepareStatement("SELECT id || ' - ' || title as literature FROM patents_data ORDER BY abstract_embeddings <=> embedding('textembedding-gecko@003', '" + searchText + "' )::vector LIMIT 1")) {
     ResultSet resultSet = statement.executeQuery();
     resultSet.next();
     String lit = resultSet.getString("literature");
     result = result + lit + "\n";
     System.out.println("Matching Literature: " + lit);
 }
writer.write("Here is the closest match: " + result);
}
  1. หากต้องการทำให้ Cloud Function ที่คุณเพิ่งสร้างขึ้นใช้งานได้ ให้เรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัล Cloud Shell อย่าลืมไปที่โฟลเดอร์โปรเจ็กต์ที่เกี่ยวข้องก่อนโดยใช้คำสั่งต่อไปนี้
cd alloydb-pgvector

จากนั้นเรียกใช้คําสั่งต่อไปนี้

gcloud functions deploy patent-search --gen2 --region=us-central1 --runtime=java11 --source=. --entry-point=cloudcode.helloworld.HelloWorld --trigger-http

ขั้นตอนสำคัญ:

เมื่อเริ่มทำให้ใช้งานได้แล้ว คุณควรจะเห็นฟังก์ชันในคอนโซล Cloud Run Functions ของ Google ค้นหาฟังก์ชันที่สร้างขึ้นใหม่แล้วเปิดฟังก์ชันนั้น แก้ไขการกําหนดค่า และทําการเปลี่ยนแปลงต่อไปนี้

  1. ไปที่การตั้งค่ารันไทม์ บิลด์ การเชื่อมต่อ และความปลอดภัย
  2. เพิ่มการหมดเวลาเป็น 180 วินาที
  3. ไปที่แท็บการเชื่อมต่อ

4e83ec8a339cda08.png

  1. ในส่วนการตั้งค่า Ingress ให้ตรวจสอบว่าได้เลือก "Allow all traffic" แล้ว
  2. ในส่วนการตั้งค่าขาออก ให้คลิกเมนูแบบเลื่อนลงของเครือข่าย แล้วเลือกตัวเลือก "เพิ่มตัวเชื่อมต่อ VPC ใหม่" แล้วทําตามวิธีการที่คุณเห็นในกล่องโต้ตอบที่ปรากฏขึ้น

8126ec78c343f199.png

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

7baf980463a86a5c.png

  1. คลิก "สร้าง" แล้วเครื่องมือเชื่อมต่อนี้จะแสดงอยู่ในการตั้งค่าการส่งออก
  2. เลือกเครื่องมือเชื่อมต่อที่สร้างขึ้นใหม่
  3. เลือกให้กำหนดเส้นทางการรับส่งข้อมูลทั้งหมดผ่านเครื่องมือเชื่อมต่อ VPC นี้

8. ทดสอบแอปพลิเคชัน

เมื่อติดตั้งใช้งานแล้ว คุณควรเห็นปลายทางในรูปแบบต่อไปนี้

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/patent-search

คุณสามารถทดสอบได้จากเทอร์มินัล Cloud Shell โดยเรียกใช้คำสั่งต่อไปนี้

gcloud functions call patent-search --region=us-central1 --gen2 --data '{"search": "A new Natural Language Processing related Machine Learning Model"}'

ผลลัพธ์:

da3dcfac7d024031.png

นอกจากนี้ คุณยังทดสอบจากรายการ Cloud Functions ได้ด้วย เลือกฟังก์ชันที่ติดตั้งใช้งานแล้วไปที่แท็บ "การทดสอบ" ในกล่องข้อความส่วนกำหนดค่าเหตุการณ์เรียกให้แสดงสําหรับคําขอ JSON ให้ป้อนข้อมูลต่อไปนี้

{"search": "A new Natural Language Processing related Machine Learning Model"}

คลิกปุ่ม "ทดสอบฟังก์ชัน" แล้วคุณจะเห็นผลลัพธ์ทางด้านขวาของหน้า

e21f806d661996ff.png

เท่านี้ก็เรียบร้อย เพียงเท่านี้คุณก็ทำการค้นหาเวกเตอร์ความคล้ายคลึงโดยใช้รูปแบบการฝังในข้อมูล AlloyDB ได้แล้ว

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

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

  1. ในคอนโซล Google Cloud ให้ไปที่จัดการ
  2. หน้าแหล่งข้อมูล
  3. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  4. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์

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

ยินดีด้วย คุณได้ทำการค้นหาความคล้ายคลึงโดยใช้ AlloyDB, pgvector และการค้นหาเวกเตอร์เรียบร้อยแล้ว การรวมความสามารถของ AlloyDB, Vertex AI และ Vector Search ช่วยให้เราสามารถก้าวไปข้างหน้าได้อย่างก้าวกระโดดในการทำให้การค้นหางานเขียนเข้าถึงได้ มีประสิทธิภาพ และตรงตามความต้องการอย่างแท้จริง