چگونه داده‌های خود را برای RAG در n8n آماده کنیم؟

فهرست مطالب

چگونه داده‌های خود را برای RAG در n8n آماده کنیم؟

در دنیای پرشتاب هوش مصنوعی و پردازش زبان طبیعی، سیستم‌های مولد (Generative AI) نظیر مدل‌های زبان بزرگ (LLMs) انقلابی در نحوه تعامل ما با اطلاعات ایجاد کرده‌اند. اما یکی از چالش‌های اصلی این مدل‌ها، دسترسی به اطلاعات به‌روز و تخصصی است که در زمان آموزش آنها وجود نداشته یا به سادگی در دسترس نبوده است. اینجا است که تکنیک Retrieval-Augmented Generation (RAG) به میدان می‌آید و با ترکیب قدرت بازیابی اطلاعات با قابلیت‌های تولید متن، راهکاری نوآورانه ارائه می‌دهد. RAG به LLM اجازه می‌دهد تا قبل از تولید پاسخ، اطلاعات مرتبط را از یک پایگاه داده خارجی بازیابی کرده و سپس با استفاده از این اطلاعات، پاسخ‌هایی دقیق‌تر، مستندتر و کمتر مستعد به «توهم‌زایی» (hallucination) ارائه دهد.

پیاده‌سازی یک سیستم RAG کارآمد نیازمند زیرساختی قوی برای آماده‌سازی داده‌ها است. اینجاست که n8n، یک ابزار اتوماسیون جریان کار کد کم (low-code) قدرتمند و انعطاف‌پذیر، نقش حیاتی ایفا می‌کند. n8n با قابلیت اتصال به هزاران سرویس و API مختلف و ارائه گره‌های (nodes) متنوع برای دستکاری، تبدیل و انتقال داده‌ها، بستر ایده‌آلی برای ساخت خطوط لوله (pipelines) پیچیده آماده‌سازی داده برای RAG فراهم می‌آورد. این مقاله به صورت عمیق به بررسی مراحل و استراتژی‌های آماده‌سازی داده‌های شما برای یک سیستم RAG مؤثر با استفاده از n8n می‌پردازد، و به شما نشان می‌دهد که چگونه می‌توانید داده‌های خام خود را به فرمتی آماده برای بازیابی و جاسازی برداری (vector embedding) تبدیل کنید.

این راهنما برای متخصصان داده، مهندسان یادگیری ماشین، توسعه‌دهندگان و هر کسی که علاقه‌مند به پیاده‌سازی سیستم‌های RAG با استفاده از n8n است، طراحی شده است. ما نه تنها به مفاهیم تئوری، بلکه به جزئیات فنی و عملی پیاده‌سازی این فرآیندها در n8n نیز خواهیم پرداخت. هدف نهایی، توانمندسازی شما برای ساخت سیستم‌های RAG قوی و قابل اعتماد است که بتوانند از پتانسیل کامل LLMها بهره‌برداری کنند و اطلاعات دقیق و مرتبط را در اختیار کاربران قرار دهند.

درک عمیق RAG و نقش n8n

پیش از غواصی در جزئیات آماده‌سازی داده، ضروری است که درک کاملی از RAG و جایگاه n8n در این اکوسیستم داشته باشیم.

RAG: فراتر از تولید ساده

مدل‌های زبان بزرگ به دلیل توانایی‌های شگفت‌انگیزشان در تولید متن، ترجمه، خلاصه‌سازی و پاسخ‌دهی به سؤالات شهرت یافته‌اند. با این حال، آنها با محدودیت‌هایی مواجه هستند: دانش آنها به داده‌های آموزشی که بر اساس آنها مدل‌سازی شده‌اند، محدود است. این داده‌ها می‌توانند قدیمی باشند، شامل اطلاعات اختصاصی نباشند، یا حتی حاوی سوگیری‌ها و نادرستی‌هایی باشند. این محدودیت‌ها منجر به پدیده‌ای به نام «توهم‌زایی» می‌شود، جایی که LLM با اطمینان اطلاعات نادرست یا ساختگی را ارائه می‌دهد.

RAG این چالش را با افزودن یک مرحله بازیابی اطلاعات قبل از تولید پاسخ، حل می‌کند. فرآیند RAG به طور کلی شامل دو جزء اصلی است:

  • بازیابی (Retrieval): در این مرحله، سیستم به دنبال اطلاعات مرتبط در یک مجموعه داده خارجی (مانند یک پایگاه داده اسناد، پایگاه داده برداری یا وب‌سایت) بر اساس پرس و جوی کاربر می‌گردد. اسناد یا قطعات مرتبطی که بازیابی می‌شوند، به عنوان «زمینه» (context) برای LLM عمل می‌کنند.
  • تولید (Generation): پس از بازیابی اطلاعات مرتبط، این اطلاعات همراه با پرس و جوی اصلی به LLM داده می‌شوند. سپس LLM با استفاده از این زمینه اضافی، پاسخ دقیق‌تر و آگاهانه‌تری را تولید می‌کند.

مزایای RAG شامل موارد زیر است:

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

n8n به عنوان ارکستراتور قدرتمند RAG

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

در یک سیستم RAG، n8n می‌تواند وظایف زیر را بر عهده بگیرد:

  • جمع‌آوری داده‌ها (Data Ingestion): از منابع مختلفی مانند پایگاه‌های داده، سیستم‌های ذخیره‌سازی ابری (Google Drive, S3)، APIهای وب، فایل‌های محلی و غیره.
  • پاک‌سازی و پیش‌پردازش داده‌ها (Data Cleaning & Preprocessing): حذف نویز، استخراج متن، استانداردسازی فرمت‌ها.
  • قطعه‌بندی متن (Text Chunking): تقسیم اسناد طولانی به قطعات کوچک‌تر و قابل مدیریت.
  • استخراج فراداده (Metadata Extraction): جمع‌آوری اطلاعات اضافی در مورد هر قطعه (مانند منبع، تاریخ، نویسنده).
  • بردارسازی (Vectorization): ارسال قطعات متن به سرویس‌های جاسازی برداری (embedding services) برای تبدیل آنها به بردارهای عددی.
  • ذخیره‌سازی (Storage): ارسال بردارهای تولید شده و فراداده‌های مربوطه به یک پایگاه داده برداری (vector database).
  • ارکستراسیون زمان اجرا (Runtime Orchestration): در زمان پرس و جو، n8n می‌تواند مسئول بازیابی قطعات مرتبط از پایگاه داده برداری، ارسال آنها به LLM و سپس نمایش پاسخ نهایی به کاربر باشد.

انعطاف‌پذیری n8n در اتصال به سرویس‌های خارجی از طریق گره‌های HTTP Request، گره‌های اختصاصی برای دیتابیس‌ها و ابزارهای ابری، و قابلیت اجرای کدهای سفارشی (با گره‌های Code و Function)، آن را به ابزاری بی‌نظیر برای ساخت یک خط لوله کامل آماده‌سازی داده RAG تبدیل می‌کند.

شناسایی و جمع‌آوری داده‌ها: سوخت RAG شما

اولین گام در آماده‌سازی داده برای RAG، شناسایی و جمع‌آوری منابع داده‌ای است که می‌خواهید LLM شما از آنها بهره‌مند شود. کیفیت و ارتباط این داده‌ها مستقیماً بر عملکرد سیستم RAG شما تأثیر می‌گذارد.

منابع داده متنوع برای RAG

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

  • اسناد متنی (Text Documents): فایل‌های TXT، Markdown، Word (DOCX)، صفحات HTML، فایل‌های JSON و XML. اینها می‌توانند شامل مقالات، گزارش‌ها، مستندات داخلی شرکت، توضیحات محصول و غیره باشند.
  • اسناد PDF: فایل‌های PDF که اغلب حاوی ترکیبی از متن و تصاویر هستند. استخراج متن از PDF می‌تواند چالش‌برانگیز باشد، به خصوص اگر سند اسکن شده باشد.
  • صفحات وب (Web Pages): محتوای صفحات وب، پست‌های وبلاگ، مقالات خبری که از طریق خزیدن (crawling) یا APIهای وب جمع‌آوری می‌شوند.
  • داده‌های پایگاه داده (Database Data): اطلاعات ساختاریافته از پایگاه‌های داده رابطه‌ای (SQL) یا غیررابطه‌ای (NoSQL) که می‌توانند شامل جداول، ردیف‌ها و فیلدها باشند.
  • APIها (Application Programming Interfaces): داده‌هایی که از طریق فراخوانی API سرویس‌های خارجی (مانند ابزارهای مدیریت پروژه، CRM، پلتفرم‌های خبری) به دست می‌آیند.
  • چت‌ها و مکالمات: داده‌های حاصل از تعاملات مشتری، پشتیبانی فنی، یا چت‌بات‌ها.

