สร้างแอปตัวแทน AI แบบ E2E ที่มีสถานะและมีประสิทธิภาพสูงใน Java ด้วย ADK, AlloyDB และ Gemini

สร้างแอปตัวแทน AI แบบ E2E ที่มีสถานะและมีประสิทธิภาพสูงใน Java ด้วย ADK, AlloyDB และ Gemini

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

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

1 ภาพรวม

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

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

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

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

เป้าหมายนั้นง่ายดาย อนุญาตให้ผู้ใช้ค้นหาสิทธิบัตรตามคำอธิบายที่เป็นข้อความ จากนั้นดูคำอธิบายโดยละเอียดของสิทธิบัตรที่เฉพาะเจาะจงจากผลการค้นหา และทั้งหมดนี้ทำได้โดยใช้ตัวแทน AI ที่สร้างขึ้นด้วย Java ADK, AlloyDB, Vector Search (ที่มีดัชนีขั้นสูง), Gemini และแอปพลิเคชันทั้งหมดที่ติดตั้งใช้งานแบบเซิร์ฟเวอร์เสมือนใน Cloud Run

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

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

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

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

c22563ace65a6930.png

High level diagram representing the flow of the Patent Search Agent with AlloyDB & ADK

ข้อกำหนด

  • เบราว์เซอร์ เช่น 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. คลิกเรียกใช้ ผลการค้นหาจะปรากฏในตารางผลลัพธ์

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

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

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

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

25a1d7ef0e49e91e.png

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

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

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

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

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

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 ช่วยให้คุณวัดผลข้อเสียเปรียบนี้ในฐานข้อมูลได้โดยตรงสําหรับการค้นหาแต่ละรายการ และช่วยให้มั่นใจว่าข้อมูลจะเสถียรเมื่อเวลาผ่านไป คุณสามารถอัปเดตพารามิเตอร์การค้นหาและดัชนีตามข้อมูลนี้เพื่อให้ได้ผลลัพธ์และประสิทธิภาพที่ดียิ่งขึ้น

คุณสามารถดูการเรียกคืนสําหรับการค้นหาเวกเตอร์ในดัชนีเวกเตอร์สําหรับการกําหนดค่าหนึ่งๆ โดยใช้ฟังก์ชัน evaluate_query_recall ฟังก์ชันนี้ช่วยให้คุณปรับแต่งพารามิเตอร์เพื่อให้ได้ผลลัพธ์การเรียกคืนคำค้นหาเวกเตอร์ที่ต้องการ การเรียกคืนคือเมตริกที่ใช้วัดคุณภาพการค้นหา และกำหนดว่าเป็นเปอร์เซ็นต์ของผลลัพธ์ที่แสดงซึ่งใกล้เคียงกับเวกเตอร์การค้นหามากที่สุดอย่างเป็นกลาง ฟังก์ชัน 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 (จากเดิม 10) และพบว่าการเรียกคืนดีขึ้นเล็กน้อย คือ 86%

c12f7b92b8481ceb.png

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

ทีนี้เรียบร้อย ถึงเวลาปรับใช้ตรรกะฐานข้อมูลและไปยังตัวแทนแล้ว

7 นำตรรกะฐานข้อมูลไปใช้กับเว็บเซิร์ฟเวอร์ได้โดยไม่ต้องใช้เซิร์ฟเวอร์

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

  1. ไปที่ฟังก์ชัน Cloud Run ในคอนโซล Google Cloud เพื่อสร้างฟังก์ชัน Cloud Run ใหม่ หรือใช้ลิงก์ https://console.cloud.google.com/functions/add
  2. เลือกสภาพแวดล้อมเป็น "ฟังก์ชัน Cloud Run" ระบุชื่อฟังก์ชัน "patent-search" และเลือกภูมิภาคเป็น "us-central1" ตั้งค่าการตรวจสอบสิทธิ์เป็น "อนุญาตการเรียกใช้ที่ไม่ผ่านการตรวจสอบสิทธิ์" แล้วคลิกถัดไป เลือก Java 17 เป็นรันไทม์และเครื่องมือแก้ไขอินไลน์สําหรับซอร์สโค้ด
  3. โดยค่าเริ่มต้น ระบบจะตั้งค่าจุดแรกเข้าเป็น "gcfv2.HelloHttpFunction" แทนที่โค้ดตัวยึดตําแหน่งใน HelloHttpFunction.java และ pom.xml ของฟังก์ชัน Cloud Run ด้วยโค้ดจาก " PatentSearch.java" และ " pom.xml" ตามลําดับ เปลี่ยนชื่อไฟล์คลาสเป็น PatentSearch.java
  4. อย่าลืมเปลี่ยนตัวยึดตําแหน่ง ************* และข้อมูลเข้าสู่ระบบการเชื่อมต่อ AlloyDB ด้วยค่าของคุณในไฟล์ Java ข้อมูลเข้าสู่ระบบ AlloyDB คือข้อมูลที่เราใช้ตอนเริ่มต้นโค้ดแล็บนี้ หากคุณใช้ค่าอื่น โปรดแก้ไขค่าดังกล่าวในไฟล์ Java
  5. คลิกทำให้ใช้งานได้

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

