Data Agent และ GraphRAG ในอุปกรณ์ด้วย Spanner Omni

1. ภาพรวม

Codelab นี้ครอบคลุมพื้นฐานของ Spanner Omni, เหตุผลที่ Spanner Omni เป็นรากฐานข้อมูลที่ดีที่สุดสำหรับ AI Agent แบบอัตโนมัติ และการติดตั้งใช้งานแบบต้นทางถึงปลายทางคร่าวๆ ของโค้ชแท็กติกและเครื่องจำลองการแข่งขันพิกเคิลบอลที่ทำงานด้วย Agent ซึ่งติดตั้งใช้งานที่ Edge และขับเคลื่อนโดย Spanner Omni (Relational + Graph GQL), Python Flask และ Gemini 3.8 Flash

ปัญหา

แพลตฟอร์มกีฬาแบบอินเทอร์แอกทีฟที่ทันสมัยและสภาพแวดล้อมการเล่นเกมแบบเรียลไทม์ต้องจัดการภาระงานที่แตกต่างกัน 3 อย่างพร้อมกัน ดังนี้

ธุรกรรมการดำเนินงานที่มีการทำงานพร้อมกันสูง:

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

การตรวจวัดระยะไกลของกราฟที่เชื่อมต่อ:

ลำดับช็อตการตีโต้ต่อเนื่อง, Markov Chain สำหรับการเปลี่ยนผ่าน และกราฟการครอบคลุมโซนที่ต้องใช้การข้ามผ่านที่มีเวลาในการตอบสนองต่ำโดยไม่ต้องใช้ไปป์ไลน์ ETL ขนาดใหญ่

การตอบสนองของ Edge ในระดับต่ำกว่ามิลลิวินาที:

การจำลองทางฟิสิกส์ที่รวดเร็วที่ 60 FPS ซึ่งการไปกลับของเครือข่ายระบบคลาวด์ในวงกว้าง (100-200 มิลลิวินาที) จะทำให้เกิดความกระตุกที่ยอมรับไม่ได้

ในอดีต ทีมวิศวกรแก้ปัญหานี้ด้วยการเชื่อมต่อสถาปัตยกรรมที่กระจัดกระจายเข้าด้วยกัน ซึ่งมีลักษณะดังนี้ PostgreSQL สำหรับข้อมูลธุรกรรม, Neo4j สำหรับกราฟช็อต, Redis สำหรับการแคชไปยังเซิร์ฟเวอร์ปลายทาง และไปป์ไลน์การซิงค์ในเบื้องหลัง ซึ่งจะทำให้เกิดความคลาดเคลื่อนทางสถาปัตยกรรม ความซับซ้อนในการดำเนินงานสูง และความล่าช้าของความสอดคล้องที่อัปเดตภายหลัง

วิธีการของเรา

เราได้สร้าง Spanner Omni Pickleball Game ซึ่งเป็นแพลตฟอร์มเกมกีฬาแบบเครื่องมือเดียวที่รวมตรรกะทางธุรกิจเชิงสัมพันธ์, การวัดและส่งข้อมูลช็อต ISO GQL แบบเนทีฟ และการโค้ช AI ทางยุทธวิธีแบบเรียลไทม์เข้าด้วยกัน โดยการติดตั้งใช้งาน Google Cloud Spanner Omni ที่ Edge และเชื่อมต่อกับ Google Gemini 3.8 Flash

Spanner Omni

Spanner Omni นำเครื่องมือฐานข้อมูลแบบกระจายระดับโลกของ Google ซึ่งมาพร้อมกับความสามารถในการปรับขนาดในแนวนอน, ธุรกรรม ACID และความสามารถแบบหลายโมเดล (เชิงสัมพันธ์, กราฟ, เวกเตอร์ และการวิเคราะห์) มาไว้ในสภาพแวดล้อมแบบจัดการด้วยตนเอง, ในองค์กร, แบบมัลติคลาวด์ และแบบ Air-gapped Spanner Omni เป็น Google Cloud Spanner รุ่นที่ดาวน์โหลดได้และมีการจัดการด้วยตนเอง โดยจะมอบความสามารถหลักของฐานข้อมูลแบบกระจายของ Spanner ซึ่งได้แก่ ชาร์ดดิ้งอัตโนมัติ, การจำลองข้อมูลตาม Paxos และความสอดคล้องภายนอกที่แข็งแกร่ง ไม่ว่าคุณจะเลือกเรียกใช้ที่ใดก็ตาม ดังนี้

