การใช้เครื่องมือค้นหาไฟล์ของ Google Gemini สำหรับ RAG

1. บทนำ

Codelab นี้จะแสดงวิธีใช้การค้นหาไฟล์ใน Gemini เพื่อเปิดใช้ RAG ในแอปพลิเคชันแบบ Agentic คุณจะใช้การค้นหาไฟล์ของ Gemini เพื่อนำเข้าและจัดทำดัชนีเอกสารได้โดยไม่ต้องกังวลเกี่ยวกับรายละเอียดของการแบ่งกลุ่ม การฝัง หรือฐานข้อมูลเวกเตอร์

สิ่งที่คุณจะได้เรียนรู้

  • พื้นฐานของ RAG และเหตุผลที่เราต้องใช้
  • Gemini File Search คืออะไรและมีข้อดีอย่างไร
  • วิธีสร้างร้านค้าค้นหาไฟล์
  • วิธีอัปโหลดไฟล์ที่กำหนดเองไปยังร้านค้าค้นหาไฟล์
  • วิธีใช้เครื่องมือค้นหาไฟล์ของ Gemini สำหรับ RAG
  • ประโยชน์ของการใช้ชุดเครื่องมือพัฒนา Agent ของ Google (ADK)
  • วิธีใช้เครื่องมือค้นหาไฟล์ของ Gemini ในโซลูชันแบบเอเจนต์ที่สร้างขึ้นโดยใช้ ADK
  • วิธีใช้เครื่องมือค้นหาไฟล์ของ Gemini ควบคู่ไปกับเครื่องมือ "ดั้งเดิม" ของ Google เช่น Google Search

สิ่งที่คุณจะทำ

  • สร้างโปรเจ็กต์ Google Cloud และตั้งค่าสภาพแวดล้อมการพัฒนา
  • สร้างเอเจนต์ที่เรียบง่ายซึ่งใช้ Gemini โดยใช้ Google Gen AI SDK (แต่ไม่มี ADK) ที่มีความสามารถในการใช้ Google Search แต่ไม่มีความสามารถ RAG
  • แสดงให้เห็นว่าไม่สามารถให้ข้อมูลที่ถูกต้องและมีคุณภาพสูงสำหรับข้อมูลเฉพาะได้
  • สร้าง Jupyter Notebook (ซึ่งคุณเรียกใช้ได้ในเครื่องหรือใน Google Colab) เพื่อสร้างและจัดการที่เก็บข้อมูลการค้นหาไฟล์ของ Gemini
  • ใช้ Notebook เพื่ออัปโหลดเนื้อหาที่กำหนดเองไปยังร้านค้าการค้นหาไฟล์
  • สร้าง Agent ที่มีที่เก็บการค้นหาไฟล์แนบอยู่ และพิสูจน์ว่า Agent สามารถสร้างคำตอบที่ดีขึ้นได้
  • เปลี่ยนเอเจนต์ "พื้นฐาน" เริ่มต้นของเราให้เป็นเอเจนต์ ADK ที่มีเครื่องมือ Google Search ครบครัน
  • ทดสอบเอเจนต์โดยใช้เว็บ UI ของ ADK
  • รวมที่เก็บการค้นหาไฟล์เข้ากับ Agent ADK โดยใช้รูปแบบ Agent-As-A-Tool เพื่อให้เราใช้เครื่องมือค้นหาไฟล์ควบคู่ไปกับเครื่องมือค้นหาของ Google ได้

2. RAG คืออะไรและเหตุใดเราจึงต้องใช้

ดังนั้น Retrieval Augmented Generation