เมื่อทำให้ใช้งานได้แล้ว เราจะสร้างเครื่องมือเชื่อมต่อ VPC เพื่ออนุญาตให้ Cloud Function เข้าถึงอินสแตนซ์ฐานข้อมูล AlloyDB

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

  1. ไปที่แท็บ "การสร้างเครือข่าย"

828cd861864d99ea.png

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

6559ccfd10e597f2.png

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

199b0ccd80215004.png

  1. คลิกสร้าง แล้วเครื่องมือเชื่อมต่อนี้จะแสดงอยู่ในการตั้งค่าการส่งออก
  2. เลือกเครื่องมือเชื่อมต่อที่สร้างขึ้นใหม่
  3. เลือกให้กำหนดเส้นทางการรับส่งข้อมูลทั้งหมดผ่านเครื่องมือเชื่อมต่อ VPC นี้
  4. คลิกถัดไป แล้วคลิกทำให้ใช้งานได้
  5. เมื่อมีการทําให้ Cloud Function ที่อัปเดตแล้วใช้งานได้ คุณจะเห็นปลายทางที่สร้างขึ้น คัดลอกข้อมูลดังกล่าวแล้วแทนที่ในคําสั่งต่อไปนี้
PROJECT_ID=$(gcloud config get-value project)

curl -X POST <<YOUR_ENDPOINT>> \
  -H 'Content-Type: application/json' \
  -d '{"search":"Sentiment Analysis"}'

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

8 มาสร้างตัวแทนด้วย Java ADK กัน

ก่อนอื่น มาเริ่มใช้งานโปรเจ็กต์ Java ในเครื่องมือแก้ไขกัน

  1. ไปที่เทอร์มินัล Cloud Shell

https://shell.cloud.google.com/?fromcloudshell=true&show=ide%2Cterminal

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

f913b886324e5196.png

  1. ในคอนโซลเครื่องมือแก้ไข Cloud Shell ที่เปิดขึ้น ให้สร้างโฟลเดอร์ใหม่และตั้งชื่อว่า "adk-agents"

คลิกสร้างโฟลเดอร์ใหม่ในไดเรกทอรีรูทของเชลล์ระบบคลาวด์ดังที่แสดงด้านล่าง

94c9804697614a94.png

ตั้งชื่อเป็น "adk-agents"

37445dc1fe08f74c.png

  1. สร้างโครงสร้างโฟลเดอร์ต่อไปนี้และไฟล์ว่างที่มีชื่อไฟล์ที่เกี่ยวข้องในโครงสร้างด้านล่าง
adk-agents/
 └—— pom.xml
 └—— src/
     └—— main/
         └—— java/
             └—— agents/
                 └—— App.java
  1. เปิด github repo ในแท็บแยกต่างหาก แล้วคัดลอกซอร์สโค้ดของไฟล์ App.java และ pom.xml
  2. หากเปิดเครื่องมือแก้ไขในแท็บใหม่โดยใช้ไอคอน "เปิดในแท็บใหม่" ที่มุมขวาบน คุณจะเปิดเทอร์มินัลที่ด้านล่างของหน้าได้ คุณสามารถเปิดทั้งเครื่องมือแก้ไขและเทมมินัลพร้อมกันเพื่อให้ดำเนินการได้อย่างอิสระ
  3. เมื่อโคลนแล้ว ให้สลับกลับไปที่คอนโซลเครื่องมือแก้ไข Cloud Shell
  4. เนื่องจากเราได้สร้างฟังก์ชัน Cloud Run ไว้แล้ว คุณจึงไม่ต้องคัดลอกไฟล์ฟังก์ชัน Cloud Run จากโฟลเดอร์ repo

