برای ساخت ایجنت هوش مصنوعی با n8n که پیام‌های کاربران را به صورت خودکار جواب دهد، یک تریگر (مثلا تلگرام یا وبهوک) بسازید، پیام را به یک مدل چتی متصل کنید، در صورت نیاز دانش اختصاصی را با بازیابی متنی (RAG) اضافه کنید و پاسخ را به همان کانال برگردانید. در ادامه، مراحل عملی، نکات کلیدی و کدهای لازم را می‌بینید.

چه چیزی می‌سازیم و چرا n8n مناسب است؟

هدف، ساخت یک ایجنت پاسخ‌گو است که:

  • ورودی را از یک کانال (تلگرام، وبهوک سایت، ایمیل یا اسلک) دریافت کند.
  • با یک مدل هوش مصنوعی گفتگو کند و بر اساس سیاست پاسخ‌دهی شما جواب بسازد.
  • در صورت نیاز، از دانش اختصاصی (FAQ، اسناد، سیاست‌ها) استفاده کند.
  • اگر اطمینان پایین بود، گفتگو را برای بررسی انسانی ارسال کند.

n8n این مسیر را بدون کدنویسی سنگین ممکن می‌کند: تریگرها و کانکتورها آماده‌اند، منطق تصمیم (IF/Switch) و لاگ‌گیری ساده است و می‌توانید هر زمان یک سرویس یا مدل را جایگزین کنید.

پیش‌نیازها و انتخاب‌ها

  • یک نصب یا حساب n8n (Self-host یا Cloud).
  • کلید API برای یک مدل چتی عمومی (مثل OpenAI، Anthropic یا Cohere). کلید را در Credentials ذخیره کنید؛ داخل نودها ننویسید.
  • کانال ورودی/خروجی: یکی از Telegram، Webhook (برای چت‌ویجت سایت)، Slack یا Email.
  • دانش اختصاصی: از یک فایل/Sheet/Notion شروع کنید و در صورت نیاز به مقیاس، به بردارها (Embeddings) و بردارگان (Vector DB) بروید.

معیار انتخاب مدل:

  • تاخیر پاسخ: برای گفتگوی بلادرنگ، مدل‌های کم‌هزینه/سریع را برای پیش‌نویس و مدل‌های قوی را برای سوال‌های دشوار ترکیبی کنید.
  • کیفیت روی زبان فارسی: خروجی را با نمونه سوال‌های واقعی خود بسنجید؛ کیفیت بسته به دامنه متفاوت است.
  • سیاست داده: اگر داده حساس است، لاگ‌برداری را محدود کنید و داده‌های شخصی را پیش از ارسال به مدل حذف کنید.

مسیر حداقلی (MVP) بدون دانش اختصاصی

  1. تریگر: یک Telegram Trigger یا Webhook بسازید. برای وبهوک، در تنظیمات تریگر، روش POST را فعال کنید و بدنه JSON را بپذیرید.
  2. پاک‌سازی پیام: یک نود Set اضافه کنید و فیلدی مثل user_message را از متن ورودی بسازید. می‌توانید با یک نود Function کاراکترهای اضافه را حذف کنید.
  3. ساخت پرامپت: یک نود Set دیگر برای تعریف نقش ایجنت (system prompt) و دستورالعمل‌ها: لحن پاسخ، محدودیت‌ها، زبان فارسی، طول مناسب.
  4. فراخوانی مدل: یا از نود اختصاصی ارائه‌دهنده مدل استفاده کنید، یا با نود HTTP Request به API چت متصل شوید.
  5. ارسال پاسخ: پاسخ مدل را با نود Telegram (یا پاسخ وبهوک) برگردانید.
  6. لاگ‌گیری: پرسش، پاسخ و متادیتا (زمان، کانال، شناسه کاربر) را در یک Google Sheet یا Database ثبت کنید.

نمونه درخواست HTTP به یک API چتی

اگر نود اختصاصی مدل را استفاده نمی‌کنید، می‌توانید با نود HTTP Request این بدنه را بفرستید. قبل از آن، Credential کلید API را بسازید و در هدر Authorization استفاده کنید.

POST https://api.openai.com/v1/chat/completions
Headers:
  Content-Type: application/json
  Authorization: Bearer <YOUR_API_KEY>

Body:
{
  "model": "your-chat-model",
  "messages": [
    {"role": "system", "content": "You are a helpful support agent in Persian. Answer concisely and honestly. If unsure, ask for clarification."},
    {"role": "user", "content": "{{$json.user_message}}"}
  ],
  "temperature": 0.3
}

