ساخت ایجنت هوشمند با n8n

ساخت ایجنت هوشمند اختصاصی در سال 1404: ترکیب n8n با OpenAI Assistant و حافظه بلندمدت

نسخه صوتی این مقاله (هوش مصنوعی کارورا)

چت‌بات‌های مبتنی بر یک فراخوانی ساده API به مدل GPT دیگر پاسخگوی نیازهای پیچیده B2B نیستند. این ابزارها فاقد حافظه بلندمدت و توانایی اجرای وظایف معین هستند.

هر بار که کاربر پیامی ارسال می‌کند، مکالمه از نقطه صفر شروع می‌شود و هزینه توکن‌ها برای ارسال مجدد تاریخچه گفتگو به سرعت از کنترل خارج می‌گردد. برای وظایف واقعی کسب‌وکار – مانند استعلام موجودی از یک انبار، تحلیل یک فایل گزارش فروش، یا ثبت یک تیکت پشتیبانی در سیستم CRM – این رویکرد ناکارآمد و محدود است.

راه‌حل، ساخت یک «ایجنت» (Agent) است، نه یک چت‌بات ساده. یک ایجنت واقعی دارای حافظه پایدار، ابزارهای قابل اجرا و یک منطق مرکزی برای ارکستراسیون است.

در این راهنمای فنی، ما در کارورا نشان می‌دههیم چگونه با ترکیب n8n به عنوان ارکستراتور، OpenAI Assistants API به عنوان موتور استدلال، و مکانیزم Retrieval داخلی آن به عنوان حافظه، یک ایجنت هوش مصنوعی (AI Agent) کاملاً اختصاصی و تحت کنترل خودتان بسازید.

معماری ایجنت هوشمند مدرن: n8n، OpenAI و حافظه پایدار

معماری سیستم اتوماسیون هوشمند
ترکیب ابزارهای مدرن مانند n8n و OpenAI برای ساخت یک ایجنت هوشمند.

قبل از ورود به جزئیات پیاده‌سازی، درک معماری سیستم ضروری است. این معماری بر سه اصل استوار است: تفکیک وظایف (Separation of Concerns)، کنترل کامل بر منطق اجرا، و قابلیت گسترش‌پذیری.

دیاگرام معماری سیستم:

دیاگرام معماری ایجنت هوشمند با ترکیب n8n و OpenAI Assistant
دیاگرام معماری ایجنت هوشمند با ترکیب n8n و OpenAI Assistant

اجزای کلیدی:

1. n8n (Orchestrator): این ابزار متن‌باز و Self-hosted، قلب تپنده سیستم ماست. n8n برخلاف ابزارهای SaaS مانند Zapier، به شما کنترل کامل بر ورک‌فلوها، مدیریت خطا و اتصال به سرویس‌های داخلی (on-premise) را می‌دهد. در این معماری، n8n مسئول دریافت درخواست‌ها، مدیریت شناسه‌های مکالمه (Thread IDs) و اجرای منطق پیچیده‌تر مانند فراخوانی APIهای دیگر به عنوان ابزار (Custom Tools) است.

2. OpenAI Assistants API: این صرفاً یک API برای مدل زبان نیست؛ Assistants API یک چارچوب کامل برای ساخت ایجنت است. این سرویس، مدیریت State مکالمه (Threads) را به صورت داخلی انجام می‌دهد و ما را از ارسال مجدد کل تاریخچه گفتگو بی‌نیاز می‌کند. همچنین ابزارهای قدرتمندی مانند Code Interpreter و Retrieval (برای پیاده‌سازی RAG) را به صورت پیش‌فرض در اختیار ما قرار می‌دهد.

3. حافظه پایدار (Retrieval): با آپلود فایل‌های دانش (PDF, DOCX, JSON, …) در Assistant، مدل می‌تواند اطلاعات را از این منابع استخراج کرده و برای پاسخ‌دهی استفاده کند. این مکانیزم، یک پیاده‌سازی مدیریت‌شده از Retrieval-Augmented Generation (RAG) است که ایجنت را به دانش اختصاصی کسب‌وکار شما مجهز می‌کند.

