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

1. ภาพรวม

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

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

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

ในโค้ดแล็บนี้ เราจะพยายามทําให้กระบวนการค้นหาสิทธิบัตรรวดเร็วขึ้น ใช้งานง่ายขึ้น และแม่นยําอย่างไม่น่าเชื่อด้วยการใช้ Spanner และฟีเจอร์การฝังและ Vector Search ใน Gemini 1.0 Pro

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

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

  1. สร้างอินสแตนซ์ Spanner
  2. โหลดชุดข้อมูลสาธารณะของ Google Patents
  3. สร้างโมเดลระยะไกลสําหรับการฝังข้อความด้วยโมเดล Gemini 1.0 Pro
  4. สร้างข้อมูลเชิงลึกแบบ Generative จากชุดข้อมูลที่โหลด
  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 แล้วโดยค้นหา 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
  2. เลือกอินสแตนซ์ spanner-vertex จากรายการ
  3. ในส่วนฐานข้อมูล ให้คลิกสร้างฐานข้อมูล
  4. ตั้งชื่อฐานข้อมูลเป็น patents
  5. คลิกสร้างเพื่อสร้างฐานข้อมูล

สร้างตาราง

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

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

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

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

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio แผง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บเครื่องมือแก้ไข SQL ใหม่
  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. สร้างโมเดลระยะไกลสําหรับการฝังข้อความ

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

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio แผง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บเครื่องมือแก้ไข SQL ใหม่
  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. สร้างข้อมูลเชิงลึกที่ทำให้เกิดแนวคิดจากข้อมูลสรุปเกี่ยวกับสิทธิบัตร

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

สร้างตาราง

  1. ในเมนูการนำทาง ให้คลิก Spanner Studio แผง Explorer จะแสดงรายการออบเจ็กต์ในฐานข้อมูล
  2. เปิดแท็บใหม่โดยคลิกแท็บเครื่องมือแก้ไข SQL ใหม่
  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', ในการค้นหา

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

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

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

คุณจะเห็นผลลัพธ์ต่อไปนี้

6041fab164aaab93.png

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

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 ใหม่
  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 ใหม่
  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

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 ให้ไปที่หน้าจัดการทรัพยากร
  2. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ หากไม่ต้องการลบโปรเจ็กต์ ให้ลบอินสแตนซ์ที่คุณสร้างขึ้นใน Spanner
  3. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์

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

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

ขั้นตอนถัดไปคือ

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

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