گره‌های n8n برای بلعیدن داده‌ها (Data Ingestion)

n8n با گره‌های متنوع خود، فرآیند جمع‌آوری داده از این منابع را تسهیل می‌کند:

  • HTTP Request Node: این گره یکی از پرکاربردترین گره‌ها برای تعامل با APIهای وب و دانلود محتوا از URLها است. می‌توانید با استفاده از آن به REST APIها متصل شوید، داده‌های JSON/XML دریافت کنید یا محتوای صفحات وب را واکشی کنید.
  • Read Binary File Node: برای خواندن فایل‌های باینری از سیستم فایل محلی n8n (در صورتی که n8n بر روی سرور شما نصب شده باشد) یا از یک فضای ذخیره‌سازی متصل. این گره برای فایل‌هایی مانند PDF، Word و تصاویر کاربرد دارد که نیاز به پردازش بعدی دارند.
  • Database Nodes: n8n گره‌های اختصاصی برای انواع پایگاه‌های داده مانند PostgreSQL، MySQL، MongoDB، SQLite و غیره دارد. با این گره‌ها می‌توانید به راحتی پرس و جوهای SQL/NoSQL را اجرا کرده و داده‌های مورد نیاز را استخراج کنید.
  • Cloud Storage Nodes: گره‌هایی برای سرویس‌های ذخیره‌سازی ابری مانند Amazon S3، Google Drive، Dropbox، OneDrive. این گره‌ها به شما امکان می‌دهند فایل‌ها را لیست، دانلود یا آپلود کنید.
  • App-Specific Nodes: n8n دارای هزاران گره اختصاصی برای سرویس‌های ابری و برنامه‌های کاربردی محبوب مانند Google Sheets، Notion، Jira، Salesforce و بسیاری دیگر است. این گره‌ها فرآیند اتصال و تعامل با این سرویس‌ها را بسیار ساده می‌کنند.
  • Scheduler Node: برای اجرای دوره‌ای جریان‌های کاری (workflows) که داده‌ها را در بازه‌های زمانی مشخص جمع‌آوری می‌کنند (مثلاً روزانه، هفتگی).

مثال کاربردی با n8n:

فرض کنید می‌خواهید مقالات جدید را از یک وب‌سایت خبری با استفاده از API آن جمع‌آوری کنید.

  1. یک گره Start را به یک گره HTTP Request متصل می‌کنید.
  2. در گره HTTP Request، URL مربوط به API وب‌سایت خبری و هرگونه پارامتر احراز هویت (API Key) را تنظیم می‌کنید.
  3. پاسخ (Response) که معمولاً به فرمت JSON است، توسط گره HTTP Request دریافت می‌شود.
  4. سپس می‌توانید از گره JSON برای تجزیه و تحلیل ساختار داده و استخراج فیلدهای مورد نظر (مانند عنوان، متن مقاله، URL، تاریخ) استفاده کنید.

اگر می‌خواهید اسناد PDF را از Google Drive جمع‌آوری کنید:

  1. از گره Google Drive Trigger (برای رصد فایل‌های جدید) یا Google Drive Node (برای لیست کردن و دانلود فایل‌ها) استفاده کنید.
  2. پس از دانلود فایل باینری PDF، باید آن را به یک گره دیگر (مانند گره Code یا یک سرویس خارجی از طریق HTTP Request) برای استخراج متن ارسال کنید. کتابخانه‌هایی مانند pdf.js یا PyPDF2 (اگر از گره Code با پایتون استفاده می‌کنید) می‌توانند برای این منظور مفید باشند.

پاک‌سازی و پیش‌پردازش داده‌ها: پایه و اساس کیفیت

پس از جمع‌آوری داده‌ها، مرحله حیاتی پاک‌سازی و پیش‌پردازش آغاز می‌شود. داده‌های خام به ندرت در فرمتی هستند که مستقیماً برای RAG قابل استفاده باشند. این مرحله شامل حذف نویز، استانداردسازی و تبدیل داده‌ها به شکلی است که برای بردارسازی و بازیابی مؤثر باشد.

حذف نویز و اطلاعات زائد

داده‌های متنی اغلب حاوی عناصری هستند که برای مدل‌های زبان بی‌اهمیت یا حتی مضرند. این عناصر شامل:

  • سرفصل‌ها و پاورقی‌ها (Headers & Footers): در اسناد و گزارش‌ها، این موارد اطلاعات تکراری و غیرمحتوایی هستند.
  • اطلاعات بویلرپلیت (Boilerplate Text): متن‌های استاندارد و تکراری مانند اطلاعات کپی‌رایت، نوارهای ناوبری وب‌سایت، تبلیغات.
  • کدهای HTML/XML: اگر داده‌ها از صفحات وب استخراج شده‌اند، ممکن است شامل تگ‌های HTML باشند که باید حذف شوند.
  • کاراکترهای خاص و غیرقابل چاپ: کاراکترهایی که به درستی نمایش داده نمی‌شوند یا بی‌معنی هستند.
  • متن‌های تکراری: پاراگراف‌ها یا جملاتی که در طول سند تکرار شده‌اند.

پیاده‌سازی در n8n:

  • Code Node (JavaScript/Python): قدرتمندترین ابزار برای این کار است. می‌توانید با استفاده از عبارات با قاعده (Regular Expressions – Regex) الگوهای خاص را شناسایی و حذف کنید. به عنوان مثال، برای حذف تگ‌های HTML: text.replace(/<[^>]*>/g, ''). یا برای حذف خطوط خالی اضافی.
  • Function Node: مشابه گره Code است اما برای توابع کوچک‌تر و ساده‌تر.
  • Split in Batches Node و Item Lists Node: برای پردازش داده‌ها در دسته‌های کوچک‌تر یا مدیریت لیست‌های تکراری از آیتم‌ها.

استانداردسازی و نرمال‌سازی متن

پس از حذف نویز، متن باید استاندارد شود تا از ناسازگاری‌ها جلوگیری شود:

  • تبدیل به حروف کوچک (Lowercasing): برای اطمینان از اینکه “Apple” و “apple” به عنوان کلمات یکسان در نظر گرفته شوند.
  • حذف علائم نگارشی: در برخی موارد، علائم نگارشی می‌توانند نویز ایجاد کنند، هرچند در موارد دیگر برای حفظ معنا ضروری هستند (باید با دقت انجام شود).
  • حذف اعداد: اگر اعداد برای مورد استفاده شما بی‌اهمیت هستند.
  • نمونه‌سازی ریشه (Stemming) یا ریشه‌یابی (Lemmatization): کاهش کلمات به ریشه مشترکشان (مانند “running”, “ran”, “runs” به “run”). این فرآیندها می‌توانند در گره Code با استفاده از کتابخانه‌های NLP (مانند NLTK یا SpaCy در پایتون) پیاده‌سازی شوند.
  • حذف کلمات توقف (Stop Words): حذف کلمات رایج و پرکاربرد که اطلاعات معنایی کمی دارند (مانند “the”, “a”, “is” در انگلیسی یا “از”, “و”, “که” در فارسی).

پیاده‌سازی در n8n:

  • گره Code یا Function برای اعمال تمامی این تبدیل‌ها. برای مثال، برای تبدیل به حروف کوچک در جاوا اسکریپت: text.toLowerCase().
  • برای حذف علائم نگارشی با Regex: text.replace(/[^\w\s]/g, '') (که تمامی کاراکترهای غیر از حروف، اعداد و فاصله را حذف می‌کند).

رسیدگی به خطاها و داده‌های گم‌شده