เริ่มต้นใช้งาน ADK Java SDK

การดำเนินการนี้ค่อนข้างตรงไปตรงมา สิ่งสำคัญคือคุณต้องตรวจสอบว่าขั้นตอนดังกล่าวครอบคลุมข้อมูลต่อไปนี้

  1. เพิ่ม Dependency:

รวมอาร์ติแฟกต์ google-adk และ google-adk-dev (สําหรับ UI ของเว็บ) ไว้ใน pom.xml

<!-- The ADK core dependency -->
        <dependency>
            <groupId>com.google.adk</groupId>
            <artifactId>google-adk</artifactId>
            <version>0.1.0</version>
        </dependency>
        <!-- The ADK dev web UI to debug your agent -->
        <dependency>
            <groupId>com.google.adk</groupId>
            <artifactId>google-adk-dev</artifactId>
            <version>0.1.0</version>
        </dependency>

อย่าลืมอ้างอิง pom.xml จากที่เก็บต้นทาง เนื่องจากมีแอตทริบิวต์และการกำหนดค่าอื่นๆ ที่จำเป็นต่อการทำงานของแอปพลิเคชัน

  1. กําหนดค่าโปรเจ็กต์:

ตรวจสอบว่าเวอร์ชัน Java (แนะนำให้ใช้เวอร์ชัน 17 ขึ้นไป) และการตั้งค่าคอมไพเลอร์ Maven ได้รับการกําหนดค่าอย่างถูกต้องใน pom.xml คุณสามารถกําหนดค่าโปรเจ็กต์ให้เป็นไปตามโครงสร้างด้านล่าง

adk-agents/
 └—— pom.xml
 └—— src/
     └—— main/
         └—— java/
             └—— agents/
                 └—— App.java
  1. การกําหนดตัวแทนและเครื่องมือของตัวแทน (App.java):

ตรงนี้แหละที่ ADK Java SDK แสดงประสิทธิภาพอันน่าทึ่ง เรากําหนดตัวแทน ความสามารถ (วิธีการ) และเครื่องมือที่ใช้ได้

ดูตัวอย่างโค้ดบางส่วนของคลาสเอเจนต์หลักเวอร์ชันที่เข้าใจง่ายได้ที่นี่ ดูโปรเจ็กต์ฉบับเต็มได้ที่ที่เก็บโปรเจ็กต์ที่นี่

// App.java (Simplified Snippets)
package agents;

import com.google.adk.agents.LlmAgent;
import com.google.adk.agents.BaseAgent;
import com.google.adk.agents.InvocationContext;
import com.google.adk.tools.Annotations.Schema;
import com.google.adk.tools.FunctionTool;
// ... other imports

public class App {

    static FunctionTool searchTool = FunctionTool.create(App.class, "getPatents");
    static FunctionTool explainTool = FunctionTool.create(App.class, "explainPatent");

    public static BaseAgent ROOT_AGENT = initAgent();

    public static BaseAgent initAgent() {
        return LlmAgent.builder()
            .name("patent-search-agent")
            .description("Patent Search agent")
            .model("gemini-2.0-flash-001") // Specify your desired Gemini model
            .instruction(
                """
                You are a helpful patent search assistant capable of 2 things:
                // ... complete instructions ...
                """)
            .tools(searchTool, explainTool)
            .outputKey("patents") // Key to store tool output in session state
            .build();
    }

    // --- Tool: Get Patents ---
    public static Map<String, String> getPatents(
        @Schema(name="searchText",description = "The search text for which the user wants to find matching patents")
        String searchText) {
        try {
            String patentsJson = vectorSearch(searchText); // Calls our Cloud Run Function
            return Map.of("status", "success", "report", patentsJson);
        } catch (Exception e) {
            // Log error
            return Map.of("status", "error", "report", "Error fetching patents.");
        }
    }