หากคุณมาที่นี่ คุณอาจทราบแล้วว่าฟีเจอร์นี้คืออะไร แต่เรามาสรุปสั้นๆ กันอีกครั้งเผื่อไว้ LLM (เช่น Gemini) มีความสามารถยอดเยี่ยม แต่ก็มีปัญหาอยู่บ้าง ดังนี้

  1. ข้อมูลไม่อัปเดตอยู่เสมอ: โมเดลจะรู้เฉพาะสิ่งที่ได้เรียนรู้ระหว่างการฝึกเท่านั้น
  2. โมเดลไม่ได้รู้ทุกเรื่อง: โมเดลมีขนาดใหญ่ก็จริง แต่ก็ไม่ได้รอบรู้ไปทุกเรื่อง
  3. โมเดลไม่ทราบข้อมูลที่เป็นกรรมสิทธิ์ของคุณ: โมเดลมีความรู้ในวงกว้าง แต่ไม่ได้อ่านเอกสารภายใน บล็อก หรือคำขอใน Jira ของคุณ

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

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

  1. เวลาในการตอบสนอง: โมเดลตอบสนองช้าลงเรื่อยๆ
  2. สัญญาณเสื่อม หรือที่เรียกว่า "สูญหายกลางทาง" คือเมื่อโมเดลไม่สามารถจัดเรียงข้อมูลที่เกี่ยวข้องจากข้อมูลที่ไม่เกี่ยวข้องได้อีกต่อไป โมเดลจะละเว้นบริบทส่วนใหญ่
  3. ค่าใช้จ่าย: เนื่องจากโทเค็นมีค่าใช้จ่าย
  4. หน้าต่างบริบทเต็ม: ในขั้นตอนนี้ Gemini จะไม่ดำเนินการตามคำขอของคุณ

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

โดยจะทำงานด้วยการนำเข้าข้อมูลภายนอก แบ่งข้อมูลออกเป็นกลุ่มๆ แปลงข้อมูลเป็นเวกเตอร์ฝัง จากนั้นจัดเก็บและจัดทำดัชนีการฝังเหล่านั้นลงในฐานข้อมูลเวกเตอร์ที่เหมาะสม

59f80cd49a8d8fdb.png

ดังนั้น ในการใช้ RAG เรามักจะต้องกังวลเกี่ยวกับสิ่งต่อไปนี้

  1. การสร้างฐานข้อมูลเวกเตอร์ (Pinecone, Weaviate, Postgres ที่มี pgvector...)
  2. การเขียนสคริปต์การแบ่งกลุ่มเพื่อแยกเอกสาร (เช่น PDF, มาร์กดาวน์ หรืออื่นๆ)
  3. สร้างการฝัง (เวกเตอร์) สำหรับก้อนข้อมูลเหล่านั้นโดยใช้โมเดลการฝัง
  4. จัดเก็บเวกเตอร์ในฐานข้อมูลเวกเตอร์

แต่เพื่อนก็ไม่ควรปล่อยให้เพื่อนออกแบบสิ่งต่างๆ มากเกินไป จะเกิดอะไรขึ้นหากเราบอกว่ามีวิธีที่ง่ายกว่านี้

3. ข้อกำหนดเบื้องต้น

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

คุณต้องมีโปรเจ็กต์ Google Cloud เพื่อเรียกใช้ Codelab นี้ คุณจะใช้โปรเจ็กต์ที่มีอยู่แล้วหรือสร้างโปรเจ็กต์ใหม่ก็ได้

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

โปรดทราบว่าการทำ Codelab นี้ไม่ควรมีค่าใช้จ่ายใดๆ โดยจะมีการเรียกเก็บเงินเพียงเล็กน้อยเท่านั้น

โปรดเตรียมโปรเจ็กต์ให้พร้อม ฉันจะรอ

โคลนที่เก็บข้อมูลตัวอย่าง

เราได้สร้างที่เก็บที่มีเนื้อหาแนะนำสำหรับ Codelab นี้ คุณจะต้องใช้ข้อมูลนี้

เรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัล หรือจากเทอร์มินัลที่ผสานรวมกับ Cloud Shell Editor ของ Google Cloud Shell และโปรแกรมแก้ไขของ Cloud Shell นั้นสะดวกมาก เนื่องจากคำสั่งทั้งหมดที่คุณต้องการได้รับการติดตั้งไว้ล่วงหน้าแล้ว และทุกอย่างจะทำงานได้ทันที

git clone https://github.com/derailed-dash/gemini-file-search-demo
cd gemini-file-search-demo

โครงสร้างนี้แสดงโฟลเดอร์และไฟล์หลักในที่เก็บ

