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
หากคุณมาที่นี่ คุณอาจทราบแล้วว่าการทดสอบ A/B คืออะไร แต่เรามาสรุปสั้นๆ กันอีกครั้งเผื่อไว้ LLM (เช่น Gemini) มีความสามารถยอดเยี่ยม แต่ก็มีปัญหาอยู่บ้าง ดังนี้
- ข้อมูลไม่อัปเดตอยู่เสมอ: โมเดลจะรู้เฉพาะสิ่งที่ได้เรียนรู้ระหว่างการฝึกเท่านั้น
- โมเดลไม่ได้รู้ทุกเรื่อง: แน่นอนว่าโมเดลมีขนาดใหญ่ แต่ก็ไม่ได้รอบรู้ทุกเรื่อง
- โมเดลไม่ทราบข้อมูลที่เป็นกรรมสิทธิ์ของคุณ: โมเดลมีความรู้ในวงกว้าง แต่ไม่ได้อ่านเอกสารภายใน บล็อก หรือคำขอใน Jira ของคุณ
ดังนั้นเมื่อคุณถามโมเดลในเรื่องที่โมเดลไม่รู้คำตอบ โดยปกติแล้วคุณจะได้รับคำตอบที่ไม่ถูกต้องหรือแม้แต่คำตอบที่แต่งขึ้น บ่อยครั้งที่โมเดลจะตอบคำตอบที่ไม่ถูกต้องนี้อย่างมั่นใจ เราเรียกอาการนี้ว่าอาการหลอนของ AI
วิธีหนึ่งคือการทิ้งข้อมูลที่เป็นกรรมสิทธิ์ของเราลงในบริบทการสนทนาโดยตรง ซึ่งใช้ได้กับข้อมูลจำนวนเล็กน้อย แต่จะกลายเป็นปัญหาอย่างรวดเร็วเมื่อคุณมีข้อมูลจำนวนมาก โดยเฉพาะอย่างยิ่ง การดำเนินการดังกล่าวจะทำให้เกิดปัญหาต่อไปนี้
- เวลาในการตอบสนอง: โมเดลตอบสนองช้าลงเรื่อยๆ
- สัญญาณเสื่อม หรือที่เรียกว่า "สูญหายกลางทาง": เมื่อโมเดลไม่สามารถจัดเรียงข้อมูลที่เกี่ยวข้องจากข้อมูลที่ไม่เกี่ยวข้องได้อีกต่อไป โมเดลจะละเว้นบริบทส่วนใหญ่
- ค่าใช้จ่าย: เนื่องจากโทเค็นมีค่าใช้จ่าย
- หน้าต่างบริบทเต็ม: ในขั้นตอนนี้ Gemini จะไม่ดำเนินการตามคำขอของคุณ
วิธีที่มีประสิทธิภาพมากกว่าในการแก้ไขสถานการณ์นี้คือการใช้ RAG ซึ่งเป็นเพียงกระบวนการค้นหาข้อมูลที่เกี่ยวข้องจากแหล่งข้อมูลของคุณ (โดยใช้การจับคู่เชิงความหมาย) และป้อนข้อมูลที่เกี่ยวข้องให้กับโมเดลพร้อมกับคำถามของคุณ ซึ่งจะช่วยให้โมเดลเข้าใจความเป็นจริงของคุณ
โดยจะทำงานด้วยการนำเข้าข้อมูลภายนอก แบ่งข้อมูลออกเป็นกลุ่มๆ แปลงข้อมูลเป็นเวกเตอร์ฝัง จากนั้นจัดเก็บและจัดทำดัชนีเวกเตอร์ฝังเหล่านั้นลงในฐานข้อมูลเวกเตอร์ที่เหมาะสม

ดังนั้นในการใช้ RAG เรามักจะต้องกังวลเกี่ยวกับสิ่งต่อไปนี้
- การสร้างฐานข้อมูลเวกเตอร์ (Pinecone, Weaviate, Postgres ที่มี pgvector...)
- การเขียนสคริปต์การแบ่งกลุ่มเพื่อแบ่งเอกสาร (เช่น PDF, มาร์กดาวน์ หรืออื่นๆ)
- สร้างการฝัง (เวกเตอร์) สำหรับก้อนข้อมูลเหล่านั้นโดยใช้โมเดลการฝัง
- จัดเก็บเวกเตอร์ในฐานข้อมูลเวกเตอร์
แต่เพื่อนก็ไม่ควรปล่อยให้เพื่อนทำอะไรที่ซับซ้อนเกินไป จะเกิดอะไรขึ้นหากฉันบอกว่ามีวิธีที่ง่ายกว่านี้
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 คุณจะเห็นผลลัพธ์ดังนี้

