DanLevy.net

موجة ابتكار قواعد البيانات في 2025

يمكنك شكر الذكاء الاصطناعي.

ليست مقالة أخرى عن قواعد بيانات المتجهات

إليك قاعدة القرار التي كنت أتمنى لو استخدمتها مبكرًا:

إذا كان يمكن إعادة بناء بياناتك من الملفات وكان المستخدمون يقرؤونها في الغالب، فجرّب قاعدة بيانات تخزين الكائنات أولاً. أما إذا كان المستخدمون يكتبون إليها طوال اليوم، فابدأ بقاعدة بيانات حقيقية وتوقف عن محاولة جعل S3 يتقمص دورها.

هذا هو الخط المفيد. ليس “الخادم اللامركزي هو المستقبل.” وليس “قواعد بيانات المتجهات غيرت كل شيء.” لقد طُبعت تلك الجمل بالفعل على ما يكفي من حبال المؤتمرات.

لقد غيّر الذكاء الاصطناعي شكل الكثير من مشاكل البحث. فجأة، أرادت الفرق الصغيرة البحث الدلالي، التصنيف الهجين، الدردشة على المستندات، البحث متعدد الوسائط، والتحليلات على الملفات الموجودة في تخزين الكائنات. الإجابة القديمة كانت “تشغيل Postgres مع pgvector” أو “إدارة OpenSearch/Elasticsearch” أو “شراء خدمة بحث مُدارة.” لا تزال تلك إجابات جيدة عندما يستحقها عبء العمل.

لكن العديد من أعباء العمل ليست كذلك. فهي كثيفة القراءة، قابلة لإعادة البناء، وتتحمل تأخيرًا قصيرًا بين تغيير المحتوى ولحاق البحث به. التوثيق. لقطات الكتالوج. الصادرات الثابتة. قواعد المعرفة الداخلية. التحليلات المحلية. أنظمة RAG النموذجية. بالنسبة لهذه، جعلت فئة جديدة من الأدوات البنية المملة قوية بشكل غير عادي: بناء فهرس، تخزينه كملفات، تقديمه عبر HTTP.

ملاحظة اللقطة: النظام البيئي يتحرك بسرعة. أعداد النجوم، تسميات الميزات، وأرقام الأداء أدناه هي لقطة لسبتمبر 2025، وليست لوحة نتائج خالدة. تعامل معها كتوجيه، ثم تحقق من الوثائق الحالية قبل المراهنة على ترحيل إنتاجي لأي خلية واحدة.

قاعدة بيانات بأي اسم آخر

مخازن البيانات هذه القادرة على العمل بدون خادم ومع CDN مفيدة للحالات متوسطة الحجم، تقريبًا من 1,000 إلى 1,000,000 سجل أو بضعة غيغابايتات، حيث يمكن أن تكون البنية التحتية لقاعدة البيانات التقليدية أكثر احتفالية من القيمة:

الحركة الشائعة بسيطة: احتفظ بالبيانات الدائمة في ملفات أو تخزين كائنات، ثم استعلم عنها من متصفح أو دالة حافة أو عامل أو خدمة خفيفة. هذا لا يلغي التعقيد. إنه ينقل التعقيد إلى خطوط البناء، ونضارة الفهرس، وإبطال التخزين المؤقت، وقدرات العميل. وهي مقايضة جيدة تمامًا عندما تسود القراءات.

معركة خانات الاختيار

الميزةPagefindOramaChromaLanceDBDuckDB-WASM
البحث النصي الكامل✅ تشكيل متقدم✅ BM25، 30 لغة✅ SQLite FTS✅ Tantivy✅ SQL كامل
البحث المتجهي✅ تشابه جيب التمام✅ HNSW✅ IVF_PQ، HNSW، GPU⚠️ إضافات
تكاملات الذكاء الاصطناعي/RAGلا شيء✅ خط أنابيب مدمج✅ LangChain، LlamaIndex✅ إعادة ترتيب متقدمة⚠️ إعداد يدوي
التخزينJSON/WASM ثابتذاكرة + إضافات S3قائم على الخادم*متوافق مع S3 LanceWASM + S3/HTTP
دعم الكتابةوقت البناء فقطCRUD كاملCRUD كاملCRUD كاملCRUD SQL كامل
الأداءأقل من 100 مللي ثانية0.0001 مللي ثانية - 100 مللي ثانيةأقل من 100 مللي ثانية3-5 مللي ثانية للمتجهات، 50 مللي ثانية للبحث النصي10 مللي ثانية - 1 ثانية (SQL معقد)

