محرك بحث AI شخصي يشتغل على لابتوبك بدون إنترنت
لو عندك 4 جيجا من ملفات Markdown و PDF و notes متناثرة على القرص، وبتفتح Notion و Obsidian و Spotlight ورا بعض علشان تلاقي معلومة قلتها في ميتنج من 6 شهور، الـ workflow اللي قدامك بيخلّيك تسأل سؤال طبيعي وتستلم الإجابة من ملفاتك في 1.4 ثانية بدون ما تبعت أي بايت لـ OpenAI ولا Anthropic.
المشكلة باختصار
Spotlight و grep و ripgrep بيشتغلوا بـ exact keyword match. لو ملفاتك بتقول "زمن الاستجابة" وانت بتسأل "ليه الموقع بطيء"، النتيجة بترجع فاضية رغم إن الإجابة موجودة. الـ Embeddings بيحلّوا المشكلة دي لأنها بيقارنوا المعنى لا الحرف. الجديد في 2026 إن تقدر تشغّل الفهرسة دي محلياً بـ موديل مفتوح صغير بدون أي API key.
مثال للمبتدئ: أمين المكتبة الذكي
تخيل مكتبة فيها 5000 كتاب. لو طلبت من الموظف "هات الكتب اللي عنوانها فيه كلمة عقل"، هيرجعلك الكتب اللي العنوان فيها الكلمة دي بالحرف. ده ripgrep. لكن لو طلبت من أمين مكتبة قرأ كل الكتب "هات حاجة عن الذاكرة وكيف بنفكّر"، هيجيبلك كتب فيها "إدراك" و"تفكير" و"وعي" حتى لو ما فيهاش كلمة "عقل". ده اللي الـ embeddings بيعمله — كل كتاب بيتحوّل لمجموعة أرقام بتمثّل معناه، والبحث بيقيس قرب المعاني.
التعريف العلمي بدقة
الـ Embedding هو vector عالي الأبعاد (768 بُعداً في nomic-embed-text) ناتج عن تمرير النص في موديل Transformer. الموديل اتدرّب بحيث إن النصوص اللي معناها قريب يكون الـ cosine similarity بين vector-اتها قريب من 1، والمتباعدة قريبة من 0. الـ Vector Database (Qdrant هنا) بيستخدم HNSW index علشان يلاقي أقرب k vectors لاستعلامك في زمن O(log n) بدل O(n) العادي.
السيناريو الواقعي
عندي مجلد notes فيه 240 ملف Markdown من سنتين شغل، إجمالي 2.1 مليون كلمة. الفهرسة الكاملة بتاخد 3 دقايق على M2 لابتوب 16GB رام. أي سؤال بيرد في 1.4 ثانية في المتوسط. التكلفة الشهرية: صفر دولار. لو نفس الـ workload على text-embedding-3-large من OpenAI: 0.85 دولار للفهرسة + 4 دولار شهرياً مع 50 سؤال يومي.
الخطوات: 8 خطوات قابلة للنسخ
1) شغّل Qdrant و Ollama في Docker Compose
# docker-compose.yml
services:
qdrant:
image: qdrant/qdrant:v1.13.0
ports: ["127.0.0.1:6333:6333"]
volumes: ["./qdrant_storage:/qdrant/storage"]
ollama:
image: ollama/ollama:0.5.7
ports: ["127.0.0.1:11434:11434"]
volumes: ["./ollama:/root/.ollama"]