مستندات n8n
74+ نود
🗂️

ذخیره برداری

Vector Store

ذخیره و جستجوی معنایی اسناد با Embeddings - پایه RAG و چت‌بات دانش‌محور

هوش مصنوعی
پیشرفته
۰ بازدید
n8n 1.0+

نمای کلی

نود Vector Store چیست؟

نود Vector Store قلب سیستم‌های هوش مصنوعی مبتنی بر دانش در n8n است. برای درک بهتر، ابتدا مفاهیم پایه را توضیح می‌دهیم:

مفهوم Vector Embedding به زبان ساده:

تصور کنید هر متن یا سند را بتوانید به یک لیست از اعداد تبدیل کنید - مثلاً جمله "گربه روی تشک نشسته" به چیزی مثل [0.23, -0.45, 0.87, ...] تبدیل شود. به این لیست اعداد بردار (Vector) و به فرایند تبدیل Embedding می‌گویند.

نکته جادویی: وقتی دو متن معنای مشابهی دارند، بردارهایشان هم به هم نزدیک هستند! مثلاً بردار "گربه روی تشک نشسته" و "یک پیشی روی فرش خوابیده" خیلی به هم نزدیک خواهند بود، حتی اگر کلمات متفاوت باشند. این دقیقاً همان چیزی است که جستجوی معنایی (Semantic Search) را ممکن می‌کند.

Vector Store دیتابیسی تخصصی است که:

  • بردارهای عددی (Embeddings) را ذخیره می‌کند
  • جستجوی شباهت (Similarity Search) بسیار سریع انجام می‌دهد
  • همراه بردار، متن اصلی و metadata هم ذخیره می‌کند
  • از الگوریتم‌های ANN (Approximate Nearest Neighbor) برای سرعت بالا استفاده می‌کند

مفهوم RAG (Retrieval-Augmented Generation):

RAG ترکیب جستجوی دانش + تولید پاسخ هوشمند است:

code
مرحله 1 (Indexing - یکبار):
  اسناد → تکه‌تکه کردن (Chunking) → تبدیل به بردار (Embedding) → ذخیره در Vector Store

مرحله 2 (Query - هر سوال):
  سوال کاربر → تبدیل به بردار → جستجو در Vector Store
    → یافتن مرتبط‌ترین تکه‌ها → ارسال به LLM همراه سوال
    → LLM پاسخ مستند تولید می‌کند

چرا RAG و Vector Store مهم هستند؟

  • دانش اختصاصی: LLM فقط دانش عمومی دارد؛ RAG دانش شرکت شما را اضافه می‌کند
  • پاسخ مستند: پاسخ‌ها بر اساس اسناد واقعی هستند، نه حدس
  • به‌روز بودن: برخلاف LLM که دانشش ثابت است، Vector Store قابل به‌روزرسانی است
  • کاهش هذیان (Hallucination): LLM فقط از اسناد مرتبط پاسخ می‌دهد
  • صرفه‌جویی: به جای Fine-tuning گران‌قیمت، فقط اسناد را Index کنید

انواع Vector Store در n8n:

#### 1. In-Memory Vector Store (ساده و سریع)

  • مزایا: بدون نیاز به سرور خارجی، راه‌اندازی فوری
  • معایب: داده‌ها با پایان workflow پاک می‌شوند
  • مناسب برای: تست، پروتوتایپ، اسناد کم‌حجم (زیر 1000 سند)

#### 2. Pinecone (ابری و مدیریت‌شده)

  • مزایا: مقیاس‌پذیر، مدیریت‌شده، API ساده
  • معایب: هزینه‌دار، نیاز به اینترنت، سرورها خارج از ایران
  • مناسب برای: پروژه‌های بزرگ Production

#### 3. Qdrant (خودمیزبان - توصیه برای ایران)

  • مزایا: open-source، قابل نصب محلی، بدون نیاز به اینترنت، عملکرد عالی
  • معایب: نیاز به مدیریت سرور
  • مناسب برای: کاربران ایرانی، پروژه‌های حساس به حریم خصوصی
  • **نصب**: docker run -p 6333:6333 qdrant/qdrant

#### 4. Chroma (خودمیزبان - ساده)

  • مزایا: open-source، نصب ساده، مناسب توسعه
  • معایب: مقیاس‌پذیری محدود
  • مناسب برای: پروژه‌های کوچک و متوسط، توسعه محلی
  • **نصب**: docker run -p 8000:8000 chromadb/chroma

