دستیار پشتیبانی مشتری
پاسخ به پرسشهای مشتری از دل مرکز راهنما، همراه با لینک به منبع.
مرکز راهنمایی که مشتریانتان بهجای جستوجو در آن، از آن میپرسند. یک فضای کاری، همهٔ مقالههای منتشرشده در آن، و پاسخهایی که به مقالهٔ منبعشان لینک میدهند.
معماری
برنامهٔ سمت کاربر شما هرگز با این API کار نمیکند. مسیر خودتان را صدا میزند، و آن مسیر کلید را نگه میدارد و پرسش را جلو میفرستد — همین است که اعتبارنامهای را که میتواند فضای کاری حذف کند از اینترنت عمومی دور نگه میدارد.
- مرورگر ← مسیر
/support/askخودتان (نشست خودتان، محدودیت نرخ خودتان). - مسیر شما ← این API، با کلید و شناسهٔ مشتری.
- پاسخ و منبعها از همان راه برمیگردند.
راهاندازی
یک فضای کاری بسازید و همهٔ مقالههای منتشرشده را در آن بارگذاری کنید. مرکز راهنمای عمومی چیزی برای جدا کردن ندارد، پس یک فضای کاری مشترک ساختار درست است.
کد
دو تابع: یکی برای پر کردن فضای کاری، یکی برای پاسخ دادن. منبعها بهازای هر مقاله تکرارزدایی میشوند، چون سه بخش بازیابیشده از یک صفحه باید یک لینک باشند، نه سه تا.
const BASE = "https://api.daneshyar.info/api/v1";
const KEY = process.env.DANESHYAR_API_KEY;
const WORKSPACE = "8f14e45f-ceea-467a-9f4c-1a2b3c4d5e6f";
/**
* One shared workspace holding every help-centre article, because in a public
* help centre there is nothing to separate — every reader may see every doc.
*/
export async function seedHelpCentre(articles) {
for (const article of articles) {
const body = new FormData();
body.append("file", new Blob([article.markdown]), `${article.slug}.pdf`);
body.append("title", article.title);
await fetch(`${BASE}/workspaces/${WORKSPACE}/resources/`, {
method: "POST",
headers: { "X-API-Key": KEY },
body,
});
}
}
/** Called from your own /support/ask route, which holds the key. */
export async function ask({ customerId, question, sessionId }) {
const res = await fetch(`${BASE}/workspaces/${WORKSPACE}/chat/`, {
method: "POST",
headers: { "X-API-Key": KEY, "Content-Type": "application/json" },
body: JSON.stringify({
// Your customer's id, so one person's thread is never another's.
external_user_id: customerId,
session_id: sessionId,
message: question,
}),
});
const { data } = await res.json();
const reply = data.assistant_message;
return {
sessionId: data.session.id,
answer: reply.content,
// Deduplicate per article: three passages from one page is one link.
sources: [
...new Map(
reply.citations.map((c) => [c.resource_id, c.resource_title]),
),
].map(([id, title]) => ({ id, title })),
};
}نتیجه
مشتریها پاسخی میگیرند همراه با مقالههایی که از آنها آمده، و شما برای هر مشتری نشستی دارید که با بارگذاری دوبارهٔ صفحه از بین نمیرود. فهرست منبعها را به نشانی مقالههای خودتان وصل کنید تا خواننده با یک کلیک هر ادعا را راستیآزمایی کند.