روابط لغة الأسس لمكتبة FAISS - مكتبة للبحث الفعّال عن التشابه وتجميع المتجهات الكثيفة.
توفر هذه المكتبة روابط لغة الأسس لمكتبة FAISS، مما يتيح عمليات البحث عن التشابه في المتجهات والتجميع عالية الأداء في لغة الأسس.
اشمل "مـحا"؛
مـحا.اشمل_حزمة("Alusus/Faiss@0.1"، "فـيس.أسس")؛
استخدم فـيس؛
import "Apm";
Apm.importPackage("Alusus/Faiss@0.1");
use Faiss;
اشمل "مـتم/طـرفية"؛
اشمل "مـتم/مـصفوفة"؛
اشمل "مـحا"؛
مـحا.اشمل_حزمة("Alusus/Faiss@0.1"، "فـيس.أسس")؛
استخدم مـتم؛
استخدم فـيس؛
// إنشاء فهرس مسطح بمتجهات رباعية الأبعاد
عرف الفهرس: سند[فـهرس]؛
فـهرس.أنشئ(الفهرس، 4، "Flat"، نـوع_قياس._نتاج_داخلي_)؛
// إضافة متجهات إلى الفهرس
عرف سب: مـصفوفة[عـائم]({1.0، 2.0، 3.0، 4.0، 2.0، 3.0، 4.0، 5.0})؛
الفهرس.أضف(2، سب.صوان)؛ // متجهان
// البحث عن أقرب الجيران
عرف سس: مـصفوفة[عـائم]({1.5، 2.5، 3.5، 4.5})؛
عرف الوسوم: مصفوفة[صحيح[64]، 3]؛
عرف المسافات: مصفوفة[عـائم، 3]؛
الفهرس.ابحث(1، سس.صوان، 3، المسافات، الوسوم)؛ // البحث عن أقرب 3 جيران
// التنظيف
فـهرس.حرر(الفهرس)؛
import "Srl/Console";
import "Srl/Array";
import "Apm";
Apm.importPackage("Alusus/Faiss@0.1");
use Srl;
use Faiss;
// Create a flat index with 4-dimensional vectors
def index: ref[Index];
Index.new(index, 4, "Flat", MetricType.METRIC_INNER_PRODUCT);
// Add vectors to the index
def xb: Array[Float]({1.0, 2.0, 3.0, 4.0, 2.0, 3.0, 4.0, 5.0});
index.add(2, xb.buf); // 2 vectors
// Search for nearest neighbors
def xq: Array[Float]({1.5, 2.5, 3.5, 4.5});
def labels: array[Int[64], 3];
def distances: array[Float, 3];
index.search(1, xq.buf, 3, distances, labels); // Find 3 nearest neighbors
// Clean up
Index.free(index);
انظر الأمثلة الكاملة في مجلد Examples/.
تلتف هذه المكتبة حول واجهة FAISS البرمجية بلغة C. للحصول على توثيق مفصل حول المفاهيم والخوارزميات وأفضل الممارسات، يرجى الرجوع إلى التوثيق الرسمي لـ FAISS:
- التوثيق الرئيسي: https://github.com/facebookresearch/faiss/wiki
- مرجع واجهة C البرمجية: https://github.com/facebookresearch/faiss/blob/main/c_api/
- دليل البدء: https://github.com/facebookresearch/faiss/wiki/Getting-started
- دليل اختيار الفهرس: https://github.com/facebookresearch/faiss/wiki/Guidelines-to-choose-an-index
الصنف الرئيسي للبحث عن التشابه. توثيق واجهة C البرمجية
الأصناف الأساسية:
دالة أنشئ(الكائن: سند[سند[فـهرس]]، ب: صـحيح، وصف: مـؤشر_محارف، نوع_القياس: صـحيح): صـحيح
func new(obj: ref[ref[Index]], d: Int, description: CharsPtr, metric: Int): Int
إنشاء فهرس باستخدام نص المصنع.
دالة حمل(اسم_الملف: مـؤشر_محارف، خيارات: صـحيح، الكائن: سند[سند[فـهرس]]): صـحيح
func load(fname: CharsPtr, flags: Int, obj: ref[ref[Index]]): Int
تحميل فهرس من ملف.
دالة احفظ(الكائن: سند[فـهرس]، اسم_الملف: مـؤشر_محارف): صـحيح
func save(obj: ref[Index], fname: CharsPtr): Int
حفظ الفهرس إلى ملف.
دالة حرر(obj: سند[فـهرس])
func free(obj: ref[Index])
تحرير ذاكرة الفهرس.
الدوال الرئيسية:
عملية هذا.درب(n: صـحيح[64]، x: سند[مصفوفة[عـائم]]): صـحيح
handler this.train(n: Int[64], x: ref[array[Float]]): Int
تدريب الفهرس على البيانات.
عملية هذا.أضف(n: صـحيح[64]، x: سند[مصفوفة[عـائم]]): صـحيح
handler this.add(n: Int[64], x: ref[array[Float]]): Int
إضافة متجهات إلى الفهرس.
عملية هذا.ابحث(n: صـحيح[64]، x: سند[مصفوفة[عـائم]]، k: صـحيح[64]،
مسافات: سند[مصفوفة[عـائم]]، labels: سند[مصفوفة[صـحيح[64]]]
): صـحيح
handler this.search(n: Int[64], x: ref[array[Float]], k: Int[64], distances: ref[array[Float]], labels: ref[array[Int[64]]]): Int
البحث عن k من أقرب الجيران.
عملية هذا.بحث_المدى(n: صـحيح[64]، x: سند[مصفوفة[عـائم]]، radius: عـائم، result: سند[نـتيجة_بحث_مدى]): صـحيح
handler this.rangeSearch(n: Int[64], x: ref[array[Float]], radius: Float, result: ref[RangeSearchResult]): Int
البحث بنطاق.
عملية هذا.أعد_الضبط(): صـحيح
handler this.reset(): Int
إزالة جميع المتجهات من الفهرس.
عملية هذا.احذف_المعرفات(sel: سند[مـنتقي_معرف]، nRemoved: سند[طـبيعي_متكيف]): صـحيح
handler this.removeIds(sel: ref[IdSelector], nRemoved: ref[ArchWord]): Int
إزالة متجهات محددة.
الخصائص:
البعد: صحيح[64]
d: Int[64]
بُعد المتجه.
العدد_الكلي: صحيح[64]
nTotal: Int[64]
العدد الإجمالي للمتجهات المفهرسة.
مدرب: صحيح
isTrained: Int
ما إذا كان الفهرس مدرباً (0 أو 1).
نوع_القياس: نـوع_قياس
metricType: MetricType
مقياس المسافة المستخدم.
إطناب: صحيح
verbose: Int
مستوى الإسهاب.
فهرس القوة الغاشمة الذي يقوم بالبحث الدقيق. دليل
الإنشاء:
دالة أنشئ(obj: سند[سند[فـهرس_مسطح]]): صـحيح
دالة أنشئ(obj: سند[سند[فـهرس_مسطح]]، d: صـحيح[64]، metric: نـوع_قياس): صـحيح
func new(obj: ref[ref[IndexFlat]]): Int
func new(obj: ref[ref[IndexFlat]], d: Int[64], metric: MetricType): Int
دوال إضافية:
عملية هذا.هات_البيانات(outXb: سند[سند[مصفوفة[عـائم]]]، outSize: سند[طـبيعي_متكيف])
handler this.getXb(outXb: ref[ref[array[Float]]], outSize: ref[ArchWord])
الحصول على المتجهات المخزنة.
عملية هذا.احسب_مسافة_مجموعة_جزئية(n: صـحيح[64]، x: سند[مصفوفة[عـائم]]، k: صـحيح[64]، outDistances: سند[مصفوفة[عـائم]]، labels: سند[مصفوفة[صـحيح[64]]]): صـحيح
handler this.computeDistanceSubset(n: Int[64], x: ref[array[Float]], k: Int[64], outDistances: ref[array[Float]], labels: ref[array[Int[64]]]): Int
حساب المسافات إلى مجموعة جزئية.
يرث جميع دوال فـهرس / Index.
فهرس مسطح متخصص لمقياس الجداء الداخلي. توثيق
الإنشاء:
دالة أنشئ(obj: سند[سند[فـهرس_مسطح_آيبي]]): صـحيح
دالة أنشئ(obj: سند[سند[فـهرس_مسطح_آيبي]]، d: صـحيح[64]): صـحيح
func IndexFlatIp.new(obj: ref[ref[IndexFlatIp]]): Int
func IndexFlatIp.new(obj: ref[ref[IndexFlatIp]], d: Int[64]): Int
فهرس مسطح متخصص لمسافة L2 (إقليدس). توثيق
الإنشاء:
دالة أنشئ(obj: سند[سند[فـهرس_مسطح_ل2]]): صـحيح
دالة أنشئ(obj: سند[سند[فـهرس_مسطح_ل2]]، d: صـحيح[64]): صـحيح
func new(obj: ref[ref[IndexFlatL2]]): Int
func new(obj: ref[ref[IndexFlatL2]], d: Int[64]): Int
فهرس الملفات المعكوسة للبحث التقريبي الأسرع. دليل
عدد_القوائم: طـبيعي_متكيف
nList: ArchWord
عدد القوائم المعكوسة (العناقيد).
عدد_الاستقصاءات: طـبيعي_متكيف
nProbe: ArchWord
عدد العناقيد المراد زيارتها أثناء البحث (قابل للضبط).
المكمم: سند[فـهرس]
quantizer: ref[Index]
فهرس المكمم.
يمتلك_الحقول: صحيح
ownFields: Int
ما إذا كان الفهرس يمتلك حقوله.
دوال إضافية:
عملية هذا.ادمج_من(other: سند[فـهرس_ملف_معكوس]، addId: صـحيح[64]): صـحيح
handler this.mergeFrom(other: ref[IndexIvf], addId: Int[64]): Int
دمج فهرس IVF آخر.
عملية هذا.انسخ_مجموعة_جزئية_إلى(other: سند[فـهرس_ملف_معكوس]، subsetType: صـحيح، a1: صـحيح[64]، a2: صـحيح[64]): صـحيح
handler this.copySubsetTo(other: ref[IndexIvf], subsetType: Int, a1: Int[64], a2: Int[64]): Int
نسخ مجموعة جزئية من المتجهات.
عملية هذا.هات_حجم_القائمة(listNo: طـبيعي_متكيف): طـبيعي_متكيف
handler this.getListSize(listNo: ArchWord): ArchWord
الحصول على حجم القائمة المعكوسة.
عملية هذا.اصنع_تعيينا_مباشرا(newMaintainDirectMap: صـحيح): صـحيح
handler this.makeDirectMap(newMaintainDirectMap: Int): Int
إنشاء خريطة مباشرة لإعادة البناء.
عملية هذا.عامل_عدم_التوازن: عـائم[64]
handler this.imbalanceFactor: Float[64]
الحصول على عامل عدم توازن العناقيد.
عملية هذا.اطبع_الإحصائيات()
handler this.printStats()
طباعة إحصائيات الفهرس.
فهرس للمتجهات الثنائية (هامينغ). دليل
مشابه لـ فـهرس / Index ولكنه يعمل على المتجهات الثنائية (مصفوفات Word[8] بدلاً من Float).
الأصناف الداعمة
إدارة معاملات الفهرس للبحث الشبكي والضبط. واجهة C البرمجية
الدوال:
دالة أنشئ(parameterSpace: سند[سند[فـضاء_وسيط]]): صـحيح
func new(parameterSpace: ref[ref[ParameterSpace]]): Int
عملية هذا.حدد_وسيط_فهرس(index: سند[فـهرس]، paramName: مـؤشر_محارف، val: عـائم[64]): صـحيح
handler this.setIndexParameter(index: ref[Index], paramName: CharsPtr, val: Float[64]): Int
تعيين معامل واحد.
عملية هذا.حدد_وسطاء_فهرس(index: سند[فـهرس]، params: مـؤشر_محارف): صـحيح
handler this.setIndexParameters(index: ref[Index], params: CharsPtr): Int
تعيين معاملات متعددة.
عملية هذا.أضف_مدى(name: مـؤشر_محارف، outRange: سند[سند[مـدى_وسيط]]): صـحيح
handler this.addRange(name: CharsPtr, outRange: ref[ref[ParameterRange]]): Int
إضافة نطاق معامل.
معاملات البحث في وقت التشغيل. واجهة C البرمجية
الدوال:
دالة أنشئ(obj: سند[سند[وسـطاء_بحث]]، sel: سند[مـنتقي_معرف]): صـحيح
func new(obj: ref[ref[SearchParameters]], sel: ref[IdSelector]): Int
الخصائص:
عدد_الاستقصاءات: صحيح
nProbe: Int
عدد العناقيد المراد استقصاءها (لفهارس IVF).
معاملات بحث موسعة لفهارس IVF.
الدوال:
دالة أنشئ(obj: سند[سند[وسـطاء_بحث_ملف_معكوس]]): صـحيح
دالة أنشئ(obj: سند[سند[وسـطاء_بحث_ملف_معكوس]]، sel: سند[مـنتقي_معرف]،nprobe: طـبيعي_متكيف، maxCodes: طـبيعي_متكيف): صـحيح
func new(obj: ref[ref[SearchParametersIvf]]): Int
func new(obj: ref[ref[SearchParametersIvf]], sel: ref[IdSelector], nprobe: ArchWord, maxCodes: ArchWord): Int
الخصائص:
المنتقي: سند[مـنتقي_معرف]
sel: ref[IdSelector]
منتقي المعرف.
عدد_الاستقصاءات: طـبيعي_متكيف
nProbe: ArchWord
عدد العناقيد المراد استقصاءها.
أقصى_شفرات: طـبيعي_متكيف
maxCodes: ArchWord
الحد الأقصى للشفرات المراد فحصها.
تطبيق تجميع K-means. واجهة C البرمجية
الإنشاء:
دالة أنشئ(out: سند[سند[تـجميع]]، d: صـحيح، k: صـحيح): صـحيح
دالة أنشئ(out: سند[سند[تـجميع]]، d: صـحيح، k: صـحيح، params: مؤشر[وسـطاء_تجميع]): صـحيح
func new(out: ref[ref[Clustering]], d: Int, k: Int): Int
func new(out: ref[ref[Clustering]], d: Int, k: Int, params: ptr[ClusteringParameters]): Int
إنشاء بالبُعد وعدد العناقيد k. الصيغة الثانية تنشئ بمعاملات.
الدوال:
عملية هذا.درب(n: صـحيح[64]، x: سند[عـائم]، index: سند[فـهرس]): صـحيح
handler this.train(n: Int[64], x: ref[Float], index: ref[Index]): Int
تشغيل k-means.
عملية هذا.هات_المراكز(centroids: سند[سند[مصفوفة[عـائم]]]، size: سند[طـبيعي_متكيف])
handler this.getCentroids(centroids: ref[ref[array[Float]]], size: ref[ArchWord])
الحصول على مراكز العناقيد.
عملية هذا.هات_إحصائيات_الدورة(stats_out: سند[سند[إحـصائيات_دورة_تجميع]]، size: سند[طـبيعي_متكيف])
handler this.getIterationStats(stats_out: ref[ref[ClusteringIterationStats]], size: ref[ArchWord])
الحصول على إحصائيات التكرار.
الخصائص:
عدد_الدورات: صحيح
niter: Int
عدد التكرارات.
عدد_الإعادات: صحيح
nredo: Int
عدد إعادات k-means.
عدد_المراكز: طـبيعي_متكيف
k: ArchWord
عدد العناقيد.
البعد: طـبيعي_متكيف
d: ArchWord
بُعد المتجه.
اختيار مجموعات فرعية من المتجهات حسب المعرف. واجهة C البرمجية
الأنواع:
مـنتقي_معرف_حزمة/IdSelectorBatch: اختيار معرفات محددة من قائمةمـنتقي_معرف_مدى/IdSelectorRange: اختيار المعرفات في نطاقمـنتقي_معرف_بتماب/IdSelectorBitmap: الاختيار باستخدام خريطة بتمـنتقي_معرف_نفي/IdSelectorNot: عكس منتقيمـنتقي_معرف_و/IdSelectorAnd: دمج المنتقيات بـ ANDمـنتقي_معرف_أو/IdSelectorOr: دمج المنتقيات بـ ORمـنتقي_معرف_أو_حصري/IdSelectorXor: دمج المنتقيات بـ XOR
نتائج استعلامات البحث بنطاق. واجهة C البرمجية
الدوال:
دالة أنشئ(obj: سند[سند[نـتيجة_بحث_مدى]]، nq: صـحيح[64]): صـحيح
func new(obj: ref[ref[RangeSearchResult]], nq: Int[64]): Int
عملية هذا.نفذ_التخصيص(): صـحيح
handler this.doAllocation(): Int
تخصيص صوانات النتائج.
عملية هذا.حجم_الصوان(): طـبيعي_متكيف
handler this.bufferSize(): ArchWord
الحصول على حجم الصوان.
عملية هذا.هات_الحدود(outLims: سند[سند[مصفوفة[طـبيعي_متكيف]]])
handler this.getLims(outLims: ref[ref[array[ArchWord]]])
الحصول على مصفوفة حدود النتائج.
عملية هذا.هات_الوسوم(outLabels: سند[سند[مصفوفة[صـحيح[64]]]]، outDistances: سند[سند[سند[عـائم]]])
handler this.getLabels(outLabels: ref[ref[array[Int[64]]]], outDistances: ref[ref[ref[Float]]])
الحصول على الوسوم والمسافات.
حساب المسافات إلى المتجهات. واجهة C البرمجية
الدوال:
عملية هذا.حدد_الاستعلام(x: سند[مصفوفة[عـائم]]): صـحيح
handler this.setQuery(x: ref[array[Float]]): Int
تعيين متجه الاستعلام.
عملية هذا.مسافة_متجه_للاستعلام(i: صـحيح[64]، qd: سند[مصفوفة[عـائم]]): صـحيح
handler this.vectorToQueryDis(i: Int[64], qd: ref[array[Float]]): Int
المسافة إلى الاستعلام.
عملية هذا.مسافة_متماثلة(i: صـحيح[64]، j: صـحيح[64]، vd: سند[مصفوفة[عـائم]]): صـحيح
handler this.symmetricDis(i: Int[64], j: Int[64], vd: ref[array[Float]]): Int
المسافة المتماثلة.
مقاييس المسافة. توثيق
_نتاج_داخلي_/METRIC_INNER_PRODUCT(0): الجداء الداخلي (أقصى تشابه)_ل2_/METRIC_L2(1): المسافة الإقليدية (معيار L2)_ل1_/METRIC_L1(2): مسافة مانهاتن (معيار L1)_ل8_/METRIC_LINF(3): معيار اللانهاية (مسافة تشيبيشيف)_لس_/METRIC_LP(4): معيار Lp_كانبيرا_/METRIC_CANBERRA(20): مسافة كانبيرا_براي_كرتس_/METRIC_BRAY_CURTIS(21): تباين براي-كورتس_جنسن_شانون_/METRIC_JENSEN_SHANNON(22): تباعد جينسن-شانون
رموز الإرجاع من دوال واجهة C البرمجية.
_نجاح_/OK(0): نجاح_استثناء_مجهول_/UNKNOWN_EXCEPT(-1): استثناء غير معروف_استثناء_فيس_/FAISS_EXCEPT(-2): استثناء FAISS_استثناء_قياسي_/STD_EXCEPT(-4): استثناء المكتبة القياسية
دالة هات_اعتماديات_البناء(): مـصفوفة[نـص]؛
func getBuildDependencies(): Array[String];
دالة تعيد مصفوفة من المكتبات و الحزم الضرورية لبناء نسخة تنفيذية من التطبيق.
دالة هات_آخر_خطأ(): مـؤشر_محارف
func getLastError(): CharsPtr
الحصول على رسالة الخطأ الأخيرة.
دالة تجميع_كيمينز(d: طـبيعي_متكيف، n: طـبيعي_متكيف، k: طـبيعي_متكيف، x: سند[مصفوفة[عـائم]]، centroids: سند[مصفوفة[عـائم]]، q_error: سند[عـائم]): صـحيح
func kmeansClustering(d: ArchWord, n: ArchWord, k: ArchWord, x: ref[array[Float]], centroids: ref[array[Float]], q_error: ref[Float]): Int
k-means مستقل.
لتفعيل معالج الرسوميات والحصول على أداء أفضل، مرر الخيار فيس_استعمل_معالج_الرسوميات (faiss_use_gpu) لمترجم الأسس أثناء تشغيل أو ترجمة برنامجك:
الأسس --خيار فيس_استعمل_معالج_الرسوميات برنامجي.أسس
alusus --opt faiss_use_gpu my_app.alusus
هذا الخيار سيجعل المكتبة تحمل الملفات الثنائية المفعّلة لـمعالج الرسوميات بدل مكتبات المعالج المركزي. راجع توثيق FAISS GPU للتفاصيل.
تقبل دالة المصنع فـهرس.أنشئ / Index.new نصوصاً لإنشاء أنواع فهرس مختلفة:
"Flat": بحث دقيق (قوة غاشمة)"IVFn,Flat": IVF مع n مركز، ترميز مسطح"IVFn,PQm": IVF مع n مركز، PQ مع m مكمّم فرعي"HNSW32": عالم صغير قابل للتنقل الهرمي مع 32 جار"IVFn,HNSW32": IVF و HNSW مدمجان
راجع توثيق مصنع الفهرس لجميع الخيارات والتوليفات المتاحة.
أمثلة عمل كاملة في مجلد Examples/:
- مثال.أسس: فهرس مسطح أساسي مع بحث الجداء الداخلي (عربي)
- مثال٢.أسس: فهرس IVF مع ضبط المعاملات (عربي)
- example.alusus: فهرس مسطح أساسي مع بحث الجداء الداخلي (إنجليزي)
- example2.alusus: فهرس IVF مع ضبط المعاملات (إنجليزي)
-
اختيار الفهرس:
- استخدم
فـهرس_مسطح/IndexFlatللبحث الدقيق في مجموعات البيانات <1 مليون متجه - استخدم
فـهرس_ملف_معكوس/IndexIVFللبحث التقريبي في مجموعات البيانات الأكبر - راجع دليل اختيار الفهرس
- استخدم
-
التدريب: تتطلب فهارس IVF والفهارس التقريبية الأخرى التدريب قبل إضافة المتجهات
-
معامل nprobe: بالنسبة لفهارس IVF، nprobe أعلى = دقة أفضل ولكن بحث أبطأ
-
تسريع GPU: فعّل GPU للعمليات على >10 مليون متجه
-
الذاكرة: تخزّن الفهارس المسطحة جميع المتجهات في الذاكرة؛ استخدم الضغط لمجموعات البيانات الكبيرة
راجع إرشادات أداء FAISS للتوصيات التفصيلية.
- FAISS على GitHub: https://github.com/facebookresearch/faiss
- ويكي FAISS: https://github.com/facebookresearch/faiss/wiki
- ورقة بحثية: البحث عن التشابه بمليارات المقاييس مع GPUs
- لغة الأسس: https://alusus.org
تتبع هذه الروابط ترخيص FAISS (MIT). راجع ملف LICENSE للتفاصيل.