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

1. บทนำ

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

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

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

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

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

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 ไหม หากยังไม่เคยใช้ ตอนนี้ก็ถึงเวลาที่เหมาะสมแล้วที่จะลองใช้)

โปรดทราบว่าที่เก็บมีเรื่องราวตัวอย่าง "การบุกรุกรูหนอน" ในไฟล์ 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 ดูขั้นตอนเฉพาะได้ในคู่มือนี้

เมื่อสร้างคีย์ 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 เพื่อออกจากตัวแทน

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

a1af82c360b915e9.png

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

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

แต่ที่สำคัญคือ ฟีเจอร์นี้จะรวมอยู่ใน 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 จากนั้นก็สร้าง Embedding แล้วนำไปเก็บไว้... ที่ไหนสักแห่ง แต่ที่ไหนล่ะ

คำตอบคือ 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" ด้วยฟังก์ชันตัวช่วยในการดึงข้อมูล Gemini File Search Store ตามชื่อ

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

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

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

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

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

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

4aeb3d5c91a66358.png

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

เราได้สร้าง Gemini File Search Store และอัปโหลดเรื่องราวของเราไปยัง Store ดังกล่าว ตอนนี้ได้เวลาใช้ที่เก็บการค้นหาไฟล์ในเอเจนต์แล้ว มาสร้างเอเจนต์ใหม่ที่ใช้ที่เก็บการค้นหาไฟล์แทน 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 แล้ว การใช้งานก็ง่ายเพียงแค่แนบเป็นเครื่องมือกับ Agent ของเรา ดังนี้

   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. การแปลง Agent ให้ใช้ 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 ซึ่งจะค้นหา Agent ของ 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

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

รวม File Search Store เข้ากับ Agent ของ ADK

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

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

  1. เรามี Root Agent ที่ควบคุม Agent ผู้เชี่ยวชาญ 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"}}

โซลูชันคือการติดตั้งใช้งาน Agent ผู้เชี่ยวชาญ 2 รายเป็น Agent ย่อยแยกกัน และส่งไปยัง Root Agent โดยใช้รูปแบบ Agent-as-a-Tool และที่สำคัญ คำสั่งของระบบของเอเจนต์รูทจะให้คำแนะนำที่ชัดเจนมากในการใช้ 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 แบบหลาย Agent โดยไม่ต้องใช้โค้ดการฝังแม้แต่บรรทัดเดียว และไม่ต้องใช้ฐานข้อมูลเวกเตอร์

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

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

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