داده‌های ناقص یا خراب می‌توانند به کل خط لوله آسیب بزنند:

  • مقادیر گم‌شده (Missing Values): تصمیم بگیرید که آیا آنها را حذف کنید، جایگزین کنید (با یک مقدار پیش‌فرض یا میانگین/میانه) یا به طور خاص مدیریت کنید.
  • فرمت‌های نادرست: داده‌هایی که با فرمت مورد انتظار مطابقت ندارند (مثلاً تاریخ با فرمت اشتباه).
  • داده‌های تکراری: شناسایی و حذف رکوردهای تکراری.

پیاده‌سازی در n8n:

  • If Node: برای اعمال منطق شرطی بر اساس وجود یا عدم وجود داده‌ها.
  • Filter Node: برای حذف آیتم‌هایی که شرط خاصی را برآورده نمی‌کنند (مثلاً فیلد متن خالی است).
  • Code Node: برای پیاده‌سازی منطق پیچیده‌تر برای جایگزینی یا تصحیح داده‌ها.
  • Item Lists Node: برای حذف آیتم‌های تکراری از یک لیست.

بهره‌گیری از گره‌های کلیدی n8n در پاک‌سازی

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

  • Code Node: برای هرگونه تبدیل داده سفارشی با JavaScript یا Python.
  • Function Node: نسخه ساده‌تر و کم‌مصرف‌تر از Code Node برای منطق‌های ساده.
  • Set Node: برای افزودن، اصلاح یا حذف فیلدها در آیتم‌های داده. می‌توانید از آن برای استانداردسازی نام فیلدها یا اضافه کردن مقادیر پیش‌فرض استفاده کنید.
  • Split in Batches Node: برای پردازش مجموعه داده‌های بزرگ به صورت دسته‌ای، که می‌تواند در مدیریت حافظه و API Rate Limit مفید باشد.
  • Merge Node: برای ترکیب مجدد جریان‌های داده‌ای که قبلاً تقسیم شده‌اند یا برای افزودن فراداده به داده‌های اصلی.

استراتژی‌های قطعه‌بندی (Chunking): تقسیم‌بندی هوشمندانه متن

یکی از مهم‌ترین مراحل در آماده‌سازی داده برای RAG، قطعه‌بندی (Chunking) است. مدل‌های زبان بزرگ محدودیت‌هایی در اندازه ورودی (context window) دارند و ارسال کل یک سند طولانی به آنها امکان‌پذیر نیست. علاوه بر این، حتی اگر امکان‌پذیر هم باشد، کارایی بازیابی را کاهش می‌دهد، زیرا بازیابی یک سند بسیار طولانی که فقط بخش کوچکی از آن مرتبط است، بار اضافه بر دوش LLM می‌گذارد.

چرا قطعه‌بندی برای RAG حیاتی است؟

دلایل اصلی برای قطعه‌بندی متن:

  • محدودیت پنجره متنی LLM (LLM Context Window Limits): LLMها تنها می‌توانند مقدار محدودی از متن را در هر فراخوانی پردازش کنند. قطعه‌بندی تضمین می‌کند که اندازه ورودی از این محدودیت تجاوز نمی‌کند.
  • افزایش دقت بازیابی (Improved Retrieval Accuracy): اگر یک سند طولانی به قطعات کوچک‌تر تقسیم شود، سیستم بازیابی می‌تواند قطعاتی را که دقیقاً با پرس و جو مرتبط هستند، با دقت بیشتری پیدا کند. بازیابی کل یک سند بزرگ و بی‌ربط می‌تواند دقت را کاهش دهد.
  • کاهش هزینه‌ها و تأخیر: پردازش حجم کمتری از متن توسط LLM و مدل‌های جاسازی، منجر به کاهش هزینه‌های API و زمان پاسخ‌گویی می‌شود.
  • حفظ انسجام معنایی: هدف این است که هر قطعه به اندازه کافی کوچک باشد تا در پنجره متنی LLM جا شود، اما به اندازه کافی بزرگ باشد که یک واحد معنایی کامل را در بر گیرد.

روش‌های متداول قطعه‌بندی

چندین استراتژی برای قطعه‌بندی وجود دارد که هر یک مزایا و معایب خاص خود را دارند:

۱. قطعه‌بندی با اندازه ثابت (Fixed-Size Chunking)

ساده‌ترین روش است که در آن متن به قطعاتی با تعداد کاراکترها یا کلمات ثابت تقسیم می‌شود.

مزایا: سادگی پیاده‌سازی.

معایب: ممکن است یک جمله یا پاراگراف را در میانه تقسیم کند و انسجام معنایی را از بین ببرد.

۲. قطعه‌بندی مبتنی بر ساختار (Structural Chunking)

در این روش، متن بر اساس ساختار منطقی آن (مانند پاراگراف‌ها، بخش‌ها، جملات) تقسیم می‌شود.

مزایا: انسجام معنایی بهتری را حفظ می‌کند.

معایب: نیاز به تجزیه ساختار سند دارد (مثلاً پارس کردن HTML، شناسایی سرصفحه‌ها در PDF). برخی پاراگراف‌ها یا بخش‌ها ممکن است بیش از حد طولانی باشند.

۳. قطعه‌بندی بازگشتی (Recursive Chunking)

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

مزایا: سعی می‌کند انسجام معنایی را حفظ کند و در عین حال اندازه قطعات را مدیریت کند.

معایب: پیچیده‌تر از قطعه‌بندی با اندازه ثابت است.

۴. قطعه‌بندی معنایی (Semantic Chunking)

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

مزایا: بالاترین کیفیت بازیابی را فراهم می‌کند زیرا هر قطعه یک مفهوم واحد را نشان می‌دهد.

معایب: بسیار پیچیده‌تر و پرهزینه‌تر از نظر محاسباتی است، زیرا نیاز به ایجاد جاسازی‌ها در طول فرآیند قطعه‌بندی دارد.

پیاده‌سازی قطعه‌بندی در n8n

پیاده‌سازی قطعه‌بندی در n8n معمولاً با استفاده از گره Code انجام می‌شود، زیرا این گره به شما امکان می‌دهد منطق سفارشی خود را بنویسید.

۱. قطعه‌بندی با اندازه ثابت و همپوشانی در گره Code

می‌توانید تابعی در گره Code بنویسید که یک متن طولانی را به قطعاتی با اندازه مشخص و با مقداری همپوشانی (Overlap) تقسیم کند. همپوشانی به حفظ زمینه بین قطعات کمک می‌کند و احتمال از دست دادن اطلاعات مهم در مرزهای قطعات را کاهش می‌دهد.

مثال ساختاری در گره Code (JavaScript):


const text = $input.item.json.text_content;
const chunkSize = 500; // اندازه قطعه بر اساس تعداد کاراکتر
const overlap = 100;   // میزان همپوشانی

let chunks = [];
for (let i = 0; i < text.length; i += chunkSize - overlap) {
    let end = i + chunkSize;
    if (end > text.length) {
        end = text.length;
    }
    const chunk = text.substring(i, end);
    chunks.push({ text: chunk });
}

return chunks;

این کد یک مثال ساده است. در عمل، ممکن است بخواهید به جای کاراکتر، بر اساس تعداد توکن‌ها قطعه‌بندی کنید که به ابزارهای tokenizer نیاز دارد.

۲. قطعه‌بندی بازگشتی در گره Code

برای قطعه‌بندی بازگشتی، منطق پیچیده‌تری نیاز است که به صورت سلسله‌مراتبی جداکننده‌ها را امتحان کند. کتابخانه‌های پایتون مانند LangChain’s RecursiveCharacterTextSplitter برای این کار بسیار مفید هستند. می‌توانید یک گره Code با محیط Python ایجاد کنید و از این کتابخانه‌ها بهره ببرید.

مثال ساختاری در گره Code (Python):


from langchain.text_splitter import RecursiveCharacterTextSplitter

text_content = item.json['text_content']

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 1000,
    chunk_overlap = 200,
    length_function = len, # یا برای توکن ها از tokenizer استفاده کنید
    separators=["\n\n", "\n", " ", ""]
)

chunks = text_splitter.create_documents([text_content])

output_items = []
for chunk in chunks:
    output_items.append({'text': chunk.page_content, 'metadata': chunk.metadata})

return output_items