สร้างคีย์ 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 จริงของคุณ ตอนนี้ควรมีลักษณะดังนี้

ตอนนี้ให้ตรวจสอบว่าระบบโหลดตัวแปรสภาพแวดล้อมแล้ว โดยทำได้โดยเรียกใช้คำสั่งต่อไปนี้
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 เพื่อค้นหาราคาปัจจุบัน

ทีนี้มาลองถามคำถามที่โมเดลไม่รู้คำตอบกัน โดยตัวแทนต้องอ่านเรื่องราวของเรา
> Who pilots the 'Too Many Pies' ship?
ซึ่งอาจล้มเหลวหรือแม้แต่ให้คำตอบที่ไม่สมเหตุสมผล มาดูกัน

และแน่นอนว่าโมเดลตอบคำถามไม่ได้ เพราะมันไม่รู้ว่าเรากำลังพูดถึงอะไร
ตอนนี้ให้พิมพ์ quit เพื่อออกจากตัวแทน
5. คำอธิบายการค้นหาไฟล์ด้วย Gemini

การค้นหาไฟล์ของ Gemini เป็นการรวม 2 สิ่งเข้าด้วยกัน ได้แก่
- ระบบ RAG ที่มีการจัดการครบวงจร: คุณระบุไฟล์จำนวนมาก และเครื่องมือค้นหาไฟล์ของ Gemini จะจัดการการแบ่งส่วน การฝัง การจัดเก็บ และการจัดทำดัชนีเวกเตอร์ให้คุณ
- "เครื่องมือ" ในความหมายของ Agent: คุณสามารถเพิ่มเครื่องมือค้นหาไฟล์ของ Gemini เป็นเครื่องมือในคำจำกัดความของ Agent และชี้เครื่องมือไปยังที่เก็บการค้นหาไฟล์ได้
แต่ที่สำคัญคือ ฟีเจอร์นี้จะรวมอยู่ใน Gemini API เอง ซึ่งหมายความว่าคุณไม่จำเป็นต้องเปิดใช้ API เพิ่มเติมหรือทำให้ใช้งานได้ผลิตภัณฑ์แยกต่างหากเพื่อใช้ฟีเจอร์นี้ จึงเป็นout-of-the-box
ฟีเจอร์การค้นหาไฟล์ของ Gemini
คุณลักษณะบางส่วนมีดังนี้:
- ระบบจะแยกรายละเอียดการแบ่งกลุ่ม การฝัง การจัดเก็บ และการจัดทำดัชนีออกจากคุณซึ่งเป็นนักพัฒนาแอป ซึ่งหมายความว่าคุณไม่จำเป็นต้องทราบ (หรือสนใจ) เกี่ยวกับโมเดลการฝัง (ซึ่งก็คือ Gemini Embeddings) หรือตำแหน่งที่จัดเก็บเวกเตอร์ผลลัพธ์ คุณไม่จำเป็นต้องตัดสินใจเกี่ยวกับฐานข้อมูลเวกเตอร์
- โดยรองรับเอกสารหลายประเภทตั้งแต่แรก ซึ่งรวมถึงแต่ไม่จำกัดเพียง PDF, DOCX, Excel, SQL, JSON, สมุดบันทึก Jupyter, HTML, Markdown, CSV และแม้แต่ไฟล์ ZIP ดูรายการทั้งหมดได้ที่นี่ ดังนั้น หากคุณต้องการให้การเชื่อมต่อแหล่งข้อมูลของ Agent ทำงานโดยอิงตามไฟล์ PDF ที่มีข้อความ รูปภาพ และตาราง คุณก็ไม่จำเป็นต้องประมวลผลล่วงหน้าไฟล์ PDF เหล่านี้ เพียงอัปโหลดไฟล์ PDF ดิบ แล้วให้ Gemini จัดการส่วนที่เหลือ
- เราสามารถเพิ่มข้อมูลเมตาที่กำหนดเองลงในไฟล์ที่อัปโหลดได้ ซึ่งจะมีประโยชน์อย่างยิ่งในการกรองไฟล์ที่เราต้องการให้เครื่องมือใช้ในเวลาเรียกใช้
ข้อมูลอยู่ที่ไหน
คุณอัปโหลดไฟล์บางรายการ เครื่องมือค้นหาไฟล์ของ Gemini ได้นำไฟล์เหล่านั้นมาสร้างเป็นก้อน จากนั้นก็สร้างการฝัง แล้วนำไปเก็บไว้... ที่ไหนสักแห่ง แต่ที่ไหนล่ะ
คำตอบคือ File Search Store ซึ่งเป็นคอนเทนเนอร์ที่มีการจัดการครบวงจรสำหรับ Embedding คุณไม่จำเป็นต้องรู้ (หรือสนใจ) ว่าระบบทำงานอย่างไรเบื้องหลัง สิ่งที่คุณต้องทำคือสร้างที่เก็บข้อมูล (โดยใช้โปรแกรม) แล้วอัปโหลดไฟล์ไปยังที่เก็บข้อมูลนั้น
ราคาถูก
การจัดเก็บและการค้นหา Embedding จะไม่มีค่าใช้จ่าย คุณจึงจัดเก็บ Embedding ได้นานเท่าที่ต้องการโดยไม่ต้องชำระเงินสำหรับพื้นที่เก็บข้อมูลดังกล่าว
โดยสิ่งเดียวที่คุณต้องจ่ายคือการสร้างการฝังในเวลาที่อัปโหลด/จัดทำดัชนี ในขณะที่เขียน ค่าใช้จ่ายนี้อยู่ที่ $0.15 ต่อ 1 ล้านโทเค็น ซึ่งถือว่าถูกมาก
6. เราใช้การค้นหาไฟล์ Gemini อย่างไร
โดยมี 2 ระยะ ดังนี้
- สร้างและจัดเก็บการฝังในที่เก็บการค้นหาไฟล์
- ค้นหาที่เก็บการค้นหาไฟล์จาก Agent
ระยะที่ 1 - Jupyter Notebook เพื่อสร้างและจัดการที่เก็บข้อมูลการค้นหาไฟล์ของ Gemini
ระยะนี้เป็นระยะที่คุณจะทำในตอนแรก และทำทุกครั้งที่ต้องการอัปเดตร้านค้า เช่น เมื่อคุณมีเอกสารใหม่ที่จะเพิ่ม หรือเมื่อเอกสารต้นฉบับมีการเปลี่ยนแปลง
คุณไม่จำเป็นต้องรวมเฟสนี้ไว้ในแอปพลิเคชันแบบเป็น Agent ที่ทำให้ใช้งานได้ ได้ คุณทำได้หากต้องการ ตัวอย่างเช่น หากคุณต้องการสร้าง UI บางอย่างสำหรับผู้ใช้ที่เป็นผู้ดูแลระบบของแอปพลิเคชันเอเจนต์ แต่ในหลายๆ ครั้ง การมีโค้ดเล็กๆ น้อยๆ ที่คุณเรียกใช้ตามต้องการก็เพียงพอแล้ว และวิธีที่ยอดเยี่ยมในการเรียกใช้โค้ดนี้ตามต้องการคืออะไร สมุดบันทึก Jupyter
The Notebook
เปิดไฟล์ notebooks/file_search_store.ipynb ในโปรแกรมแก้ไข หากระบบแจ้งให้ติดตั้งส่วนขยาย Jupyter VS Code โปรดดำเนินการติดตั้ง
หากเราเปิดไฟล์ใน Cloud Shell Editor ไฟล์จะมีลักษณะดังนี้

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