gemini-file-search-demo/
├── app/
│   ├── basic_agent_adk/        # Agent with Google Search, using ADK framework
│   │   └── agent.py
│   ├── rag_agent_adk/          # Agent with Google Search and File Search, using ADK framework
│   │   ├── agent.py            
│   │   └── tools_custom.py      
│   ├── sdk_agent.py            # Agent using GenAI SDK (no ADK) with Google Search tool
│   └── sdk_rag_agent.py        # Agent using GenAI SDK (no ADK) with Gemini File Search tool
├── data/
│   └── story.md                # Sample story with "bespoke content" to use with Gemini File Search Store
├── notebooks/
│   └── file_search_store.ipynb # Jupyter notebook for creating and managing Gemini File Search Store
│
├── .env.template               # Template for environment variables - make a copy as .env
├── Makefile                    # Makefile for `make` commands
├── pyproject.toml              # Project configuration and dependencies
└── README.md                   # This file

เปิดโฟลเดอร์นี้ใน Cloud Shell Editor หรือโปรแกรมแก้ไขที่ต้องการ (คุณเคยใช้ Antigravity ไหม หากยังไม่เคยใช้ ตอนนี้ก็ถึงเวลาที่เหมาะสมแล้วที่จะลองใช้)

โปรดทราบว่าที่เก็บมีเรื่องราวตัวอย่างชื่อ "The Wormhole Incursion" ในไฟล์ data/story.md ฉันเขียนร่วมกับ Gemini โดยเป็นเรื่องราวเกี่ยวกับผู้บัญชาการ Dazbo และกองเรือรบของเขาซึ่งประกอบด้วยยานอวกาศที่มีสติสัมปชัญญะ (ฉันได้รับแรงบันดาลใจจากเกม Elite Dangerous) เรื่องราวนี้ทำหน้าที่เป็น "ฐานความรู้เฉพาะ" ของเรา ซึ่งมีข้อเท็จจริงที่เฉพาะเจาะจงซึ่ง Gemini ไม่ทราบ และที่สำคัญคือ Gemini ไม่สามารถค้นหาโดยใช้ Google Search ได้

ตั้งค่าสภาพแวดล้อมในการพัฒนา

เพื่อความสะดวก ฉันได้จัดเตรียม Makefile เพื่อลดความซับซ้อนของคำสั่งหลายรายการที่คุณต้องเรียกใช้ คุณไม่จำเป็นต้องจำคำสั่งที่เฉพาะเจาะจง เพียงแค่เรียกใช้คำสั่งอย่างเช่น make <target> อย่างไรก็ตาม make จะใช้ได้เฉพาะในสภาพแวดล้อม Linux / MacOS / WSL เท่านั้น หากใช้ Windows (ไม่มี WSL) คุณจะต้องเรียกใช้คำสั่งทั้งหมดที่เป้าหมาย make มี

# Install dependencies with make
make install

# If you don't have make...
uv sync --extra jupyter

เมื่อเรียกใช้ make install ในเครื่องมือแก้ไข Cloud Shell คุณจะเห็นผลลัพธ์ดังนี้

64ed9878be59adad.png

สร้างคีย์ Gemini API

หากต้องการใช้ Gemini Developer API (ซึ่งเราต้องใช้เพื่อใช้เครื่องมือค้นหาไฟล์ Gemini) คุณต้องมีคีย์ Gemini API วิธีที่ง่ายที่สุดในการรับคีย์ API คือการใช้ Google AI Studio ซึ่งมีอินเทอร์เฟซที่สะดวกในการรับคีย์ API สำหรับโปรเจ็กต์ Google Cloud ดูขั้นตอนเฉพาะได้ในคำแนะนำนี้

เมื่อสร้างคีย์ API แล้ว ให้คัดลอกและเก็บรักษาคีย์ดังกล่าวให้ปลอดภัย

ตอนนี้คุณต้องตั้งค่าคีย์ API นี้เป็นตัวแปรสภาพแวดล้อม เราสามารถทำได้โดยใช้.envไฟล์ คัดลอก .env.example ที่รวมไว้เป็นไฟล์ใหม่ชื่อ .env ไฟล์ควรมีลักษณะดังนี้

export GEMINI_API_KEY="your-api-key"
export MODEL="gemini-2.5-flash"
export STORE_NAME="demo-file-store"

