Hỗ trợ
Trả lời câu hỏi hỗ trợ từ tài liệu của chính bạn
Tạo LiveDoc, tải trung tâm trợ giúp và runbook nội bộ, lấy các đoạn trả lời ticket và để model chỉ trả lời từ bằng chứng đó.
Sao chép prompt
Thay các trường trong ngoặc vuông rồi dán vào Claude Code, Codex hoặc AI có quyền truy cập terminal. Nó cài skill Felo, hỏi trước khi dùng credit và chạy quy trình.
Trả lời câu hỏi hỗ trợ này chỉ bằng tài liệu của chúng ta: [câu hỏi của khách hàng]. Cơ sở kiến thức: [URL trung tâm trợ giúp hoặc LiveDoc short_id]. Đường chuyển cấp: [người phụ trách hoặc hàng đợi]. Ngữ cảnh khách hàng có sẵn: [gói, khu vực, sản phẩm] (không bao giờ hỏi mật khẩu hay dữ liệu thanh toán). Tạo: 1. Câu trả lời trực tiếp trong hai đến bốn câu. 2. Các đoạn tài liệu làm căn cứ, kèm tên tài nguyên. 3. Bước tiếp theo cho khách hàng. 4. Ghi chú nội bộ: tài nguyên đã dùng và điểm liên quan. Quy tắc: - Chỉ trả lời từ các đoạn đã truy xuất. Không có kết quả hoặc độ liên quan thấp thì chuyển cấp; không bao giờ đoán. - Không bịa chính sách, hoàn tiền, giá hay thao tác tài khoản. - Không đưa dữ liệu riêng tư của khách, thông tin đăng nhập hay thông tin thanh toán vào. - Hỏi trước khi tiêu tín dụng cho nạp dữ liệu hoặc truy xuất. - Không gửi câu trả lời cho khách; trả lại cho tôi để xem xét.
Bản sao cũng gồm các bước cài đặt và quy tắc an toàn.
Bạn nhận được gì
Kết quả mẫu của một lần chạy. Không phải tạo trực tiếp.
Trả lời: Gói của bạn gia hạn vào ngày 1 hàng tháng. Thẻ bị từ chối sẽ được thử lại ba ngày trước khi chỗ ngồi tạm dừng.
Nguồn: “câu hỏi thường gặp về thanh toán” - https://example.com/help/billing
Nếu chưa được đề cập: chuyển lên hàng đợi thanh toán kèm ID hóa đơn.
Các lệnh gọi chính xác
Dành cho lập trình viên: cùng quy trình dưới dạng mã, theo thứ tự chạy.
Hiện lệnh gọi API thật
Tạo cơ sở tri thức
Tạo cơ sở qua LiveDoc API và lưu short_id.
support.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>; } type LiveDocData = { data: { short_id: string } }; const kb = await felo<LiveDocData>("/v2/livedocs", { name: "Support knowledge base", description: "Help center, policy pages, and internal runbooks", }); const kbId = kb.data.short_id; // save this in your configKết quả mẫu
{ "short_id": "PvyKouzJirXjFdst4uKRK3", "name": "Support knowledge base", "description": "Help center, policy pages, and internal runbooks" }Tải trung tâm trợ giúp công khai
Thêm URL trung tâm trợ giúp làm tài nguyên LiveDoc.
support.ts type UrlResult = { data: { url: string; status: string; fail_reason: string | null; resource_id: string | null; }[]; }; const added = await felo<UrlResult>( `/v2/livedocs/${kbId}/resources/urls`, { urls: [ "https://example.com/help/getting-started", { url: "https://example.com/help/billing", title: "Billing FAQ" }, ], }, ); const failed = added.data.filter((item) => item.status === "failed");Kết quả mẫu
[ { "url": "https://example.com/help/getting-started", "status": "success", "resource_id": "res_003" }, { "url": "https://example.com/help/billing", "status": "existed", "resource_id": "res_004" } ]Thêm tài liệu nội bộ
Thêm runbook nội bộ làm tài liệu.
support.ts type ResourceData = { data: { id: string } }; const runbook = `# Refund policy Refunds are available within 30 days of purchase. Requests after 30 days need a manual review by the billing team. `; const policy = await felo<ResourceData>( `/v2/livedocs/${kbId}/resources/doc`, { title: "Refund policy", content: runbook }, ); console.log(policy.data.id); // use this for updatesLấy bằng chứng cho câu hỏi
Tìm kiếm ngữ nghĩa trả các đoạn và điểm liên quan nhất.
support.ts type Hit = { id: string; title: string; content: string; score: number }; async function findEvidence(question: string) { const res = await felo<{ data: Hit[] }>( `/v2/livedocs/${kbId}/resources/retrieve`, { query: question }, ); return res.data.filter((hit) => hit.score >= 0.7).slice(0, 4); } const question = "Can I get a refund after 45 days?"; const hits = await findEvidence(question);Kết quả mẫu
[ { "id": "res_005", "title": "Refund policy", "content": "Refunds are available within 30 days of purchase…", "score": 0.92 } ]Chỉ trả lời từ bằng chứng
Cho model chỉ dùng đoạn đã lấy và escalation khi không có kết quả.
support.ts type Completion = { choices: { message: { content: string | null } }[]; usage: { prompt_tokens: number; completion_tokens: number; total_tokens: number }; }; const context = hits .map((hit) => `### ${hit.title}\n${hit.content}`) .join("\n\n"); const completion = await felo<Completion>("/api/v1/chat/completions", { model: "anthropic/claude-haiku-5.5", messages: [ { role: "system", content: "Answer only from the context. If the context does not cover the question, say so and hand the ticket to a human.", }, { role: "user", content: `Context:\n${context}\n\nQuestion: ${question}`, }, ], }); console.log(completion.choices[0].message.content); console.log(completion.usage.total_tokens);Kết quả mẫu
"No. The Refund policy says refunds are available within 30 days of purchase, so a request at 45 days needs a manual review by the billing team."
Bao gồm
- LiveDoc từ trung tâm trợ giúp và runbook nội bộ
- Tìm kiếm ngữ nghĩa với đoạn và tiêu đề
- Câu trả lời có nguồn trích được
- Escalation rõ khi thiếu độ phủ
Không làm gì
- Chỉ trả lời từ tài liệu của bạn và không duyệt web mở
- Không thực hiện thao tác tài khoản, hoàn tiền hay đổi gói
- Không đưa dữ liệu khách riêng hay thông tin đăng nhập vào cơ sở
- Tài liệu cũ tạo câu trả lời cũ; cập nhật thường xuyên
- Chỉ soạn câu trả lời, không gửi cho khách
Câu hỏi
Câu trả lời đến từ đâu?
Chỉ từ LiveDoc: trang trung tâm trợ giúp và runbook. Tìm kiếm trả đoạn và agent viết từ đó.
Nếu tài liệu không đủ?
Escalation. Không kết quả hoặc độ liên quan thấp được coi là chưa đủ, không phải phép đoán.
Làm sao giữ cơ sở mới?
Khi chính sách đổi, thêm lại URL và cập nhật tài liệu; quy trình có lệnh cập nhật và audit.
Dùng trong hàng đợi ticket được không?
Có, như bước soạn nháp. Giữ người duyệt trước khi gửi khách.
Có xử lý câu hỏi theo tài khoản không?
Chỉ tài liệu thì không. Dữ liệu tài khoản ở hệ thống của bạn; chỉ truyền bối cảnh an toàn cần thiết, không bao giờ thông tin đăng nhập.
Một lần chạy tốn bao nhiêu?
Ingest và tìm kiếm tính theo mức dùng; giá hiện tại ở trang giá và prompt hỏi duyệt trước khi chi.
Quy trình liên quan
Biến một câu hỏi thành báo cáo nghiên cứu có nguồn
Hỏi web, lưu các trang đằng sau câu trả lời thành Markdown, thêm điều người thực hành nói trên X và giữ bằng chứng trong LiveDoc có thể tìm lại sau.
Mở quy trìnhNội dungXuất bản bản tin AI hằng ngày mà nhóm bạn thực sự đọc
Lấy bản tóm tắt tin có nguồn, thêm thảo luận của người thực hành trên X, lấy một bản ghi video, dựng bản tin Markdown và lưu vào LiveDoc.
Mở quy trìnhVăn phòngBiến trang nghiên cứu thành bài thuyết trình
Trích xuất trang, lưu làm bối cảnh LiveDoc, để PPT Task API dựng deck và hỏi cho đến khi có liên kết hoàn chỉnh.
Mở quy trìnhTùy biến
Cùng công thức, điều chỉnh theo cách bạn thực sự triển khai.
Chỉ một dòng sản phẩm
Giới hạn một sản phẩm để cơ sở gọn hơn.
Thêm phân loại ticket
Phân loại câu hỏi trước rồi tìm tài liệu phù hợp.
Audit định kỳ
Kiểm tra liên kết hỏng và chính sách cũ mỗi tháng.
Đi tiếp
Các trang tham chiếu đằng sau công thức và nơi đi tiếp.