نماذج التضمين وقواعد البيانات المتجهة
مشهد قواعد البيانات المتجهة
قواعد البيانات المتجهة مبنية خصيصاً لتخزين والبحث في المتجهات عالية الأبعاد. فهم المقايضات يساعدك على اختيار الحل الصحيح.
فئات قواعد البيانات
| الفئة | الأمثلة | الأفضل لـ |
|---|---|---|
| سحابة مدارة | Pinecone, Weaviate Cloud | الإنتاج، بدون عمليات |
| استضافة ذاتية | Qdrant, Milvus, Weaviate | التحكم، التكلفة على نطاق واسع |
| مضمنة | Chroma, LanceDB | التطوير، الحافة |
| إضافات | pgvector | بنية Postgres موجودة |
Pinecone
قاعدة بيانات متجهة مدارة بالكامل، بدون خادم:
from pinecone import Pinecone
pc = Pinecone(api_key="your-api-key")
# إنشاء فهرس
pc.create_index(
name="rag-index",
dimension=1536,
metric="cosine",
spec={"serverless": {"cloud": "aws", "region": "us-east-1"}}
)
index = pc.Index("rag-index")
# إدراج المتجهات
index.upsert(vectors=[
{
"id": "doc1",
"values": embedding,
"metadata": {"source": "manual.pdf", "page": 5}
}
])
# استعلام
results = index.query(
vector=query_embedding,
top_k=5,
include_metadata=True,
filter={"source": {"$eq": "manual.pdf"}}
)
نقاط القوة: صفر عمليات، تحجيم تلقائي، تصفية بيانات وصفية ممتازة اعتبارات: التكلفة على نطاق واسع، قفل المورد
Qdrant
قاعدة بيانات مفتوحة المصدر عالية الأداء:
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct
client = QdrantClient(host="localhost", port=6333)
# إنشاء مجموعة
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(size=1536, distance=Distance.COSINE)
)
# إدراج النقاط
client.upsert(
collection_name="documents",
points=[
PointStruct(
id=1,
vector=embedding,
payload={"source": "manual.pdf", "page": 5}
)
]
)
# البحث مع التصفية
results = client.search(
collection_name="documents",
query_vector=query_embedding,
limit=5,
query_filter={
"must": [{"key": "source", "match": {"value": "manual.pdf"}}]
}
)
نقاط القوة: سريع، تصفية ممتازة، دعم البحث الهجين اعتبارات: تعقيد الاستضافة الذاتية
Weaviate
قاعدة بيانات متجهة قائمة على المخطط مع GraphQL:
import weaviate
from weaviate.classes.config import Property, DataType
client = weaviate.connect_to_local()
# إنشاء مجموعة مع مخطط
collection = client.collections.create(
name="Document",
properties=[
Property(name="content", data_type=DataType.TEXT),
Property(name="source", data_type=DataType.TEXT),
Property(name="page", data_type=DataType.INT),
]
)
# إدراج مع تحويل تلقائي للمتجهات (اختياري)
collection.data.insert({
"content": "نص المستند هنا",
"source": "manual.pdf",
"page": 5
})
# البحث
results = collection.query.near_vector(
near_vector=query_embedding,
limit=5,
filters=weaviate.classes.query.Filter.by_property("source").equal("manual.pdf")
)
نقاط القوة: تحويل متجه مدمج، GraphQL، متعدد الوسائط اعتبارات: منحنى التعلم، متطلبات الموارد
Chroma
قاعدة بيانات مضمنة خفيفة الوزن (رائعة للتطوير):
import chromadb
from chromadb.utils import embedding_functions
client = chromadb.PersistentClient(path="./chroma_db")
# استخدم تضمينات OpenAI
openai_ef = embedding_functions.OpenAIEmbeddingFunction(
api_key="your-api-key",
model_name="text-embedding-3-small"
)
# إنشاء مجموعة
collection = client.get_or_create_collection(
name="documents",
embedding_function=openai_ef
)
# إضافة مستندات (تضمين تلقائي)
collection.add(
documents=["نص المستند هنا"],
metadatas=[{"source": "manual.pdf", "page": 5}],
ids=["doc1"]
)
# استعلام
results = collection.query(
query_texts=["استعلام البحث"],
n_results=5,
where={"source": "manual.pdf"}
)
نقاط القوة: API بسيط، لا حاجة لخادم، إعداد سريع اعتبارات: ليس للنطاق الإنتاجي
pgvector (إضافة PostgreSQL)
أضف المتجهات لـ Postgres موجود:
import psycopg2
from pgvector.psycopg2 import register_vector
conn = psycopg2.connect("postgresql://localhost/mydb")
register_vector(conn)
cur = conn.cursor()
# إنشاء جدول مع عمود متجه
cur.execute("""
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
source TEXT,
embedding vector(1536)
)
""")
# إنشاء فهرس للبحث السريع
cur.execute("""
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100)
""")
# إدراج
cur.execute(
"INSERT INTO documents (content, source, embedding) VALUES (%s, %s, %s)",
("نص المستند", "manual.pdf", embedding)
)
# استعلام
cur.execute("""
SELECT content, source, 1 - (embedding <=> %s) as similarity
FROM documents
WHERE source = 'manual.pdf'
ORDER BY embedding <=> %s
LIMIT 5
""", (query_embedding, query_embedding))
نقاط القوة: استخدم Postgres موجود، امتثال ACID، الضم اعتبارات: ليس بسرعة قواعد البيانات المتجهة المخصصة
مصفوفة المقارنة
| الميزة | Pinecone | Qdrant | Weaviate | Chroma | pgvector |
|---|---|---|---|---|---|
| الاستضافة | مدار | كلاهما | كلاهما | مضمن | ذاتي |
| التصفية | ممتاز | ممتاز | جيد | أساسي | SQL |
| البحث الهجين | نعم | نعم | نعم | لا | يدوي |
| التحجيم | تلقائي | يدوي | يدوي | محدود | محدود |
| التكلفة | $$ | مجاني/$ | مجاني/$ | مجاني | مجاني |
| الإعداد | سهل | متوسط | متوسط | سهل | سهل |
إطار القرار
البداية
│
▼
تحتاج خدمة مدارة مع صفر عمليات؟
│
├─ نعم → Pinecone
│
▼
تستخدم PostgreSQL بالفعل؟
│
├─ نعم → pgvector
│
▼
تطوير/نماذج أولية؟
│
├─ نعم → Chroma
│
▼
تحتاج بحث هجين + تصفية متقدمة؟
│
├─ نعم → Qdrant أو Weaviate
│
▼
الافتراضي → Qdrant (أفضل توازن أداء/ميزات)
نصيحة الترحيل: ابدأ مع Chroma للتطوير، ثم انتقل إلى Qdrant أو Pinecone للإنتاج. تجريد LangChain يجعل التبديل سهلاً نسبياً.
التالي، لنستكشف استراتيجيات الفهرسة التي تحدد سرعة ودقة البحث. :::