จากนั้นแทนที่ your-api-key ด้วยคีย์ API จริง ตอนนี้ควรมีลักษณะดังนี้

70fba02ac80c3790.png

ตอนนี้ให้ตรวจสอบว่าได้โหลดตัวแปรสภาพแวดล้อมแล้ว โดยทำได้โดยเรียกใช้คำสั่งต่อไปนี้

source .env

4. The Basic Agent

ก่อนอื่น มากำหนดเกณฑ์พื้นฐานกัน เราจะใช้ google-genai SDK ดิบเพื่อเรียกใช้เอเจนต์อย่างง่าย

โค้ด

ดูที่ app/sdk_agent.py ซึ่งเป็นการติดตั้งใช้งานขั้นต่ำที่มีลักษณะดังนี้

  • สร้างอินสแตนซ์ของ genai.Client
  • เปิดใช้เครื่องมือ google_search
  • เท่านี้เอง ไม่มี RAG

ดูโค้ดและตรวจสอบว่าคุณเข้าใจสิ่งที่โค้ดทำ

การเรียกใช้

# With make
make sdk-agent

# Without make
uv run python app/sdk_agent.py

มาลองถามคำถามทั่วไปกัน

> What is the stock price of Google?

โดยควรตอบคำถามได้อย่างถูกต้องโดยใช้ Google Search เพื่อค้นหาราคาปัจจุบัน

c1b9b6c7b37290ee.png

ทีนี้มาลองถามคำถามที่โมเดลไม่รู้คำตอบกัน โดยกำหนดให้ตัวแทนต้องอ่านเรื่องราวของเรา

> Who pilots the 'Too Many Pies' ship?

ซึ่งอาจล้มเหลวหรือแม้แต่สร้างข้อมูลที่ไม่ถูกต้อง มาดูกัน

945003150f7099cd.png

และแน่นอนว่าโมเดลตอบคำถามไม่ได้ เพราะมันไม่รู้ว่าเรากำลังพูดถึงอะไร

ตอนนี้ให้พิมพ์ quit เพื่อออกจาก Agent

5. คำอธิบายการค้นหาไฟล์ด้วย Gemini

a1af82c360b915e9.png

การค้นหาไฟล์ใน Gemini เป็นการรวม 2 สิ่งเข้าด้วยกัน ได้แก่

  1. ระบบ RAG ที่มีการจัดการเต็มรูปแบบ: คุณจัดหาไฟล์จำนวนมาก และ Gemini File Search จะจัดการการแบ่งส่วน การฝัง การจัดเก็บ และการจัดทำดัชนีเวกเตอร์ให้คุณ
  2. "เครื่องมือ" ในความหมายของเอเจนต์: คุณสามารถเพิ่มเครื่องมือค้นหาไฟล์ของ Gemini เป็นเครื่องมือในคำจำกัดความของเอเจนต์ และชี้เครื่องมือไปยังที่เก็บการค้นหาไฟล์ได้

แต่ที่สำคัญคือ ฟีเจอร์นี้จะรวมอยู่ใน Gemini API เอง ซึ่งหมายความว่าคุณไม่จำเป็นต้องเปิดใช้ API เพิ่มเติมหรือติดตั้งใช้งานผลิตภัณฑ์แยกต่างหากเพื่อใช้ฟีเจอร์นี้ จึงout-of-the-box

ฟีเจอร์การค้นหาไฟล์ของ Gemini