*لقطة سبتمبر 2025: يتطلب Chroma بيئة تشغيل خادم ولا يدعم تخزين كائنات S3 المباشر بالطريقة التي تعمل بها أدوات ملفات الكائنات (issue #1736).

أمثلة التنفيذ

تكشف الاختلافات في الصياغة عن الانقسام الحقيقي: البحث في وقت البناء، والبحث في الذاكرة، والتخزين المتجهي الأصلي، والجداول متعددة الوسائط، وSQL في المتصفح ليست نفس فئة المنتج لمجرد ظهورها جميعًا في عروض الذكاء الاصطناعي.

بحث المواقع الثابتة باستخدام Pagefind

<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
<script src="/pagefind/pagefind-ui.js"></script>
<div id="search"></div>
<script>new PagefindUI({ element: "#search" });</script>

متعدد الوسائط على مستوى المؤسسات باستخدام LanceDB

كود لإنشاء جدول LanceDB مع تضمينات OpenAI تلقائية:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
import { LanceSchema, getRegistry } from "@lancedb/lancedb/embedding";
import { Utf8 } from "apache-arrow";
const db = await lancedb.connect("data/multimodal-db");
const func = getRegistry()
.get("openai")
?.create({ model: "text-embedding-ada-002" });
// Schema with automatic embedding generation
const documentsSchema = LanceSchema({
text: func.sourceField(new Utf8()),
vector: func.vectorField(),
category: new Utf8()
});
const table = await db.createEmptyTable("documents", documentsSchema);
await table.add([
{ text: "machine learning concepts", category: "research" },
{ text: "deep learning fundamentals", category: "research" }
]);

مثال على الاستعلام عن جدول LanceDB:

import * as lancedb from "@lancedb/lancedb";
import "@lancedb/lancedb/embedding/openai";
// "Connect" to a URL path
const db = await lancedb.connect("data/multimodal-db");
const table = db.getTable("documents");
// SQL + vector search combination
const results = await table.search("machine learning concepts")
.where("category = 'research'")
.limit(10)
.toArray();
console.log(results);

البحث الشامل باستخدام Orama

import { create, insert, search } from '@orama/orama'
const db = create({
schema: {
title: 'string',
content: 'string',
embedding: 'vector[1536]'
}
})
await insert(db, {
title: 'Getting Started',
content: 'Learn the basics',
embedding: await generateEmbedding('Learn the basics')
})
const results = await search(db, {
term: 'basics',
mode: 'hybrid' // Combines text + vector search
})

DuckDB-WASM:

import * as duckdb from "https://cdn.jsdelivr.net/npm/@duckdb/duckdb-wasm@latest/dist/duckdb-browser.mjs";
const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
const worker = new Worker(bundle.mainWorker);
const db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), worker);
await db.instantiate(bundle.mainModule, bundle.pthreadWorker);
const conn = await db.connect();
await conn.query(`create table t as select * from (values (1,'hybrid search'),(2,'edge sql')) as v(id,txt);`);
// Optional full-text:
await conn.query(`install fts; load fts; select * from t where match_bm25(txt, 'hybrid');`);

البحث الأصلي للذكاء الاصطناعي باستخدام Chroma

import { ChromaClient } from "chromadb";
const client = new ChromaClient();
const collection = await client.createCollection({ name: "knowledge-base" });
await collection.add({
documents: ["AI will transform software development"],
metadatas: [{ source: "tech-blog", category: "AI" }],
ids: ["doc1"]
});
const results = await collection.query({
queryTexts: ["future of programming"],
where: { category: "AI" },
nResults: 5
});

دليل حالات الاستخدام

اختر Pagefind عندما:

اختر Orama عندما:

اختر Chroma عندما:

اختر LanceDB عندما:

اختر DuckDB-WASM عندما:

قاعدة القرار

السؤال العملي ليس “أي قاعدة بيانات هي الأفضل؟”

السؤال العملي هو: أي نوع من التغيير يجب أن يستوعبه النظام؟

المسار السعيد رخيص. الحالات الحدودية هي التي تحدد البنية.

الصورة الأكبر

هذه الأدوات تقلل من الحد الأدنى للبنية التحتية القابلة للتطبيق للبحث المفيد. هذا مهم. في عام 2020، كان “البحث الدلالي” يعني غالبًا كومة من الخدمات، والكثير من الكود اللاصق، وشخصًا يشرح فهارس المتجهات في اجتماع حيث أراد نصف الغرفة الغداء. في عام 2025، يمكن لفريق صغير بناء نموذج أولي لنفس فكرة المنتج باستخدام ملفات وتضمينات وعطلة نهاية أسبوع.

هذا لا يعني أن كل مربع بحث يجب أن يصبح نظام RAG. إنه يعني أن الإصدار الأول لم يعد مضطرًا لوراثة البنية التحتية للإنتاج قبل أن يكون لديه دليل إنتاج.

حتى AWS كانت تتحرك في هذا الاتجاه مع عمل بحث متجهي مجاور لـ S3، وهو إشارة مفيدة: تخزين الكائنات لم يعد مجرد العلية حيث تذهب الملفات القديمة. إنه يصبح سطح استعلام.

ابدأ بالتجربة

  1. اختر نمط التحديث أولاً: وقت البناء، دفعة كل ساعة، كتابات حية، أو نتائج لكل مستخدم.
  2. قم بالنمذجة الأولية بأصغر أداة صادقة: Pagefind لـ HTML الثابت، DuckDB للملفات التحليلية، Orama للبحث الخفيف في التطبيقات، LanceDB أو Chroma للعمل الثقيل بالمتجهات.
  3. قس الجزء القبيح: وقت الفهرسة، النضارة، حجم الحزمة، الأذونات، وأول استعلام بعد بدء بارد.
  4. قم بالترقية فقط عندما يكون الألم حقيقيًا: قاعدة بيانات مُدارة أسهل تبريرًا بعد أن يظهر الإصدار القائم على الملفات أين ينحني بالضبط.

اطلع على دليلي العملي لـ Pagefind للتنفيذ العملي، أو استكشف النظام البيئي المتنامي لقواعد البيانات الأصلية للحافة التي تعيد تشكيل البيانات على نطاق واسع.

إخلاء مسؤولية: لقد استخدمت Pagefind لسنوات وأصبحت مساهمًا في 2025. لقد جربت Orama و Chroma لمشاريع أصغر وأستكشف LanceDB لتطبيقات الذكاء الاصطناعي الأكبر. لا توجد علاقات مالية مع هذه المشاريع — مجرد اهتمام شديد بمشهد قواعد البيانات المتطور.