acc871a470f63b29.png

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

ใน Codelab นี้ คุณจะเปลี่ยนจากสถาปัตยกรรมฐานข้อมูลแบบแยกส่วนแบบดั้งเดิมไปเป็นโซลูชันฐานข้อมูล Edge แบบรวมที่ทันสมัย คุณจะได้เรียนรู้วิธีต่อไปนี้

  1. ติดตั้งใช้งานและจัดการ Spanner Omni ในเครื่องโดยใช้ Docker เพื่อจัดการเวิร์กโหลดเชิงสัมพันธ์แบบอินสแตนซ์เดียวที่มีประสิทธิภาพสูง
  2. ออกแบบสคีมากราฟ Unified Relational และ ISO GQL ที่แมปโมเดลธุรกิจธุรกรรมควบคู่ไปกับข้อมูลการวัดและส่งข้อมูลทางไกลของเกมที่มีมิติสูงโดยไม่ต้องซิงค์ฐานข้อมูลภายนอก
  3. ใช้การจัดลำดับ ACID ที่เข้มงวดภายในธุรกรรมการอ่าน-เขียนของ Python เพื่อป้องกันภาวะแข่งขันแบบเป็นโปรแกรมและขจัดความขัดแย้งจากการจองซ้ำ
  4. สร้างไปป์ไลน์ GraphRAG แบบเนทีฟที่ใช้ประโยชน์จากการค้นหากราฟ ISO GQL ที่ผสานรวม SQL เพื่อป้อนข้อมูลการตรวจวัดระยะไกลของการแข่งขันที่อิงตามบริบทแบบเรียลไทม์ลงใน Google Gemini โดยตรงเพื่อการฝึกสอนทางยุทธวิธีแบบทันที

ข้อกำหนด

  • เครื่องภายในมาตรฐานหรือ VM สำหรับการพัฒนาที่ใช้ Linux (Ubuntu 22.04 ขึ้นไป), macOS หรือ Windows
  • ติดตั้งและเรียกใช้ Docker Desktop หรือ Docker Engine
  • ติดตั้ง Python 3.10 ขึ้นไปแล้ว
  • เครื่องมือแก้ไขข้อความหรือ IDE (เช่น VS Code หรือ PyCharm)
  • คีย์ Gemini API ของ Google ที่ใช้งานอยู่ (หมายเหตุ: ไม่จำเป็นต้องมีบัญชีสำหรับการเรียกเก็บเงินใน Google Cloud เพื่อเรียกใช้ Spanner Omni ในเครื่อง เนื่องจาก Spanner Omni ทำงานภายใต้ใบอนุญาตการประเมินของนักพัฒนาซอฟต์แวร์ที่จัดการด้วยตนเองในรุ่นฟรี)

2. การติดตั้งใช้งานและการกำหนดค่า Spanner Omni

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

  1. เปิดเทอร์มินัลและสร้างวอลุ่ม Docker แบบถาวรเพื่อจัดเก็บสคีมาฐานข้อมูลและข้อมูลการตรวจวัดระยะไกลของเกม โดยทำดังนี้
docker volume create spanner_omni_data
  1. ดึงและเริ่มอิมเมจคอนเทนเนอร์ Spanner Omni อย่างเป็นทางการที่กำหนดค่าไว้ในโหมดนักพัฒนาซอฟต์แวร์เซิร์ฟเวอร์เดียว
docker run -d --name spanner-omni \
  -p 9010:9010 -p 9020:9020 \
  -v spanner_omni_data:/spanner \
  us-docker.pkg.dev/spanner-omni/images/spanner-omni:2026.r2.1-beta \
  start-single-server
  1. ตรวจสอบว่าคอนเทนเนอร์เปิดใช้งานเรียบร้อยแล้ว โดยทำดังนี้
docker ps