คุณลักษณะบางส่วนมีดังนี้:

  • ระบบจะแยกรายละเอียดการแบ่งกลุ่ม การฝัง การจัดเก็บ และการจัดทำดัชนีออกจากคุณซึ่งเป็นนักพัฒนาแอป ซึ่งหมายความว่าคุณไม่จำเป็นต้องทราบ (หรือสนใจ) เกี่ยวกับโมเดลการฝัง (ซึ่งก็คือ Gemini Embeddings) หรือตำแหน่งที่จัดเก็บเวกเตอร์ผลลัพธ์ คุณไม่จำเป็นต้องตัดสินใจเกี่ยวกับฐานข้อมูลเวกเตอร์
  • โดยรองรับเอกสารหลายประเภทตั้งแต่แรก ซึ่งรวมถึงแต่ไม่จำกัดเพียงไฟล์ PDF, DOCX, Excel, SQL, JSON, สมุดบันทึก Jupyter, HTML, Markdown, CSV และแม้แต่ไฟล์ ZIP ดูรายการทั้งหมดได้ที่นี่ เช่น หากต้องการให้เอเจนต์ของคุณอ้างอิงไฟล์ PDF ที่มีข้อความ รูปภาพ และตาราง คุณก็ไม่จำเป็นต้องประมวลผลล่วงหน้าไฟล์ PDF เหล่านี้ เพียงอัปโหลด PDF ดิบ แล้วให้ Gemini จัดการส่วนที่เหลือ
  • เราสามารถเพิ่มข้อมูลเมตาที่กำหนดเองลงในไฟล์ที่อัปโหลดได้ ซึ่งจะมีประโยชน์อย่างยิ่งในการกรองไฟล์ที่เราต้องการให้เครื่องมือใช้ในเวลาเรียกใช้

ข้อมูลอยู่ที่ไหน

คุณอัปโหลดไฟล์บางรายการ เครื่องมือค้นหาไฟล์ของ Gemini ได้นำไฟล์เหล่านั้นมาสร้างเป็น Chunk จากนั้นก็สร้างการฝัง แล้วนำไปเก็บไว้... ที่ไหนสักแห่ง แต่ที่ไหนล่ะ

คำตอบคือ File Search Store ซึ่งเป็นคอนเทนเนอร์ที่มีการจัดการอย่างเต็มรูปแบบสำหรับ Embedding คุณไม่จำเป็นต้องรู้ (หรือสนใจ) ว่าระบบทำงานอย่างไรเบื้องหลัง สิ่งที่คุณต้องทำคือสร้างที่เก็บข้อมูล (โดยใช้โปรแกรม) แล้วอัปโหลดไฟล์ไปยังที่เก็บข้อมูลนั้น

ราคาถูก

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

โดยสิ่งเดียวที่คุณต้องจ่ายคือการสร้างการฝังในเวลาที่อัปโหลด/จัดทำดัชนี ณ เวลาที่เขียน ค่าใช้จ่ายนี้อยู่ที่ $0.15 ต่อ 1 ล้านโทเค็น ถือว่าถูกมาก

6. เราใช้การค้นหาไฟล์ใน Gemini อย่างไร

โดยมี 2 ระยะ ดังนี้

  1. สร้างและจัดเก็บการฝังในที่เก็บการค้นหาไฟล์
  2. ค้นหาที่เก็บการค้นหาไฟล์จาก Agent ของคุณ

ระยะที่ 1 - Jupyter Notebook เพื่อสร้างและจัดการที่เก็บการค้นหาไฟล์ของ Gemini

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

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

The Notebook

เปิดไฟล์ notebooks/file_search_store.ipynb ในโปรแกรมแก้ไข หากระบบแจ้งให้ติดตั้งส่วนขยาย Jupyter VS Code โปรดดำเนินการติดตั้ง

หากเปิดใน Cloud Shell Editor จะมีลักษณะดังนี้

b87aed3c36a44e81.png

มาลองรันทีละเซลล์กัน เริ่มต้นด้วยการเรียกใช้เซลล์ Setup ที่มีการนำเข้าที่จำเป็น หากคุณยังไม่เคยเรียกใช้ Notebook ระบบจะขอให้คุณติดตั้งส่วนขยายที่จำเป็น ในกรณีดังกล่าวให้ดำเนินการสร้างคีย์ตามที่ระบบแจ้ง จากนั้นระบบจะขอให้คุณเลือกเคอร์เนล เลือก "Python environments..." แล้วเลือก .venv ในเครื่องที่เราติดตั้งเมื่อเรียกใช้ make install ก่อนหน้านี้

1101585f7bd5040f.png

จากนั้นให้ทำดังนี้

  • เรียกใช้เซลล์ "ในเครื่องเท่านั้น" เพื่อดึงตัวแปรสภาพแวดล้อม
  • เรียกใช้เซลล์ "การเริ่มต้นไคลเอ็นต์" เพื่อเริ่มต้นไคลเอ็นต์ Gemini Gen AI
  • เรียกใช้เซลล์ "ดึงข้อมูล Store" ด้วยฟังก์ชัน Helper สำหรับการดึงข้อมูล Gemini File Search Store ตามชื่อ