برای استفاده از این کد، باید مطمئن شوید که کتابخانه LangChain در محیط n8n شما قابل دسترسی است (در حالت Docker با نصب dependency یا با استفاده از محیط‌های سفارشی). اگر این امکان وجود ندارد، می‌توانید منطق LangChain را در گره Code (JavaScript) خودتان پیاده‌سازی کنید یا از یک سرویس ابری واسط که این کار را انجام می‌دهد (از طریق گره HTTP Request) استفاده کنید.

مدیریت همپوشانی (Overlap) بین قطعات

همپوشانی (overlap) نقش مهمی در حفظ زمینه دارد. اگر دو قطعه در مرزهای خود هیچ همپوشانی نداشته باشند، ممکن است اطلاعات حیاتی که یک مفهوم را به قطعه بعدی متصل می‌کنند، از دست بروند. یک همپوشانی منطقی (مثلاً ۱۰ تا ۲۰ درصد اندازه قطعه) می‌تواند به مدل LLM کمک کند تا زمینه کافی را در هر قطعه برای درک کامل مطلب داشته باشد.

مدیریت فراداده (Metadata): غنی‌سازی زمینه بازیابی

فراداده (Metadata) یا ابرداده، اطلاعاتی در مورد داده‌های اصلی شماست. در زمینه RAG، فراداده‌ها می‌توانند نقش بسیار مهمی در بهبود کیفیت بازیابی و ارائه پاسخ‌های دقیق‌تر توسط LLM ایفا کنند. فراداده‌ها به سیستم بازیابی کمک می‌کنند تا قطعات مرتبط را با دقت بیشتری فیلتر، مرتب‌سازی و رتبه‌بندی کند و همچنین به LLM اجازه می‌دهند تا منشأ اطلاعات را درک کند.

اهمیت فراداده در بهبود بازیابی

فراداده‌ها به چند طریق به RAG کمک می‌کنند:

  • فیلتر کردن (Filtering): می‌توانید جستجو را به اسناد خاصی محدود کنید. مثلاً “فقط اسناد منتشر شده در سال ۲۰۲۳” یا “فقط مستندات مربوط به بخش مالی”.
  • رتبه‌بندی (Ranking): فراداده‌ها می‌توانند برای رتبه‌بندی قطعات بازیابی شده استفاده شوند. مثلاً، قطعاتی که توسط یک نویسنده معتبر نوشته شده‌اند یا جدیدتر هستند، ممکن است اولویت بیشتری داشته باشند.
  • استناد و شفافیت (Attribution & Transparency): با نگهداری فراداده‌هایی مانند منبع اصلی سند یا URL، می‌توانید در پاسخ‌های LLM به کاربران نشان دهید که اطلاعات از کجا آمده‌اند، که اعتمادپذیری را افزایش می‌دهد.
  • بهبود تجربه کاربر: کاربران می‌توانند سؤالات خود را با معیارهای فراداده‌ای ترکیب کنند، مانند “آخرین گزارش عملکرد محصول که توسط تیم توسعه منتشر شده است، چیست؟”

انواع فراداده مفید برای RAG

بسته به نوع داده و مورد استفاده شما، فراداده‌های مختلفی می‌توانند مفید باشند:

  • منبع (Source): نام فایل، URL وب‌سایت، نام پایگاه داده.
  • تاریخ (Date): تاریخ ایجاد، تاریخ اصلاح، تاریخ انتشار سند.
  • نویسنده (Author): نام نویسنده یا تیمی که سند را ایجاد کرده است.
  • نوع سند (Document Type): گزارش، مقاله، دستورالعمل، سیاست، ایمیل.
  • موضوع/برچسب‌ها (Topic/Tags): کلمات کلیدی یا دسته‌بندی‌هایی که محتوای سند را توصیف می‌کنند.
  • بخش/دپارتمان (Department/Section): بخشی از سازمان که سند به آن تعلق دارد.
  • سطح محرمانه بودن (Confidentiality Level): عمومی، داخلی، محرمانه.
  • شماره نسخه (Version Number): برای مدیریت تغییرات در اسناد.
  • شناسه منحصر به فرد (Unique ID): برای هر قطعه، برای ردیابی و به‌روزرسانی آسان.

استخراج و اتصال فراداده در n8n

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

۱. استخراج فراداده در مرحله Ingestion

هنگامی که داده‌ها را از منابع جمع‌آوری می‌کنید، می‌توانید فراداده‌های اولیه را استخراج کنید:

  • از HTTP Request: هدرهای پاسخ (Response Headers)، URL اصلی، تاریخ از فیلدهای JSON/XML.
  • از Database Nodes: هر فیلد مرتبط از جدول پایگاه داده (مانند تاریخ ایجاد، نام نویسنده).
  • از Cloud Storage Nodes: نام فایل، تاریخ آپلود، مسیر پوشه.
  • از File Nodes: نام فایل، پسوند، تاریخ آخرین تغییر.

پیاده‌سازی در n8n:
پس از دریافت داده‌ها، می‌توانید از گره Set یا Code برای استخراج این اطلاعات و ذخیره آنها به عنوان فیلدهای جدید در آیتم‌های داده n8n استفاده کنید.


// در گره Set پس از HTTP Request
// فرض کنید پاسخ شامل فیلد "published_date" است
{
  "chunk_text": "{{ $json.article_content }}",
  "metadata": {
    "source_url": "{{ $json.article_url }}",
    "publication_date": "{{ $json.published_date }}",
    "document_type": "article"
  }
}

۲. اتصال فراداده به قطعات

هنگامی که متن را به قطعات تقسیم می‌کنید، باید مطمئن شوید که فراداده‌های مربوط به سند اصلی به هر قطعه متصل می‌شوند.

پیاده‌سازی در n8n:
اگر از گره Code برای قطعه‌بندی استفاده می‌کنید، می‌توانید فراداده‌ها را مستقیماً به هر شیء قطعه اضافه کنید.


// در گره Code پس از قطعه بندی
// فرض کنید آیتم ورودی شامل metadata از مراحل قبل است
const originalMetadata = $input.item.json.metadata; // فراداده از سند اصلی

let chunks = [];
// ... منطق قطعه بندی ...
for (let i = 0; i < text.length; i += chunkSize - overlap) {
    const chunk = text.substring(i, end);
    chunks.push({ 
        text: chunk, 
        metadata: { 
            ...originalMetadata, // کپی کردن فراداده اصلی
            chunk_id: `chunk_${i}`, // اضافه کردن فراداده مخصوص قطعه
            start_offset: i 
        } 
    });
}
return chunks;

اگر از چندین جریان داده (مثلاً یک جریان برای متن و دیگری برای فراداده) استفاده می‌کنید، می‌توانید از گره Merge (با حالت Merge By Index یا Merge By Custom Key) برای ترکیب آنها استفاده کنید.

۳. اعتبارسنجی و نرمال‌سازی فراداده‌ها

همانند داده‌های متنی، فراداده‌ها نیز ممکن است نیاز به پاک‌سازی و استانداردسازی داشته باشند. اطمینان حاصل کنید که فرمت تاریخ‌ها یکسان است، نام‌ها نرمال شده‌اند و دسته‌بندی‌ها از یک مجموعه از پیش تعریف شده پیروی می‌کنند. می‌توانید از گره Code یا Set برای این منظور استفاده کنید.

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

بردارسازی و جاسازی (Embedding): تبدیل متن به زبان ماشین

برای اینکه یک سیستم RAG بتواند قطعات متنی مرتبط را بازیابی کند، نیاز است که متن‌ها به فرمتی تبدیل شوند که کامپیوترها بتوانند آنها را مقایسه و درک کنند. اینجاست که مفهوم بردارسازی (Vectorization) یا جاسازی (Embedding) وارد می‌شود. جاسازی‌ها، نمایش‌های عددی (بردارها) از کلمات، جملات یا کل قطعات متن هستند که روابط معنایی بین آنها را در یک فضای چندبعدی (vector space) ثبت می‌کنند.

مفهوم جاسازی‌ها و نقش آنها در RAG