خروجی را از مسیر choices[0].message.content بردارید و در نود ارسال پیام استفاده کنید.

افزودن دانش اختصاصی با RAG سبک (Google Sheets + Embeddings)

برای اینکه ایجنت پاسخ‌ها را از دانش سازمان شما بسازد، یک نسخه سبک RAG بسازید: جملات/پرسش-پاسخ‌ها را در Google Sheets ذخیره کنید، برای هر ردیف embedding بسازید، در زمان اجرا نزدیک‌ترین موارد را پیدا کرده و به پرامپت اضافه کنید.

ساخت دانش پایه

  1. یک Google Sheet با ستون‌های question، answer و embedding_json بسازید. ستون embedding در ابتدا خالی بماند.
  2. در n8n یک گردش «آماده‌سازی دانش» بسازید که برای ردیف‌های بدون embedding، متن را به API embedding بفرستد و نتیجه را به صورت JSON-string ذخیره کند.

جریان پاسخ‌دهی با RAG

  1. تریگر پیام: Telegram Trigger یا Webhook.
  2. دریافت دانش: نود Google Sheets (Read) برای گرفتن تمام ردیف‌ها یا یک محدوده مناسب.
  3. Embedding پرسش: نود HTTP Request برای فراخوانی API embedding و گرفتن بردار پرسش کاربر.
  4. انتخاب نزدیک‌ترین دانش: نود Function برای محاسبه شباهت کسینوسی و برگزیدن K نتیجه برتر.
  5. ساخت پرامپت + فراخوانی مدل: پرامپت را با context برگزیده بسازید و مدل را صدا بزنید.
  6. ارسال پاسخ + لاگ: مانند قبل.

درخواست نمونه Embedding

POST https://api.openai.com/v1/embeddings
Headers:
  Content-Type: application/json
  Authorization: Bearer <YOUR_API_KEY>

Body:
{
  "model": "your-embedding-model",
  "input": ["{{$json.user_message}}"]
}

بردار نتیجه را از مسیر data[0].embedding بردارید و به نود Function بعدی بدهید.

کد Function برای انتخاب نزدیک‌ترین دانش

این نود Function، امتیاز کسینوسی هر ردیف Sheet با پرسش کاربر را حساب می‌کند و 3 نتیجه برتر را برمی‌گرداند.

// ورودی‌ها:
// items[0].json.userEmbedding: بردار پرسش کاربر (آرایه اعداد)
// itemsFromSheets: داده‌های ردیف‌های Google Sheets در input دیگر نود (Use "Merge" before)
// قالب ردیف Sheet: { question: string, answer: string, embedding_json: string }

function cosineSim(a, b) {
  const dot = a.reduce((s, v, i) => s + v * b[i], 0);
  const na = Math.sqrt(a.reduce((s, v) => s + v*v, 0));
  const nb = Math.sqrt(b.reduce((s, v) => s + v*v, 0));
  return dot / (na * nb + 1e-10);
}

const userEmb = items[0].json.userEmbedding;
const kbRows = $items("Google Sheets", 0, 0).map(it => it.json);

const scored = [];
for (const row of kbRows) {
  try {
    const emb = JSON.parse(row.embedding_json);
    const score = cosineSim(userEmb, emb);
    scored.push({ score, question: row.question, answer: row.answer });
  } catch (e) {
    // ردیف بدون embedding یا معیوب
  }
}

// مرتب‌سازی و انتخاب 3 نتیجه برتر
scored.sort((a,b) => b.score - a.score);
const topK = scored.slice(0, 3);

// آستانه اطمینان برای تشخیص نیاز به ارجاع انسانی
const maxScore = topK[0]?.score || 0;
const needHandOff = maxScore < 0.75;

return [
  {
    json: {
      context: topK.map((r, i) => `Q${i+1}: ${r.question}\nA${i+1}: ${r.answer}`).join("\n\n"),
      maxScore,
      needHandOff
    }
  }
];

ساخت پرامپت نهایی

در نود Set یا Function، پیام‌های چت را بسازید تا مدل بداند فقط از متن context استفاده کند و اگر کافی نبود، عدم قطعیت را اعلام کند:

[
  {
    "role": "system",
    "content": "تو یک ایجنت پشتیبانی فارسی هستی. فقط بر اساس متن زیر پاسخ بده. اگر مطمئن نیستی، بگو که نیاز به اطلاعات بیشتر است و درخواست را برای اپراتور ارسال کن."
  },
  {
    "role": "system",
    "content": "دانش:\n{{$json.context}}"
  },
  {
    "role": "user",
    "content": "{{$json.user_message}}"
  }
]

اگر فیلد needHandOff برابر true شد، با یک نود IF، گفتگو را برای اپراتور (مثلا ایمیل/اسلک) ارسال کنید و به کاربر پیام بفرستید که «در حال ارجاع به همکار انسانی است».

اتصال به تلگرام؛ مسیر نمونه انتها به انتها

  1. Telegram Trigger: دریافت متن و chat_id.
  2. Set: ساخت فیلد user_message.
  3. (اختیاری) HTTP Embeddings: گرفتن userEmbedding.
  4. (اختیاری) Google Sheets Read: دریافت دانش و Function شباهت.
  5. Set: ساخت messages برای چت (با یا بدون context).
  6. HTTP Request (Chat) یا نود مدل: تولید پاسخ.
  7. IF: اگر needHandOff، ارسال به اسلک/ایمیل؛ وگرنه ادامه.
  8. Telegram (Send Message): ارسال پاسخ به chat_id.
  9. Google Sheets (Append Row): ثبت پرسش، پاسخ، زمان، امتیاز شباهت.

ارزیابی و بهبود کیفیت پاسخ

  • مجموعه تست: 20 تا 50 پرسش واقعی کاربران را جمع‌آوری و به صورت دستی پاسخ صحیح‌شان را تعیین کنید. یک گردش آزمایشی n8n بسازید که این پرسش‌ها را وارد کند و خروجی مدل را با پاسخ مرجع مقایسه کند.
  • آستانه شباهت: مقدار 0.7 تا 0.85 را آزمایش کنید و تعادل میان «پاسخ‌دهی خودکار» و «ارجاع انسانی» را بیابید.
  • بازخورد کاربر: یک گزینه «مفید بود/نبود» در انتهای پاسخ بگذارید و نتیجه را در لاگ ذخیره کنید.
  • به‌روزرسانی دانش: ردیف‌هایی که بیشترین ارجاع یا نارضایتی دارند را بازنویسی و خلاصه‌تر کنید.

نکات عملی، خطاهای رایج و محدودیت‌ها

  • حریم خصوصی: پیش از ارسال به مدل، نام‌ها، ایمیل و داده شخصی را ماسک کنید. لاگ‌ها را محدود و دسترسی‌ها را نقش‌محور تنظیم کنید.
  • توکن و قطع پاسخ: پاسخ‌های خیلی بلند را محدود کنید یا حالت «stream» را فعال کنید تا تجربه کاربر بهتر شود.
  • Hallucination: در پرامپت تاکید کنید «اگر در دانش نبود، حدس نزن.» و آستانه ارجاع را جدی بگیرید.
  • نرخ درخواست‌ها: با نودهای Delay/Queue ازدحام را کنترل کنید. در خطاهای موقتی، Retry نمایی پیاده‌سازی کنید.
  • چندزبانه: زبان ورودی را تشخیص دهید و در صورت نیاز، سیاست پاسخ‌دهی را تطبیق دهید؛ اما برای دقت، یک زبان غالب انتخاب کنید.
  • نگهداری embeddings: اگر Sheet بزرگ شد، به یک بردارگان مثل Qdrant/Pinecone مهاجرت کنید تا جستجو سریع بماند.

چه زمانی گزینه دیگری بهتر است؟

اگر ترافیک بسیار بالاست یا نیاز به ابزارهای پیچیده (کدنویسی، بازیابی وب، حافظه بلندمدت) دارید، چارچوب‌های تخصصی ایجنت‌ها یا سرویس‌های مدیریت‌شده را بررسی کنید. برای تیم‌های کوچک با جریان پشتیبانی استاندارد، n8n معمولا سریع‌ترین مسیر تا تولید است.

گام بعدی

از یک MVP بدون RAG شروع کنید، سپس FAQهای پرتکرار را به Sheet بیفزایید و RAG سبک را فعال کنید. اگر می‌خواهید با مدل‌ها و پرامپت‌نویسی عمیق‌تر کار کنید، یک مسیر آموزشی منسجم مانند «دوره آموزش ابزارهای هوش مصنوعی» به شما دید کلی و تمرین‌های ساختاریافته می‌دهد.