ตอนนี้เราก็พร้อมที่จะสร้างร้านค้าแล้ว

  • เรียกใช้เซลล์ "สร้าง Store (ครั้งเดียว)" เพื่อสร้าง Store เราต้องทำขั้นตอนนี้เพียงครั้งเดียว หากโค้ดทํางานสําเร็จ คุณควรเห็นข้อความที่ระบุว่า "Created store: fileSearchStores/<someid>"
  • เรียกใช้เซลล์ "ดู Store" เพื่อดูเนื้อหาในนั้น ตอนนี้คุณควรเห็นว่าโฟลเดอร์มีเอกสาร 0 รายการ

เยี่ยมเลย ตอนนี้เรามีร้านค้า Gemini File Search ที่พร้อมใช้งานแล้ว

การอัปโหลดข้อมูล

เราต้องการอัปโหลด data/story.md ไปยังร้านค้า ทำสิ่งต่อไปนี้:

  • เรียกใช้เซลล์ที่ตั้งค่าเส้นทางการอัปโหลด ซึ่งจะชี้ไปยังโฟลเดอร์ data/
  • เรียกใช้เซลล์ถัดไป ซึ่งจะสร้างฟังก์ชันยูทิลิตีสำหรับการอัปโหลดไฟล์ไปยังร้านค้า โปรดทราบว่าโค้ดในเซลล์นี้ยังใช้ Gemini เพื่อดึงข้อมูลเมตาจากแต่ละไฟล์ที่อัปโหลดด้วย เราจะนำค่าที่แยกออกมาเหล่านี้ไปจัดเก็บเป็นข้อมูลเมตาที่กำหนดเองในร้านค้า (คุณไม่จำเป็นต้องทำ แต่การทำเช่นนี้ก็เป็นประโยชน์)
  • เรียกใช้เซลล์เพื่ออัปโหลดไฟล์ โปรดทราบว่าหากเราอัปโหลดไฟล์ที่มีชื่อเดียวกันมาก่อนแล้ว Notebook จะลบเวอร์ชันที่มีอยู่ก่อน จากนั้นจึงอัปโหลดเวอร์ชันใหม่ คุณควรเห็นข้อความที่ระบุว่าระบบอัปโหลดไฟล์แล้ว

4aeb3d5c91a66358.png

ระยะที่ 2 - ใช้ RAG การค้นหาไฟล์ของ Gemini ในเอเจนต์ของเรา

เราได้สร้างร้านค้าค้นหาไฟล์ Gemini และอัปโหลดเรื่องราวของเราไปยังร้านค้าดังกล่าว ตอนนี้ได้เวลาใช้ที่เก็บการค้นหาไฟล์ในเอเจนต์แล้ว มาสร้างเอเจนต์ใหม่ที่ใช้ที่เก็บการค้นหาไฟล์แทน Google Search กัน ดูที่ app/sdk_rag_agent.py

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

def get_store(client: genai.Client, store_name: str) -> types.FileSearchStore | None:
    """Retrieve a store by display name"""
    try:
        for a_store in client.file_search_stores.list():
            if a_store.display_name == store_name:
                return a_store
    except Exception as e:
        logger.error(f"Error listing stores: {e}")
    return None

เมื่อมี Store แล้ว การใช้งานก็ง่ายเพียงแค่แนบเป็นเครื่องมือให้กับเอเจนต์ ดังนี้

   file_search_tool = types.Tool(file_search=types.FileSearch(file_search_store_names=[store.name]))

การเรียกใช้ Agent RAG

เราเปิดตัวฟีเจอร์นี้ดังนี้

make sdk-rag-agent

# Or, without make:
uv run python app/sdk_rag_agent.py

มาถามคำถามที่ตัวแทนคนก่อนตอบไม่ได้กัน

> Who pilots the 'Too Many Pies' ship?

แล้วการตอบสนองล่ะ

15659914bcdee9c7.png

สำเร็จ! จากคำตอบ เราจะเห็นว่า

  • เราใช้ที่เก็บไฟล์เพื่อตอบคำถาม
  • พบข้อมูลที่เกี่ยวข้อง 5 ส่วน
  • คำตอบถูกต้อง