🛠️ การแก้ปัญหาอย่างรวดเร็วด้วยบรรทัดเดียว: หากเปิดใช้งานไม่สำเร็จเนื่องจากพอร์ต 9010 หรือ 9020 มีกระบวนการเบื้องหลังหรือการเรียกใช้โปรแกรมจำลองเดิมใช้งานอยู่ ให้เรียกใช้สคริปต์ล้างข้อมูลนี้ในเทอร์มินัล

pkill -f "spanner" || true
fuser -k 9010/tcp 9020/tcp 2>/dev/null || true
docker rm -f spanner-local spanner-omni spanner-omni-local 2>/dev/null || true

3. การออกแบบสคีมา DDL ของกราฟเชิงสัมพันธ์และ ISO GQL

เมื่อ Spanner Omni ทำงานอยู่ เราจะสร้างสคีมาฐานข้อมูลได้ สคีมานี้ทำหน้าที่เป็นแหล่งข้อมูลที่เชื่อถือได้เพียงแหล่งเดียว (SSOT) โดยรวมองค์กรธุรกิจเชิงสัมพันธ์ (เช่น สนาม ผู้เล่น และการจอง) เข้ากับสคีมาการวัดและส่งข้อมูลทางไกลแบบกราฟที่เชื่อมต่อและรวดเร็ว (ช็อต โซน และการเปลี่ยนผ่าน)

วิธีสร้างตารางการดำเนินการและการวัดและส่งข้อมูลทางไกล

  1. เชื่อมต่อกับฐานข้อมูลโดยใช้ Spanner CLI หรือไคลเอ็นต์แอปพลิเคชัน
  2. เรียกใช้คำสั่ง DDL ต่อไปนี้

คุณไม่จำเป็นต้องดำเนินการใดๆ ในตอนนี้ เนื่องจากเรากำลังแก้ไขปัญหานี้ในโค้ดของแอปพลิเคชัน

-- ============================================================================
-- 1. OPERATIONAL & FACILITY MANAGEMENT (RELATIONAL ACID)
-- ============================================================================