    // --- Tool: Explain Patent (Leveraging InvocationContext) ---
    public static Map<String, String> explainPatent(
        @Schema(name="patentId",description = "The patent id for which the user wants to get more explanation for, from the database")
    String patentId,
    @Schema(name="ctx",description = "The list of patent abstracts from the database from which the user can pick the one to get more explanation for")
    InvocationContext ctx) { // Note the InvocationContext
        try {
            // Retrieve previous patent search results from session state
            String previousResults = (String) ctx.session().state().get("patents");
            if (previousResults != null && !previousResults.isEmpty()) {
// Logic to find the specific patent abstract from 'previousResults' by 'patentId'
                String[] patentEntries = previousResults.split("\n\n\n\n");
                for (String entry : patentEntries) {
                    if (entry.contains(patentId)) { // Simplified check
       // The agent will then use its instructions to summarize this 'report'
                        return Map.of("status", "success", "report", entry);
                    }
                }
            }
            return Map.of("status", "error", "report", "Patent ID not found in previous search.");
        } catch (Exception e) {
            // Log error
            return Map.of("status", "error", "report", "Error explaining patent.");
        }
    }

    public static void main(String[] args) throws Exception {
        InMemoryRunner runner = new InMemoryRunner(ROOT_AGENT);
        // ... (Session creation and main input loop - shown in your source)
    }
}

คอมโพเนนต์โค้ด Java หลักของ ADK ที่ไฮไลต์

  1. LlmAgent.builder(): Fluent API สําหรับการกําหนดค่าตัวแทน
  2. .instruction(...): ระบุพรอมต์หลักและหลักเกณฑ์สําหรับ LLM รวมถึงกรณีที่ควรใช้เครื่องมือใด
  3. FunctionTool.create(App.class, "methodName"): ลงทะเบียนเมธอด Java เป็นเครื่องมือที่ตัวแทนเรียกใช้ได้ง่ายๆ สตริงชื่อเมธอดต้องตรงกับเมธอดแบบคงที่สาธารณะจริง
  4. @Schema(description = ...): กำกับเนื้อหาพารามิเตอร์ของเครื่องมือ ซึ่งช่วยให้ LLM เข้าใจว่าเครื่องมือแต่ละรายการต้องการอินพุตใด คําอธิบายนี้สําคัญอย่างยิ่งสําหรับการเลือกเครื่องมือและการกรอกพารามิเตอร์ที่ถูกต้อง
  5. InvocationContext ctx: ส่งไปยังเมธอดของเครื่องมือโดยอัตโนมัติ ซึ่งจะให้สิทธิ์เข้าถึงสถานะเซสชัน (ctx.session().state()), ข้อมูลผู้ใช้ และอื่นๆ
  6. .outputKey("patents"): เมื่อเครื่องมือแสดงผลข้อมูล ADK จะจัดเก็บข้อมูลนั้นไว้ในสถานะเซสชันภายใต้คีย์นี้โดยอัตโนมัติ นี่คือวิธีที่ explainPatent เข้าถึงผลลัพธ์จาก getPatents
  7. VECTOR_SEARCH_ENDPOINT: ตัวแปรนี้เก็บตรรกะฟังก์ชันหลักสําหรับถามและตอบตามบริบทสําหรับผู้ใช้ใน Use Case การค้นหาสิทธิบัตร
  8. สิ่งที่ต้องทําที่นี่: คุณต้องตั้งค่าอุปกรณ์ปลายทางที่อัปเดตแล้วเมื่อคุณใช้ขั้นตอนฟังก์ชัน Java Cloud Run จากส่วนก่อนหน้า
  9. searchTool: มีส่วนร่วมกับผู้ใช้เพื่อค้นหาการจับคู่สิทธิบัตรที่เกี่ยวข้องตามบริบทจากฐานข้อมูลสิทธิบัตรสำหรับข้อความค้นหาของผู้ใช้
  10. explainTool: ข้อความนี้จะถามผู้ใช้เกี่ยวกับสิทธิบัตรที่ต้องการเจาะลึก จากนั้นจะสรุปข้อมูลสรุปของสิทธิบัตรและพร้อมตอบคำถามเพิ่มเติมจากผู้ใช้ตามรายละเอียดสิทธิบัตรที่มี

หมายเหตุสำคัญ: โปรดตรวจสอบว่าได้แทนที่ตัวแปร VECTOR_SEARCH_ENDPOINT ด้วยปลายทาง CRF ที่ติดตั้งใช้งาน