จากนั้นให้ทำดังนี้
- เรียกใช้เซลล์ "ในเครื่องเท่านั้น" เพื่อดึงตัวแปรสภาพแวดล้อม
- เรียกใช้เซลล์ "การเริ่มต้นไคลเอ็นต์" เพื่อเริ่มต้นไคลเอ็นต์ Gemini Gen AI
- เรียกใช้เซลล์ "ดึงข้อมูล Store" ด้วยฟังก์ชันตัวช่วยสำหรับการดึงข้อมูล Gemini File Search Store ตามชื่อ
ตอนนี้เราก็พร้อมที่จะสร้างร้านค้าแล้ว
- เรียกใช้เซลล์ "สร้าง Store (ครั้งเดียว)" เพื่อสร้าง Store เราต้องทำขั้นตอนนี้เพียงครั้งเดียว หากโค้ดทํางานสําเร็จ คุณควรเห็นข้อความที่ระบุว่า
"Created store: fileSearchStores/<someid>" - เรียกใช้เซลล์ "ดู Store" เพื่อดูว่ามีอะไรอยู่ ตอนนี้คุณควรเห็นว่าโฟลเดอร์มีเอกสาร 0 รายการ
เยี่ยมเลย ตอนนี้เรามีร้านค้า Gemini File Search ที่พร้อมใช้งานแล้ว
การอัปโหลดข้อมูล
เราต้องการอัปโหลด data/story.md ไปยังร้านค้า ทำสิ่งต่อไปนี้:
- เรียกใช้เซลล์ที่ตั้งค่าเส้นทางการอัปโหลด ซึ่งจะชี้ไปยังโฟลเดอร์
data/ - เรียกใช้เซลล์ถัดไป ซึ่งจะสร้างฟังก์ชันยูทิลิตีสำหรับการอัปโหลดไฟล์ไปยังร้านค้า โปรดทราบว่าโค้ดในเซลล์นี้ยังใช้ Gemini เพื่อดึงข้อมูลเมตาจากแต่ละไฟล์ที่อัปโหลดด้วย เราจะนำค่าที่แยกออกมาเหล่านี้ไปจัดเก็บเป็นข้อมูลเมตาที่กำหนดเองในร้านค้า (คุณไม่จำเป็นต้องทำ แต่การทำเช่นนี้จะเป็นประโยชน์)
- เรียกใช้เซลล์เพื่ออัปโหลดไฟล์ โปรดทราบว่าหากเราอัปโหลดไฟล์ที่มีชื่อเดียวกันก่อนหน้านี้ Notebook จะลบเวอร์ชันที่มีอยู่ก่อน แล้วจึงอัปโหลดเวอร์ชันใหม่ คุณควรเห็นข้อความที่ระบุว่าระบบอัปโหลดไฟล์แล้ว

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