یک مدل جاسازی، متنی را به یک بردار متراکم از اعداد تبدیل می‌کند. مهمترین ویژگی این بردارها این است که متن‌های با معنای مشابه در فضای برداری به هم نزدیک خواهند بود، در حالی که متن‌های با معنای متفاوت دورتر قرار می‌گیرند. این قابلیت برای RAG حیاتی است، زیرا به سیستم امکان می‌دهد:

  • مقایسه معنایی (Semantic Comparison): به جای تطابق کلمات کلیدی (keyword matching)، سیستم می‌تواند متن پرس و جو را با قطعات ذخیره شده بر اساس معنای کلی آنها مقایسه کند.
  • جستجوی شباهت (Similarity Search): هنگامی که یک پرس و جوی کاربر وارد می‌شود، آن نیز به یک بردار تبدیل می‌شود. سپس سیستم می‌تواند نزدیک‌ترین بردارها را در پایگاه داده برداری پیدا کند، که متناظر با مرتبط‌ترین قطعات متن هستند.

به عبارت دیگر، جاسازی‌ها به سیستم RAG اجازه می‌دهند تا "درک" کند که چگونه یک پرس و جو با اطلاعات موجود در پایگاه داده شما مرتبط است، حتی اگر از کلمات دقیقاً یکسان استفاده نشده باشد.

انتخاب مدل جاسازی مناسب

انتخاب مدل جاسازی تأثیر زیادی بر کیفیت RAG دارد. مدل‌های مختلف در دقت، سرعت، ابعاد بردار و هزینه متفاوت هستند:

  • OpenAI Embeddings (text-embedding-ada-002): یکی از محبوب‌ترین و کارآمدترین مدل‌ها برای کاربردهای عمومی. دارای ابعاد برداری بالا و کیفیت خوب. هزینه بر اساس تعداد توکن‌ها محاسبه می‌شود.
  • Cohere Embeddings: جایگزینی قدرتمند برای OpenAI با مدل‌های مختلف برای موارد استفاده خاص.
  • Hugging Face Embeddings / Sentence Transformers: مجموعه‌ای از مدل‌های متن‌باز و قابل اجرا به صورت محلی. این مدل‌ها برای سناریوهایی که نیاز به کنترل بیشتر، حریم خصوصی یا کاهش هزینه‌های API دارید، مناسب هستند. نیاز به زیرساخت محلی برای اجرا دارند.
  • Google's PaLM Embeddings / Vertex AI Embeddings: مدل‌های جاسازی از گوگل که در اکوسیستم Google Cloud در دسترس هستند.

هنگام انتخاب مدل، به موارد زیر توجه کنید:

  • کیفیت (Quality): مدل چقدر در ضبط روابط معنایی خوب عمل می‌کند؟
  • هزینه (Cost): مدل‌های API محور مانند OpenAI هزینه‌ای بر اساس توکن‌های پردازش شده دارند. مدل‌های محلی هزینه سخت‌افزار و نگهداری دارند.
  • سرعت/تأخیر (Speed/Latency): برای حجم بالای داده، سرعت بردارسازی مهم است.
  • زبان (Language): آیا مدل برای زبان فارسی به خوبی کار می‌کند؟ بسیاری از مدل‌های محبوب عمدتاً روی داده‌های انگلیسی آموزش دیده‌اند، اما مدل‌های چندزبانه نیز موجود هستند.
  • ابعاد بردار (Vector Dimensions): تعداد ابعاد بردار (مثلاً ۱۵۳۶ برای ada-002) می‌تواند بر عملکرد و حجم ذخیره‌سازی تأثیر بگذارد.

ادغام سرویس‌های جاسازی در n8n

بردارسازی در n8n معمولاً از طریق گره HTTP Request برای ارتباط با APIهای مدل‌های جاسازی یا با استفاده از گره‌های اختصاصی (در صورت وجود) انجام می‌شود.

۱. استفاده از گره HTTP Request برای OpenAI Embeddings

برای استفاده از OpenAI (یا هر API دیگری که سرویس جاسازی ارائه می‌دهد):

  1. پس از مرحله قطعه‌بندی، یک گره HTTP Request اضافه کنید.
  2. Method را روی POST تنظیم کنید.
  3. URL را به https://api.openai.com/v1/embeddings تنظیم کنید.
  4. در بخش Headers، یک هدر Authorization با مقدار Bearer YOUR_OPENAI_API_KEY و هدر Content-Type: application/json اضافه کنید. (API Key خود را در یک Credential در n8n ذخیره کنید و از آن استفاده کنید.)
  5. در بخش Body، نوع را JSON انتخاب کرده و ساختار درخواست را بسازید:
    
    {
      "model": "text-embedding-ada-002",
      "input": "{{ $json.text }}" // متن قطعه شده از مرحله قبل
    }
            
  6. پاسخ شامل یک فیلد data[0].embedding خواهد بود که بردار جاسازی است. می‌توانید از یک گره Set برای استخراج این بردار و افزودن آن به آیتم داده خود استفاده کنید:
    
    {
      "text": "{{ $json.text }}",
      "metadata": "{{ $json.metadata }}",
      "embedding": "{{ $json.data[0].embedding }}"
    }
            

ملاحظات مهم: OpenAI و دیگر APIها دارای محدودیت نرخ (rate limits) هستند. اگر تعداد زیادی قطعه دارید، باید از گره Split In Batches قبل از گره HTTP Request استفاده کنید و تأخیر (delay) بین دسته‌ها را تنظیم کنید تا از تجاوز از محدودیت نرخ جلوگیری شود.

۲. استفاده از گره‌های اختصاصی

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

۳. مدل‌های محلی (Local Models)

برای مدل‌های جاسازی محلی (مانند Sentence Transformers که روی یک سرور GPU اجرا می‌شوند)، می‌توانید یک API کوچک با Flask یا FastAPI ایجاد کنید که این مدل‌ها را به صورت سرویس ارائه دهد. سپس، n8n می‌تواند با استفاده از گره HTTP Request به این API محلی متصل شود و جاسازی‌ها را دریافت کند. این رویکرد کنترل بیشتری روی مدل و حریم خصوصی داده‌ها می‌دهد، اما نیاز به مدیریت زیرساخت سرور دارد.

چالش‌ها و ملاحظات در بردارسازی

  • هزینه: بردارسازی حجم زیادی از داده‌ها می‌تواند پرهزینه باشد، به خصوص با مدل‌های API محور. بهینه‌سازی فرآیند و استفاده از مدل‌های مقرون‌به‌صرفه ضروری است.
  • مدیریت توکن‌ها: برخی مدل‌های جاسازی محدودیت توکن دارند. مطمئن شوید که قطعات شما از این محدودیت تجاوز نمی‌کنند.
  • سازگاری (Consistency): همیشه از یک مدل جاسازی یکسان برای تمامی قطعات ذخیره شده و پرس و جوهای زمان اجرا استفاده کنید تا مقایسه‌ها معنادار باشند.
  • به‌روزرسانی مدل: مدل‌های جاسازی به طور مرتب به‌روز می‌شوند. بررسی کنید که آیا به‌روزرسانی مدل نیاز به بازسازی جاسازی‌های موجود دارد یا خیر.

بردارسازی قلب سیستم بازیابی معنایی RAG است. با دقت در انتخاب مدل و پیاده‌سازی کارآمد در n8n، می‌توانید اطمینان حاصل کنید که سیستم RAG شما قادر به درک عمیق‌تر معنای داده‌ها و ارائه نتایج بازیابی دقیق و مرتبط خواهد بود.

ذخیره‌سازی داده‌های آماده‌شده در پایگاه داده برداری (Vector Database)

پس از اینکه داده‌های خام خود را پاک‌سازی، قطعه‌بندی و به بردارهای جاسازی تبدیل کردید، مرحله نهایی در آماده‌سازی داده، ذخیره این بردارها و فراداده‌های مربوطه در یک پایگاه داده برداری (Vector Database) است. پایگاه داده برداری برای ذخیره‌سازی، مدیریت و جستجوی کارآمد بردارهای با ابعاد بالا بهینه شده‌اند و جزء جدایی‌ناپذیر یک سیستم RAG مدرن هستند.

معرفی پایگاه داده‌های برداری و لزوم آنها