ใช้ประโยชน์จาก InvocationContext สําหรับการโต้ตอบที่มีสถานะ

ฟีเจอร์สําคัญอย่างหนึ่งในการสร้างตัวแทนที่มีประโยชน์คือการจัดการสถานะในการสนทนาหลายรอบ InvocationContext ของ ADK ทําให้การดำเนินการนี้ง่ายขึ้น

ใน App.java

  1. เมื่อกำหนด initAgent() เราจะใช้ .outputKey("patents") ซึ่งจะบอก ADK ว่าเมื่อเครื่องมือ (เช่น getPatents) แสดงผลข้อมูลในช่องรายงาน ข้อมูลดังกล่าวควรจัดเก็บไว้ในสถานะเซสชันภายใต้คีย์ "patents"
  2. ในเมธอดเครื่องมือ explainPatent เราจะแทรก InvocationContext ctx ดังนี้
public static Map<String, String> explainPatent(
    @Schema(description = "...") String patentId, InvocationContext ctx) {
    String previousResults = (String) ctx.session().state().get("patents");
    // ... use previousResults ...
}

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

9 การทดสอบ CLI ในเครื่อง

กําหนดตัวแปรสภาพแวดล้อม

คุณจะต้องส่งออกตัวแปรสภาพแวดล้อม 2 รายการต่อไปนี้

  1. คีย์ Gemini ที่คุณได้รับจาก AI Studio

โดยไปที่ https://aistudio.google.com/apikey และรับคีย์ API สำหรับโปรเจ็กต์ Google Cloud ที่ใช้งานอยู่ซึ่งคุณกำลังติดตั้งใช้งานแอปพลิเคชันนี้อยู่ และบันทึกคีย์ไว้ที่ใดก็ได้

ae2db169e6a94e4a.png

  1. เมื่อได้รับคีย์แล้ว ให้เปิด Cloud Shell Terminal และย้ายไปยังไดเรกทอรีใหม่ที่เพิ่งสร้าง adk-agents โดยเรียกใช้คําสั่งต่อไปนี้
cd adk-agents
  1. ตัวแปรเพื่อระบุว่าเราไม่ได้ใช้ Vertex AI ในครั้งนี้
export GOOGLE_GENAI_USE_VERTEXAI=FALSE
export GOOGLE_API_KEY=AIzaSyDF...
  1. เรียกใช้ตัวแทนตัวแรกใน CLI

หากต้องการเปิดใช้งาน Agent ตัวแรกนี้ ให้ใช้คำสั่ง Maven ต่อไปนี้ในเทอร์มินัล

mvn compile exec:java -DmainClass="agents.App"

คุณจะเห็นคำตอบแบบอินเทอร์แอกทีฟจากตัวแทนในเทอร์มินัล

10 การทำให้ใช้งานได้กับ Cloud Run

การนำส่งตัวแทน Java ของ ADK ไปยัง Cloud Run คล้ายกับการนำส่งแอปพลิเคชัน Java อื่นๆ ดังนี้

  1. Dockerfile: สร้าง Dockerfile เพื่อแพ็กเกจแอปพลิเคชัน Java
  2. สร้างและพุชอิมเมจ Docker: ใช้ Google Cloud Build และ Artifact Registry
  3. คุณทําตามขั้นตอนข้างต้นและทําให้ใช้งานได้กับ Cloud Run ได้ในคําสั่งเดียว
gcloud run deploy --source . --set-env-vars GOOGLE_API_KEY=<<Your_Gemini_Key>>

ในทํานองเดียวกัน คุณจะทําให้ฟังก์ชัน Java Cloud Run (gcfv2.PatentSearch) ใช้งานได้ หรือจะสร้างและทำให้ Cloud Run Function ของ Java ใช้งานได้สําหรับตรรกะฐานข้อมูลโดยตรงจากคอนโซล Cloud Run Function ก็ได้

11 การทดสอบด้วย UI ของเว็บ

ADK มาพร้อมกับ Web UI ที่มีประโยชน์สําหรับการทดสอบและการแก้ไขข้อบกพร่องของตัวแทนในเครื่อง เมื่อคุณเรียกใช้ App.java ในเครื่อง (เช่น mvn exec:java -Dexec.mainClass="agents.App" หากกําหนดค่าไว้ หรือเพียงแค่เรียกใช้เมธอดหลัก) ADK มักจะเริ่มเว็บเซิร์ฟเวอร์ในเครื่อง