#### 5. Supabase Vector (pgvector)

  • مزایا: ترکیب با PostgreSQL، SQL queries روی metadata
  • معایب: عملکرد کمتر از Pinecone برای مقیاس بزرگ
  • مناسب برای: پروژه‌هایی که از Supabase استفاده می‌کنند

#### 6. PGVector (PostgreSQL Extension)

  • مزایا: اضافه شدن به PostgreSQL موجود، بدون دیتابیس جدید
  • معایب: عملکرد در مقیاس بزرگ نیاز به تنظیم دارد
  • مناسب برای: کسانی که PostgreSQL دارند

مدل‌های Embedding:

#### OpenAI Embeddings

  • text-embedding-3-small: ارزان ($0.02 / 1M tokens)، 1536 بعد
  • text-embedding-3-large: دقیق‌تر ($0.13 / 1M tokens)، 3072 بعد
  • text-embedding-ada-002: نسل قبلی، هنوز کاربردی

#### مدل‌های محلی (بدون اینترنت - عالی برای ایران)

  • **Ollama Embeddings**: مدل‌های nomic-embed-text، mxbai-embed-large
  • HuggingFace: هزاران مدل رایگان
  • مزیت: رایگان، بدون محدودیت، حفظ حریم خصوصی

Document Chunking (تکه‌تکه کردن اسناد):

  • Character Splitter: بر اساس تعداد کاراکتر (ساده)
  • Token Splitter: بر اساس تعداد توکن (دقیق‌تر)
  • Recursive Character Splitter: تکه‌تکه هوشمند بر اساس پاراگراف و جمله (توصیه)
  • Chunk Size: معمولاً 500-1000 کاراکتر
  • Chunk Overlap: 50-200 کاراکتر (برای حفظ context بین تکه‌ها)

احراز هویت

احراز هویت Vector Store

هر Vector Store credential جداگانه دارد. در اینجا تنظیمات هر کدام را توضیح می‌دهیم:

1. In-Memory Vector Store

  • نیازی به credential ندارد!
  • فقط یک Embedding Model متصل کنید (OpenAI یا Ollama)
  • داده‌ها در حافظه workflow ذخیره می‌شوند