CREATE TABLE Courts (
    court_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    location STRING(100) NOT NULL,
    surface_type STRING(50) NOT NULL,
    is_indoor BOOL NOT NULL,
    hourly_rate FLOAT64 NOT NULL,
    has_lighting BOOL NOT NULL,
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (court_id);

CREATE TABLE Players (
    player_id INT64 NOT NULL,
    name STRING(100) NOT NULL,
    email STRING(100) NOT NULL,
    skill_level STRING(20) NOT NULL,
    phone STRING(50),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (player_id);

CREATE TABLE Bookings (
    booking_id INT64 NOT NULL,
    court_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    booking_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    end_hour INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_name STRING(100) NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (booking_id);

CREATE TABLE MatchRequests (
    match_id INT64 NOT NULL,
    player_id INT64 NOT NULL,
    player_name STRING(100) NOT NULL,
    court_id INT64,
    court_name STRING(100),
    play_date DATE NOT NULL,
    start_hour INT64 NOT NULL,
    skill_required STRING(20) NOT NULL,
    match_type STRING(20) NOT NULL,
    spots_open INT64 NOT NULL,
    status STRING(20) NOT NULL,
    notes STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (match_id);

-- ============================================================================
-- 2. TACTICAL GAME TELEMETRY & PROPERTY GRAPH (ISO GQL)
-- ============================================================================

CREATE TABLE CourtZones (
    zone_id STRING(50) NOT NULL,
    name STRING(100) NOT NULL,
    is_kitchen BOOL NOT NULL,
    side STRING(50) NOT NULL
) PRIMARY KEY (zone_id);

CREATE TABLE Shots (
    shot_id STRING(50) NOT NULL,
    player_id STRING(50) NOT NULL,
    shot_type STRING(100) NOT NULL,
    speed_mph FLOAT64,
    spin_type STRING(50),
    outcome STRING(50),
    from_zone_id STRING(50),
    to_zone_id STRING(50)
) PRIMARY KEY (shot_id);

CREATE TABLE ShotTransitions (
    transition_id STRING(50) NOT NULL,
    from_shot_id STRING(50) NOT NULL,
    to_shot_id STRING(50) NOT NULL,
    rally_depth INT64,
    pressure_level STRING(20)
) PRIMARY KEY (transition_id);

-- ============================================================================
-- 3. MATCH SESSIONS & AI COACHING HISTORY
-- ============================================================================

CREATE TABLE GameSessions (
    session_id STRING(50) NOT NULL,
    player_id INT64 NOT NULL,
    player_score INT64 NOT NULL,
    bot_score INT64 NOT NULL,
    bot_difficulty STRING(20) NOT NULL,
    winner STRING(20) NOT NULL,
    rally_length INT64 NOT NULL,
    fault_type STRING(100),
    coaching_summary STRING(MAX),
    created_at TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (session_id);
cat << 'EOF' > Dockerfile
FROM ollama/ollama:latest
ENV OLLAMA_HOST=0.0.0.0:8080
ENV OLLAMA_MODELS=/root/.ollama
ENV MODEL=gemma4:e2b
RUN ollama serve & sleep 5 && ollama pull $MODEL
ENTRYPOINT ["ollama", "serve"]
EOF

💡 ความสำคัญของการประทับเวลาการคอมมิต: การระบุ OPTIONS (allow_commit_timestamp=true) ช่วยให้สามารถจัดลำดับแบบโมโนโทนิกที่มีความแม่นยำระดับไมโครวินาทีในตัวจำลองโหนดในเครื่องทั้งหมด ซึ่งสำคัญอย่างยิ่งสำหรับการซิงค์เหตุการณ์ในเกมที่เกิดขึ้นอย่างรวดเร็ว (เช่น ฟุตเทจวิดีโอการตัดสินลูกออก) กับบันทึกการวัดระยะไกลของการยิงในฐานข้อมูลที่เกี่ยวข้อง

4. การควบคุมการเกิดขึ้นพร้อมกันของ ACID และการป้องกันการจองซ้ำ

ในพอร์ทัลการจองกีฬาที่ใช้งานอยู่ ผู้ใช้หลายคนมักจะแย่งกันจองช่วงเวลาของสนามเดียวกัน เพื่อป้องกันภาวะแข่งขัน เราจะเขียนธุรกรรมการอ่าน-เขียน Python ใน Spanner Omni เพื่อให้มั่นใจว่าการจัดลำดับได้แบบป้องกันการจองซ้ำนั้นสมบูรณ์แบบ

คุณไม่จำเป็นต้องดำเนินการใดๆ ในตอนนี้ เพียงสังเกตรหัสต่อไปนี้

from google.cloud import spanner

def create_booking_transaction(transaction, booking_data):
    # 1. Query for existing overlapping confirmed bookings on the same court
    query = """
        SELECT booking_id, player_name, start_hour, end_hour
        FROM Bookings
        WHERE court_id = @court_id
          AND booking_date = @booking_date
          AND status = 'CONFIRMED'
          AND NOT (end_hour <= @start_hour OR start_hour >= @end_hour)
    """
    params = {
        "court_id": booking_data["court_id"],
        "booking_date": booking_data["booking_date"],
        "start_hour": booking_data["start_hour"],
        "end_hour": booking_data["end_hour"],
    }
    param_types = {
        "court_id": spanner.param_types.INT64,
        "booking_date": spanner.param_types.DATE,
        "start_hour": spanner.param_types.INT64,
        "end_hour": spanner.param_types.INT64,
    }
    
    results = list(transaction.execute_sql(query, params=params, param_types=param_types))
    
    if results:
        conflict = results[0]
        raise ValueError(
            f"Court conflict: Already booked by {conflict[1]} ({conflict[2]}:00-{conflict[3]}:00)"
        )
    
    # 2. Insert new confirmed booking with Spanner commit timestamp
    insert_stmt = """
        INSERT INTO Bookings (
            booking_id, court_id, player_id, booking_date, start_hour, end_hour,
            player_name, court_name, status, notes, created_at
        ) VALUES (
            @booking_id, @court_id, @player_id, @booking_date, @start_hour, @end_hour,
            @player_name, @court_name, 'CONFIRMED', @notes, PENDING_COMMIT_TIMESTAMP()
        )
    """
    # execute_update statement writing to Spanner Omni...
    transaction.execute_update(insert_stmt, params=booking_data, param_types=booking_types)

5. ระบบฟิสิกส์ 60 FPS แบบเรียลไทม์และกลไกบ็อต DUPR ที่ปรับได้

ฟรอนท์เอนด์ของแอปพลิเคชันของเราใช้การแสดงผลการจำลอง HTML5 Canvas แบบ 2.5 มิติที่ 60 เฟรมต่อวินาที (FPS) การแสดงผลนี้ทำงานแยกจากเลเยอร์ฐานข้อมูลโดยสิ้นเชิงเพื่อรักษาประสิทธิภาพที่ราบรื่น โดยจะล้างข้อมูลการตรวจวัดระยะไกลเมื่อการแข่งขันสิ้นสุดลงเท่านั้น

เกมจำลองนี้มีเครื่องมือ AI ของ OmniBot ที่ปรับได้ ซึ่งใช้เมทริกซ์ความยากตามระดับ DUPR (Dynamic Universal Pickleball Rating) ในโลกจริง

1640056a824b47e6.png

คุณไม่จำเป็นต้องดำเนินการใดๆ ในตอนนี้ เพียงแค่ดูรายละเอียด

6. การประมวลผลกราฟการตรวจวัดระยะไกลของ ISO GQL Shot

เมื่อสิ้นสุดการแรลลี่แต่ละครั้ง ฟรอนท์เอนด์จะโพสต์กราฟวิถีที่เชื่อมต่อกับปลายทางแบ็กเอนด์ /api/rally-end ระบบจะบันทึกช็อตแต่ละช็อตเป็นโหนดเชิงสัมพันธ์ และเชื่อมโยงลำดับภาพแบบไดนามิกผ่านขอบการเปลี่ยนฉาก

คุณไม่จำเป็นต้องดำเนินการใดๆ ในตอนนี้ เพียงแค่สังเกตรหัสต่อไปนี้

@app.route("/api/execute-shot", methods=["POST"])
def execute_shot():
    data = request.json or {}
    shot_id = f"shot_{int(time.time()*1000)}"
    
    # 1. Insert the Shot Node
    insert_shot_sql = """
        INSERT INTO Shots (shot_id, player_id, shot_type, speed_mph, spin_type, outcome, from_zone_id, to_zone_id)
        VALUES (@shot_id, @player_id, @shot_type, @speed, @spin, @outcome, @from_zone, @to_zone)
    """
    
    # 2. If part of a continuous rally, link with a ShotTransition Edge
    if data.get("prev_shot_id"):
        transition_id = f"trans_{int(time.time()*1000)}"
        insert_trans_sql = """
            INSERT INTO ShotTransitions (transition_id, from_shot_id, to_shot_id, rally_depth, pressure_level)
            VALUES (@trans_id, @from_shot, @to_shot, @depth, @pressure)
        """
        # Executed within a single, unified Spanner Omni transaction...

โค้ชหรือโปรแกรมวิเคราะห์สามารถค้นหารูปแบบโครงสร้างที่ซับซ้อนและลึกได้ทันทีโดยไม่ต้องรวมฐานข้อมูลขนาดใหญ่ โดยใช้เครื่องมือการค้นหากราฟ ISO GQL แบบเนทีฟของ Spanner ดังนี้

-- Find highest-frequency transition sequences leading to player unforced errors
GRAPH PickleballTelemetry
MATCH (s1:Shots)-[t:ShotTransitions]->(s2:Shots)
WHERE s1.shot_type = 'Speedup' AND s2.outcome = 'FAULT_NET'
RETURN s1.speed_mph, s2.from_zone_id, COUNT(*) AS occurrences
ORDER BY occurrences DESC
LIMIT 5;

7. การโค้ชเชิงกลยุทธ์ด้วย AI จาก Gemini และแชท RAG ที่อิงตามข้อมูลที่เชื่อถือได้

ตอนนี้เราจะเปิดใช้งานสมองของแอปพลิเคชัน ซึ่งก็คือ Google Gemini 3.8 Flash แบ็กเอนด์ Python ของเราใช้โมเดลเพื่อมอบความสามารถ AI แบบเรียลไทม์ 3 รายการซึ่งอิงตาม Spanner Omni โดยตรง

ระบบใช้ Google Gemini 3.8 Flash สำหรับเวิร์กโฟลว์ AI แบบเรียลไทม์ที่แตกต่างกันบางอย่าง ดังนี้

การวิเคราะห์การตีโต้แบบเรียลไทม์และผู้ตัดสินแท็กติก:

หลังจากได้คะแนนแต่ละแต้ม Gemini จะวิเคราะห์ชุดการตี ความยากของบ็อต และตำแหน่งในสนาม

Spanner Multi-Table Grounded AI Concierge และ Match Analyst:

ผู้ใช้สามารถค้นหาตารางเวลาของสนาม อัตราค่าบริการของสิ่งอำนวยความสะดวก และถามว่า "ฉันเล่นกับ OmniBot เป็นอย่างไรบ้าง" โดยใช้ภาษาธรรมชาติ แบ็กเอนด์จะค้นหา Spanner Omni แบบไดนามิกใน 4 โดเมน (Courts, Bookings, GameSessions และ Shots) เพื่อให้ Gemini มีข้อมูลอ้างอิงที่ถูกต้องโดยไม่มีอาการหลอน

Real-Time Performance Analytics API (/api/performance):

รวบรวมอัตราส่วนการชนะ-แพ้แบบเรียลไทม์ ความลึกเฉลี่ยของการตีโต้ และเซสชันเกมล่าสุดจากตาราง GameSessions ของ Spanner Omni โดยตรงสำหรับแดชบอร์ดของผู้เล่น

คุณไม่จำเป็นต้องดำเนินการใดๆ ในตอนนี้ เพียงแค่ดูรายละเอียด

8. กำหนดค่า เรียกใช้ และทดสอบ

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

  1. เปิดเทอร์มินัลโฮสต์และโคลนที่เก็บโปรเจ็กต์โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/AbiramiSukumaran/pickleball

cd pickleball
  1. รับคีย์ Gemini API โดยทำตามขั้นตอนในเอกสารประกอบต่อไปนี้

https://medium.com/google-cloud/get-api-key-from-google-ai-studio-b2d2059a171d

  1. เปิดไฟล์ .env ในเครื่องมือแก้ไขและกำหนดค่ารายละเอียดสภาพแวดล้อม ดังนี้
SPANNER_EMULATOR_HOST="localhost:9010"
SPANNER_PROJECT="PROJECT_ID"
SPANNER_INSTANCE="omni-instance"
SPANNER_DATABASE="pickleball-db"
GEMINI_API_KEY="REPLACE_WITH_YOUR_ACTUAL_GEMINI_KEY"
  1. ติดตั้งทรัพยากร Dependency ของ Python และเรียกใช้แอปพลิเคชันโดยทำดังนี้
pip install -r requirements.txt

python app.py
  1. เปิดเว็บเบราว์เซอร์แล้วไปที่ http://localhost:5000 เพื่อเริ่มเล่น คุณสามารถจองเวลาใช้สนามได้ในแท็บการจอง เล่นกับ DUPR OmniBot ที่ปรับระดับได้ และปรึกษานักวิเคราะห์การแข่งขัน Gemini แบบเรียลไทม์ที่ข้างสนาม

เปิดเว็บเบราว์เซอร์หรือคลิกลิงก์ไปยังแอปที่ทำงานใน Localhost

a2d18f8288607c66.png

9. ยินดีด้วย

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

Spanner Omni ช่วยขจัดข้อจำกัดนี้ โดยผสานรวมความสอดคล้องแบบกระจายในระดับโลก, การค้นหากราฟ ISO GQL และประสิทธิภาพเชิงสัมพันธ์ไว้ในคอนเทนเนอร์ภายในเครื่องที่ดาวน์โหลดได้เพียงรายการเดียว ไม่ว่าคุณจะอยู่ในอุตสาหกรรมใด Spanner Omni จะช่วยให้มั่นใจได้ว่า Edge Agent ของคุณจะมีข้อมูลที่เป็นความจริงที่เชื่อถือได้