เว็บ UI ของ ADK ช่วยให้คุณทำสิ่งต่อไปนี้ได้

  1. ส่งข้อความถึงตัวแทน
  2. ดูเหตุการณ์ (ข้อความของผู้ใช้ การเรียกใช้เครื่องมือ การตอบกลับของเครื่องมือ การตอบกลับ LLM)
  3. ตรวจสอบสถานะเซสชัน
  4. ดูบันทึกและการติดตาม

ข้อมูลนี้มีประโยชน์อย่างยิ่งในระหว่างการพัฒนาเพื่อทำความเข้าใจวิธีที่ตัวแทนประมวลผลคำขอและใช้เครื่องมือ สมมติว่า mainClass ใน pom.xml ของคุณตั้งค่าเป็น com.google.adk.web.AdkWebServer และตัวแทนของคุณจดทะเบียนกับคลาสนี้ หรือคุณกำลังเรียกใช้โปรแกรมรันทดสอบในเครื่องที่แสดงคลาสนี้

เมื่อเรียกใช้ App.java ด้วย InMemoryRunner และ Scanner สําหรับอินพุตคอนโซล แสดงว่าคุณกําลังทดสอบตรรกะเอเจนต์หลัก เว็บ UI เป็นคอมโพเนนต์แยกต่างหากที่ให้ประสบการณ์การแก้ไขข้อบกพร่องที่มองเห็นได้มากขึ้น ซึ่งมักใช้เมื่อ ADK แสดงข้อมูลให้กับตัวแทนผ่าน HTTP

คุณสามารถใช้คำสั่ง Maven ต่อไปนี้จากไดเรกทอรีรูทเพื่อเปิดเซิร์ฟเวอร์ภายในของ SpringBoot

mvn compile exec:java -Dexec.args="--adk.agents.source-dir=src/main/java/ --logging.level.com.google.adk.dev=TRACE --logging.level.com.google.adk.demo.agents=TRACE"

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

คุณควรเห็นผลลัพธ์ในอินเทอร์เฟซแบบอินเทอร์แอกทีฟ

ดูวิดีโอด้านล่างเกี่ยวกับตัวแทนการจดสิทธิบัตรที่เราใช้งานอยู่

การสาธิตตัวแทนการจดสิทธิบัตรที่มีการควบคุมคุณภาพด้วย AlloyDB Inline Search และการประเมินการเรียกคืน

ca7b0fc4fe571dd6.png

12 ล้างข้อมูล

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

  1. ในคอนโซล Google Cloud ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source=blog
  2. หน้า https://console.cloud.google.com/cloud-resource-manager?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source=blog
  3. ในรายการโปรเจ็กต์ ให้เลือกโปรเจ็กต์ที่ต้องการลบ แล้วคลิกลบ
  4. ในกล่องโต้ตอบ ให้พิมพ์รหัสโปรเจ็กต์ แล้วคลิกปิดเพื่อลบโปรเจ็กต์

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

ยินดีด้วย คุณสร้างตัวแทนการวิเคราะห์สิทธิบัตรใน Java เรียบร้อยแล้วด้วยการรวมความสามารถของ ADK, https://cloud.google.com/alloydb/docs?utm_campaign=CDR_0x1d2a42f5_default_b419133749&utm_medium=external&utm_source=blog, Vertex AI และ Vector Search นอกจากนี้ เรายังก้าวไปอีกขั้นในการสร้างการค้นหาความคล้ายคลึงตามบริบทที่เปลี่ยนแปลงไปอย่างมาก มีประสิทธิภาพ และมุ่งเน้นความหมายอย่างแท้จริง

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

เอกสารประกอบ ADK: [ลิงก์ไปยังเอกสารประกอบอย่างเป็นทางการของ ADK Java]

รหัสต้นทางของตัวแทนการวิเคราะห์สิทธิบัตร: [ลิงก์ไปยังที่เก็บ GitHub (ตอนนี้เป็นแบบสาธารณะ) ของคุณ]

Java Sample Agents: [ลิงก์ไปยังที่เก็บ adk-samples]

เข้าร่วมชุมชน ADK: https://www.reddit.com/r/agentdevelopmentkit/

ขอให้สนุกกับการสร้างตัวแทน