สำเร็จ! จากคำตอบ เราจะเห็นว่า
- เราใช้ที่เก็บไฟล์เพื่อตอบคำถาม
- พบข้อมูลที่เกี่ยวข้อง 5 รายการ
- คำตอบถูกต้อง
พิมพ์ quit เพื่อปิดตัวแทน
7. การแปลงเอเจนต์ให้ใช้ ADK
Agent Development Kit (ADK) ของ Google เป็นเฟรมเวิร์กแบบแยกส่วนและ SDK แบบโอเพนซอร์สสำหรับนักพัฒนาซอฟต์แวร์ในการสร้างเอเจนต์และระบบที่ใช้เอเจนต์ ซึ่งช่วยให้เราสร้างและประสานงานระบบแบบหลายเอเจนต์ได้อย่างง่ายดาย แม้ว่า ADK จะได้รับการเพิ่มประสิทธิภาพสําหรับ Gemini และระบบนิเวศของ Google แต่ก็ไม่ได้ขึ้นอยู่กับโมเดล ไม่ได้ขึ้นอยู่กับการติดตั้งใช้งาน และสร้างขึ้นเพื่อให้ใช้งานร่วมกับเฟรมเวิร์กอื่นๆ ได้ หากยังไม่เคยใช้ ADK ให้ไปที่เอกสาร ADK เพื่อดูข้อมูลเพิ่มเติม
Basic ADK Agent พร้อม Google Search
ดูข้อมูลได้ที่ app/basic_agent_adk/agent.py ในโค้ดตัวอย่างนี้ คุณจะเห็นว่าเราได้ติดตั้งใช้งานเอเจนต์ 2 รายการ
root_agentที่จัดการการโต้ตอบกับผู้ใช้ และที่ที่เราได้ให้คำสั่งหลักของระบบ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 โดยอัตโนมัติ มาลองใช้กันเลย

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

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

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

