สร้างแอป Patent Search ด้วย Spanner, Vector Search และ Gemini 1.0 Pro

1. ภาพรวม

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

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

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

ในโค้ดแล็บนี้ เราจะมุ่งมั่นที่จะทำให้กระบวนการค้นหาสิทธิบัตรเร็วขึ้น ใช้งานง่ายขึ้น และแม่นยำอย่างยิ่งด้วยการใช้ประโยชน์จาก Spanner รวมถึง Gemini 1.0 Pro, Embeddings และ Vector Search ในตัว

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

ในส่วนหนึ่งของห้องทดลองนี้ คุณจะได้ทำสิ่งต่อไปนี้

  1. สร้างอินสแตนซ์ Spanner
  2. โหลดชุดข้อมูลสาธารณะของ Google Patents
  3. สร้างโมเดลระยะไกลสำหรับการฝังข้อความด้วยโมเดล Gemini 1.0 Pro
  4. สร้างข้อมูลเชิงลึกเชิงสร้างสรรค์จากชุดข้อมูลที่โหลด
  5. สร้างการฝังจากข้อมูลเชิงลึก
  6. ส่งคำค้นหาการค้นหาความคล้ายคลึงของปัญหาเทียบกับชุดข้อมูล

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

14cfdde5e24258a.png

ข้อกำหนด

  • เบราว์เซอร์ เช่น 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. ตรวจสอบว่าได้เปิดใช้ Vertex AI และ Spanner API โดยค้นหาในคอนโซล หรือจะใช้คำสั่งต่อไปนี้ในเทอร์มินัล Cloud Shell ก็ได้
gcloud services enable spanner.googleapis.com --project <<YOUR_PROJECT_ID>>
gcloud services enable aiplatform.googleapis.com --project <<YOUR_PROJECT_ID>>

อีกทางเลือกหนึ่งคือใช้ลิงก์นี้

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

3. เตรียมฐานข้อมูล Spanner

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

สร้างอินสแตนซ์ Spanner

  1. สร้างอินสแตนซ์ Spanner ชื่อ spanner-vertex
gcloud spanner instances create spanner-vertex \
--config=regional-us-central1 \
--description=spanner-vertex \
--nodes=1

สร้างฐานข้อมูล

  1. เปิดหน้า Spanner ใน Google Cloud Console
  2. เลือกอินสแตนซ์ spanner-vertex จากรายการ
  3. ในส่วนฐานข้อมูล ให้คลิกสร้างฐานข้อมูล
  4. ตั้งชื่อฐานข้อมูลเป็น patents
  5. คลิกสร้างเพื่อสร้างฐานข้อมูล

สร้างตาราง

  1. เปิดหน้า Spanner ใน Google Cloud Console
  2. เลือกอินสแตนซ์ spanner-vertex จากรายการ
  3. เลือกpatentsฐานข้อมูล
  4. คลิกสร้างตารางในแท็บตาราง หน้า Spanner Studio จะเปิดขึ้น
  5. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  6. เรียกใช้การค้นหาต่อไปนี้
CREATE TABLE patents_data (
   id string(25), type string(25), number string(20), country string(2), date string(20), abstract string(300000), title string(100000),kind string(5), num_claims numeric, filename string(100), withdrawn numeric, 
) PRIMARY KEY (id);

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

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

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

5. สร้างโมเดลระยะไกลสำหรับ Gemini 1.0 Pro

หลังจากโหลดข้อมูลสิทธิบัตรลงในฐานข้อมูลแล้ว เราจะสร้างโมเดลระยะไกลที่ใช้โมเดล Gemini 1.0 Pro Vertex AI เพื่อสร้างชุดชื่อและคีย์เวิร์ดที่สรุปแล้ว

เรียกใช้คำสั่ง DDL ต่อไปนี้ในโปรแกรมแก้ไข Spanner Studio

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio บานหน้าต่าง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  3. เรียกใช้การค้นหาต่อไปนี้
CREATE MODEL gemini_pro_model INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/gemini-pro',
default_batch_size = 1
);
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์

6. สร้างโมเดลระยะไกลสำหรับข้อความฝัง