2. Pinecone

  1. 1به [pinecone.io](https://www.pinecone.io) بروید و ثبت‌نام کنید
  2. 2یک Index بسازید:
  • Dimension: باید با مدل Embedding مطابقت داشته باشد
  • OpenAI text-embedding-3-small: 1536
  • OpenAI text-embedding-3-large: 3072
  • **Metric**: cosine (توصیه) یا euclidean یا dotproduct
  1. 1API Key از داشبورد کپی کنید
  2. 2در n8n: Credentials > Pinecone API
  • API Key: کلید کپی شده
  • Environment: منطقه سرور (مثل us-east-1-aws)

3. Qdrant (خودمیزبان)

  1. 1نصب با Docker:
bash
docker run -d --name qdrant \
  -p 6333:6333 -p 6334:6334 \
  -v qdrant_data:/qdrant/storage \
  qdrant/qdrant
  1. 1در n8n: Credentials > Qdrant API
  • URL: http://localhost:6333 (یا آدرس سرور)
  • API Key: اختیاری (اگر authentication فعال باشد)

4. Chroma (خودمیزبان)

  1. 1نصب با Docker:
bash
docker run -d --name chroma \
  -p 8000:8000 \
  -v chroma_data:/chroma/chroma \
  chromadb/chroma
  1. 1در n8n: Credentials > Chroma API
  • URL: http://localhost:8000

5. Supabase Vector

  1. 1به [supabase.com](https://supabase.com) بروید
  2. 2پروژه بسازید
  3. 3Extension pgvector را فعال کنید:
sql
CREATE EXTENSION IF NOT EXISTS vector;
  1. 1جدول documents بسازید:
sql
CREATE TABLE documents (
  id BIGSERIAL PRIMARY KEY,
  content TEXT,
  metadata JSONB,
  embedding VECTOR(1536)
);
  1. 1در n8n: Credentials > Supabase API
  • Project URL و API Key از داشبورد Supabase

6. PGVector (PostgreSQL)

  1. 1Extension نصب کنید:
sql
CREATE EXTENSION IF NOT EXISTS vector;
  1. 1جدول بسازید (مشابه Supabase)
  2. 2در n8n: Credentials > PostgreSQL
  • Host، Port، Database، User، Password

تنظیم مدل Embedding:

#### OpenAI Embeddings:

  1. 1API Key از [platform.openai.com](https://platform.openai.com)
  2. 2در n8n: Credentials > OpenAI API
  3. 3مدل: text-embedding-3-small (ارزان و مناسب)

#### Ollama Embeddings (محلی و رایگان):

  1. 1نصب Ollama: [ollama.ai](https://ollama.ai)
  2. 2دانلود مدل:
bash
ollama pull nomic-embed-text
# یا
ollama pull mxbai-embed-large
  1. 1در n8n: Credentials > Ollama
  • Base URL: http://localhost:11434
  • بدون API Key!

نکته مهم برای کاربران ایرانی:

  • Pinecone: نیاز به VPN یا proxy برای اتصال
  • Qdrant + Ollama: بهترین ترکیب بدون نیاز به اینترنت
  • Chroma + Ollama: ساده‌ترین راه‌اندازی محلی
  • Dimension مدل Embedding باید با Vector Store یکسان باشد

عملیات‌های موجود

1

insertDocuments

تبدیل متون به بردار و ذخیره در Vector Store. هسته اصلی ساخت Knowledge Base.

2

searchSimilar

جستجوی شباهت معنایی در بین اسناد ذخیره‌شده. مهم‌ترین عملیات برای RAG.

3

deleteDocuments

حذف اسناد از Vector Store بر اساس ID یا فیلتر metadata.

4

getDocument

دریافت یک سند خاص از Vector Store بر اساس شناسه.

5

upsertDocuments

اگر سند وجود دارد به‌روزرسانی کن، اگر نه درج کن. عالی برای به‌روزرسانی دانش.

6

createCollection

ساخت مجموعه یا ایندکس جدید در Vector Store.

7

listCollections

نمایش لیست همه مجموعه‌ها (Collections) موجود در Vector Store.

8

loadDocuments

بارگذاری اسناد از منابع مختلف و آماده‌سازی برای ذخیره در Vector Store.

9

retrieveForRAG

جستجوی اسناد مرتبط و ارسال به LLM برای تولید پاسخ مستند. قلب سیستم RAG.

10

metadataFilter

جستجوی ترکیبی: معنایی + فیلتر بر اساس metadata اسناد.

11

hybridSearch

ترکیب جستجوی معنایی (Vector) با جستجوی کلیدواژه‌ای (BM25) برای نتایج بهتر.

12

embedText

تبدیل مستقیم متن به بردار عددی بدون ذخیره. مناسب مقایسه و محاسبه شباهت.

13

clearCollection

حذف تمام اسناد یک مجموعه. مفید برای بازسازی کامل Knowledge Base.

14

getCollectionStats

دریافت آمار و اطلاعات یک مجموعه: تعداد اسناد، حجم، ابعاد بردار.

کاربردهای متداول

1. پایگاه دانش سازمانی (Knowledge Base Q&A)

ساخت سیستم پرسش و پاسخ از اسناد شرکت:

code
مرحله Indexing (یکبار):
  Google Drive Trigger (فایل جدید)
    → Document Loader (PDF/Docx)
    → Text Splitter (Recursive, 800 chars, 200 overlap)
    → Embeddings (OpenAI text-embedding-3-small)
    → Vector Store Insert (Qdrant)
      Collection: "company_docs"
      Metadata: {source: filename, department: folder, date: uploadDate}

مرحله Query (هر سوال):
  Telegram Trigger (سوال کارمند)
    → Vector Store Search (Qdrant)
      Query: \${$json.message}
      TopK: 5
      Filter: {department: \${$json.userDepartment}}
    → OpenAI Chat
      System: "بر اساس اسناد زیر به سوال پاسخ بده.
      اگر پاسخ در اسناد نبود، بگو اطلاعات کافی نداری.
      منبع هر پاسخ را ذکر کن."
      Context: \${$json.documents}
      Question: \${$json.message}
    → Telegram (پاسخ مستند + منابع)

2. جستجوی معنایی محصولات (Semantic Product Search)

جستجوی هوشمند محصولات بر اساس توصیف طبیعی:

code
Indexing:
  MySQL (همه محصولات)
    → Set (ترکیب: نام + توصیف + ویژگی‌ها + دسته‌بندی)
    → Embeddings (OpenAI)
    → Vector Store Insert (Pinecone)
      Metadata: {productId, category, price, inStock}

Query:
  Webhook (جستجوی کاربر)
    → Vector Store Search (Pinecone)
      Query: "یک لپتاپ سبک برای دانشجو با بودجه متوسط"
      TopK: 10
      Filter: {inStock: true}
    → Set (فرمت نتایج)
    → Response (لیست محصولات مرتبط)

3. چت‌بات دانش‌محور با حافظه (RAG Chatbot)

چت‌بات هوشمند با دسترسی به اسناد و حافظه مکالمه:

code
Telegram Trigger (پیام کاربر)
  → AI Agent (Tools Agent)
    LLM: GPT-4o-mini
    Memory: Window Memory (20 پیام)
    SessionId: \${$json.chat.id}
    System: "دستیار دانش شرکت هستی.
    از ابزار search_docs برای پاسخ به سوالات استفاده کن.
    فقط بر اساس اسناد پاسخ بده."
    Tools: [
      Vector Store Tool (Qdrant - company_docs)
    ]
  → Telegram (پاسخ)

4. تشخیص تکراری بودن محتوا (Duplicate Detection)

بررسی تکراری نبودن محتوای جدید:

code
Webhook (مقاله جدید)
  → Vector Store Search
    Query: \${$json.title + " " + $json.content}
    TopK: 3
    Threshold: 0.92
  → IF (similarityScore > 0.92)
    → True: "محتوای تکراری! مشابه: [عنوان مقاله قبلی]"
    → False: Vector Store Insert (ذخیره مقاله جدید)
      → "مقاله ثبت شد"

5. پیشنهاد محصولات مشابه (Product Recommendations)

نمایش محصولات مشابه بر اساس شباهت معنایی:

code
Webhook (مشاهده محصول)
  → MySQL (اطلاعات محصول فعلی)
  → Vector Store Search (Pinecone)
    Query: \${$json.productDescription}
    TopK: 6
    Filter: {
      category: \${$json.category},
      productId: {$ne: \${$json.currentProductId}}
    }
  → Set (فرمت پیشنهادات)
  → Response (محصولات پیشنهادی)

6. پاسخ خودکار به تیکت‌های پشتیبانی

جستجو در تاریخچه تیکت‌ها و پایگاه دانش:

code
Webhook (تیکت جدید)
  → Vector Store Search (FAQ Knowledge Base)
    Query: \${$json.subject + " " + $json.message}
    TopK: 5
    Filter: {status: "resolved"}
  → IF (topScore > 0.85)
    → True: OpenAI Chat
      System: "بر اساس پاسخ‌های قبلی، پیش‌نویس پاسخ بنویس"
      Context: \${$json.similarTickets}
    → False: "تیکت نیاز به بررسی انسانی دارد"
  → MySQL (ذخیره + ارجاع)

7. خلاصه‌سازی و جستجوی اسناد حقوقی

ساخت دانش‌پایه از قراردادها و اسناد حقوقی:

code
Indexing:
  Schedule (هفتگی)
    → Google Drive (پوشه قراردادها)
    → Document Loader (PDF)
    → Text Splitter (Token, 1000 tokens, 200 overlap)
    → Vector Store Upsert (Qdrant)
      Collection: "legal_docs"
      Metadata: {contractType, parties, date, status}

Query:
  Webhook (سوال حقوقی)
    → Vector Store Search
      Query: \${$json.question}
      Filter: {contractType: \${$json.type}}
      TopK: 8
    → OpenAI Chat (GPT-4o)
      System: "وکیل متخصص هستی.
      بر اساس مفاد قراردادها پاسخ بده.
      شماره بند و ماده را ذکر کن."
    → Response (پاسخ حقوقی مستند)

8. حافظه بلندمدت چت‌بات (Long-term Memory)

ذخیره و بازیابی اطلاعات مهم از مکالمات قبلی:

code
Telegram Trigger (پیام کاربر)
  → Vector Store Search (Memory Store)
    Query: \${$json.message}
    Filter: {userId: \${$json.from.id}}
    TopK: 3
  → OpenAI Chat
    System: "دستیار شخصی با حافظه بلندمدت هستی.
    اطلاعات قبلی کاربر: \${$json.memories}
    به پیام جدید پاسخ بده."
  → IF (اطلاعات مهم در پیام)
    → Vector Store Insert (Memory Store)
      Metadata: {userId, topic, timestamp}
  → Telegram (پاسخ شخصی‌سازی‌شده)

9. نظارت بر رسانه‌ها و تحلیل اخبار

جمع‌آوری و تحلیل معنایی اخبار مرتبط:

code
Schedule (هر ساعت)
  → HTTP Request (RSS خبرگزاری‌ها)
  → SplitInBatches
  → Vector Store Search (مقالات موجود)
    Query: \${$json.title}
    Threshold: 0.95
  → IF (تکراری نیست)
    → Vector Store Insert
      Metadata: {source, date, category}
    → OpenAI Chat
      System: "خبر را تحلیل کن:
      - احساسات (مثبت/منفی/خنثی)
      - موضوعات کلیدی
      - تاثیر بر صنعت ما"
  → IF (مرتبط با شرکت)
    → Telegram (هشدار خبری)

10. آموزش‌دهنده هوشمند (AI Tutor)

سیستم آموزشی مبتنی بر محتوای درسی:

code
Indexing:
  Manual Trigger
    → Google Drive (جزوه‌ها و کتاب‌ها)
    → Document Loader (PDF)
    → Text Splitter (Recursive, 600 chars)
    → Vector Store Insert (Qdrant)
      Collection: "course_\${courseName}"
      Metadata: {chapter, topic, difficulty}

Student Query:
  Webhook (سوال دانشجو)
    → Vector Store Search
      Query: \${$json.question}
      Collection: "course_\${$json.course}"
      TopK: 5
    → OpenAI Chat (GPT-4o)
      System: "استاد خصوصی \${$json.course} هستی.
      بر اساس جزوه‌ها توضیح بده.
      مثال‌های ساده بزن.
      اگر سوال خارج از درس بود، بگو."
    → Response (توضیح + منبع)

11. تشخیص شباهت اسناد (Document Similarity)

مقایسه معنایی اسناد و یافتن موارد مشابه:

code
Webhook (سند جدید)
  → Embeddings (تبدیل به بردار)
  → Vector Store Search
    Query: \${$json.documentText}
    TopK: 10
    Threshold: 0.80
  → Set (محاسبه درصد شباهت)
  → IF (شباهت > 80%)
    → Gmail (هشدار: "سند مشابه با \${$json.similarDoc.title}")
  → Response (گزارش شباهت)

12. سیستم FAQ هوشمند (Smart FAQ)

پاسخ خودکار به سوالات متداول بر اساس جستجوی معنایی:

code
Indexing:
  Webhook (سوال و جواب جدید)
    → Vector Store Upsert
      Content: \${$json.question + " " + $json.answer}
      Metadata: {question, answer, category, views: 0}

Query:
  Webhook (سوال کاربر)
    → Vector Store Search
      Query: \${$json.question}
      TopK: 3
    → IF (topScore > 0.85)
      → Response (پاسخ آماده از FAQ)
    → ELSE IF (topScore > 0.60)
      → OpenAI Chat (بازنویسی پاسخ مرتبط)
    → ELSE
      → Response ("سوال شما ثبت شد و پاسخ داده خواهد شد")
      → MySQL (ذخیره سوال بدون پاسخ)

نکات حرفه‌ای

نکات حرفه‌ای

  1. 1انتخاب Vector Store مناسب:
code
تست و توسعه: In-Memory (ساده، بدون نصب)
   پروژه کوچک: Chroma (Docker ساده)
   پروژه متوسط: Qdrant (عملکرد عالی، خودمیزبان)
   پروژه بزرگ: Pinecone (مقیاس‌پذیر، مدیریت‌شده)
   PostgreSQL دارید: PGVector (بدون دیتابیس اضافی)
   Supabase دارید: Supabase Vector (یکپارچه)

   برای ایران: Qdrant + Ollama Embeddings
   (بدون نیاز به اینترنت و VPN)
  1. 1Chunking بهینه برای فارسی:
code
// متن فارسی معمولاً بیشتر از انگلیسی توکن مصرف می‌کند
   // پیشنهاد:
   Chunk Size: 600-800 کاراکتر (فارسی)
   Chunk Overlap: 150-200 کاراکتر
   Splitter: Recursive Character Splitter
   Separators: ["\n\n", "\n", ". ", "، ", " "]

   // برای اسناد فنی:
   Chunk Size: 1000-1500 (بلوک‌های کد بزرگ‌ترند)

   // برای FAQ:
   هر سوال-پاسخ = یک Chunk (بدون Split)
  1. 1Metadata هوشمند:
code
// metadata خوب = فیلتر بهتر = جستجوی دقیق‌تر

   // مثال metadata برای مقاله:
   {
     source: "blog-post-123.md",
     category: "فنی",
     author: "علی احمدی",
     date: "2024-06-15",
     language: "fa",
     wordCount: 1500,
     tags: ["Docker", "DevOps"]
   }

   // مثال metadata برای محصول:
   {
     productId: "PRD-456",
     category: "لپتاپ",
     brand: "ASUS",
     priceRange: "medium",
     inStock: true
   }
  1. 1بهینه‌سازی TopK:
code
TopK = 2-3: پاسخ سریع، context کم (سوالات ساده)
   TopK = 4-5: تعادل خوب (توصیه پیش‌فرض)
   TopK = 8-10: context زیاد (سوالات پیچیده)
   TopK = 15-20: جستجوی جامع (تحلیل و گزارش)

   نکته: TopK بیشتر = توکن بیشتر = هزینه LLM بالاتر
  1. 1الگوی RAG حرفه‌ای (کامل):
code
// مرحله 1: Indexing Pipeline
   Document Loader → Text Splitter → Embedding → Vector Store Insert
                                                    ↓
                                              metadata enrich

   // مرحله 2: Query Pipeline
   User Question → Embedding → Vector Search → Rerank → LLM → Answer
                                  ↓                       ↑
                            metadata filter          system prompt +
                                                     few-shot examples

   // مرحله 3: بهبود مستمر
   User Feedback → Log → Analyze → Improve Chunks/Prompts
  1. 1System Prompt عالی برای RAG:
code
"You are a helpful assistant that answers questions based
   on the provided context documents.

   Rules:
   1. ONLY use information from the provided documents
   2. If the answer is not in the documents, say:
      'اطلاعات مرتبطی در اسناد موجود نیست'
   3. Always cite your sources with document names
   4. Respond in Persian (Farsi)
   5. Be concise but thorough
   6. If documents are contradictory, mention both views

   Context Documents:
   {context}

   User Question: {question}"
  1. 1Embedding محلی با Ollama (رایگان):
code
// نصب و راه‌اندازی:
   1. ollama pull nomic-embed-text    // 274MB، سریع
   2. ollama pull mxbai-embed-large   // 670MB، دقیق‌تر

   // مزایا:
   - کاملاً رایگان (بدون API Key)
   - بدون نیاز به اینترنت
   - حریم خصوصی کامل
   - بدون Rate Limit

   // معایب:
   - نیاز به CPU/GPU مناسب
   - کیفیت فارسی کمتر از OpenAI
   - سرعت کمتر (بدون GPU)
  1. 1Qdrant: بهترین گزینه خودمیزبان:
code
// نصب با Docker:
   docker run -d --name qdrant \
     -p 6333:6333 -p 6334:6334 \
     -v qdrant_data:/qdrant/storage \
     --restart unless-stopped \
     qdrant/qdrant

   // مزایا برای ایرانی‌ها:
   - روی سرور خودتان نصب می‌شود
   - بدون نیاز به VPN
   - عملکرد فوق‌العاده (Rust-based)
   - پشتیبانی از Hybrid Search
   - فیلتر metadata پیشرفته
   - رابط وب: http://localhost:6333/dashboard
  1. 1مقایسه عملکرد Vector Storeها:
code
In-Memory:  سرعت ★★★★★  مقیاس ★☆☆☆☆  ماندگاری ✗
   Chroma:     سرعت ★★★★☆  مقیاس ★★★☆☆  ماندگاری ✓
   Qdrant:     سرعت ★★★★★  مقیاس ★★★★★  ماندگاری ✓
   Pinecone:   سرعت ★★★★☆  مقیاس ★★★★★  ماندگاری ✓
   PGVector:   سرعت ★★★☆☆  مقیاس ★★★★☆  ماندگاری ✓
   Supabase:   سرعت ★★★☆☆  مقیاس ★★★★☆  ماندگاری ✓
  1. 1مدیریت به‌روزرسانی اسناد:
code
// الگوی Upsert هوشمند:
    هر سند ID منحصربه‌فرد داشته باشد (مثلاً hash محتوا)

    Document Changed → Delete old chunks (by source metadata)
                     → Re-chunk new document
                     → Insert new chunks

    // یا از Upsert استفاده کنید:
    Upsert with ID = hash(source + chunkIndex)
    → اسناد تغییریافته خودکار به‌روز می‌شوند
  1. 1Hybrid Search برای نتایج بهتر:
code
// ترکیب Vector Search + Keyword Search
    // مزیت: هم معنا و هم کلمات کلیدی بررسی می‌شوند

    Qdrant Hybrid Search:
      Vector weight: 0.7 (معنایی)
      Keyword weight: 0.3 (کلیدواژه)

    // مثال: جستجوی "خطای 404 در صفحه لاگین"
    // Vector: معنای "خطا در ورود" را می‌فهمد
    // Keyword: عدد "404" را دقیق پیدا می‌کند
  1. 1Pre-filtering vs Post-filtering:
code
// Pre-filtering (توصیه): فیلتر قبل از جستجوی برداری
    → سریع‌تر، نتایج مرتبط‌تر
    → مثال: ابتدا فقط اسناد "فنی" → سپس جستجوی معنایی

    // Post-filtering: ابتدا جستجوی برداری → فیلتر نتایج
    → ممکن است نتایج کمتر از TopK بگیرید
    → مناسب فیلترهای پیچیده

    // در Qdrant و Pinecone هر دو روش پشتیبانی می‌شود
  1. 1امنیت و حریم خصوصی:
code
// اسناد محرمانه:
    1. از Embedding محلی (Ollama) استفاده کنید
       → متن به سرور خارجی ارسال نمی‌شود
    2. Vector Store خودمیزبان (Qdrant/Chroma)
       → داده‌ها روی سرور شما می‌مانند
    3. Authentication فعال کنید (Qdrant API Key)
    4. دسترسی شبکه‌ای محدود کنید

    // برای اسناد عمومی: OpenAI + Pinecone = راحت‌ترین
  1. 1بهینه‌سازی هزینه:
code
// Embedding:
    text-embedding-3-small: $0.02 / 1M tokens (مناسب اکثر کارها)
    text-embedding-3-large: $0.13 / 1M tokens (دقت بالاتر)
    Ollama: رایگان!

    // مثال هزینه Indexing 1000 صفحه PDF:
    ~500,000 tokens → $0.01 با text-embedding-3-small

    // Vector Store:
    Qdrant/Chroma: رایگان (خودمیزبان)
    Pinecone Free: 100K vectors رایگان
    Pinecone Standard: $0.33/GB/month
  1. 1الگوی Multi-Collection:
code
// هر نوع سند در Collection جداگانه:
    Collection "products": اطلاعات محصولات
    Collection "faq": سوالات متداول
    Collection "docs": مستندات فنی
    Collection "tickets": تیکت‌های حل‌شده

    // جستجو:
    → ابتدا Intent Detection (تشخیص نوع سوال)
    → سپس جستجو در Collection مرتبط
    → نتایج دقیق‌تر + سریع‌تر
  1. 1Reranking برای دقت بالاتر:
code
// مرحله 1: Vector Search (TopK = 20)
    // مرحله 2: Rerank با مدل Cross-Encoder (TopK = 5)
    // → نتایج بسیار دقیق‌تر

    Vector Store Search (TopK: 20)
      → Code (Rerank with similarity recalculation)
      → Limit (Top 5)
      → LLM (پاسخ با context بهینه)
  1. 1نظارت و لاگ:
code
// هر Query را لاگ کنید:
    {
      query: "سوال کاربر",
      topResults: [{score, source}],
      responseUseful: true/false,
      timestamp: Date.now()
    }

    // تحلیل هفتگی:
    - سوالاتی که پاسخ مرتبط نداشتند
    - اسنادی که هرگز بازیابی نشدند
    - امتیاز شباهت میانگین
    → بهبود Chunks، metadata و system prompt

رفع مشکلات

خطاهای رایج

1. خطای "Dimension mismatch"

علت: ابعاد بردار Embedding با Vector Store مطابقت ندارد

راه‌حل

  • مطمئن شوید مدل Embedding موقع Insert و Search یکسان باشد
  • ابعاد مدل‌ها:
  • OpenAI text-embedding-3-small: 1536
  • OpenAI text-embedding-3-large: 3072
  • OpenAI text-embedding-ada-002: 1536
  • Ollama nomic-embed-text: 768
  • Ollama mxbai-embed-large: 1024
  • در Pinecone: Dimension ایندکس باید با مدل مطابقت داشته باشد
  • اگر مدل عوض شد، باید مجموعه را از نو بسازید

2. خطای "Collection not found"

علت: مجموعه هنوز ایجاد نشده

راه‌حل

  • ابتدا مجموعه بسازید (Create Collection)
  • یا اولین Insert خودکار مجموعه ایجاد می‌کند (در Qdrant و Chroma)
  • نام مجموعه را دقیق وارد کنید (Case-sensitive)
  • فاصله و کاراکتر خاص در نام مجاز نیست

3. نتایج جستجو نامرتبط هستند

علت: Chunking نامناسب یا Embedding ضعیف

راه‌حل

  • اندازه Chunk را تنظیم کنید (500-1000 بهینه برای اکثر موارد)
  • Overlap کافی بگذارید (100-200 کاراکتر)
  • از Recursive Text Splitter بجای Character Splitter استفاده کنید
  • metadata اضافه کنید و از فیلتر استفاده کنید
  • TopK را افزایش دهید (8-10) و سپس Rerank کنید
  • مدل Embedding بزرگ‌تر تست کنید (text-embedding-3-large)

4. خطای "Rate limit" هنگام Embedding

علت: تعداد زیاد اسناد برای Embedding

راه‌حل

  • از SplitInBatches استفاده کنید (batch size: 50-100)
  • بین batch‌ها Wait اضافه کنید (1-2 ثانیه)
  • Embedding محلی (Ollama) محدودیت ندارد
  • از OpenAI Batch API استفاده کنید

5. خطای اتصال به Qdrant/Chroma

علت: سرور Vector Store در دسترس نیست

راه‌حل

  • مطمئن شوید Docker Container در حال اجراست
  • پورت صحیح: Qdrant=6333، Chroma=8000
  • اگر n8n در Docker: از host.docker.internal بجای localhost استفاده کنید
  • فایروال پورت مورد نظر را چک کنید
  • Volume برای پایداری داده‌ها تنظیم کنید

6. خطای "Out of memory" برای In-Memory Vector Store

علت: حجم اسناد بیش از حد حافظه

راه‌حل

  • In-Memory فقط برای تست و اسناد کم (زیر 1000 سند)
  • برای Production از Qdrant، Pinecone یا PGVector استفاده کنید
  • حافظه n8n را افزایش دهید: NODE_OPTIONS=--max-old-space-size=4096

7. جستجو خیلی کند است

علت: ایندکس نامناسب یا حجم بالای داده

راه‌حل

  • ایندکس HNSW در Qdrant تنظیم کنید (m=16, ef_construct=100)
  • در PGVector از ایندکس IVFFlat یا HNSW استفاده کنید
  • Metadata filter قبل از Vector Search اعمال شود
  • از Approximate search بجای Exact استفاده کنید

8. خطای "Invalid metadata filter"

علت: ساختار فیلتر metadata اشتباه

راه‌حل

  • هر Vector Store ساختار فیلتر متفاوتی دارد
  • Pinecone: {genre: {$eq: "action"}}
  • Qdrant: {must: [{key: "genre", match: {value: "action"}}]}
  • Supabase: از SQL-like filter استفاده کنید
  • metadata را هنگام Insert صحیح ذخیره کنید

9. اسناد فارسی به درستی Embed نمی‌شوند

علت: مدل Embedding ضعیف برای فارسی

راه‌حل

  • OpenAI text-embedding-3-small فارسی را خوب پشتیبانی می‌کند
  • Ollama: از مدل‌های multilingual استفاده کنید
  • متن را قبل از Embedding پیش‌پردازش کنید (حذف اعراب اضافی، نرمال‌سازی)
  • اگر مدل فارسی ضعیف است، کلمات کلیدی انگلیسی هم اضافه کنید

10. داده‌های In-Memory بعد از ریستارت پاک می‌شوند

علت: In-Memory Vector Store داده‌ها را در RAM نگه می‌دارد

راه‌حل

  • برای ماندگاری از Qdrant، Chroma یا PGVector استفاده کنید
  • اگر حتماً In-Memory لازم دارید، داده‌ها را در هر اجرا مجدداً بارگذاری کنید
  • از Workflow اولیه (Startup Trigger) برای بارگذاری استفاده کنید
اشتراک‌گذاری:

آیا این مستندات مفید بود؟