پایگاه داده‌های برداری، دیتابیس‌های تخصصی هستند که برای ذخیره بردارهای جاسازی و انجام جستجوهای شباهت (similarity search) بر اساس نزدیکی در فضای برداری طراحی شده‌اند. برخلاف پایگاه داده‌های سنتی که بر اساس تطابق دقیق مقادیر یا پرس و جوهای ساختاریافته کار می‌کنند، پایگاه داده‌های برداری بر اساس نزدیکی معنایی عمل می‌کنند.

وظایف اصلی یک پایگاه داده برداری عبارتند از:

  • ذخیره‌سازی بردارها: نگهداری حجم عظیمی از بردارهای با ابعاد بالا.
  • جستجوی همسایگان نزدیک تقریبی (Approximate Nearest Neighbor - ANN): یافتن سریع K نزدیک‌ترین بردار به یک بردار پرس و جو، حتی در مجموعه داده‌های بسیار بزرگ. این فرآیند بهینه‌سازی شده و بسیار سریع‌تر از جستجوی دقیق همسایگان نزدیک (Exact Nearest Neighbor) است.
  • فیلتر کردن فراداده: قابلیت ترکیب جستجوی شباهت برداری با فیلترهای سنتی بر اساس فراداده‌ها. به عنوان مثال، "نزدیک‌ترین قطعات به این پرس و جو را فقط در اسنادی که در سال ۲۰۲۳ منتشر شده‌اند، پیدا کن."
  • مدیریت مقیاس‌پذیری و پایداری: اطمینان از دسترس‌پذیری بالا و عملکرد خوب حتی با افزایش حجم داده‌ها و پرس و جوها.

بدون یک پایگاه داده برداری، مدیریت و بازیابی مؤثر اطلاعات از مجموعه بزرگی از جاسازی‌ها تقریباً غیرممکن خواهد بود.

برخی از پایگاه داده‌های برداری محبوب:

  • Pinecone: یک سرویس ابری کاملاً مدیریت شده که مقیاس‌پذیری و کارایی بالایی ارائه می‌دهد.
  • Weaviate: یک پایگاه داده برداری متن‌باز با قابلیت‌های گراف دانش و جستجوی سمانتیک.
  • Qdrant: یک پایگاه داده برداری متن‌باز با کارایی بالا، مناسب برای سناریوهای با تأخیر کم.
  • Chroma: یک پایگاه داده برداری سبک‌وزن و قابل توسعه، مناسب برای پروژه‌های کوچک تا متوسط یا توسعه محلی.
  • Milvus / Zilliz: یک پایگاه داده برداری متن‌باز با قابلیت‌های مقیاس‌پذیری بالا و پشتیبانی از انواع جستجوها.
  • Redis Stack: با ماژول RediSearch، Redis نیز می‌تواند برای ذخیره‌سازی و جستجوی برداری استفاده شود.

تعامل n8n با پایگاه داده‌های برداری

n8n می‌تواند از طریق گره‌های اختصاصی (در صورت وجود) یا گره HTTP Request با این پایگاه داده‌ها تعامل داشته باشد.

۱. استفاده از گره‌های اختصاصی n8n

برخی از پایگاه داده‌های برداری ممکن است گره‌های اختصاصی در n8n داشته باشند. این گره‌ها فرآیند اتصال و ارسال داده را بسیار ساده می‌کنند. برای مثال، ممکن است یک گره Pinecone یا Weaviate وجود داشته باشد که به شما امکان می‌دهد بردارها و فراداده‌ها را به راحتی آپلود کنید.

مثال با گره فرضی Pinecone:

  1. گره Pinecone را پس از گره بردارسازی اضافه کنید.
  2. Credential مربوط به Pinecone (API Key و Environment) را تنظیم کنید.
  3. در تنظیمات گره، مشخص کنید که کدام فیلد حاوی بردار ($json.embedding) و کدام فیلد حاوی فراداده ($json.metadata) و کدام فیلد حاوی متن اصلی ($json.text) است.
  4. عملیات را روی Upsert تنظیم کنید.

۲. استفاده از گره HTTP Request

اگر گره اختصاصی برای پایگاه داده برداری شما وجود ندارد، گره HTTP Request راه حل استاندارد است. تمامی پایگاه داده‌های برداری یک API برای تعامل دارند.

مثال با گره HTTP Request برای Qdrant:

  1. یک گره HTTP Request را پس از مرحله بردارسازی اضافه کنید.
  2. Method را روی POST تنظیم کنید.
  3. URL را به http://localhost:6333/collections/your_collection_name/points (یا URL ابری Qdrant شما) تنظیم کنید.
  4. هدر Content-Type: application/json و هر هدر احراز هویت لازم را اضافه کنید.
  5. در Body، نوع را JSON انتخاب کرده و ساختار درخواست را بر اساس مستندات API پایگاه داده برداری بسازید. برای Qdrant، هر آیتم باید شامل id (یک شناسه منحصر به فرد)، vector (بردار جاسازی) و payload (فراداده و متن اصلی) باشد:
    
    {
      "points": [
        {
          "id": "{{ $json.metadata.chunk_id }}", // شناسه منحصر به فرد برای هر قطعه
          "vector": "{{ $json.embedding }}",
          "payload": {
            "text": "{{ $json.text }}",
            "source_url": "{{ $json.metadata.source_url }}",
            "publication_date": "{{ $json.metadata.publication_date }}"
            // ... سایر فراداده ها
          }
        }
      ]
    }
            

مانند بردارسازی، ممکن است نیاز به استفاده از گره Split In Batches قبل از ارسال داده‌ها به پایگاه داده برداری داشته باشید تا از ارسال بیش از حد آیتم‌ها در یک درخواست و تجاوز از محدودیت‌های API جلوگیری کنید.

عملیات Upsert و مدیریت نسخه‌ها

Upsert (Update or Insert) یک عملیات رایج در پایگاه داده‌های برداری است که به شما امکان می‌دهد اگر یک بردار با یک ID مشخص وجود دارد، آن را به‌روزرسانی کنید و اگر وجود ندارد، آن را درج کنید. این برای مدیریت تغییرات در اسناد و اطمینان از تازگی اطلاعات در پایگاه داده برداری حیاتی است.

  • به‌روزرسانی داده‌ها: اگر یک سند اصلی تغییر کند، می‌توانید فرآیند آماده‌سازی را مجدداً برای آن سند اجرا کنید. با استفاده از همان chunk_id یا document_id و chunk_index، می‌توانید قطعات به‌روز شده را با عملیات Upsert جایگزین قطعات قدیمی در پایگاه داده برداری کنید.
  • حذف داده‌ها: اگر سندی حذف شود، باید اطمینان حاصل کنید که قطعات و بردارهای مربوط به آن نیز از پایگاه داده برداری حذف می‌شوند. APIهای پایگاه داده برداری معمولاً دارای عملیات حذف (delete) بر اساس ID هستند.

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

ساخت یک گردش کار جامع آماده‌سازی داده برای RAG در n8n (مطالعه موردی)

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

طرح کلی یک گردش کار نمونه

