با حرکت هوش مصنوعی از نمونههای آزمایشی به برنامههای تولیدی، تقاضا برای بازیابی دادههای با تأخیر کم و توان پردازشی بالا هرگز به این اندازه نبوده است. موتورهای جستجو و پایگاههای داده رابطهای سنتی اغلب در مدیریت ابعاد بردارهای یادگیری ماشین مدرن با مشکل مواجه میشوند. اینجاست که جستجوی برداری Redis درخشش خود را نشان میدهد و ترکیبی منحصر به فرد از سرعت درونحافظهای و قابلیتهای قوی برداری را ارائه میدهد.
چرا Redis برای جستجوی برداری؟
در هسته خود، Redis پیشروترین ذخیرهساز داده درونحافظهای در جهان است. با نگهداری دادهها در RAM به جای دیسک، Redis گلوگاههای ورودی/خروجی (I/O) که پایگاههای داده مبتنی بر دیسک را آزار میدهند، حذف میکند. وقتی قابلیتهای جستجوی برداری را به این پایه اضافه میکنید، زمان پاسخ زیر میلیثانیه برای جستجوهای شباهت به دست میآید. این موضوع برای برنامههایی مانند شخصیسازی بلادرنگ، جستجوی معنایی و سیستمهای تولید تقویتشده با بازیابی (RAG) حیاتی است، در جایی که تجربه کاربر مستقیماً به تأخیر پرسوجو وابسته است.
برخلاف پایگاههای داده برداری تخصصی که ممکن است به لایههای زیرساخت و همگامسازی جداگانه نیاز داشته باشند، جستجوی برداری Redis به شما اجازه میدهد بردارها را در کنار دادههای کلید-مقدار سنتی، رشتهها یا هشها ذخیره کنید. این امر معماری را با کاهش نیاز به الگوهای شکافدهی داده (sharding) و پایداری چندزبانه (polyglot persistence) ساده میکند.
پیادهسازی با پایتون
شروع کار با جستجوی برداری Redis ساده است، به ویژه با کتابخانه مدرن redis-py. این کتابخانه روشهای شهودی برای ایجاد شاخصها، درج بردارها و انجام پرسوجوها با استفاده از Redis Stack ارائه میدهد.
اول، مطمئن شوید که یک نمونه Redis Stack در حال اجرا است. سپس، میتوانید یک فضای برداری را با استفاده از الگوریتم HNSW (جهان کوچک ناوبری سلسلهمراتبی) تعریف کنید که تعادل عالی بین دقت و سرعت ارائه میدهد.
import redis
import json
# اتصال به Redis
client = redis.Redis(host='localhost', port=6379, decode_responses=True)
# تعریف پارامترهای برداری
DIM = 1536 # مثال برای بردارهای OpenAI
DISTANCE_METRIC = "COSINE"
# ایجاد شاخص برداری
client.ft("idx:vector").create_index(
fields=(
redis.commands.vector.Field("vector", "VECTOR", "HNSW", {
"TYPE": "FLOAT32",
"DIM": DIM,
"DISTANCE_METRIC": DISTANCE_METRIC,
"INITIAL_CAP": 1000
})
),
definition=redis.commands.index.IndexDefinition(prefix=["doc:"])
)
# درج یک سند با یک بردار ویژگی
embedding = [0.1] * DIM # بردار ویژگی جایگزین
payload = {"title": "درک هوش مصنوعی", "content": "هوش مصنوعی در حال تحول..."}
client.hset(
"doc:1",
mapping={
"vector": redis.commands.vector.convert_vector(embedding),
"payload": json.dumps(payload)
}
)
در این مثال، ما یک شاخص تخت یا HNSW بر اساس الگوریتم مشخص شده ایجاد میکنیم. نوع فیلد VECTOR به Redis میگوید که فیلد مشخص شده را به عنوان یک فضای برداری با ابعاد بالا در نظر بگیرد. پارامتر DIM باید با طول بردارهای ویژگی شما مطابقت داشته باشد.
اجرای پرسوجوهای معنایی
پس از شاخصبندی دادهها، پرسوجو به سادگی ارائه یک بردار پرسوجو است. Redis جستجوی شباهت را انجام داده و نزدیکترین همسایگان را به همراه امتیازهای آنها بازگردانی میکند.
# جستجوی اسناد مشابه
query_vector = [0.12] * DIM
num_results = 5
results = client.ft("idx:vector").search(
redis.commands.vector.Query(query_vector)
.return_fields("payload")
.dialect(2)
)
for doc in results.docs:
print(f"ID: {doc.id}, Score: {doc.score}, Payload: {doc.payload}")
امتیاز score بازگردانده شده نشاندهنده فاصله یا معیار شباهت است (بسته به پیکربندی)، که به شما امکان میدهد نتایج کمتر مرتبط را به صورت پویا فیلتر کنید. این قابلیت برای ساخت لولههای RAG ضروری است، جایی که فقط بخشهای متن با بیشترین ارتباط معنایی باید به یک مدل زبانی بزرگ (LLM) داده شوند.
نتیجهگیری
جستجوی برداری Redis نمایانگر تکاملی قدرتمند در زیرساخت داده است، که سرعت محاسبات درونحافظهای را با پیچیدگی بازیابی مبتنی بر هوش مصنوعی ترکیب میکند. برای توسعهدهندگانی که برنامههای بلادرنگ میسازند، این راهی سادهشده برای پیادهسازی جستجوی معنایی بدون بار عملیاتی نگهداری پایگاههای داده برداری جداگانه ارائه میدهد. با بهرهگیری از Redis، شما اطمینان حاصل میکنید که ویژگیهای هوش مصنوعی شما به سرعتی که دادهها دریافت میشوند، عملکرد دارند.