ลองดูเองได้เลย คุณจะเห็นว่าการทดสอบล้มเหลวอย่างรวดเร็วตามที่ระบุไว้
รวม File Search Store เข้ากับ Agent ของ ADK
ตอนนี้เราจะนำทุกอย่างมารวมกัน เราจะเรียกใช้ Agent ของ ADK ที่ใช้ได้ทั้ง File Search Store และ Google Search ดูรหัสใน app/rag_agent_adk/agent.py
โค้ดคล้ายกับตัวอย่างก่อนหน้า แต่มีข้อแตกต่างที่สำคัญเล็กน้อย ดังนี้
- เรามีเอเจนต์หลักที่ประสานงานเอเจนต์ผู้เชี่ยวชาญ 2 รายการ ได้แก่
- RagAgent: ผู้เชี่ยวชาญด้านความรู้เฉพาะตัว - ใช้ที่เก็บเครื่องมือค้นหาไฟล์ของ Gemini
- SearchAgent: ผู้เชี่ยวชาญด้านความรู้ทั่วไป - ใช้ Google Search
- เนื่องจาก ADK ยังไม่มี Wrapper ในตัวสำหรับ
FileSearchเราจึงใช้คลาส Wrapper ที่กำหนดเองFileSearchToolเพื่อ Wrap เครื่องมือ FileSearch ซึ่งจะแทรกการกำหนดค่าfile_search_store_namesลงในคำขอโมเดลระดับต่ำ เราได้นำฟีเจอร์นี้ไปใช้ในสคริปต์แยกต่างหากapp/rag_agent_adk/tools_custom.pyแล้ว
นอกจากนี้ ยังมีข้อควรระวังที่ต้องทราบด้วย ในขณะที่เขียนนี้ คุณไม่สามารถใช้เครื่องมือ GoogleSearch และเครื่องมือ FileSearch ในคำขอเดียวกันกับ Agent เดียวกันได้ หากพยายาม คุณจะได้รับข้อผิดพลาดดังนี้
ข้อผิดพลาด - เกิดข้อผิดพลาด: 400 INVALID_ARGUMENT {"error": {"code": 400, "message": "ไม่รองรับการใช้เครื่องมือค้นหาและเครื่องมือค้นหาไฟล์ร่วมกัน", "status": "INVALID_ARGUMENT"}}
ข้อผิดพลาด: 400 INVALID_ARGUMENT {"error": {"code": 400, "message": "ไม่รองรับการใช้เครื่องมือค้นหาและเครื่องมือค้นหาไฟล์ร่วมกัน", "status": "INVALID_ARGUMENT"}}
วิธีแก้คือการใช้เอเจนต์ผู้เชี่ยวชาญ 2 คนเป็นเอเจนต์ย่อยแยกกัน และส่งไปยังเอเจนต์รูทโดยใช้รูปแบบเอเจนต์เป็นเครื่องมือ และที่สำคัญ คำสั่งของระบบของเอเจนต์รูทจะให้คำแนะนำที่ชัดเจนมากในการใช้ RagAgent ก่อน
คุณเป็นผู้ช่วย AI ที่มีประโยชน์ซึ่งออกแบบมาเพื่อให้ข้อมูลที่ถูกต้องและเป็นประโยชน์
คุณมีสิทธิ์เข้าถึงตัวแทนผู้เชี่ยวชาญ 2 คนดังนี้
- RagAgent: สำหรับข้อมูลที่กำหนดเองจากฐานความรู้ภายใน
- 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 มาดูการทำงานจริงกัน 
เราจะเห็นว่าระบบเลือกตัวแทนย่อยที่เหมาะสมตามคำถาม
8. บทสรุป
ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์
คุณได้เปลี่ยนจากสคริปต์ง่ายๆ เป็นระบบที่เปิดใช้ RAG แบบหลายเอเจนต์ โดยไม่ต้องใช้โค้ดการฝังแม้แต่บรรทัดเดียว และไม่ต้องติดตั้งใช้งานฐานข้อมูลเวกเตอร์
เราได้เรียนรู้สิ่งต่อไปนี้
- การค้นหาไฟล์ของ Gemini เป็นโซลูชัน RAG ที่มีการจัดการซึ่งช่วยประหยัดเวลาและลดความซับซ้อน
- ADK ช่วยให้เรามีโครงสร้างที่จำเป็นสำหรับแอปแบบหลายเอเจนต์ที่ซับซ้อน และมอบความสะดวกแก่นักพัฒนาซอฟต์แวร์ผ่านอินเทอร์เฟซต่างๆ เช่น Web UI
- รูปแบบ "Agent-as-a-Tool" ช่วยแก้ปัญหาความเข้ากันได้ของเครื่องมือ
หวังว่าแล็บนี้จะเป็นประโยชน์กับคุณ แล้วพบกันใหม่โอกาสหน้าค่ะ