این ترکیب، بهینه‌ترین حالت ممکن را ارائه می‌دهد: قدرت استدلال و ابزارهای مدیریت‌شده OpenAI در کنار انعطاف‌پذیری و کنترل مطلق n8n.

قدم اول: راه‌اندازی و پیکربندی OpenAI Assistant

پیکربندی OpenAI Assistant API
تنظیم دستورالعمل‌ها و شخصیت ایجنت در پنل مدیریتی OpenAI.

ابتدا باید یک Assistant در پلتفرم OpenAI ایجاد کنیم. این Assistant به عنوان الگوی اولیه برای تمام تعاملات ایجنت ما عمل خواهد کرد.

1. وارد داشبورد OpenAI شده و به بخش Assistants بروید.
2. روی دکمه Create کلیک کنید.
3. Name: یک نام مشخص برای ایجنت خود انتخاب کنید (مثلاً Karvara_Support_Agent).
4. Instructions (System Prompt): این بخش حیاتی است. در اینجا شخصیت، وظایف و محدودیت‌های ایجنت را تعریف می‌کنید. برای مثال:


You are a technical support agent for Karora. Your primary goal is to answer user questions based on the provided documentation. If a user asks about product pricing, you must use the 'get_live_price' tool. Do not answer questions outside of your knowledge base. Always be concise and professional.


5. Model: مدل مورد نظر خود را انتخاب کنید (مثلاً gpt-4o).
6. Tools: ابزارهای مورد نیاز را فعال کنید. برای شروع، Retrieval را فعال کنید. این قابلیت به ایجنت اجازه می‌دهد تا از فایل‌هایی که شما آپلود می‌کنید برای پاسخ‌دهی استفاده کند.
7. Files: در این بخش می‌توانید فایل‌های دانش (مثلاً کاتالوگ محصولات، راهنمای فنی) را آپلود کنید. فعلاً این بخش را خالی بگذارید تا در قدم سوم به آن بپردازیم.
8. Save: پس از ذخیره، یک Assistant ID (با پیشوند asst_...) به شما داده می‌شود. این شناسه را کپی کنید؛ در ورک‌فلو n8n به آن نیاز خواهیم داشت.

نکته امنیتی مهم: کلید API خود (API Key) را هرگز به صورت مستقیم در نودهای n8n وارد نکنید. آن را در بخش Credentials > New > OpenAI API ذخیره کنید تا به صورت رمزنگاری‌شده نگهداری شود.

قدم دوم: ساخت ورک‌فلو پایه در n8n برای مدیریت مکالمه

ورک‌فلو n8n برای ایجنت
نمایش گرافیکی و واضح جریان منطقی یک مکالمه در محیط n8n.

این بخش هسته اصلی پیاده‌سازی است. یک ورک‌فلو می‌سازیم که پیام کاربر را دریافت کرده، مکالمه را مدیریت می‌کند و پاسخ را برمی‌گرداند.

دیاگرام ورک‌فلو در n8n:
[Webhook Trigger] -> [OpenAI Assistant Node] -> [Set Node for Response]

