การสร้าง AI Agent ถือเป็นวิวัฒนาการที่สำคัญในการพัฒนาซอฟต์แวร์ ซึ่งช่วยให้ระบบสามารถใช้การให้เหตุผลที่ซับซ้อนและทำงานได้อย่างอิสระมากขึ้น อย่างไรก็ตาม โมเดลพื้นฐานที่ขับเคลื่อนระบบเหล่านี้มีข้อจำกัดโดยธรรมชาติ จากข้อมูลฝึกฝน หากไม่มีบริบทภายนอก ระบบจะไม่มีข้อมูลเกี่ยวกับ สภาพแวดล้อมแบบเรียลไทม์ เช่น สภาพอากาศภายนอกในปัจจุบัน ร้านค้า ในพื้นที่เปิดทำการอยู่หรือไม่ หรือเส้นทางที่มีประสิทธิภาพที่สุดไปยังจุดหมาย
เอกสารนี้จะอธิบายรายละเอียดวิธีเชื่อมช่องว่างระหว่างการให้เหตุผลแบบคงที่กับความเป็นจริงแบบไดนามิกโดยการอิงเอเจนต์ AI กับข้อมูลเชิงพื้นที่ที่เชื่อถือได้จาก Google Maps คุณจะได้ทราบว่าเหตุใดการอ้างอิงเชิงพื้นที่จึงมีความสําคัญอย่างยิ่งสําหรับงานในโลกจริง วิธีที่ Model Context Protocol (MCP) ช่วยลดความซับซ้อนในการผสานรวมเครื่องมือ และ วิธีสร้าง Agent วางแผนการเดินทางโดยใช้ MCP แบบ Google Maps Grounding Lite
เหตุใด Agent จึงต้องอิงตามข้อมูลแผนที่
การเปลี่ยนจากซอฟต์แวร์แบบเดิมไปเป็นเวิร์กโฟลว์แบบเอเจนต์คือการเปลี่ยนจากการออกแบบที่แน่นอนไปเป็นการจัดการแบบกลุ่มที่อิงตามความน่าจะเป็น เรากำลังเปลี่ยนจากระบบที่เพียงแค่รู้เรื่องต่างๆ ไปเป็นเครื่องมือการดำเนินการเชิงรุกที่ลงมือทำจริง เมื่อแอปพลิเคชันก้าวข้ามเส้นนั้นและดำเนินการในโลกแห่งความเป็นจริง ความเสี่ยงต่อความถูกต้องจะเปลี่ยนไปโดยสิ้นเชิง
โมเดลภาษาขนาดใหญ่ (LLM) เข้าใจตรรกะ แต่หน่วยความจำภายในเป็นภาพรวมในอดีต ตัวอย่างเช่น หากตัวแทนจัดการซัพพลายเชนและยืนยันความพร้อมของผู้ให้บริการหรือเส้นทางถนนอย่างไม่ถูกต้อง คุณจะเห็นว่ามีการใช้น้ำมันอย่างสิ้นเปลือง SLA ไม่เป็นไปตามที่กำหนด และธุรกิจหยุดชะงักอย่างแท้จริง และในสถาปัตยกรรมแบบหลายเอเจนต์ คุณจะพบปัญหาการหลอนแบบต่อเนื่อง หากเอเจนต์ตัวหนึ่งในเชนเกิดอาการหลอนและส่งข้อมูลที่ไม่ถูกต้องไปยังเอเจนต์ตัวที่ 2 ระบบทั้งหมดจะเริ่มให้คำมั่นสัญญาในโลกแห่งความเป็นจริงโดยอิงตามคำโกหก การปกครองตนเองที่ไม่มีความจริง จะกลายเป็นภาระที่ยิ่งใหญ่
การอ้างอิงกำหนดให้ Agent ต้องก้าวข้ามน้ำหนักการฝึก การบังคับให้ AI ดึงข้อเท็จจริงที่ตรวจสอบได้และเป็นข้อมูลเรียลไทม์ เช่น ข้อมูลสถานที่และข้อมูลการกำหนดเส้นทาง จะช่วยให้เอเจนต์มีข้อมูลแบบเรียลไทม์ ซึ่งจะเปลี่ยนการคาดคะเนทางสถิติเป็นการตัดสินใจด้านการปฏิบัติงานที่มีข้อมูล
เหตุผลที่ควรใช้ MCP
Model Context Protocol (MCP) เป็นมาตรฐานแบบเปิดที่ออกแบบมาเพื่อให้การผสานรวมเครื่องมือและข้อมูลเป็นแบบพลักแอนด์เพลย์
ในอดีต การเชื่อมต่อโมเดล AI กับ API ภายนอกต้องมีการเขียน Wrapper ที่เฉพาะเจาะจงและเข้มงวด คุณต้องจัดการการจัดรูปแบบ การแยกวิเคราะห์ข้อผิดพลาด และการแปลการเรียกใช้เครื่องมือด้วยตนเองสำหรับความสามารถแต่ละอย่าง
MCP จะกำหนดเลเยอร์การผสานรวมนี้ให้เป็นมาตรฐาน การใช้ไคลเอ็นต์ MCP จะช่วยให้แอปพลิเคชันค้นหาและเรียกใช้เครื่องมือที่เซิร์ฟเวอร์จัดหาให้แบบไดนามิกผ่านโปรโตคอลแบบรวมได้ ซึ่งจะเปลี่ยนโฟกัสของนักพัฒนาแอปจากการเขียนตรรกะการผสานรวม API ที่ซ้ำซ้อนไปเป็นการออกแบบเครือข่ายเอเจนต์ระดับสูง
MCP ของ Google Maps Grounding Lite
MCP ของ Google Maps Grounding Lite เป็นเซิร์ฟเวอร์ MCP ที่มีการจัดการอย่างเต็มรูปแบบและโฮสต์โดย Google ซึ่งผสานรวมเข้ากับเฟรมเวิร์กแบบเอเจนต์ที่เข้ากันได้โดยตรง
ปัจจุบันเซิร์ฟเวอร์มีเครื่องมือหลัก 3 อย่างสำหรับการอ้างอิง ดังนี้
- ค้นหาสถานที่: ขอข้อมูลเกี่ยวกับสถานที่และรับข้อมูลสรุปเกี่ยวกับสถานที่ที่ AI สร้างขึ้น รวมถึงรหัสสถานที่ พิกัดละติจูดและลองจิจูด และลิงก์ Google Maps สำหรับแต่ละสถานที่ที่รวมอยู่ในข้อมูลสรุป คุณสามารถใช้รหัสสถานที่และพิกัดละติจูดและลองจิจูดที่ได้จาก API อื่นๆ ของ Google Maps Platform เพื่อแสดงสถานที่บนแผนที่
- ค้นหาสภาพอากาศ: ขอข้อมูลเกี่ยวกับสภาพอากาศและแสดงสภาพอากาศปัจจุบัน พยากรณ์อากาศรายชั่วโมง และพยากรณ์อากาศรายวัน
- คำนวณเส้นทาง: ขอข้อมูลเกี่ยวกับเส้นทางการขับรถหรือเดินระหว่าง 2 สถานที่ และแสดงข้อมูลระยะทางและระยะเวลาของเส้นทาง
หากต้องการเข้าถึงบริการ คุณจะใช้คีย์ API หรือ OAuth ก็ได้ Google Maps Platform มีคีย์ API สำหรับการสาธิตที่ไม่มีค่าใช้จ่ายซึ่งออกแบบมาโดยเฉพาะเพื่อช่วยให้นักพัฒนาเริ่มสร้างต้นแบบได้ทันที
แนวทางปฏิบัติแนะนำในการผสานรวม MCP ที่อิงตามแผนที่
ยึดคำสั่งของระบบของเอเจนต์ตามกลยุทธ์หลักต่อไปนี้เพื่อเพิ่มความเกี่ยวข้องของข้อมูลและขจัดภาพหลอนเชิงโครงสร้าง * ระบุอย่างชัดเจนและเฉพาะเจาะจง: สั่งให้เอเจนต์ใช้ตำแหน่งที่แน่นอน "เซ็นทรัลพาร์ก นิวยอร์ก" ให้ผลลัพธ์ที่ดีกว่า "นิวยอร์ก" เช่นเดียวกับที่ "ปารีส ฝรั่งเศส" ช่วยป้องกันความสับสนกับปารีส เท็กซัส
แยกคำค้นหาทั่วไป: สำหรับคำขอที่คลุมเครือ เช่น "ไอเดียสำหรับคืนออกเดต" ให้แจ้งเอเจนต์แยกงานออกเป็นการค้นหาย่อยที่เฉพาะเจาะจง เช่น "ร้านอาหารโรแมนติก" "โรงภาพยนตร์" หรือ "ค็อกเทลบาร์"
การค้นหาจากประเภทก่อน การสำรวจทีหลัง: ทำการค้นหาจากประเภทในวงกว้างก่อน (เช่น "ร้านอาหารญี่ปุ่นที่มีทางเข้าสำหรับผู้พิการซึ่งเปิดในวันอาทิตย์") แสดงตัวเลือกต่อผู้ใช้ จากนั้นเรียกใช้คำค้นหาติดตามผลเพื่อดึงรายละเอียดที่เฉพาะเจาะจง เช่น หมายเลขโทรศัพท์ของสถานที่ที่เลือก
อย่าสร้างรหัสสถานที่ขึ้นมาเอง: รหัสสถานที่คือเนื้อเยื่อที่เชื่อมต่อที่สำคัญในบริการต่างๆ ของ Google Maps Platform ตรวจสอบว่าตัวแทนของคุณทราบว่าต้องใช้เฉพาะรหัสสถานที่ที่เครื่องมือ search_places แสดงอย่างชัดเจนเท่านั้น ไม่ใช่พยายามสร้างรหัสสถานที่ขึ้นมาเอง
ติดตั้งใช้งาน Agent วางแผนการเดินทางด้วย Google ADK
ส่วนนี้แสดงวิธีสร้าง Agent วางแผนการเดินทางโดยใช้เฟรมเวิร์ก Agent Development Kit (ADK) ของ Google หากยังไม่ได้ติดตั้ง ADK ให้ดูเอกสารสำหรับนักพัฒนาซอฟต์แวร์ Google ADK
การผสานรวมเซิร์ฟเวอร์ MCP ของ Maps เข้ากับเฟรมเวิร์กของ Agent เช่น ADK นั้น ทำได้ง่าย ADK จะจัดการความซับซ้อนของการจัดการบริบท เพื่อให้คุณมุ่งเน้นที่ลักษณะการทำงานของ Agent ได้
โปรเจ็กต์ตัวอย่างมีโครงสร้างดังนี้
travel-concierge-google-maps-mcp/
├── travel_planner_agent/
├── agent.py # main agent code
├── .env # API keys
├── __init__.py
├── skills/travel-concierge/
├── SKILL.md # Agent skill
ตัวอย่าง agent.py แก้ไขตามกรณีการใช้งานของคุณ
import os
import pathlib
import logging
from datetime import date
from dotenv import load_dotenv
from google.adk.agents.llm_agent import Agent
from google.adk.skills import load_skill_from_dir
from google.adk.tools import skill_toolset
from google.adk.tools.mcp_tool import McpToolset
from google.adk.planners import BuiltInPlanner
from google.genai import types
from google.adk.tools.mcp_tool.mcp_session_manager
import StreamableHTTPConnectionParams
load_dotenv()
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
GOOGLE_MAPS_API_KEY = os.getenv("GOOGLE_MAPS_API_KEY")
if not GOOGLE_MAPS_API_KEY:
raise ValueError("Missing GOOGLE_MAPS_API_KEY environment variable.")
current_date = date.today().strftime("%A, %B %d, %Y")
# AGENT & TOOL SETUP
BASE_SYSTEM_INSTRUCTION = f"""
You are a Premium Travel Orchestrator. Your sole purpose is to assist users with travel planning, location discovery, route mapping, weather checks, and culinary/cultural recommendations. The current system date is {current_date}.
# 1. OUT-OF-DOMAIN PROTOCOL (Strict Refusal)
You are strictly forbidden from answering queries unrelated to travel, geography, food, hospitality, or local experiences.
If a user asks about coding (e.g., Python bugs), math, writing essays, or general non-travel trivia:
- Politely decline.
- Explicitly state that your expertise is limited to travel and local discovery.
- Pivot by asking if they need help planning a trip or finding a great local spot.
# 2. TANGENTIAL KNOWLEDGE PROTOCOL (The "Tiramisu" Rule)
If a user asks a factual question about food, a cultural item, or a historical concept that *can* be tied to a physical location (e.g., "What is tiramisu?", "What is Gothic architecture?"):
- Provide a brief, helpful 1-2 sentence explanation of the concept.
- IMMEDIATELY pivot to your primary domain. Ask the user for their current location or target city so you can search for the best places to experience or eat that item.
# 3. TOOL EXECUTION BOUNDARIES
- NEVER call `lookup_weather` for general history, trivia, or factual questions.
- ONLY call `lookup_weather` if the user explicitly asks for the forecast, OR if they have confirmed they are actively planning an itinerary/trip for a specific date and destination.
"""
travel_skill = load_skill_from_dir(
pathlib.Path(__file__).parent / "skills" / "travel-concierge"
)
maps_mcp_toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://mapstools.googleapis.com/mcp",
headers={
"X-Goog-Api-Key": GOOGLE_MAPS_API_KEY,
"Content-Type": "application/json",
"Accept": "application/json, text/event-stream"
}
)
)
my_skill_toolset = skill_toolset.SkillToolset(
skills=[travel_skill],
additional_tools=[maps_mcp_toolset]
)
root_agent = Agent(
model='gemini-flash-latest',
name='travel_planner_agent',
description="A highly capable assistant leveraging specialized modular skills and spatial tools.",
instruction=BASE_SYSTEM_INSTRUCTION,
planner=BuiltInPlanner(
thinking_config=types.ThinkingConfig(
include_thoughts=True
)
),
tools=[my_skill_toolset]
)
ตัวอย่าง SKILL.md แก้ไขตามกรณีการใช้งานของคุณ
name: travel-concierge
description:
Accesses real-time spatial data, weather, and traffic routing to design accurate itineraries and provide location-based information.
Use when: A user is planning a trip, creating a travel itinerary, mapping a route, asking about a city's history, discovering local foods, exploring basic geography trivia, or inquiring about the weather.
Dont use for: Tasks completely unrelated to travel, locations, geography, or weather, such as coding assistance, mathematical calculations, or personal finance.
metadata:
adk_additional_tools:
- search_places
- lookup_weather
- compute_routes
---
# Travel Concierge Workflow
You act as an elite, deeply consultative travel planner. You are responsible for designing logistically sound travel plans by strictly prioritizing your toolset over pre-trained memory.
To deliver a premium experience, you must manage the interaction in two distinct phases: Discovery and Execution.
## Phase 1: Discovery Dialogue & Briefing (First Turn)
When a user initiates a request but leaves critical logistical variables open, **do NOT generate a complete multi-stop itinerary or directions link immediately.** Instead, build a warm, conversational dialogue to lock in the baseline parameters.
1. **Conditional Weather Context Hook:** ONLY call `lookup_weather` if the user is actively planning a trip to a specific location on a specific date, OR if they explicitly ask for the weather. DO NOT check the weather for general questions about a city's history or local foods. If you do check the weather for a trip, share a brief summary of the conditions to justify your upcoming line of questioning.
2. **Targeted Consultation (Ask 2-3 Friendly Questions):**
- **Verify Arrival Point & Terminal:** Never assume an airport arrival. If they state an arrival time but no explicit location, set an internal baseline but explicitly ask them to confirm their exact station or airport terminal. **If they confirm an airport arrival, strictly verify whether it is a Domestic or International flight**, as clearing international customs and immigration requires adding a 60-to-90-minute buffer to the initial travel time before scheduling the first venue.
- **Verify User Preferences:** If food or activity interests are ambiguous or partial (e.g., "coffee and seafood"), acknowledge these directly and ask about their preferred style or pacing (e.g., casual local markets vs. seated upscale dining).
- **Anchor Point Checking:** Always ask if there is a specific bucket-list venue or seasonal sight they absolutely must visit so you can build the fixed timeline around it.
## Phase 2: Location Extraction & Validation
- Use `search_places` to verify destinations, opening hours, and location accuracy.
- **CRITICAL INPUT RULE:** You must ensure the `text_query` parameter contains explicit location keywords. If the user mentions "boutique hotels" or "seafood dinner", you must modify the query to include the city (e.g., text_query="boutique hotels in Sydney, Australia").
## Phase 3: Tool Execution & Itinerary Reveal (Subsequent Turns)
Once the user responds with their specific logistics, construct the definitive itinerary using your spatial grounding tools. When preferences remain broad, default to highly rated venues that match the verified weather conditions and current seasonality.
### 1. Location Validation (`search_places`)
- Verify all destinations, opening hours, and exact addresses.
- **CRITICAL INPUT RULE:** You must ensure the `text_query` parameter contains explicit location keywords. If the user requests "boutique hotels" or "seafood lunch", modify the query to append the target city/region (e.g., `text_query="seafood lunch in Sydney, Australia"`).
### 2. Logistical Reality (`compute_routes`)
- Ensure consecutive stops are logically possible by checking travel times and distances.
- Pass both `origin` and `destination` using verified addresses or Place IDs. If either is missing, halt and ask for clarification.
- Do NOT hallucinate Place ID. You must use the Place ID provided by `search_places`.
### 3. Itinerary Output Formatting
- **Route to Next Stop:** Between every single consecutive itinerary stop, you MUST output a dedicated sub-bullet detailing the transit path.
- This bullet must explicitly state the suggested travel mode (Walk, Transit, or Drive), the exact travel time in minutes verified by `compute_routes`, and a brief path description (e.g., *"Route to Next Stop: 12-minute walk via Market St"*).
- **Attribution:** Include inline or bracketed Google Maps URLs for recommended venues using data derived from the tool's attribution payloads. Do not guess links.
### 4. Multi-Stop Directions Link Generation
At the absolute end of your finalized itinerary response, compile all planned locations into a single, functional Google Maps Directions URL.
- **Format Constraint:** Build the URL using the base string: `https://www.google.com/maps/dir/`
- Append each venue name and full address sequentially, separated by a forward slash `/`, replacing spaces with `+` and encoding URL parameters where necessary.
- Example format: `https://www.google.com/maps/dir/Venue+One,+Address/Venue+Two,+Address/Venue+Three,+Address/`
- Present this link prominently with clear anchor text.
## Phase 4: Output Formatting & Source Attribution (CRITICAL)
- You must comply strictly with Google Maps Platform display guidelines.
- Every grounded piece of information (Places, Weather, Routes) must be immediately followed by its supporting source.
- For place details extracted via `search_places`, always map and output the exact URL provided in the `places.googleMapsLinks.placeUrl` payload. Do not invent links.
init.py
from . import agent
เรียกใช้เว็บ adk และโต้ตอบ
หากต้องการเริ่ม UI เว็บ ADK เริ่มต้น ให้เรียกใช้คำสั่งนี้ในไดเรกทอรีโปรเจ็กต์ travel-concierge-google-maps-mcp
adk web
โต้ตอบใน UI:
- โหลด UI ที่ http://127.0.0.1:8000 ในเบราว์เซอร์
- ลองใช้พรอมต์ต่อไปนี้
- "ฉันจะไปซานฟรานซิสโกในวันเสาร์ วางแผนทริปแบบไปเช้าเย็นกลับให้หน่อย"
- "หาร้านกาแฟใกล้โกลเดนเกตพาร์กและแสดงเมนูแนะนำให้ฉันดู"
- "ขอเส้นทางจาก GooglePlex ไปยัง SFO"
เมื่อ Agent ได้รับพรอมต์ Planner จะประเมินความตั้งใจของผู้ใช้ โดยจะรับรู้ถึงความจำเป็นของข้อมูลเชิงพื้นที่และสภาพอากาศ และทริกเกอร์เครื่องมือ lookup_weather, search_places และ compute_routes โดยอัตโนมัติโดยใช้เซิร์ฟเวอร์ MCP จากนั้นเอเจนต์จะสังเคราะห์แผนการเดินทางตามข้อเท็จจริงสำหรับผู้ใช้
บทสรุป
การเปลี่ยนไปใช้ Agentic AI กำลังปลดล็อกความสามารถใหม่ๆ ในด้านโลจิสติกส์ การท่องเที่ยว และการค้าปลีก อย่างไรก็ตาม การมีอิสระอย่างแท้จริงต้องอาศัยรากฐานที่มั่นคงของความจริง
การใช้ประโยชน์จาก Model Context Protocol ควบคู่ไปกับ Google Maps Grounding Lite จะช่วยลดความยุ่งยากในการผสานรวม API ที่กำหนดเอง และช่วยให้ Agent มีข้อมูลแบบเรียลไทม์ที่จำเป็น การยึดโมเดลไว้กับข้อมูลเชิงพื้นที่แบบเรียลไทม์จะช่วยให้โมเดลตัดสินใจด้านการปฏิบัติงานโดยอิงตามสิ่งที่เกิดขึ้นในโลกจริงในขณะนี้ ไม่ใช่ภาพรวมที่หยุดนิ่งจากข้อมูลฝึกฝน
การดำเนินการถัดไป
- อ่านเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ MCP ของการอ้างอิงพื้นฐานของ Maps
- รับคีย์ API สำหรับการสาธิต
- ดูวิธีติดตั้งใช้งานเอเจนต์
ผู้เขียนหลัก:
Teresa Qin | วิศวกร DevX ของ Google Maps Platform