تصور کنید می‌خواهید مجموعه مستندات فنی شرکت خود را (شامل فایل‌های PDF و صفحات وب) برای یک سیستم RAG آماده کنید تا کارمندان بتوانند سؤالات خود را در مورد محصولات و فرآیندها بپرسند.

  1. شروع (Start Node):
    • Scheduler Node: برای اجرای روزانه یا هفتگی جهت بررسی و پردازش مستندات جدید یا به‌روز شده.
  2. جمع‌آوری داده‌ها (Data Ingestion):
    • HTTP Request Node: برای خزیدن (crawling) صفحات وب مستندات فنی از یک URL مشخص (مثلاً بلاگ فنی یا بخش مستندات وب‌سایت). خروجی: محتوای HTML صفحات.
    • Google Drive Node یا S3 Node: برای لیست کردن و دانلود فایل‌های PDF از پوشه‌های مشخص. خروجی: فایل‌های باینری PDF.
    • Merge Node: برای ترکیب خروجی‌های HTTP Request و Cloud Storage به یک جریان واحد.
  3. استخراج متن و فراداده (Text & Metadata Extraction):
    • If Node: برای تمایز بین HTML و PDF.
    • برای HTML:
      • Code Node (JS): استفاده از کتابخانه‌هایی مانند Cheerio (که در n8n قابل استفاده است) یا Regex برای استخراج متن اصلی از HTML و حذف کدهای زائد. استخراج فراداده‌هایی مانند عنوان (از تگ title)، URL، و تاریخ.
    • برای PDF:
      • HTTP Request Node: ارسال فایل باینری PDF به یک سرویس OCR (تشخیص متن نوری) یا یک API که متن را از PDF استخراج می‌کند (مثلاً Apache Tika که به صورت محلی یا در کانتینر اجرا می‌شود). این مرحله ممکن است به یک سرویس خارجی نیاز داشته باشد زیرا استخراج متن از PDF پیچیده است.
      • Set Node: برای افزودن فراداده‌هایی مانند نام فایل PDF و تاریخ آپلود.
    • Merge Node: برای ترکیب مجدد جریان‌های متن استخراج شده از HTML و PDF.
  4. پاک‌سازی و پیش‌پردازش (Cleaning & Preprocessing):
    • Code Node (JS/Python):
      • حذف اطلاعات بویلرپلیت (boilerplate text) و نویزهای باقیمانده (مثلاً متن‌های کپی‌رایت تکراری).
      • تبدیل به حروف کوچک (lower-casing).
      • استانداردسازی علائم نگارشی و فاصله‌ها.
    • Filter Node: حذف اسناد یا قطعاتی که پس از پاک‌سازی خالی هستند یا بیش از حد کوتاهند.
  5. قطعه‌بندی (Chunking):
    • Code Node (JS/Python): پیاده‌سازی منطق قطعه‌بندی بازگشتی با همپوشانی (recursive chunking with overlap) برای تقسیم هر سند به قطعات کوچک‌تر و معنایی. در این مرحله، document_id و chunk_index به هر قطعه به عنوان فراداده اضافه می‌شود.
  6. بردارسازی (Vectorization/Embedding):
    • Split In Batches Node: برای تقسیم قطعات به دسته‌های کوچک‌تر (مثلاً ۱۰ تا ۲۰ قطعه در هر دسته) جهت مدیریت Rate Limit API.
    • HTTP Request Node: ارسال هر دسته از قطعات به API مدل جاسازی (مثلاً OpenAI text-embedding-ada-002).
    • Set Node: استخراج بردار جاسازی (embedding) از پاسخ API و افزودن آن به آیتم داده (کنار متن قطعه و فراداده).
    • Merge Node: ترکیب مجدد دسته‌های پردازش شده.
  7. ذخیره‌سازی در پایگاه داده برداری (Vector Database Storage):
    • HTTP Request Node (یا گره اختصاصی): ارسال هر قطعه (شامل متن، فراداده و بردار جاسازی) به پایگاه داده برداری (مثلاً Pinecone، Qdrant). عملیات روی Upsert تنظیم می‌شود تا بتواند اسناد موجود را به‌روزرسانی کند.
  8. پایان (End Node): پس از اتمام تمامی مراحل، گردش کار به پایان می‌رسد.

جریان بصری در n8n:

این گردش کار یک خط لوله خطی نخواهد بود، بلکه شامل شاخه‌ها (branches) و ترکیب مجدد (merges) داده‌ها خواهد شد. استفاده از گره Error Trigger و If Node برای مدیریت خطاها و مسیرهای جایگزین نیز توصیه می‌شود.

با ساختن چنین گردش کاری در n8n، شما یک سیستم قوی و خودکار برای تبدیل داده‌های خام خود به منابع قابل بازیابی برای RAG ایجاد کرده‌اید. این فرآیند می‌تواند در پس‌زمینه اجرا شود و دانش سیستم RAG شما را به‌روز نگه دارد، بدون نیاز به دخالت دستی مداوم.

انعطاف‌پذیری و ماژولار بودن

یکی از مزایای اصلی n8n، انعطاف‌پذیری آن است. می‌توانید هر مرحله از این گردش کار را به یک گردش کار (workflow) جداگانه (Sub-Workflow) تبدیل کنید و آنها را با استفاده از گره Execute Workflow فراخوانی کنید. این رویکرد ماژولار باعث می‌شود:

  • قابلیت نگهداری (Maintainability): هر بخش از جریان کار به راحتی قابل درک و اصلاح است.
  • قابلیت استفاده مجدد (Reusability): یک گردش کار قطعه‌بندی می‌تواند برای انواع مختلف داده‌ها مورد استفاده قرار گیرد.
  • تست‌پذیری (Testability): می‌توانید هر Sub-Workflow را به صورت جداگانه تست و اشکال‌زدایی کنید.

بهترین روش‌ها و بهینه‌سازی برای RAG موفق

آماده‌سازی داده برای RAG یک فرآیند پیچیده است که نیاز به دقت و بهینه‌سازی مداوم دارد. با رعایت بهترین روش‌ها، می‌توانید کارایی و دقت سیستم RAG خود را به حداکثر برسانید.

رویکرد تکراری و بازخورد مداوم

RAG یک فرآیند خطی نیست، بلکه یک چرخه تکراری است:

  • شروع با مجموعه داده کوچک: ابتدا با یک مجموعه داده کوچک شروع کنید تا فرآیند آماده‌سازی و پارامترها را تنظیم کنید.
  • بررسی خروجی‌ها در هر مرحله:
    • آیا پاک‌سازی به درستی انجام شده است؟ آیا نویز باقیمانده‌ای وجود دارد؟
    • آیا قطعه‌بندی به درستی انجام شده است؟ آیا قطعات معنایی منسجم هستند؟ آیا اطلاعات مهمی در مرزها از دست رفته است؟
    • آیا جاسازی‌ها منطقی به نظر می‌رسند؟ (اگرچه به صورت مستقیم قابل مشاهده نیستند، اما می‌توانند از طریق تست‌های شباهت بررسی شوند).
  • جمع‌آوری بازخورد: پس از پیاده‌سازی اولیه RAG، بازخورد کاربران را در مورد کیفیت پاسخ‌ها جمع‌آوری کنید. آیا پاسخ‌ها دقیق هستند؟ آیا مستندات مربوطه بازیابی شده‌اند؟
  • تنظیم پارامترها: بر اساس بازخورد، پارامترهای قطعه‌بندی (اندازه، همپوشانی)، مدل جاسازی، یا حتی منطق پاک‌سازی را تنظیم کنید. این می‌تواند شامل تنظیم Regexها، بهبود استخراج فراداده یا تغییر روش قطعه‌بندی باشد.

نظارت بر کیفیت داده و کارایی RAG

  • مانیتورینگ خط لوله n8n: وضعیت اجرای گردش کارها را به طور منظم بررسی کنید. آیا خطایی رخ داده است؟ آیا پردازش داده‌ها طبق برنامه پیش می‌رود؟
  • اعتبارسنجی داده (Data Validation): مطمئن شوید که داده‌های ورودی به پایگاه داده برداری از کیفیت لازم برخوردارند. آیا همه قطعات دارای بردار هستند؟ آیا فراداده‌ها کامل و صحیح هستند؟
  • متریک‌های RAG: برای ارزیابی عملکرد RAG از متریک‌هایی مانند دقت بازیابی (Recall@K, Precision@K)، F1 Score و کیفیت تولید پاسخ (با استفاده از LLMهای ارزیاب یا ارزیابی انسانی) استفاده کنید.

ملاحظات مقیاس‌پذیری و امنیت

  • پردازش دسته‌ای (Batch Processing): برای حجم بالای داده‌ها، همیشه از گره Split In Batches برای تقسیم کار به قطعات کوچک‌تر استفاده کنید. این به مدیریت حافظه، منابع سرور n8n و محدودیت‌های Rate Limit API کمک می‌کند.
  • مدیریت Credentialها: هرگز API Keyها یا اطلاعات حساس را مستقیماً در گره‌ها هاردکد (hardcode) نکنید. همیشه از قابلیت Credential Manager در n8n استفاده کنید.
  • امنیت داده: اطمینان حاصل کنید که داده‌های شما در حین انتقال (in transit) و در زمان ذخیره‌سازی (at rest) ایمن هستند. استفاده از HTTPS برای فراخوانی‌های API و رمزگذاری در پایگاه داده برداری ضروری است.
  • منابع n8n: مطمئن شوید که n8n بر روی سرور با منابع کافی (CPU, RAM) برای پردازش حجم داده‌های مورد نظر شما اجرا می‌شود.