พิมพ์ quit เพื่อปิดตัวแทน

7. การเปลี่ยนเอเจนต์ให้ใช้ ADK

Agent Development Kit (ADK) ของ Google เป็นเฟรมเวิร์กแบบแยกส่วนและ SDK แบบโอเพนซอร์สสำหรับนักพัฒนาซอฟต์แวร์ในการสร้างเอเจนต์และระบบเอเจนต์ ซึ่งช่วยให้เราสร้างและประสานงานระบบแบบหลายเอเจนต์ได้อย่างง่ายดาย แม้ว่า ADK จะได้รับการเพิ่มประสิทธิภาพสำหรับ Gemini และระบบนิเวศของ Google แต่ก็ไม่ได้ขึ้นอยู่กับโมเดล ไม่ได้ขึ้นอยู่กับการติดตั้งใช้งาน และสร้างขึ้นเพื่อให้ใช้งานร่วมกับเฟรมเวิร์กอื่นๆ ได้ หากยังไม่เคยใช้ ADK ให้ไปที่เอกสาร ADK เพื่อดูข้อมูลเพิ่มเติม

ดูที่ app/basic_agent_adk/agent.py ในโค้ดตัวอย่างนี้ คุณจะเห็นว่าเราได้ติดตั้งใช้งานเอเจนต์ 2 รายการ

  1. root_agent ที่จัดการการโต้ตอบกับผู้ใช้ และที่ที่เราได้ให้คำสั่งหลักของระบบ
  2. SearchAgentแยกต่างหากที่ใช้ google.adk.tools.google_search เป็นเครื่องมือ

root_agentใช้ SearchAgent เป็นเครื่องมือ ซึ่งจะใช้งานได้โดยใช้บรรทัดต่อไปนี้

   tools=[AgentTool(agent=search_agent)],

พรอมต์ของระบบสำหรับเอเจนต์รูทจะมีลักษณะดังนี้

You are a helpful AI assistant designed to provide accurate and useful information.
If you don't know the answer, use the SearchAgent to perform a Google search.
Do not attempt to search more than ONCE.
If the search yields no relevant results or returns unrelated content, you MUST immediately respond with: "I could not find any information about that."
Do NOT retry the search with different terms. Do NOT ask for clarification. FAIL FAST.

ลองใช้ Agent

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

เราเปิดตัวอินเทอร์เฟซนี้ได้โดยการเรียกใช้คำสั่งต่อไปนี้

make adk-playground

# Or, without make:
uv run adk web app --port 8501 --reload_agents

โปรดทราบว่าคำสั่งจะชี้เครื่องมือ adk web ไปยังโฟลเดอร์ app ซึ่งจะค้นหาตัวแทน ADK ที่ใช้ root_agent โดยอัตโนมัติ มาลองใช้กันเลย

89218e7915011dd3.png

หลังจากผ่านไป 2-3 วินาที แอปพลิเคชันจะพร้อมใช้งาน หากคุณเรียกใช้โค้ดในเครื่อง ให้ชี้เบราว์เซอร์ไปที่ http://127.0.0.1:8501 หากเรียกใช้ใน Cloud Shell Editor ให้คลิก "ตัวอย่างเว็บ" แล้วเปลี่ยนพอร์ตเป็น 8501

1b416cc40d67d794.png

เมื่อ UI ปรากฏขึ้น ให้เลือก basic_agent_adk จากเมนูแบบเลื่อนลง แล้วเราจะถามคำถามได้ดังนี้

a2acc9901de49e20.gif

ตอนนี้ทุกอย่างไปได้สวย นอกจากนี้ เว็บ UI ยังแสดงให้คุณเห็นเมื่อเอเจนต์รูทมอบสิทธิ์ให้ SearchAgent ด้วย ฟีเจอร์นี้มีประโยชน์มาก

ตอนนี้เรามาถามคำถามที่ต้องใช้ความรู้เกี่ยวกับเรื่องราวของเรากัน

5a9f9ec06a29160.png

ลองดูเองได้เลย คุณควรพบว่าการทดสอบล้มเหลวอย่างรวดเร็วตามที่ระบุไว้

