1. บทนำ
การพัฒนาเว็บสมัยใหม่มีทางเลือกอื่นแทนการเดินทางไปกลับในระบบคลาวด์สำหรับการใช้งาน AI Chrome ได้เริ่มจัดส่ง AI API ในตัวที่ช่วยให้คุณใช้ทุกอย่างได้ตั้งแต่โมเดลผู้เชี่ยวชาญขนาดเล็กสำหรับการแปลไปจนถึงโมเดลภาษาแบบเต็มที่กลั่นกรองที่มีประสิทธิภาพ โดยทั้งหมดนี้ไม่มีค่าใช้จ่ายโทเค็นสำหรับคุณหรือผู้ใช้ และทำงานแบบส่วนตัวในอุปกรณ์ของผู้ใช้
ในขณะเดียวกัน AI Agent ก็เป็นวิธีใหม่ที่ผู้ใช้จะโต้ตอบกับเว็บแอปพลิเคชัน และการเตรียมประสบการณ์บนเว็บให้พร้อมสำหรับ Agent ด้วย WebMCP จะช่วยลดการใช้โทเค็นในขณะที่ให้ผลลัพธ์ที่แม่นยำกว่าการกระตุ้นแบบเดิมที่ต้องใช้ภาพหน้าจอและการขูด DOM
ใน Codelab นี้ คุณจะได้ทำงานกับ Mont-Royal Plein Air ซึ่งเป็นเว็บไซต์อีคอมเมิร์ซอุปกรณ์กลางแจ้ง คุณจะได้เรียนรู้วิธีสร้างและผสานรวม API ของ AI ในตัวและ WebMCP เพื่อทำสิ่งต่อไปนี้
- อนุมานความตั้งใจของลูกค้าจากประวัติการท่องเว็บและสร้างคำแนะนำแบบไดนามิกสำหรับลูกค้าโดยใช้โมเดลในอุปกรณ์
- แสดงเครื่องมือที่ตัวแทนและผู้ช่วยเบราว์เซอร์ใช้เพื่อไปยังส่วนต่างๆ ของเว็บไซต์ ตรวจสอบผลิตภัณฑ์และสินค้าแนะนำ รวมถึงจัดการรถเข็นช็อปปิ้งของผู้ใช้
- (ไม่บังคับ) แปลเว็บไซต์ได้ทันทีโดยใช้โมเดลผู้เชี่ยวชาญขนาดเล็กในอุปกรณ์
- (ไม่บังคับ) เปลี่ยนการค้นหาเว็บไซต์ขั้นพื้นฐานให้เป็นเอเจนต์ในเว็บไซต์ที่ทำงานด้วยเครื่องมือเดียวกับที่เอเจนต์ภายนอกใช้
สิ่งที่คุณจะได้เรียนรู้
- วิธีใช้ Prompt API และบังคับใช้เอาต์พุต JSON ที่มีโครงสร้างจาก API
- วิธีลงทะเบียนเครื่องมือ WebMCP และกลยุทธ์ในการพิจารณาองค์ประกอบและความละเอียดของเครื่องมือ
- (ไม่บังคับ) วิธีใช้ Translator API เพื่อแปลเนื้อหาอย่างรวดเร็วโดยใช้โมเดลผู้เชี่ยวชาญในอุปกรณ์
- (ไม่บังคับ) วิธีเรียกใช้เครื่องมือ WebMCP ด้วยตนเอง
ข้อกำหนดเบื้องต้น
- บัญชี Google ส่วนบุคคลและ Google Cloud
- Google Chrome เวอร์ชัน 150 ขึ้นไป หรือช่อง Canary, Dev หรือ Beta โดยเปิดใช้แฟล็ก
#enable-webmcp-testingและ#devtools-webmcp-support - มีความคุ้นเคยกับ HTML, CSS, JavaScript และ TypeScript
- คุ้นเคยกับ JSON Schema
2. การตั้งค่าโปรเจ็กต์
บัญชี Google
หากยังไม่มีบัญชี Google ส่วนบุคคล คุณต้องสร้างบัญชี Google
ลงชื่อเข้าใช้คอนโซล Google Cloud
ลงชื่อเข้าใช้ คอนโซล Google Cloud โดยใช้บัญชี Google ส่วนตัว
เปิดใช้การเรียกเก็บเงิน
หากต้องการตั้งค่าบัญชีสำหรับการเรียกเก็บเงินส่วนตัว ให้เปิดใช้การเรียกเก็บเงินใน Cloud Console
สร้างโปรเจ็กต์ (ไม่บังคับ)
หากไม่มีโปรเจ็กต์ปัจจุบันที่ต้องการใช้ในแล็บนี้ ให้สร้างโปรเจ็กต์ใหม่ที่นี่
เปิดเครื่องมือแก้ไข Cloud Shell
- คลิกลิงก์นี้เพื่อไปยัง Cloud Shell Editor โดยตรง
- หากระบบแจ้งให้คุณให้สิทธิ์ในวันนี้ ให้คลิกให้สิทธิ์เพื่อดำเนินการต่อ

- หากเทอร์มินัลไม่ปรากฏที่ด้านล่างของหน้าจอ ให้เปิดโดยทำดังนี้
- คลิกแสดง
- คลิก Terminal