تست و اعتبارسنجی

  • تست واحد (Unit Tests): برای بخش‌های مهم منطق در گره‌های Code، تست‌های واحد بنویسید (مثلاً برای توابع پاک‌سازی یا قطعه‌بندی).
  • تست انتها به انتها (End-to-End Tests): یک گردش کار تست ایجاد کنید که با یک مجموعه داده کوچک شروع شود و کل خط لوله را تا ذخیره‌سازی در پایگاه داده برداری اجرا کند و سپس خروجی را اعتبارسنجی کند.

چالش‌های متداول و راه‌حل‌ها در n8n

در طول پیاده‌سازی خط لوله آماده‌سازی داده برای RAG در n8n، ممکن است با چالش‌هایی مواجه شوید. در اینجا به برخی از رایج‌ترین آنها و راه حل‌های مرتبط اشاره می‌کنیم:

مدیریت حجم بالای داده

چالش: پردازش همزمان هزاران یا میلیون‌ها سند می‌تواند منابع سرور n8n را مصرف کند یا باعث کندی شدید شود.

راه‌حل‌ها:

  • Split In Batches Node: حتماً از این گره قبل از عملیات‌های پرهزینه (مانند بردارسازی) استفاده کنید. این گره به شما امکان می‌دهد تا آیتم‌ها را به دسته‌های کوچک‌تر تقسیم کرده و با تأخیر (delay) بین هر دسته، بار روی سیستم و APIهای خارجی را کاهش دهید.
  • Stream Processing: در صورت امکان، به جای بارگذاری کل داده در حافظه، داده‌ها را به صورت جریانی (stream) پردازش کنید. n8n به طور طبیعی تا حدی از پردازش جریانی پشتیبانی می‌کند، اما برای فایل‌های بسیار بزرگ، ممکن است نیاز به گره‌های Code سفارشی برای خواندن فایل به صورت تکه تکه داشته باشید.
  • Offloading Heavy Computations: وظایف محاسباتی سنگین (مانند استخراج متن از PDFهای پیچیده یا اجرای مدل‌های زبان محلی) را به سرویس‌های خارجی یا کانتینرهای جداگانه (مثلاً با استفاده از Kubernetes یا Cloud Functions) واگذار کنید و n8n فقط وظیفه ارکستراسیون را بر عهده داشته باشد.
  • افزایش منابع n8n: در صورت نیاز، منابع CPU و RAM سروری که n8n روی آن اجرا می‌شود را افزایش دهید.

خطاهای API و محدودیت نرخ (Rate Limits)

چالش: فراخوانی مکرر APIهای خارجی (مانند OpenAI برای جاسازی) می‌تواند منجر به خطاهای 429 Too Many Requests (Rate Limit Exceeded) یا سایر خطاهای موقت شود.

راه‌حل‌ها:

  • Retry Logic: در تنظیمات گره HTTP Request، گزینه Retry On Fail را فعال کنید. همچنین می‌توانید تأخیر بین تلاش‌های مجدد را تنظیم کنید.
  • Exponential Backoff: در گره Code یا با استفاده از گره‌های Wait، منطق تأخیر نمایی (exponential backoff) را پیاده‌سازی کنید. این بدان معناست که پس از هر خطا، زمان انتظار قبل از تلاش مجدد به صورت نمایی افزایش می‌یابد.
  • Batching with Delay: همانطور که قبلاً ذکر شد، استفاده از Split In Batches با یک تأخیر (مثلاً چند ثانیه) بین هر دسته، فشار را بر API کاهش می‌دهد.
  • افزایش Rate Limit: در صورت لزوم، با ارائه‌دهنده API تماس بگیرید و درخواست افزایش محدودیت نرخ خود را بدهید.

بهینه‌سازی زمان اجرا

چالش: گردش کار شما به کندی اجرا می‌شود و زمان زیادی برای پردازش داده‌ها نیاز دارد.

راه‌حل‌ها:

  • موازی‌سازی (Parallelization): اگر n8n شما در حالت Queue Mode (با Redis) پیکربندی شده باشد، می‌توانید چندین اجرای همزمان از یک گردش کار را مدیریت کنید یا با استفاده از گره Split In Batches و سپس گره Execute Workflow، زیر-گردش کارها را به صورت موازی اجرا کنید.
  • کش کردن (Caching): اگر برخی مراحل پرهزینه و دارای خروجی ثابت هستند، نتایج آنها را کش کنید. برای مثال، اگر متن‌های اصلی تغییر نمی‌کنند، می‌توانید نتایج پاک‌سازی یا حتی جاسازی‌ها را در یک پایگاه داده موقت ذخیره کنید تا در اجرای مجدد از آنها استفاده کنید.
  • بهینه‌سازی گره Code: کدهای نوشته شده در گره‌های Code را برای کارایی بهینه کنید. از حلقه‌های غیرضروری اجتناب کنید و از ساختارهای داده‌ای مناسب استفاده کنید.
  • انتخاب مدل مناسب: مدل‌های جاسازی سریع‌تر و با ابعاد کمتر ممکن است سرعت بردارسازی را افزایش دهند، البته با بررسی تأثیر آن بر کیفیت.

با پیش‌بینی این چالش‌ها و پیاده‌سازی راه‌حل‌های مناسب در n8n، می‌توانید یک خط لوله آماده‌سازی داده RAG قوی، مقیاس‌پذیر و کارآمد بسازید که به خوبی در محیط تولید عمل کند.

نتیجه‌گیری

آماده‌سازی دقیق و هوشمندانه داده‌ها، سنگ بنای هر سیستم Retrieval-Augmented Generation (RAG) موفق است. همانطور که در این راهنمای جامع مشاهده کردید، فرآیند تبدیل داده‌های خام به فرمتی قابل استفاده برای مدل‌های زبان بزرگ، شامل مراحل متعددی از جمع‌آوری و پاک‌سازی گرفته تا قطعه‌بندی، استخراج فراداده، بردارسازی و ذخیره‌سازی در پایگاه داده برداری است.

ابزار n8n با ارائه یک بستر کد کم، انعطاف‌پذیری بی‌نظیری را برای ارکستراسیون این خطوط لوله پیچیده فراهم می‌آورد. گره‌های قدرتمند آن، از HTTP Request و Database Nodes برای جمع‌آوری داده‌ها گرفته تا Code Node و Set Node برای تبدیل و غنی‌سازی، به شما امکان می‌دهند تا کنترل کاملی بر هر مرحله از فرآیند داشته باشید.

با رعایت بهترین روش‌ها، اتخاذ رویکرد تکراری، و توجه به جزئیاتی مانند مدیریت فراداده و بهینه‌سازی قطعه‌بندی، می‌توانید اطمینان حاصل کنید که سیستم RAG شما نه تنها از توهم‌زایی LLM جلوگیری می‌کند، بلکه پاسخ‌هایی دقیق، مستند و مرتبط با اطلاعات اختصاصی شما ارائه می‌دهد.

جهان RAG به سرعت در حال تکامل است و با پیشرفت‌هایی در مدل‌های جاسازی، پایگاه داده‌های برداری و تکنیک‌های قطعه‌بندی معنایی، امکانات جدیدی به وجود می‌آید. با استفاده از n8n به عنوان ستون فقرات اتوماسیون خود، آماده خواهید بود تا این نوآوری‌ها را به سرعت در خطوط لوله داده خود ادغام کنید و سیستم‌های RAG خود را همیشه در اوج نگه دارید.

اکنون زمان آن رسیده است که این دانش را به عمل تبدیل کنید. با n8n، ابزار قدرتمند در دستان شماست تا داده‌های خود را مهار کرده و پتانسیل کامل هوش مصنوعی مولد را در پروژه‌های خود آزاد کنید. با آزمایش و تکرار، مسیر خود را به سوی یک سیستم RAG قوی و قابل اعتماد هموار خواهید کرد.

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

"با شرکت در این دوره جامع و کاربردی، به راحتی مهارت‌های برنامه‌نویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر می‌سازد تا به سرعت الگوریتم‌های پیچیده را درک کرده و اپلیکیشن‌های هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفه‌ای و امکان دانلود و تماشای آنلاین."

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان