สนับสนุน
จัดลำดับทิกเก็ตสนับสนุนเป็นร่างคำตอบที่มีหลักฐาน
ปิดข้อมูลทิกเก็ต จัดประเภทเจตนาและลำดับความสำคัญด้วย Chat ดึงส่วนที่ตอบจากเอกสาร ตรวจบทสนทนาเหตุการณ์สาธารณะ และทิ้งร่างที่กำหนดเส้นทางเพื่ออนุมัติโดยมนุษย์
คัดลอกพรอมป์ต์
แทนช่องในวงเล็บเหลี่ยมแล้ววางใน Claude Code, Codex หรือ AI ที่เข้าถึงเทอร์มินัล ระบบจะติดตั้งสกิล Felo ถามก่อนใช้เครดิต และรันเวิร์กโฟลว์
คัดแยกตั๋วสนับสนุนนี้และร่างคำตอบสำหรับให้คนตรวจ: [วางตั๋วหลังลบชื่อ อีเมล ID บัญชี ข้อมูลการชำระเงิน และข้อมูลระบุตัวตนอื่น] พื้นที่ผลิตภัณฑ์: [ผลิตภัณฑ์] แพ็กเกจหรือภูมิภาค: [เฉพาะเมื่อจำเป็นต่อคำตอบ] แหล่งเอกสาร: [URL ศูนย์ช่วยเหลือหรือ LiveDoc short_id] เส้นทางอนุมัติ: [ใครตรวจ] คิวส่งต่อ: [ทีมหรือช่องทาง] สร้าง: 1. เจตนา: หนึ่งหมวดและหนึ่งประโยคเหตุผล 2. ลำดับความสำคัญ: เร่งด่วน / ปกติ / ต่ำ พร้อมกฎที่ใช้ 3. หลักฐาน: ข้อความเอกสารที่ตอบตั๋ว พร้อมชื่อและความเกี่ยวข้อง 4. ตรวจเหตุการณ์: รายงานสาธารณะบ่งชี้เหตุขัดข้องวงกว้างหรือไม่ ลิงก์และวันที่ หรือ “ไม่มีสัญญาณสาธารณะ” 5. เส้นทาง: ร่าง ติดต่อขอข้อมูลเพิ่ม หรือส่งต่อ — และเพราะอะไร 6. ร่างคำตอบ: สองถึงสี่ประโยค อิงหลักฐานเท่านั้น และระบุแหล่งที่ใช้ กฎ: - ห้ามใส่ชื่อ อีเมล เลขคำสั่งซื้อ โทเคน หรือข้อมูลการชำระเงินในการเรียก API หรือผลลัพธ์ ทำงานกับตั๋วที่ปิดข้อมูลแล้วเท่านั้น - ตอบจากเอกสารที่ค้นคืนได้เท่านั้น ถ้าไม่มีหลักฐานให้ส่งต่อ ไม่ใช่เดา - ห้ามสัญญาการคืนเงิน ส่วนลด กำหนดเวลา หรือการเปลี่ยนบัญชี ให้ส่งเคสเหล่านี้ไปยังการส่งต่อ - ข่าวลือเหตุขัดข้องสาธารณะเป็นสัญญาณ ไม่ใช่หลักฐาน อ้างโพสต์และวันที่ - ก่อนใช้เครดิต ให้แสดงการเรียกที่จะทำและรอการอนุมัติจากฉัน - ห้ามส่งคำตอบ อัปเดตตั๋ว หรือดำเนินการกับบัญชี ให้ส่งร่างกลับมาให้ตรวจ - เขียนผลลัพธ์ลง ./support-triage.md และสรุปในแชท
สำเนายังรวมขั้นตอนติดตั้งและกฎความปลอดภัย
สิ่งที่คุณได้รับ
ตัวอย่างผลลัพธ์จากการรันหนึ่งครั้ง ไม่ใช่การสร้างสด
คัดแยก — ตั๋วตัวอย่าง
เจตนา
คำถามการเรียกเก็บเงิน / ต่ออายุ ลูกค้าถามทำไมแพ็กเกจต่ออายุอีกครั้ง
ลำดับความสำคัญ
ปกติ เป็นคำถามเรียกเก็บเงิน ไม่ใช่เหตุขัดข้อง และลูกค้าไม่ถูกบล็อก
หลักฐาน
- “คำถามที่พบบ่อยเกี่ยวกับการเรียกเก็บเงิน” — เวลาต่ออายุและการลองบัตรใหม่ ความเกี่ยวข้อง: สูง
- “การเปลี่ยนแพ็กเกจ” — ดาวน์เกรดระหว่างรอบต่ออายุ ความเกี่ยวข้อง: กลาง
ตรวจเหตุการณ์
ไม่มีรายงานสาธารณะใน 48 ชั่วโมงที่ผ่านมา
เส้นทาง
ร่าง เอกสารครอบคลุมคำถาม
ร่างคำตอบ
สวัสดี — แพ็กเกจของคุณต่ออายุวันที่ 1 ของทุกเดือน หากบัตรถูกปฏิเสธจะลองใหม่สามวันก่อนพักที่นั่ง คุณเปลี่ยนบัตรได้ในการตั้งค่าการเรียกเก็บเงิน และ คำถามที่พบบ่อย มีขั้นตอน หากต้องเลื่อนวันต่ออายุ ตอบกลับมาแล้วเราจะส่งต่อทีมเรียกเก็บเงิน
บันทึกผู้ตรวจ
อนุมัติ แก้ไข หรือส่งต่อคิวการเรียกเก็บเงิน
การเรียกที่แน่นอน
สำหรับนักพัฒนา: เวิร์กโฟลว์เดียวกันในรูปโค้ดตามลำดับการทำงาน
แสดงการเรียก API จริง
ปิดข้อมูลและจัดประเภท
ลบอีเมล โทรศัพท์ และเลขคำสั่งซื้อด้วยโค้ด แล้วใช้ Chat กำหนดเจตนาและลำดับความสำคัญ
triage.ts const BASE = "https://openapi.felo.ai"; const headers = { Authorization: `Bearer ${process.env.FELO_API_KEY}`, "Content-Type": "application/json", }; async function felo<T>(path: string, body?: unknown): Promise<T> { const res = await fetch(`${BASE}${path}`, { method: body ? "POST" : "GET", headers, body: body ? JSON.stringify(body) : undefined, }); if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`); return res.json() as Promise<T>; } const redact = (text: string) => text .replace(/[\w.+-]+@[\w.-]+\.\w+/g, "[email]") .replace(/\b(?:acct|account|order|invoice)[-_ ]?\w+\b/gi, "[id]") .replace(/\b(?:\d[ -]?){13,19}\b/g, "[card]"); type Ticket = { id: string; product: string; subject: string; body: string; plan?: string; sensitive?: boolean; }; const ticket: Ticket = { id: "T-1042", product: "Acme Workspace", subject: "Why did my plan renew?", body: "I was charged again and cannot find the renewal date on my account.", plan: "team", }; const summary = redact(`${ticket.subject}\n\n${ticket.body}`).slice(0, 1500); type ChatData = { data: { answer: string; resources: { link: string; title: string; snippet: string }[]; }; }; const triage = await felo<ChatData>("/v2/chat", { query: `Classify this support question by intent and priority, and list what is missing:\n\n${summary}`, }); console.log(triage.data.answer);ตัวอย่างผลลัพธ์
{ "answer": "Intent: billing / renewal question. Priority: normal. Missing: the renewal date the customer expects.", "resources": [ { "link": "https://example.com/billing-faq", "title": "Billing FAQ", "snippet": "…" } ] }ดึงหลักฐานเอกสาร
ค้นส่วนที่เกี่ยวข้องใน LiveDoc สนับสนุน เก็บหัวเรื่องและคะแนน
triage.ts type Hit = { title: string; content: string; score: number }; const KB = process.env.SUPPORT_LIVEDOC_ID!; // the help-center LiveDoc short_id const retrieved = await felo<{ data: Hit[] }>( `/v2/livedocs/${KB}/resources/retrieve`, { query: summary }, ); const hits = retrieved.data.filter((hit) => hit.score >= 0.7).slice(0, 4); if (hits.length === 0) { console.log("No grounded evidence: escalate instead of drafting"); }ตัวอย่างผลลัพธ์
[ { "title": "Billing FAQ", "content": "Your plan renews on the first of the month; a failed card retries for three days…", "score": 0.91 } ]ตรวจเหตุการณ์สาธารณะ
ค้นบน X ผลิตภัณฑ์และคำอย่าง “ขัดข้อง/ออฟไลน์” ใน 48 ชั่วโมง เฉพาะเป็นสัญญาณสาธารณะ
triage.ts type XData = { data: { tweets: { content: string; author: { username: string }; created_at: string; url: string; }[]; }; }; const since = Math.floor((Date.now() - 48 * 60 * 60 * 1000) / 1000); const incident = await felo<XData>("/v2/x/tweet/search", { query: `"${ticket.product}" (outage OR "not working" OR error)`, limit: 20, since_time: since, }); const reports = incident.data.tweets.map((post) => ({ text: post.content, handle: post.author.username, at: post.created_at.slice(0, 10), link: post.url, }));ตัวอย่างผลลัพธ์
[ { "text": "Workspace login is failing for my whole team.", "handle": "example_user", "at": "2026-10-30", "link": "https://x.com/example_user/status/..." } ]กำหนดเส้นทางและประกอบคำตอบ
กฎกำหนดคิว รวมหลักฐาน ขั้นถัดไป และร่าง
triage.ts type Route = "draft" | "ask-customer" | "escalate"; function decideRoute(): { route: Route; reason: string } { if (hits.length === 0) { return { route: "escalate", reason: "no grounded evidence in the knowledge base" }; } if (ticket.sensitive) { return { route: "escalate", reason: "an account or billing action is requested" }; } if (reports.length >= 3) { return { route: "escalate", reason: "public reports suggest a wider issue" }; } if (!ticket.plan) { return { route: "ask-customer", reason: "the plan is needed to answer the question" }; } return { route: "draft", reason: "the documentation covers the question" }; } const decision = decideRoute(); const packet = [ `# Triage — ${ticket.id}`, "", `Route: ${decision.route} (${decision.reason})`, "", "## Intent and priority", triage.data.answer, "", "## Evidence", ...hits.map((hit) => `- ${hit.title} (score ${hit.score})`), "", "## Public signal", ...(reports.length ? reports.map((report) => `- @${report.handle} (${report.at}): ${report.text} — ${report.link}`) : ["No public reports in the last 48 hours."]), "", "## Reply draft", "[Written by the host Agent from the evidence above — human review required]", ].join("\n"); console.log(packet);ตัวอย่างผลลัพธ์
# Triage — T-1042 Route: draft (the documentation covers the question) ## Intent and priority Intent: billing / renewal question. Priority: normal. ## Evidence - Billing FAQ (score 0.91)
บันทึกการจัดลำดับ
เขียนผลลง LiveDoc เพื่อทบทวนและตรวจสอบ
triage.ts type LiveDocData = { data: { short_id: string } }; const log = await felo<LiveDocData>("/v2/livedocs", { name: "Support triage log", description: "One document resource per triaged ticket", }); await felo(`/v2/livedocs/${log.data.short_id}/resources/doc`, { title: `Triage — ${ticket.id}`, content: packet, }); console.log(log.data.short_id); // reuse it for the next ticketตัวอย่างผลลัพธ์
{ "short_id": "PvyKouzJirXjFdst4uKRK3" }
รวมอะไรบ้าง
- เจตนาและลำดับความสำคัญหลังปิดข้อมูล
- หลักฐานเอกสารพร้อมคะแนน
- การตรวจเหตุการณ์สาธารณะ
- ร่างคำตอบที่กำหนดเส้นทาง
- LiveDoc พร้อมบันทึกการจัดลำดับ
สิ่งที่ไม่ทำ
- ไม่ส่งคำตอบ ไม่ปิดทิกเก็ต และไม่ทำกิจกรรมบัญชี
- อย่าส่งรหัสผ่าน ข้อมูลชำระเงิน หรือข้อมูลลูกค้าเต็มไปยัง API
- หากไม่มีผลเอกสาร ต้องส่งต่อ
- X เป็นสัญญาณเหตุการณ์สาธารณะ ไม่ใช่สถานะระบบสนับสนุน
- กฎลำดับความสำคัญเป็นของคุณ โมเดลเพียงเสนอ
คำถาม
ส่งข้อมูลทิกเก็ตใดได้?
เฉพาะบริบทจำเป็นหลังปิดข้อมูล: ผลิตภัณฑ์ คำอธิบาย แพ็กเกจ และภูมิภาค ไม่ส่งรหัสผ่าน การชำระเงิน ที่อยู่เต็ม หรือบทสนทนาส่วนตัว
คำตอบมาจากไหน?
จากส่วนที่ดึงใน LiveDoc เอกสาร หากไม่มีผล เวิร์กโฟลว์ส่งต่อแทนการเดา
ตอบหรือปิดทิกเก็ตไหม?
ไม่ เพียงสร้างร่างและเส้นทาง การส่งและปิดทำโดยคนหรือระบบของคุณ
ลำดับความสำคัญตัดสินอย่างไร?
ตามกฎของคุณ โมเดลเสนอและให้เหตุผล เส้นทางยืนยันลำดับสุดท้าย
ถ้าเอกสารไม่ครอบคลุม?
ส่งต่อไปคิวของมนุษย์ โดยระบุ “ยังไม่ครอบคลุม” ในแพ็กเกจจัดลำดับ
การจัดลำดับหนึ่งครั้งมีค่าใช้จ่ายเท่าไร?
Chat การค้น และ X Search คิดตามการใช้งาน อัตราปัจจุบันที่หน้าค่าบริการ และพรอมป์ต์ขออนุมัติก่อนใช้จ่าย
เวิร์กโฟลว์ที่เกี่ยวข้อง
ตอบคำถามฝ่ายสนับสนุนจากเอกสารของคุณเอง
สร้าง LiveDoc โหลดศูนย์ช่วยเหลือและ runbook ภายใน ดึงส่วนที่ตอบทิกเก็ต และให้โมเดลตอบจากหลักฐานนั้นเท่านั้น
เปิดเวิร์กโฟลว์เนื้อหาเปลี่ยนบทสนทนาโซเชียลเป็นบรีฟฟังรายสัปดาห์
ค้นโพสต์ X สัปดาห์นี้เกี่ยวกับแบรนด์และคู่แข่ง เพิ่มบริบทเว็บพร้อมแหล่ง อ่านหน้าเบื้องหลัง และเก็บทุกฉบับเพื่อให้สัปดาห์ถัดไปเริ่มจากที่รู้แล้ว
เปิดเวิร์กโฟลว์วิจัยเปลี่ยนคำถามหนึ่งข้อเป็นบรีฟวิจัยที่มีแหล่งอ้างอิง
ถามเว็บ บันทึกหน้าเว็บที่อยู่เบื้องหลังคำตอบเป็น Markdown เพิ่มสิ่งที่ผู้ปฏิบัติพูดบน X และเก็บหลักฐานใน LiveDoc ที่ค้นซ้ำได้
เปิดเวิร์กโฟลว์ปรับให้เป็นของคุณ
สูตรเดิม ปรับตามวิธีที่คุณส่งมอบจริง
เฉพาะการจัดประเภท
ไม่ตอบ: เฉพาะเจตนา ลำดับความสำคัญ และคิวที่แนะนำ
เชื่อมกับระบบทิกเก็ต
ใช้ webhook ของคุณเขียนแพ็กเกจลงทิกเก็ตโดยไม่ส่งอัตโนมัติ
ต่อยอดไปฐานความรู้
เมื่อมีผลเอกสาร ไปต่อเวิร์กโฟลว์ฐานความรู้เพื่อคำตอบครบขึ้น
ไปต่อ
หน้าเอกสารอ้างอิงเบื้องหลังสูตรนี้และก้าวต่อไป