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

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

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ พ.ค. 24, 2024
account_circleเขียนโดย Author: Abirami Sukumaran, Editor: Shweta Shetye

1 ภาพรวม

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

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

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

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

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

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

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

14cfdde5e24258a.png

ข้อกำหนด

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

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

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

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

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

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

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

  1. คลิก Spaner 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. คลิก Spaner 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 สร้าง Generative Insights จาก Patent Abstracts

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

สร้างตาราง

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

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

หากต้องการป้อนข้อมูลในตารางด้วย Generative Insights เราขอแนะนำให้คุณใช้แอปพลิเคชันที่ใช้วิธีการเขียนแบบกลุ่มหรือการกลายพันธุ์ สำหรับ Codelab นี้ เราจะเรียกใช้การค้นหา 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. คลิก SPANer 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 เตรียมพร้อมสำหรับการค้นหาเวกเตอร์

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

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

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

  1. คลิก Spaner 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