۱. Trigger Node: Webhook

  • یک نود Webhook به صفحه اضافه کنید. این نود یک URL یکتا ایجاد می‌کند که می‌توانید از طریق آن (مثلاً از یک اپلیکیشن فرانت‌اند یا حتی curl) به ورک‌فلو پیام ارسال کنید.
  • فرض می‌کنیم ورودی به این Webhook یک JSON با ساختار زیر است:
  • 
    {
      "question": "اطلاعات محصول X چیست؟",
      "threadId": "thread_abc123" // اختیاری، برای ادامه مکالمه
    }
    


    ⚠️ نکته امنیتی: وب‌هوک‌ها به صورت پیش‌فرض عمومی هستند. برای محیط‌های پروداکشن، حتماً از بخش تنظیمات وب‌هوک، گزینه Authentication را فعال کرده و از یک Header امنیتی (مانند X-API-KEY) برای اعتبارسنجی درخواست‌ها استفاده کنید.

    ۲. OpenAI Assistant Node

  • یک نود OpenAI اضافه کرده و Resource آن را روی Assistant تنظیم کنید.
  • Authentication: کردنشیال‌های (Credentials) OpenAI که قبلاً ذخیره کرده‌اید را انتخاب کنید.
  • Operation: گزینه Use Existing Assistant and Add Message to Thread را انتخاب کنید.
  • Assistant ID: شناسه‌ای که در قدم اول کپی کردید (asst_...) را در این فیلد وارد کنید.
  • Thread ID: این بخش برای مدیریت حافظه مکالمه حیاتی است. ما باید به n8n بگوییم که اگر threadId در ورودی Webhook وجود داشت، از آن استفاده کند؛ در غیر این صورت، یک Thread جدید بسازد. برای این کار از یک Expression استفاده می‌کنیم:
  • 
    {{ $json.body.threadId || '' }}
    

    اگر threadId در ورودی موجود باشد، از آن استفاده می‌شود. اگر نباشد، مقدار خالی ('') به نود ارسال شده و نود OpenAI به طور خودکار یک Thread جدید ایجاد می‌کند.

  • Message: محتوای پیام کاربر را از ورودی Webhook می‌خوانیم:
  • 
    {{ $json.body.question }}
    

    ۳. Set Node: فرمت‌بندی خروجی

    نود OpenAI Assistant خروجی پیچیده‌ای دارد. ما برای ارسال یک پاسخ تمیز به کاربر، تنها به محتوای آخرین پیام و threadId نیاز داریم.

  • یک نود Set اضافه کنید.
  • یک متغیر جدید به نام response با مقدار زیر ایجاد کنید. این Expression آخرین پیام اضافه شده توسط assistant را از آرایه پیام‌ها استخراج می‌کند:
  • 
    {{ $json.data[0].content[0].text.value }}
    
  • یک متغیر دیگر به نام threadId برای ارسال به فرانت‌اند ایجاد کنید تا در درخواست‌های بعدی استفاده شود:
  • 
    {{ $json.body.threadId || '' }}
    
  • گزینه Keep Only Set را فعال کنید تا خروجی نهایی ورک‌فلو فقط شامل این دو متغیر باشد.
  • ورک‌فلو پایه شما آماده است. با ارسال یک درخواست به URL وب‌هوک، ایجنت پاسخ می‌دهد و threadId را برای ادامه گفتگو برمی‌گرداند.

    ورک‌فلو آماده n8n را دانلود کنید

    چرا از صفر شروع کنید؟ این ورک‌فلو تست‌شده را در n8n خود ایمپورت کرده و ساخت ایجنت هوش مصنوعی را در چند دقیقه آغاز کنید.

    دانلود فایل JSON ورک‌فلو →

    کد JSON ورک‌فلو برای Import:

    
    {
      "name": "Karvara - Basic AI Agent",
      "nodes": [
        {
          "parameters": {},
          "name": "Start",
          "type": "n8n-nodes-base.start",
          "typeVersion": 1,
          "position": [250, 300]
        },
        {
          "parameters": {
            "path": "ai-agent-webhook",
            "options": {}
          },
          "name": "Webhook",
          "type": "n8n-nodes-base.webhook",
          "typeVersion": 1,
          "position": [450, 300],
          "webhookId": "your-webhook-id-here"
        },
        {
          "parameters": {
            "resource": "assistant",
            "operation": "useAssistantAddMessage",
            "assistantId": "asst_YOUR_ASSISTANT_ID_HERE",
            "threadId": "{{ $json.body.threadId || '' }}",
            "message": "{{ $json.body.question }}"
          },
          "name": "OpenAI Assistant",
          "type": "n8n-nodes-base.openAi",
          "typeVersion": 2,
          "position": [650, 300],
          "credentials": {
            "openAiApi": {
              "id": "your-credential-id-here",
              "name": "OpenAI account"
            }
          }
        },
        {
          "parameters": {
            "values": {
              "string": [
                {
                  "name": "response",
                  "value": "{{ $json.data[0].content[0].text.value }}"
                },
                {
                  "name": "threadId",
                  "value": "{{ $json.thread_id }}"
                }
              ]
            },
            "options": {
              "keepOnlySet": true
            }
          },
          "name": "Format Response",
          "type": "n8n-nodes-base.set",
          "typeVersion": 2,
          "position": [850, 300]
        }
      ],
      "connections": {
        "Webhook": {
          "main": [[{"node": "OpenAI Assistant", "type": "main", "index": 0}]]
        },
        "OpenAI Assistant": {
          "main": [[{"node": "Format Response", "type": "main", "index": 0}]]
        }
      }
    }
    

    قدم سوم: تجهیز ایجنت به حافظه بلندمدت با مکانیزم Retrieval

    تزریق دانش با Retrieval
    افزودن فایل‌های دانش تخصصی به حافظه بلندمدت ایجنت هوشمند.

    در این مرحله، به ایجنت دانش اختصاصی تزریق می‌کنیم تا از یک ربات عمومی به یک متخصص مجازی تبدیل شود.

    1. به داشبورد OpenAI و تنظیمات Assistant خود بازگردید.
    2. در بخش Files، روی Upload کلیک کرده و یک فایل PDF حاوی اطلاعات فنی محصولات شرکت خود را آپلود کنید.
    3. مطمئن شوید که ابزار Retrieval همچنان فعال است.
    4. Assistant را ذخیره کنید.

    تست عملی:
    حالا یک درخواست جدید به Webhook ورک‌فلو خود ارسال کنید و سوالی بپرسید که پاسخ آن منحصراً در فایل PDF شما وجود دارد.

    مثال درخواست:

    
    {
      "question": "حداکثر فشار عملیاتی برای مدل پمپ K-500 چقدر است؟",
      "threadId": "" // Start a new conversation
    }
    

    نتیجه مورد انتظار:
    ایجنت باید فایل PDF را جستجو کرده و پاسخ دقیق را استخراج کند (مثلاً: «حداکثر فشار عملیاتی برای مدل پمپ K-500 طبق داکیومنت، 25 بار است.»). این اثبات می‌کند که مکانیزم RAG به درستی کار می‌کند. در تجربه ما در کارورا، این روش برای ساخت ایجنت‌های پشتیبانی فنی و پاسخگویی به سوالات متداول مشتریان بسیار کارآمد است.

    قدم چهارم: ارتقاء AI Agents با ابزارهای اختصاصی (Custom Tools)

    اتصال ایجنت به API
    تعریف ابزارهای سفارشی در n8n برای تعامل ایجنت با سیستم‌های دیگر.

    قدرت واقعی این معماری زمانی آشکار می‌شود که ایجنت بتواند با سیستم‌های دیگر تعامل کند. ما یک ابزار سفارشی تعریف می‌کنیم که قیمت لحظه‌ای یک محصول را از یک API دیگر استعلام می‌کند.

    ۱. تعریف Function در OpenAI Assistant

  • در تنظیمات Assistant، به بخش Tools رفته و روی Add function کلیک کنید.
  • یک Schema به فرمت JSON برای تابع خود تعریف کنید. این Schema به مدل زبان می‌فهماند که این ابزار چه کاری انجام می‌دهد و چه پارامترهایی نیاز دارد.
  • 
    {
      "name": "get_live_price",
      "description": "Get the real-time price of a specific product by its SKU.",
      "parameters": {
        "type": "object",
        "properties": {
          "sku": {
            "type": "string",
            "description": "The product SKU, e.g., 'KV-PROD-001'."
          }
        },
        "required": ["sku"]
      }
    }
    

    ۲. بروزرسانی ورک‌فلو n8n برای مدیریت Tool Calls

    ورک‌فلو را طوری تغییر می‌دهیم که بتواند درخواست اجرای ابزار را تشخیص داده و آن را اجرا کند.

    دیاگرام ورک‌فلو جدید:

    شماتیک مدیریت هوشمند ابزارها
    شماتیک مدیریت هوشمند ابزارها

    1. IF Node: بعد از نود OpenAI Assistant، یک نود IF اضافه کنید. شرط آن را طوری تنظیم کنید که بررسی کند آیا خروجی Assistant نیازمند اجرای یک ابزار است یا خیر.

  • Condition: {{ $json.status }} Equals requires_action
  • 2. شاخه True (اجرای ابزار):

  • HTTP Request Node: این نود به شاخه true از نود IF متصل می‌شود. فرض کنید API قیمت‌دهی شما در آدرس https://api.karvara.com/price قرار دارد.
  • URL: https://api.karvara.com/price?sku={{ $json.required_action.submit_tool_outputs.tool_calls[0].function.arguments.sku }}
  • OpenAI Assistant Node (Submit Tool Output): یک نود OpenAI دیگر اضافه کنید.
  • Resource: Assistant
  • Operation: Submit Tool Outputs to Run
  • Thread ID: {{ $('OpenAI Assistant').item.json.thread_id }} (از خروجی نود اول Assistant)
  • Run ID: {{ $('OpenAI Assistant').item.json.id }} (از خروجی نود اول Assistant)
  • Tool Outputs: این بخش مهم‌ترین قسمت است. باید خروجی نود HTTP Request را به همراه tool_call_id به OpenAI برگردانیم.
  • 
    [
      {
        "tool_call_id": "{{ $('OpenAI Assistant').item.json.required_action.submit_tool_outputs.tool_calls[0].id }}",
        "output": "{{ $('HTTP Request').item.json.price }}"
      }
    ]
    


    این نود نتیجه را برای Assistant ارسال می‌کند تا او پاسخ نهایی را با استفاده از این اطلاعات تولید کند.

    3. شاخه False (پاسخ مستقیم):

  • این شاخه مستقیماً به نود Set نهایی متصل می‌شود و پاسخ متنی معمولی را پردازش می‌کند.
  • با این ساختار، هرگاه کاربر در مورد قیمت سوال کند (مثلاً «قیمت محصول KV-PROD-001 چنده؟»)، مدل تابع get_live_price را فراخوانی می‌کند، n8n آن را اجرا کرده، نتیجه را به مدل برمی‌گرداند و مدل پاسخ نهایی را تولید می‌کند: «قیمت لحظه‌ای محصول KV-PROD-001، مبلغ ۱,۵۴۰,۰۰۰ تومان است.»

    نتیجه‌گیری: شما یک ایجنت خودکار ساختید، نه یک ربات ساده

    ساخت ایجنت هوشمند با n8n
    معماری یک ایجنت هوشمند با استفاده از ارکستراتور n8n و OpenAI Assistants API.

    با دنبال کردن این راهنما، شما یک چت‌بات ساده نساخته‌اید؛ شما یک ایجنت هوش مصنوعی (AI Agent) با معماری مدرن پیاده‌سازی کرده‌اید که دارای ویژگی‌های زیر است:

  • حافظه پایدار: با استفاده از مکانیزم Threads و Retrieval، ایجنت مکالمات را به خاطر می‌سپارد و به دانش اختصاصی شما دسترسی دارد.
  • قابلیت اجرای ابزار: با تعریف Custom Tools، ایجنت می‌تواند با APIهای دیگر تعامل کرده و وظایف واقعی را در دنیای خارج از مدل زبان انجام دهد.
  • کنترل کامل و مالکیت: با اجرای n8n روی زیرساخت خود — که در مرجع تخصصی n8n ما به آن پرداخته‌ایم — شما کنترل کاملی بر منطق، داده‌ها و هزینه‌ها دارید. این یک جایگزین Zapier قدرتمند برای اتوماسیون‌های پیچیده است.
  • این معماری نقطه شروعی برای ساخت سیستم‌های بسیار پیچیده‌تر است. در پروژه‌های واقعی دیده‌ایم که با اتصال این ایجنت به APIهای داخلی شرکت‌ها (مانند سیستم‌های ERP و CRM)، می‌توان فرآیندهای کسب‌وکار را به شکل چشمگیری خودکار و بهینه کرد. چالش‌های بعدی شما مدیریت هزینه API در مقیاس بالا و بهینه‌سازی تاخیر (Latency) در پاسخ‌دهی خواهد بود که نیازمند استراتژی‌های Caching و بهینه‌سازی ورک‌فلو است.

    ایده خود را به یک پروژه واقعی تبدیل کنید

    ساخت نمونه اولیه یک چیز است، و پیاده‌سازی یک ایجنت هوشمند امن و مقیاس‌پذیر چیز دیگر. هنوز مطمئن نیستید؟ بیایید ۱۵ دقیقه رایگان در مورد کسب‌وکار و چالش‌های شما صحبت کنیم.

    رزرو جلسه استراتژی رایگان →

    سوالات متداول

    هزینه استفاده از Assistants API در مقایسه با Chat Completion API چگونه است؟

    Assistants API معمولاً گران‌تر است. هزینه آن شامل سه بخش است: هزینه توکن‌های ورودی و خروجی (مشابه Chat Completion)، یک هزینه ثابت به ازای هر مکالمه (Thread) فعال، و هزینه استفاده از ابزارهایی مانند Code Interpreter و Retrieval (به ازای هر گیگابایت فایل در ساعت). برای وظایف ساده و بدون نیاز به حافظه، Chat Completion ارزان‌تر است. برای کاربردهای ایجنت-محور، هزینه اضافی Assistants API با صرفه‌جویی در مدیریت State و توسعه جبران می‌شود.

    مدیریت State یا همان Thread ID در سمت کلاینت (Front-end) چگونه باید انجام شود؟

    ورک‌فلو n8n در هر پاسخ، threadId مربوط به آن مکالمه را برمی‌گرداند. اپلیکیشن کلاینت شما (مثلاً یک وب اپلیکیشن چت) باید این شناسه را ذخیره کرده (مثلاً در Local Storage) و در درخواست‌های بعدی همان کاربر، آن را مجدداً به Webhook ارسال کند. این کار تضمین می‌کند که هر کاربر در ادامه مکالمه قبلی خود قرار می‌گیرد.

    آیا می‌توان از مدل‌های زبان محلی (Local LLMs) به جای OpenAI در این معماری استفاده کرد؟

    بله، اما با پیچیدگی بیشتر. n8n نودهایی برای مدل‌های محلی مانند Ollama دارد. در این حالت، شما باید منطق مدیریت State (مشابه Threads) و اجرای ابزارها (مشابه Function Calling) را خودتان در ورک‌فلو n8n پیاده‌سازی کنید. برای مثال، می‌توانید تاریخچه گفتگو را در یک دیتابیس Redis یا PostgreSQL ذخیره کرده و قبل از هر فراخوانی مدل، آن را بازیابی کنید. قدرت Assistants API در این است که این پیچیدگی‌ها را به صورت مدیریت‌شده ارائه می‌دهد.

    تفاوت اصلی این رویکرد با استفاده از فریمورک‌هایی مانند LangChain یا LlamaIndex چیست؟

    LangChain و LlamaIndex کتابخانه‌های کد-محور (code-centric) برای ساخت اپلیکیشن‌های مبتنی بر LLM هستند. آن‌ها انعطاف‌پذیری بسیار بالایی در سطح کد ارائه می‌دهند اما نیازمند مهارت برنامه‌نویسی عمیق هستند. رویکرد n8n یک راهکار بصری و مبتنی بر ورک‌فلو (low-code) است که ارکستراسیون و اتصال بین سرویس‌ها را بسیار ساده‌تر و سریع‌تر می‌کند. برای تیم‌هایی که می‌خواهند به سرعت یک ایجنت را به مرحله تولید برسانند، n8n اغلب گزینه بهینه‌تری است.

    نوشته های مرتبط