รวมที่เก็บการค้นหาไฟล์เข้ากับตัวแทน ADK

ตอนนี้เราจะนำทุกอย่างมารวมกัน เราจะเรียกใช้เอเจนต์ ADK ที่ใช้ได้ทั้ง File Search Store และ Google Search ดูรหัสใน app/rag_agent_adk/agent.py

โค้ดคล้ายกับตัวอย่างก่อนหน้า แต่มีข้อแตกต่างที่สำคัญเล็กน้อย ดังนี้

  1. เรามีเอเจนต์หลักที่ประสานงานกับเอเจนต์ผู้เชี่ยวชาญ 2 คน ได้แก่
  2. RagAgent: ผู้เชี่ยวชาญด้านความรู้เฉพาะทาง - ใช้ที่เก็บการค้นหาไฟล์ของ Gemini
  3. SearchAgent: ผู้เชี่ยวชาญด้านความรู้ทั่วไป - ใช้ Google Search
  4. เนื่องจาก ADK ยังไม่มี Wrapper ในตัวสำหรับ FileSearch เราจึงใช้คลาส Wrapper ที่กำหนดเอง FileSearchTool เพื่อ Wrap เครื่องมือ FileSearch ซึ่งจะแทรกการกำหนดค่า file_search_store_names ลงในคำขอโมเดลระดับต่ำ เราได้นำฟีเจอร์นี้ไปใช้ในสคริปต์แยกต่างหาก app/rag_agent_adk/tools_custom.py แล้ว

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

ข้อผิดพลาด - เกิดข้อผิดพลาด: 400 INVALID_ARGUMENT {"error": {"code": 400, "message": "ไม่รองรับการใช้เครื่องมือค้นหาและเครื่องมือค้นหาไฟล์ร่วมกัน", "status": "INVALID_ARGUMENT"}}

ข้อผิดพลาด: 400 INVALID_ARGUMENT {"error": {"code": 400, "message": "ไม่รองรับการใช้เครื่องมือค้นหาและเครื่องมือค้นหาไฟล์ร่วมกัน", "status": "INVALID_ARGUMENT"}}

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

คุณเป็นผู้ช่วย AI ที่มีประโยชน์ซึ่งออกแบบมาเพื่อให้ข้อมูลที่ถูกต้องและเป็นประโยชน์

คุณมีสิทธิ์เข้าถึงตัวแทนผู้เชี่ยวชาญ 2 คน ได้แก่

  1. RagAgent: สำหรับข้อมูลที่กำหนดเองจากฐานความรู้ภายใน
  2. SearchAgent: สำหรับข้อมูลทั่วไปจาก Google Search

ลองใช้ RagAgent ก่อนเสมอ หากวิธีนี้ไม่ได้คำตอบที่มีประโยชน์ ให้ลองใช้ SearchAgent

การทดสอบขั้นสุดท้าย

เรียกใช้เว็บ UI ของ ADK เหมือนเดิม

make adk-playground

# Or, without make:
uv run adk web app --port 8501 --reload_agents

คราวนี้ให้เลือก rag_agent_adk ใน UI มาดูการทำงานจริงกัน c4d2cdaa3257e115.gif

เราจะเห็นว่าระบบเลือกตัวแทนย่อยที่เหมาะสมตามคำถาม

8. บทสรุป

ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์

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

เราได้เรียนรู้สิ่งต่อไปนี้

  • การค้นหาไฟล์ใน Gemini เป็นโซลูชัน RAG ที่มีการจัดการซึ่งช่วยประหยัดเวลาและลดความซับซ้อน
  • ADK ช่วยให้เรามีโครงสร้างที่จำเป็นสำหรับแอปแบบหลายเอเจนต์ที่ซับซ้อน และมอบความสะดวกแก่นักพัฒนาซอฟต์แวร์ผ่านอินเทอร์เฟซต่างๆ เช่น Web UI
  • รูปแบบ "Agent-as-a-Tool" ช่วยแก้ปัญหาความเข้ากันได้ของเครื่องมือ

หวังว่าแล็บนี้จะเป็นประโยชน์กับคุณ แล้วพบกันใหม่โอกาสหน้าค่ะ