ตั้งค่าโปรเจ็กต์
- ในเทอร์มินัล ให้ตั้งค่าโปรเจ็กต์โดยใช้คำสั่งนี้
ตัวอย่าง:gcloud config set project [PROJECT_ID]gcloud config set project lab-project-id-example
- คุณจะเห็นข้อความต่อไปนี้
Updated property [core/project].
การตั้งค่าในเครื่องและ Workspace
- ในเทอร์มินัล (หรือเทอร์มินัล Cloud Shell) ให้โคลนที่เก็บโปรเจ็กต์และไปที่ไดเรกทอรีโปรเจ็กต์
git clone https://github.com/GoogleChromeLabs/codelabs mont-royal cd mont-royal - ไปที่โฟลเดอร์
ecommerce-ai-enhancements/starterโดยทำดังนี้cd ecommerce-ai-enhancements/starter - ติดตั้งการอ้างอิงโดยใช้
pnpmดังนี้pnpm install - เริ่มเซิร์ฟเวอร์การพัฒนาซอฟต์แวร์ภายใน
เปิดเบราว์เซอร์ไปที่pnpm devhttp://localhost:5173เพื่อดูร้านค้า Mont-Royal Plein Air
(ไม่บังคับ) ติดตั้งส่วนขยายเครื่องมือตรวจสอบ WebMCP
คุณสามารถติดตั้งเครื่องมือตรวจสอบบริบทโมเดล WebMCP เพื่อให้การทำงานกับ WebMCP ง่ายขึ้น เมื่อติดตั้งแล้ว คุณจะต้องรับคีย์ Gemini API เพื่อใช้งาน โดยทำดังนี้
- ไปที่ AI Studio
- คลิกปุ่มสร้างคีย์ API เพื่อสร้างคีย์ Gemini API ใหม่ที่เชื่อมโยงกับโปรเจ็กต์ที่คุณตั้งค่าไว้ก่อนหน้านี้ในขั้นตอนนี้
- เปิดเครื่องมือตรวจสอบบริบทโมเดล WebMCP (จะเปิดในแผงด้านข้าง) แล้วคลิกปุ่มอัปเดต Gemini API Key
- วางคีย์ API ลงในป๊อปอัปแล้วบันทึก
ส่วนขยายนี้มี Agent พื้นฐานที่ใช้ WebMCP ได้ ซึ่งช่วยให้คุณทดลองใช้เว็บไซต์ผ่านส่วนขยายนี้แทนการเรียกใช้เครื่องมือ WebMCP ผ่านเครื่องมือสำหรับนักพัฒนาเว็บโดยตรง
3. โมเดล AI ในตัวบนเว็บ
Prompt API คืออะไร
Prompt API ช่วยให้เว็บแอปพลิเคชันเข้าถึงโมเดลภาษาขนาดเล็กแบบมัลติโมดัลที่ทำงานบนอุปกรณ์ของผู้ใช้โดยตรงได้ เนื่องจากการอนุมานจะดำเนินการในเครื่อง
- เวลาในการตอบสนองของระบบคลาวด์เป็น 0: ไม่มีการเดินทางไปกลับของเครือข่ายหรือการจัดคิวเซิร์ฟเวอร์แบ็กเอนด์
- เป็นส่วนตัวโดยค่าเริ่มต้น: พรอมต์และบริบทที่ส่งไปยังพรอมต์จะไม่เคยออกจากอุปกรณ์
- ไม่มีค่าใช้จ่าย: การอนุมานจะทำงานบนฮาร์ดแวร์ของไคลเอ็นต์โดยไม่มีการเรียกเก็บเงินตามโทเค็นหรือค่าใช้จ่ายในการโฮสต์ระบบคลาวด์
- ใช้งานแบบออฟไลน์ได้: ทำงานได้อย่างน่าเชื่อถือแม้จะไม่มีการเชื่อมต่ออินเทอร์เน็ตที่ใช้งานอยู่
ใน Chrome คุณจะเข้าถึง Prompt API ได้ผ่านอินเทอร์เฟซ LanguageModel ทั่วโลก
// 1. Set your expected inputs and outputs. This is multimodal, so you can
// include other types here, too
const languages = {
expectedInputs: [{type: "text", languages: ["en"]}],
expectedOutputs: [{type: "text", languages: ["en"]}],
}
// 2. Check availability. Always pass in your expected inputs and outputs,
// as some models may only support some inputs and outputs
const availability = await LanguageModel.availability(languages);
// 'available', 'downloading', or 'unavailable'
// 3. Create an isolated session with system prompt and language constraints
const session = await LanguageModel.create({
...languages,
// Optional: add initial context to your session, like a system prompt
initialPrompts: [
{
role: 'system',
content: 'You are an expert outdoors sales assistant...'
}
]
});
// 4. Define your expected output as JSON Schema
const schema = {
//...
}
// 5. Prompt the model (supports plain text or structured models)
const result = await session.prompt('Recommend a 3-season tent footprint.', {
responseConstraint: schema,
});
แบบฝึกหัดที่ 1: คำแนะนำตามเส้นทาง
โดยปกติแล้ว เว็บไซต์อีคอมเมิร์ซจะมีภาพหมุนหรือการอัปเซลล์ของรายการ "มักซื้อร่วมกัน" สำหรับเว็บไซต์กลางแจ้ง การสร้างคำแนะนำตามประวัติการท่องเว็บอาจมีประโยชน์มากกว่า
คุณจะต้องสร้างไปป์ไลน์การแนะนำ 3 ขั้นตอนเพื่อดำเนินการนี้
- โปรไฟล์เส้นทาง: คุณจะใช้ Prompt API เพื่อวิเคราะห์ไทม์ไลน์การท่องเว็บตามลำดับเวลาของลูกค้าเพื่อพยายามอนุมานความตั้งใจในการผจญภัยที่แท้จริงของผู้ใช้
- การค้นหาผลิตภัณฑ์: จากความตั้งใจนั้น คุณจะส่งคำขอ API ไปยังแบ็กเอนด์ของผลิตภัณฑ์จำลองเพื่อรับสินค้าที่เกี่ยวข้อง
- สินค้าแนะนำ: คุณจะส่งผลิตภัณฑ์เหล่านั้นกลับไปยัง Product API เพื่อจัดอันดับ โดยจะแสดงผลิตภัณฑ์ 5 รายการที่สอดคล้องกับสิ่งที่ผู้ใช้กำลังดูมากที่สุด
งานที่ 1.1: การเริ่มต้นใช้งาน Prompt API
แทนที่จะเริ่มต้น Prompt API ทีละรายการทุกครั้งที่ต้องการใช้ คุณสามารถรวมการเรียกใช้ไว้ในไฟล์เดียวและบันทึกการสร้างโดยใช้พรอมต์ของระบบเพื่อลดเวลาเริ่มต้นสำหรับการเรียกใช้หลายครั้งไปยังเอเจนต์เดียวกัน
ไปที่ไฟล์ src/ai/prompt-api.ts แล้วตรวจสอบ getPromptSession() ในบรรทัดที่ 27–58
export async function getPromptSession(
systemPrompt: string = '',
options: { signal?: AbortSignal } = {}
): Promise<LanguageModel>
- ใช้เซสชันพื้นฐานที่แคชไว้ซ้ำ มีแผนที่แคชอยู่แล้วในบรรทัดที่ 21
baseSessionsซึ่งจัดทำดัชนีตามพรอมต์ของระบบ การใช้โมเดลพื้นฐานซ้ำแทนการclone()โมเดลใหม่จะช่วยลดเวลาเริ่มต้นและรับการตั้งค่าหลักโดยที่แต่ละเซสชันจะไม่รบกวนกัน ส่งคืนโคลน - ผู้โทรสามารถโต้ตอบกับโคลน รวมถึงdestroy()ได้อย่างอิสระโดยไม่ต้องทิ้งฐานที่แคชไว้ - ตรวจหาฟีเจอร์ของ API ตรวจหาฟีเจอร์หากมี API อยู่ และแสดงข้อผิดพลาดหากไม่มี
- ประกาศรูปแบบและภาษา โมเดลในตัวรองรับอินพุตหลายรูปแบบ คุณต้องประกาศว่าต้องการโหมดใดและต้องการรองรับภาษาใด เนื้อหาทั้งหมดที่คุณส่งไปยัง LLM จะเป็นภาษาอังกฤษ
- ตรวจสอบความพร้อมใช้งานก่อนสร้าง แม้ว่าจะมี API อยู่ แต่โมเดลที่รองรับข้อกำหนดของคุณอาจไม่มี ตรวจสอบว่ามีไฟล์ดังกล่าวหรือไม่ หากไม่ตรง ให้แสดงข้อผิดพลาด หากยังไม่ได้ดาวน์โหลด ให้รายงานความคืบหน้าในการดาวน์โหลด
- สร้างเซสชัน ตั้งค่าตัวเลือกเพื่อสร้างเซสชัน Prompt API ใหม่และพรอมต์ของระบบ (หากมี)
งาน 1.2: ติดตั้งใช้งาน Journey Profiler
ไปที่ไฟล์ src/ai/journey-profiler.ts แล้วตรวจสอบฟังก์ชันเป้าหมายในบรรทัดที่ 42–100
export async function inferJourneyProfile(
context: ProfilerInputContext,
catalogMap: ReadonlyMap<string, Product>
): Promise<JourneyProfile>
- ใช้ฟังก์ชันจากงานที่ 1 เพื่อสร้างเซสชันพรอมต์ใหม่ที่จะใช้
- แจ้งโมเดลด้วยข้อความพรอมต์ที่ระบุ โดยใช้
journeyProfileSchemaเป็น JSON Schema สำหรับการตอบกลับที่มีโครงสร้าง - แยกวิเคราะห์เอาต์พุตของพรอมต์และขจัดหมวดหมู่เป้าหมายที่ซ้ำกัน
- แทนที่สตริงที่เขียนโค้ดไว้ด้วยผลลัพธ์จริงจากพรอมต์
- ทำลายเซสชันเมื่อเสร็จสิ้นเพื่อเพิ่มหน่วยความจำ
งานที่ 1.3: ใช้ตัวจัดอันดับใหม่ที่พิจารณาความสอดคล้องกัน
ไปที่ไฟล์ src/ai/synergy-reranker.ts แล้วตรวจสอบฟังก์ชันเป้าหมายในบรรทัดที่ 30–71
export async function rankComplementaryGear(
profile: JourneyProfile,
candidates: readonly Product[],
currentProduct?: Product | null,
cartProducts?: readonly Product[],
limit: number = 5
): Promise<readonly RecommendedItem[]>
- ใช้ฟังก์ชันจากงานที่ 1 เพื่อสร้างเซสชันพรอมต์ใหม่ที่จะใช้
- ป้อนข้อความพรอมต์และสคีมาที่สร้างขึ้นให้กับโมเดล
- แยกวิเคราะห์เอาต์พุตของพรอมต์
- ส่งคืนรายการคำแนะนำที่ประกอบขึ้นโดยใช้
assembleRecommendations - ทำลายเซสชันเมื่อเสร็จสิ้นเพื่อเพิ่มหน่วยความจำ
ยืนยันไปป์ไลน์การแนะนำ
- เปิด Chrome เพื่อ
http://localhost:5173/catalog/tent-mont-tremblant-3p - เลื่อนลงไปที่ส่วนสำหรับคุณ
- สังเกตว่าการ์ดเสริมทั้ง 5 ใบอัปเดตเพื่อแสดงการจับคู่ชุดอัจฉริยะ (เช่น ร่องรอยบนพื้น แผ่นรองนอน และสมอบกน้ำหนักเบา) แทนที่จะเป็นผลิตภัณฑ์แบบสุ่มได้อย่างไร
- เปิดคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome เพื่อตรวจสอบระยะเวลาการดำเนินการแบบเรียลไทม์ของทั้ง 2 ขั้นตอนการอนุมาน
(ไม่บังคับ) งานที่ 1.4: สำรวจโมเดล AI ในตัวเพิ่มเติม
นอกจากนี้ยังมีโมเดล AI ในตัวอื่นๆ อีกหลายโมเดลให้ใช้งาน รวมถึงโมเดลผู้เชี่ยวชาญของ Translator API คอมโพเนนต์ในโค้ดเบสนี้เชื่อมต่อกับบริการที่คอยฟังการเปลี่ยนแปลงในภาษาปัจจุบันและขอการแปลอยู่แล้ว และคุณมีหน้าที่เชื่อมต่อทุกอย่าง
ไปที่ไฟล์ src/ai/translator.ts
ตรวจสอบฟังก์ชันเป้าหมาย createTranslator ในบรรทัดที่ 29–45:
export async function createTranslator(
targetLang: SupportedLanguage
): Promise<Translator | null>
- ตรวจสอบว่า API ของเครื่องมือแปลภาษาได้รับการรองรับและตรวจสอบว่าภาษาเป้าหมายไม่ใช่ภาษาอังกฤษ (เนื้อหาจะเป็นภาษาอังกฤษโดยค่าเริ่มต้น)
- สร้างคู่ภาษาจากภาษาอังกฤษเป็นภาษาเป้าหมาย แล้วตรวจสอบว่าคู่ภาษานั้นพร้อมใช้งานหรือไม่
- สร้างตัวเลือกสำหรับนักแปลและแนบจอภาพเพื่อแสดงความคืบหน้าในการดาวน์โหลดโมเดล
- แสดงผลโปรแกรมแปลที่เริ่มต้น
จากนั้นตรวจสอบฟังก์ชันเป้าหมาย translate ในบรรทัดที่ 50-58 ดังนี้
export async function translate(
text: string,
targetLang: SupportedLanguage
): Promise<string>
- ตรวจสอบว่ามีนักแปลที่พร้อมให้บริการโดย
getCachedTranslatorส่งtargetLangหรือไม่ หากไม่มี ให้ส่งคืนข้อความที่คลีนแล้ว - หากมี ให้ใช้เครื่องมือแปลภาษาเพื่อแปลข้อความที่สะอาด
ไปที่ไฟล์ src/ai/translator.ts
ตรวจสอบฟังก์ชันเป้าหมาย render ในบรรทัดที่ 204 ดังนี้
export async function translate(
text: string,
targetLang: SupportedLanguage
): Promise<string>
- เปิดใช้คอมโพเนนต์เครื่องมือเลือกภาษา
4. การใช้ WebMCP เพื่อปรับปรุงประสบการณ์ของตัวแทน
WebMCP คืออะไร
เมื่อผู้ใช้เริ่มใช้เอเจนต์แบบอัตโนมัติและเอเจนต์ที่ใช้การเรียกดูร่วมกัน เว็บไซต์จึงต้องปรับตัว โดยปกติแล้ว Agent จะอาศัยการกระตุ้น ซึ่งเป็นการถ่ายภาพหน้าจอและคัดลอก DOM รวมถึงแผนผังการช่วยเหลือพิเศษ เพื่อพิจารณาวิธีโต้ตอบกับเว็บไซต์ ซึ่งช้า ไม่เสถียร มีข้อผิดพลาด และสิ้นเปลืองโทเค็นของผู้ใช้
WebMCP ช่วยแก้ปัญหานี้ด้วยการอนุญาตให้นักพัฒนาแอปมอบเครื่องมือให้แก่เอเจนต์โดยตรงเพื่อโต้ตอบกับหน้าเว็บที่เอเจนต์กำลังดูอยู่ ตัวแทนที่ให้การสนับสนุนสามารถใช้เครื่องมือเหล่านั้นได้เช่นเดียวกับเครื่องมือในสายรัดการเขียนโค้ด โดยมีอินพุตที่ชัดเจนและเป็นโครงสร้าง รวมถึงค่าที่ส่งคืนซึ่งคุณเป็นผู้กำหนด
// Register a tool directly on document.modelContext
document.modelContext.registerTool({
name: 'get_product_specs',
title: 'Get Product Specs',
description: 'Retrieve technical specifications for the active product.',
inputSchema: {
type: 'object',
properties: {
// ...
},
},
annotations: {
readOnlyHint: true, // Informs the agent this tool causes no side-effects
},
execute: async (input) => {
return {
weight: '1.8 kg',
capacity: '3 persons',
seasons: '3-season',
};
},
});
เมื่อตัวแทนเชื่อมต่อกับหน้าเว็บ ตัวแทนจะส่งคำค้นหาไปยัง document.modelContext.getTools() เครื่องมือที่ลงทะเบียนแต่ละรายการจะแสดงข้อมูลต่อไปนี้
name: ตัวระบุเครื่องมือแบบเป็นโปรแกรมที่เอเจนต์ใช้เมื่อเรียกใช้เครื่องมือ (เช่น'get_product_specs')title: ป้ายกำกับที่แสดงซึ่งมนุษย์อ่านได้ซึ่งใช้โดยผู้ตรวจสอบและอินเทอร์เฟซของตัวแทน (เช่น'Get Product Specs')description: คำอธิบายข้อความธรรมดาที่แจ้งให้โมเดลทราบว่าเครื่องมือทำอะไรและเมื่อใดควรเรียกใช้ ซึ่งเป็นวิธีที่เอเจนต์ใช้พิจารณาว่าควรเรียกใช้เครื่องมือหรือไม่ ดังนั้นโปรดอธิบายให้ชัดเจนinputSchema: JSON Schema ที่กำหนดอาร์กิวเมนต์ที่ยอมรับannotations: คำแนะนำเกี่ยวกับลักษณะการทำงาน เช่น{ readOnlyHint: true }สำหรับเครื่องมือแบบอ่านอย่างเดียวซึ่งไม่ทำให้เกิดผลข้างเคียงของสถานะexecute: ฟังก์ชันแบบไม่พร้อมกันที่ดำเนินการเมื่อเรียกใช้เครื่องมือ
งานที่ 2.1: เครื่องมือแนะนำและผลิตภัณฑ์
คุณเริ่มต้นด้วยการลงทะเบียนเครื่องมือเพื่อให้ตัวแทนดึงคำแนะนำที่คุณเพิ่งสร้างขึ้นในแบบฝึกหัดก่อนหน้าได้
ไปที่ไฟล์ src/components/product/ForYouSection.ts
ตรวจสอบ registerWebMCPTools() ในบรรทัดที่ 71–94
private registerWebMCPTools(): void
- ตรวจสอบว่ารองรับ WebMCP หรือไม่
- หากเป็นเช่นนั้น ให้ลงทะเบียนเครื่องมือ
- เลือกชื่อและคำอธิบายที่ดึงดูดให้ Agent เลือกใช้เครื่องมือดังกล่าว โดยคิดถึงวิศวกรรมพรอมต์ (Prompt Engineering) ในที่นี้
- ไม่มีอินพุต ดังนั้นให้รวมสคีมา JSON ของออบเจ็กต์ที่ว่างเปล่า
- นี่คือเครื่องมือแบบอ่านอย่างเดียว
- ในฟังก์ชันการดำเนินการ ให้ใช้
recommendationStoreเพื่อรับชุดคำแนะนำปัจจุบัน จากนั้นส่งคืนรหัสผลิตภัณฑ์ปัจจุบันและชุดคำแนะนำผลิตภัณฑ์ - เพิ่มสัญญาณยกเลิกและดักจับสัญญาณดังกล่าวเพื่อไม่ให้เกิดข้อผิดพลาด ซึ่งจะช่วยให้มั่นใจได้ว่าระบบจะนำเครื่องมือออกอย่างถูกต้องเมื่อคอมโพเนนต์เลิกติดตั้ง
ไปที่ไฟล์ src/views/ProductView.ts
- ทำขั้นตอนเดียวกันเพื่อลงทะเบียนเครื่องมือ
get_current_productโดยคราวนี้ให้ส่งคืนทั้งผลิตภัณฑ์และคำแนะนำ
งาน 2.2: เครื่องมือลิ้นชักรถเข็น
ไปที่ไฟล์ src/components/cart/CartDrawer.ts
ตรวจสอบ registerWebMCPTools() ในบรรทัดที่ 83–114
private registerWebMCPTools(): void
- ลงทะเบียนเครื่องมือ
view_cartโดยทำดังนี้
inputSchemaของออบเจ็กต์ควรเป็นออบเจ็กต์ที่มีตัวเลือกบูลีนเดียวคือopenDrawer- โดยควรเป็นแบบอ่านอย่างเดียว
- อ่านข้อมูลที่ป้อนเป็นส่วนหนึ่งของฟังก์ชัน
executeตัดสินใจว่าจะแสดงหรือซ่อนรถเข็น รีเฟรชrecommendationStoreแล้วแสดงข้อมูลสรุปของรถเข็น
- ลงทะเบียนเครื่องมือ
manage_cartโดยทำดังนี้
inputSchemaควรเป็นออบเจ็กต์ที่มีitemsซึ่งเป็นอาร์เรย์ของออบเจ็กต์ที่มีproductID,add,removeและupdateactionenum รวมถึงจำนวนเต็มquantity- ฟังก์ชัน
executeควรส่งรายการไปยังthis.updateCart
งานที่ 2.3: เครื่องมือสลับภาษา
พัฒนา WebMCP ให้ดียิ่งขึ้นด้วยการเปิดเผยเครื่องมือภาษาแก่ตัวแทนภายนอก
ไปที่ไฟล์ src/components/navigation/LanguagePicker.ts
ตรวจสอบ registerWebMCPTools() ในบรรทัดที่ 61–63:
private registerWebMCPTools(): void
- ลงทะเบียนเครื่องมือ
switch_languageโดยทำดังนี้inputSchemaควรมีพร็อพเพอร์ตี้languageซึ่งเป็น enum ของSUPPORTED_LANGUAGE_CODES- ฟังก์ชัน
executeควรเรียกใช้this.switchLanguageด้วยภาษาที่ระบุ
งานที่ 2.4: เครื่องมือการนำทางในร้านค้า
เปิดใช้เอเจนต์อัตโนมัติเพื่อไปยังส่วนต่างๆ ของร้านค้า ไปยังหน้าผลิตภัณฑ์ เรียกดูหมวดหมู่ หรือเริ่มการค้นหา
ไปที่ไฟล์ src/components/navigation/SiteHeader.ts
ตรวจสอบ registerWebMCPTools() ในบรรทัดที่ 155–171
private registerWebMCPTools(): void
- ตรวจสอบว่ารองรับ WebMCP หรือไม่
- ลงทะเบียนเครื่องมือ
searchโดยทำดังนี้- สคีมาอินพุตใช้สตริง
query - ใน
executeโทรหาthis.search(input?.query)
- สคีมาอินพุตใช้สตริง
- ลงทะเบียนเครื่องมือ
go_to_catalogโดยทำดังนี้- สคีมาอินพุตยอมรับ
activity(enum ของACTIVITIES) และcategory(enum ของPRODUCT_CATEGORIES) ที่ไม่บังคับ - ใน
executeโทรหาthis.goToCatalog(input?.activity, input?.category)
- สคีมาอินพุตยอมรับ
- ลงทะเบียนเครื่องมือ
get_categories_and_activitiesโดยทำดังนี้- เครื่องมือแบบอ่านอย่างเดียวที่ไม่มีพารามิเตอร์อินพุต
- ใน
executeโทรหาthis.getCategoriesAndActivities()
- ลงทะเบียนเครื่องมือ
go_to_productโดยทำดังนี้- สคีมาอินพุตต้องมี
productIdสตริง - ใน
executeโทรหาthis.goToProduct(input?.productId)
- สคีมาอินพุตต้องมี
ยืนยันด้วยเครื่องมือตรวจสอบ WebMCP
- โหลด
http://localhost:5173/catalog/tent-mont-tremblant-3pใน Chrome ซ้ำ แล้วไปที่หน้าสินค้า - เปิดเครื่องมือสำหรับนักพัฒนาเว็บใน Chrome > แอปพลิเคชัน > WebMCP
- คุณควรเห็นเครื่องมือ WebMCP:
get_recommendations,get_current_product,view_cart,manage_cart,switch_language,search,go_to_catalog,get_categories_and_activitiesและgo_to_product - คลิกรายการใดรายการหนึ่งเพื่อดูรายละเอียดและพารามิเตอร์
- เลือกรายการที่มีพารามิเตอร์ เลือกบางรายการ แล้วคลิกเรียกใช้เครื่องมือเพื่อดูการทำงาน
- (ไม่บังคับ) หากคุณติดตั้งและตั้งค่า WebMCP Model Context Tool Inspector ให้เปิดเครื่องมือดังกล่าว ซึ่งจะเปิดขึ้นในแผงด้านข้างของ Chrome ใช้อินเทอร์เฟซแชทเพื่อบอกให้ตัวแทนดำเนินการที่คุณเชื่อว่าควรเรียกใช้เครื่องมือใดเครื่องมือหนึ่งเพื่อดูว่าเครื่องมือตอบสนองอย่างไร
5. (ไม่บังคับ) การสร้างเอเจนต์ในสถานที่
เรียกใช้เครื่องมือ WebMCP ในหน้าเว็บ
เครื่องมือ WebMCP ไม่ได้มีไว้สำหรับส่วนขยายของเบราว์เซอร์ภายนอกหรือบ็อตของบุคคลที่สามเท่านั้น แต่แอปพลิเคชันของคุณเองก็เรียกใช้เครื่องมือเหล่านี้ได้โดยตรง การค้นหา document.modelContext.getTools() จะช่วยให้โค้ดฝั่งไคลเอ็นต์ค้นหาและเรียกใช้เครื่องมือแบบไดนามิกได้
คุณสามารถใช้เครื่องมือนี้เพื่อสร้างผู้ช่วยช็อปปิ้ง AI ในเว็บไซต์ ซึ่งจะเปลี่ยนแถบค้นหาให้เป็นเครื่องมือค้นพบผลิตภัณฑ์ตามอินพุตภาษาที่เป็นธรรมชาติ แถบค้นหาจะส่งคำค้นหาที่เป็นภาษาธรรมชาติไปยัง Prompt API ซึ่งจะตัดสินใจว่าจะเรียกใช้เครื่องมือ WebMCP ในหน้าเว็บใด แทนที่จะเขียนโค้ดคำสั่งที่กำหนดเองเพื่อประสานงานตัวกรองข้อมูลประกอบจำนวนมาก
วิธีค้นหาและเรียกใช้เครื่องมือ WebMCP จาก JavaScript
// getTools() returns a Promise — it must be awaited.
const tools = await document.modelContext.getTools();
const tool = tools.find(t => t.name === 'list_items');
const json = await document.modelContext.executeTool(tool, args);
const result = JSON.parse(json); // executeTool resolves with a DOMString
งาน 3.1: เครื่องมือแง่มุมของแถบด้านข้าง
เปิดเผยแง่มุมของแถบด้านข้างของแคตตาล็อกแต่ละรายการต่อ WebMCP เพื่อให้ตัวแทน (และผู้ช่วยค้นหาในหน้าเว็บ) สลับตัวกรองแบบเป็นโปรแกรมได้
คอมโพเนนต์ Facet แต่ละรายการใน src/components/facets/ มีเมธอดตัวช่วยในคลาสและสคีมาอินพุตที่ส่งออกใน src/utils/filter-schemas.ts อยู่แล้ว
- ใน
src/components/facets/ActivityFacet.ts:- ลงทะเบียน
activity_filterโดยใช้activityFilterSchema - ใน
executeโทรหาthis.filterActivity(input?.activity, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/CategoryFacet.ts:- ลงทะเบียน
category_filterโดยใช้categoryFilterSchema - ใน
executeโทรหาthis.filterCategory(input?.category, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/ConditionFacet.ts:- ลงทะเบียน
condition_filterโดยใช้conditionFilterSchema - ใน
executeโทรหาthis.filterCondition(input?.condition, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/PriceFacet.ts:- ลงทะเบียน
price_filterโดยใช้priceFilterSchema - ใน
executeโทรหาthis.filterPrice(input?.priceRange || input?.bracket, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/WeightFacet.ts:- ลงทะเบียน
weight_filterโดยใช้weightFilterSchema - ใน
executeโทรหาthis.filterWeight(input?.weightRange || input?.bracket, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/RatingFacet.ts:- ลงทะเบียน
rating_filterโดยใช้ratingFilterSchema - ใน
executeโทรหาthis.filterRating(input?.minRating || input?.rating, input?.selected)
- ลงทะเบียน
- ใน
src/components/facets/SearchFacet.ts:- ลงทะเบียน
keyword_filterโดยใช้keywordFilterSchema - ใน
executeโทรหาthis.updateKeyword(input?.keyword)
- ลงทะเบียน
อย่าลืมตรวจสอบการรองรับ WebMCP และส่ง { signal: this.signal } พร้อม .catch(() => {}) ตามที่ได้เรียนรู้ในขั้นตอนที่ 2
งานที่ 3.2: เครื่องมือมุมมองแคตตาล็อก
ตอนนี้คุณสามารถลงทะเบียนเครื่องมือแคตตาล็อกระดับข้อมูล กรองรีเซ็ต และเครื่องมือค้นหาเชิงความหมายได้แล้วใน document.modelContext
ไปที่ไฟล์ src/views/CatalogView.ts
ตรวจสอบ registerWebMCPTools() ในบรรทัดที่ 125–140
private registerWebMCPTools(): void
- ตรวจสอบว่ารองรับ WebMCP หรือไม่
- ลงทะเบียนเครื่องมือ
list_itemsโดยทำดังนี้- โดยไม่มีพารามิเตอร์อินพุตและเป็นแบบอ่านอย่างเดียว
- ฟังก์ชัน
executeควรเรียกใช้this.getItemsSummary()
- ลงทะเบียนเครื่องมือ
reset_filtersโดยทำดังนี้- โดยไม่ต้องใช้พารามิเตอร์อินพุต
- ฟังก์ชัน
executeควรเรียกใช้this.resetFilters()
- ลงทะเบียนเครื่องมือ
semantic_catalog_filterโดยทำดังนี้- ใช้
semanticCatalogFilterSchema - ฟังก์ชัน
executeควรเรียกใช้interpretAndApplySemanticFilter(input.query)
- ใช้
งาน 3.3: จัดการ Agent ตัวกรองเชิงความหมาย
ตอนนี้ก็ถึงเวลาต่อสายไฟทั้งหมดแล้ว งานนี้จะเปลี่ยนการค้นหาให้เป็นไปป์ไลน์เชิงความหมายที่ขับเคลื่อนsemantic_catalog_filterเครื่องมือดังนี้
ไปที่ไฟล์ src/ai/catalog-semantic-filter.ts
ตรวจสอบ prewarmSemanticFilterSession() ในบรรทัดที่ 84–88
export async function prewarmSemanticFilterSession(): Promise<void>
- ตรวจสอบว่ามี
warmSessionอยู่แล้วหรือไม่ หากมี ให้แสดงผลก่อน - อุ่นเซสชัน Prompt API ล่วงหน้าด้วย
SEMANTIC_FILTER_SYSTEM_PROMPTโดยใช้getPromptSession()และจัดเก็บไว้ในwarmSessionรวมไว้ในบล็อกtry/catchเพื่อให้การสร้างการค้นหายังคงย้อนกลับได้อย่างราบรื่นในกรณีที่การอุ่นเครื่องล่วงหน้าไม่สำเร็จ
ตรวจสอบ inferSearchFacets() ในบรรทัดที่ 93–134:
async function inferSearchFacets(
searchTerm: string,
cachedJourney: JourneyProfile | null
): Promise<{ parsed: SemanticFilterResponse; cacheHit: boolean }>
- อ้างสิทธิ์เซสชันที่อุ่นเครื่องไว้ล่วงหน้าจาก
warmSessionหากมี (และรีเซ็ตwarmSessionเป็นnull) หรือสร้างเซสชันใหม่โดยใช้getPromptSession(SEMANTIC_FILTER_SYSTEM_PROMPT) - พรอมต์โมเดลด้วย
promptTextโดยใช้semanticFilterSchemaเป็นresponseConstraint - แยกวิเคราะห์ JSON ที่ส่งคืน จัดเก็บผลลัพธ์ที่แยกวิเคราะห์แล้วในแคชถาวรด้วย
cacheKeyและทำลายเซสชันในบล็อกfinally
ตรวจสอบ applyFacetsViaWebMCP() ในบรรทัดที่ 139–270
async function applyFacetsViaWebMCP(
searchTerm: string,
parsed: SemanticFilterResponse
): Promise<{ appliedFilters: SemanticFilterResult['appliedFilters']; toolsExecuted: string[] }>
- ค้นพบเครื่องมือที่ลงทะเบียนไว้ใน
document.modelContextโดยใช้await document.modelContext.getTools() - รีเซ็ตตัวกรองเพื่อเริ่มต้นใหม่โดยการเรียก
await executeFacet('reset_filters', {}) - ใช้แง่มุมที่ใช้งานอยู่พร้อมกันโดยใช้
await Promise.all(facetTasks)
ตรวจสอบ interpretAndApplySemanticFilter() ในบรรทัดที่ 272–316
export async function interpretAndApplySemanticFilter(
searchTerm: string
): Promise<SemanticFilterResult>
- อนุมานแง่มุมการค้นหาโดยการเรียกใช้
inferSearchFacets(searchTerm, cachedJourney) - ใช้แง่มุมที่อนุมานกับแคตตาล็อกโดยใช้
applyFacetsViaWebMCP(searchTerm, parsed)
ยืนยันตัวแทนในหน้าเว็บ
- นำทางไปยัง
http://localhost:5173/catalog - ป้อน
"lightweight 3 season tent for wet hikes"ในแถบค้นหาด้านบน - ดู Prompt API แยกวิเคราะห์คำขอ เรียกใช้
activity_filter(Hiking),category_filter(Tents) และcondition_filter(Wet) เพื่อจำกัดแคตตาล็อกให้เหลือเฉพาะอุปกรณ์ที่ตรงกันได้ทันทีโดยไม่ต้องคลิกช่องทำเครื่องหมายด้วยตนเอง
6. สิ่งที่คุณได้เรียนรู้
ยินดีด้วย คุณได้เปลี่ยนแอปพลิเคชันอีคอมเมิร์ซให้เป็นประสบการณ์การใช้งานอัจฉริยะที่เน้นตัวแทนซึ่งขับเคลื่อนด้วย AI ในอุปกรณ์และ API ของแพลตฟอร์มเว็บมาตรฐานทั้งหมด
สิ่งที่คุณสร้าง
- Prompt API ในอุปกรณ์: สังเคราะห์ไทม์ไลน์การท่องเว็บของผู้ใช้ด้วย
LanguageModelเพื่อสร้างบริบทJourneyProfileแบบเรียลไทม์ และสร้างrankComplementaryGearเครื่องมือเสริมประสิทธิภาพโดยใช้สคีมา JSON ที่มีโครงสร้าง (responseConstraint) - เครื่องมือคอมโพเนนต์ WebMCP: เครื่องมือแบบโมดูลาร์ที่ลงทะเบียนแล้วและแคปซูลในคอมโพเนนต์ UI (
get_recommendations,get_current_product,view_cart,manage_cart) ผ่านdocument.modelContext - สถาปัตยกรรมตัวแทนส่งต่อ: ทดสอบและยืนยันการดำเนินการเครื่องมือโดยใช้ส่วนขยาย Chrome WebMCP Inspector
- เอเจนต์ในหน้าเว็บของเว็บไซต์: เครื่องมือฝั่งไคลเอ็นต์ที่จัดระเบียบโดยตรงในเบราว์เซอร์เพื่อขับเคลื่อนการค้นหาแคตตาล็อกด้วยภาษาธรรมชาติแบบหลายแง่มุมจากแถบค้นหาในส่วนหัวของเว็บไซต์
- โมเดล AI ในอุปกรณ์เฉพาะทาง: ทดลองใช้การแปลในอุปกรณ์แบบไดนามิกโดยใช้
Translator
สิ่งสำคัญที่เรียนรู้
- ความหน่วงเป็นศูนย์และความเป็นส่วนตัวสูง: โมเดลในอุปกรณ์ เช่น Gemini Nano ช่วยลดความกังวลเกี่ยวกับคีย์ API ของระบบคลาวด์ ความหน่วงของเครือข่าย และการขโมยข้อมูล
- เอาต์พุตที่มีโครงสร้างเป็นสิ่งจำเป็น: การใช้สคีมา JSON กับ
responseConstraintจะเปลี่ยนการสร้างข้อความครีเอทีฟโฆษณาให้เป็นตรรกะของแอปพลิเคชันที่เชื่อถือได้และปลอดภัย - WebMCP เตรียมเว็บสำหรับ AI Agent: การลงทะเบียนเครื่องมือใน DOM โดยตรงจะช่วยให้ทั้งฟีเจอร์ความช่วยเหลือภายในและ Agent เบราว์เซอร์อัตโนมัติภายนอกสามารถดำเนินการที่ได้รับการยืนยันและกำหนดได้
- ให้โมเดลเสนอ ไม่ใช่ดำเนินการ: การจำกัดโมเดลให้อยู่ใน
enumของเครื่องมือที่ลงทะเบียนไว้และการส่งผลลัพธ์ด้วยตนเองจะช่วยให้ตรวจสอบพฤติกรรมของเอเจนต์ได้และป้องกันไม่ให้เอเจนต์สร้างการดำเนินการขึ้นมาเอง