ผลลัพธ์ของขั้นตอนก่อนหน้าประกอบด้วยข้อมูลสรุปแบบรวมที่มีชื่อและคีย์เวิร์ด เราจะแปลงคำตอบนี้เป็น Embedding ซึ่งจะช่วยให้เราสร้างการจับคู่ที่เหมาะสมเมื่อเรียกใช้การค้นหา เราจะใช้ Text Embedding Gecko 003 model จาก Vertex AI จากระยะไกลจาก Spanner

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio บานหน้าต่าง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  3. เรียกใช้การค้นหาต่อไปนี้
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
 embeddings
   STRUCT<
     statistics STRUCT<truncated BOOL, token_count FLOAT64>,
     values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
 endpoint = '//aiplatform.googleapis.com/projects/<<YOUR_PROJECT_ID>>/locations/us-central1/publishers/google/models/textembedding-gecko@003');
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์

7. สร้างข้อมูลเชิงลึกแบบ Generative จากบทคัดย่อสิทธิบัตร

เราจะสร้างpatents_data_geminiตารางเพื่อจัดเก็บข้อมูลเชิงลึกแบบ Generative ที่เราจะสร้างโดยใช้โมเดล Gemini 1.5 Pro ที่เราสร้างไว้ก่อนหน้านี้

สร้างตาราง

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio บานหน้าต่าง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  3. เรียกใช้การค้นหาต่อไปนี้
CREATE TABLE patents_data_gemini (id string(100), gemini_response STRING(MAX)) PRIMARY KEY (id);
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์

สร้างข้อมูลเชิงลึก

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

INSERT INTO patents_data_gemini (id, gemini_response)
SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b where id not in (select id from patents_data_gemini) limit 50
));

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

ส่วนวิธีแก้ปัญหา:

SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))

สังเกตข้อมูลเชิงลึก

ตารางนี้มีข้อมูลเชิงลึกที่สร้างขึ้นสำหรับพรอมต์ 'Identify the areas of work or keywords in this abstract', ในคำค้นหา

หมายเหตุ: หากคุณเรียกใช้การค้นหาส่วนวิธีแก้ปัญหาด้านบนแทน DDL ของ INSERT ให้ข้ามส่วนนี้และเรียกใช้การค้นหา SELECT สุดท้ายในหน้านี้แทน

มาเรียกใช้คำค้นหาต่อไปนี้เพื่อยืนยันผลลัพธ์ของข้อมูลเชิงลึกกัน

select title, abstract, gemini_response from patents_data a inner join patents_data_gemini b
on a.id = b.id;

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

6041fab164aaab93.png

หมายเหตุ: หากเรียกใช้การค้นหาส่วนวิธีแก้ปัญหาชั่วคราว ให้แทนที่ชื่อตารางในการค้นหา SELECT ด้านบนด้วยการค้นหาในส่วนวิธีแก้ปัญหาชั่วคราว ดังนั้นคุณจึงควรเรียกใช้คำสั่งด้านล่างแทน

select title, abstract, gemini_response from patents_data a inner join (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
))) b
on a.id = b.id;

ผลลัพธ์ควรเหมือนกับผลลัพธ์ในภาพหน้าจอผลลัพธ์ด้านบน

8. สร้างการฝังสำหรับข้อมูลเชิงลึกที่สร้างขึ้น

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

หมายเหตุ: หากเรียกใช้การค้นหาส่วนวิธีแก้ปัญหาในขั้นตอนก่อนหน้า คุณสามารถข้ามขั้นตอนนี้และไปที่การค้นหาส่วนวิธีแก้ปัญหาในขั้นตอนนี้ได้เลย

เรียกใช้การค้นหาต่อไปนี้เพื่อสร้างการฝัง

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio บานหน้าต่าง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  3. เรียกใช้การค้นหาต่อไปนี้เพื่อสร้างตาราง patents_data_embeddings
CREATE TABLE patents_data_embeddings (id string(100), patents_embeddings ARRAY<FLOAT64>) PRIMARY KEY (id);
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์
  2. เรียกใช้การค้นหาต่อไปนี้เพื่อสร้างการฝัง
INSERT INTO patents_data_embeddings (id, patents_embeddings)
SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM patents_data_gemini));
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์

สังเกตผลลัพธ์

ตารางนี้มีข้อมูลฝังที่สร้างขึ้นสำหรับชื่อและข้อความที่ดึงข้อมูล

มาเรียกใช้การค้นหาต่อไปนี้เพื่อยืนยันผลลัพธ์กัน

select title, abstract, b.patents_embeddings from patents_data a inner join patents_data_embeddings b
on a.id = b.id;

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

a1e968bac4ab1cb.png

ส่วนวิธีแก้ปัญหาเฉพาะหน้า:

ใช้การค้นหานี้หากคุณทำส่วนวิธีแก้ปัญหาในขั้นตอนอื่นๆ

select title, abstract, b.patents_embeddings from patents_data a inner join 
(SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b limit 50
)))))) b
on a.id = b.id;

ซึ่งควรให้ผลลัพธ์เหมือนกับที่แสดงในภาพหน้าจอด้านบน

9. เตรียมพร้อมสำหรับการค้นหาเวกเตอร์

ตอนนี้เราได้สร้างการฝังข้อความแล้ว เราจึงสามารถเตรียมเว็บแอปพลิเคชันให้พร้อมสำหรับการค้นหาเวกเตอร์ความคล้ายคลึงกัน ในโค้ดแล็บนี้ เราจะสร้างเว็บแอปพลิเคชันที่มีตรรกะในการแสดงผลการค้นหาตามความสามารถในการค้นหาความคล้ายคลึงกันของ K-Nearest Neighbors คุณสามารถใช้ชุดข้อมูลที่เตรียมไว้นี้กับแอปค้นหาเพื่อแสดงภาพลักษณะที่ผลการค้นหาปรากฏ

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

เรียกใช้การค้นหาต่อไปนี้

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio บานหน้าต่าง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บ SQL Editor ใหม่
  3. เรียกใช้การค้นหาต่อไปนี้เพื่อสร้างตาราง patents_data_embeddings
SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join patents_data_gemini b on a.id = b.id
inner join patents_data_embeddings c on a.id = c.id
ORDER BY distance
LIMIT 10;
  1. คลิกเรียกใช้ ผลลัพธ์ของคำค้นหาจะปรากฏในตารางผลลัพธ์

หมายเหตุ: หากใช้คำค้นหาในส่วนวิธีแก้ปัญหา คุณสามารถข้ามขั้นตอนอื่นๆ ทั้งหมดและเรียกใช้คำค้นหาด้านล่างโดยตรงเพื่อดูผลลัพธ์ของการค้นหาเพื่อนบ้านที่ใกล้ที่สุดในเวกเตอร์ฝังในฐานข้อมูล Spanner ได้ เนื่องจากข้อผิดพลาดเกี่ยวกับโควต้าในคำสั่ง INSERT แรกๆ รายการใดรายการหนึ่ง

SELECT a.id, a.title, a.abstract, 'A new Natural Language Processing related Machine Learning Model' search_text, COSINE_DISTANCE(c.patents_embeddings,
(SELECT embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT 'A new Natural Language Processing related Machine Learning Model' as content)))) as distance
FROM patents_data a inner join (SELECT id, embeddings.values as patents_embeddings
FROM ML.PREDICT(MODEL text_embeddings,
(SELECT id, gemini_response as content FROM (SELECT id, content as gemini_response
FROM ML.PREDICT(MODEL gemini_pro_model,
(select id, concat ('Identify the areas of work or keywords in this abstract', abstract) as prompt from patents_data b 
)))))) c on a.id = c.id
ORDER BY distance
LIMIT 2;

สังเกตผลลัพธ์

การค้นหาก่อนหน้านี้ใช้วิธี COSINE_DISTANCE เพื่อค้นหาคำที่ตรงกันมากที่สุด 10 รายการสำหรับพรอมต์ของเรา

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

d26ca8b8238bdf25.png

ผลลัพธ์ที่สร้างขึ้นจะมีความใกล้เคียงกับบริบทของพรอมต์ซึ่งเป็นส่วนหนึ่งของคำค้นหา

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

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

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

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

ขอแสดงความยินดี คุณค้นหาความคล้ายคลึงโดยใช้การค้นหาเวกเตอร์ในตัวของ Spanner ได้สำเร็จ นอกจากนี้ คุณยังเห็นว่าการทำงานกับโมเดลการฝังและ LLM นั้นง่ายเพียงใดในการมอบฟังก์ชัน Generative AI โดยตรงโดยใช้ SQL

ขั้นตอนต่อไปคืออะไร

ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์การค้นหาเวกเตอร์เพื่อนบ้านที่ใกล้ที่สุดแบบตรง (KNN) ของ Spanner ได้ที่ https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

นอกจากนี้ คุณยังอ่านข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำการคาดการณ์ออนไลน์ด้วย SQL โดยใช้การผสานรวม Vertex AI ของ Spanner ได้ที่ https://cloud.google.com/spanner/docs/ml