একটি ডিরেক্টরি লুকআপ।
একটি সংলগ্ন স্ক্যান।
ফিল্টারড ভেক্টর সার্চ সাধারণত এমন একটি ইনডেক্সে স্ক্যাটার-গ্যাদার যা আপনার ফিল্টার সম্পর্কে কিছু জানে না। Telys পরিবর্তে ফিজিক্যাল লেআউটের মালিক: পার্টিশন কী-তে, nearest-neighbours-where-key-equals-x হলো একটি O(1) ডিরেক্টরি লুকআপ এবং একটি সংলগ্ন ব্লকের একটি সিকোয়েন্শিয়াল স্ক্যান। এই পেজটি আজ শিপ করা রানটাইম, তারপর এটি যে আর্কিটেকচারের দিকে এগোচ্ছে তা দেখায় — স্পেক হিসেবে চিহ্নিত।
ইঞ্জিন প্রতিটি ভেক্টরের অবস্থানের মালিক।
একটি কালেকশন তৈরির সময় partition_by ঘোষণা করে, এবং লেআউট কী অনুসরণ করে। বেস সেগমেন্ট পার্টিশন অনুযায়ী ক্লাস্টারড — প্রতিটি কী একটি সংলগ্ন স্লাইসে ম্যাপ হয় — এবং সাম্প্রতিক রাইটগুলো তার পাশে একটি মিউটেবল, Arrow-আকৃতির ডেল্টায় থাকে।
পার্টিশন-ক্লাস্টারড
ভেক্টরগুলো পার্টিশন কী অনুযায়ী সাজানো, তাই প্রতিটি পার্টিশন একটি সংলগ্ন ব্লক। একটি স্কোপড কোয়েরি মেমরির একটি সিকোয়েন্শিয়াল রান পড়ে, ইনডেক্সে ছড়িয়ে থাকা রো নয়।
O(1) key → slice
একটি ডিরেক্টরি প্রতিটি পার্টিশন মানকে বেস সেগমেন্টে তার (offset, length)-এ ম্যাপ করে। ফিল্টার রিজলভ করা একটি ডিকশনারি লুকআপ, ইনডেক্স ট্র্যাভার্সাল নয়।
Arrow-আকৃতির রাইট
add ও upsert এখানে অ্যাপেন্ড করে, প্রতিটি রো একটি মনোটোনিক রাইট LSN দিয়ে স্ট্যাম্পড। ডেল্টা তাৎক্ষণিক কোয়েরিযোগ্য এবং একটি স্ক্যান পাথের মাধ্যমে বেস স্লাইসের সাথে ইউনিয়ন করে।
একটি স্কোপড কোয়েরি যা এক্সিকিউট করে।
col.search(qvec, where={"tenant_id": "acme"}, top_k=10)
ফিল্টারটি সেই পার্টিশন কী উল্লেখ করে যা দিয়ে কালেকশন তৈরি হয়েছিল।
O(1) লুকআপ: পার্টিশন মান বেস সেগমেন্টে (offset, length)-এ রিজলভ হয়। কোনো ক্যান্ডিডেট জেনারেশন নেই, কোনো গ্রাফ এন্ট্রি পয়েন্ট নেই।
একটি sequential ব্লকে SIMD exact স্কোরিং। এই পাথে recall 1.0 — এটি একটি স্ক্যান, অ্যাপ্রক্সিমেশন নয়। এই ধাপের পরিমাপকৃত p50/p95 benchmarks পেজে প্রকাশিত, প্রতিটি তার recall গেট ও রিগের সাথে আবদ্ধ।
একই কী-এর জন্য Arrow-আকৃতির ডেল্টার রোগুলো একই পথে স্কোর করা হয়। একটি রাইট পরবর্তী কোয়েরিতেই দৃশ্যমান হয়।
স্ন্যাপশট LSN-এ হিট ফিল্টার করা হয়: tombstone করা ও superseded সংস্করণ কখনো উঠে আসে না। Top-k ফলাফল explain পেলোড সহ ফেরত আসে।
অতিরিক্ত বড় পার্টিশন একটি ঘোষিত ফর্ক নেয়: build_ivf রো থ্রেশহোল্ড ছাড়িয়ে যাওয়া যেকোনো পার্টিশনে per-partition IVF স্থাপন করে, এবং কোয়েরিগুলো exact rerank সহ সেই পথে রুট হয় — একটি recall floor-এর বিপরীতে ক্যালিব্রেট করা, এবং প্ল্যানে নামকরণ করা।
প্রতিটি ফলাফল তার প্ল্যান জানায়।
explain=True কোয়েরি আসলে যে ফিজিক্যাল প্ল্যান নিয়েছে তা ফেরত দেয়। পার্টিশন কী-তে আপনি পাবেন contiguous-slice স্ক্যান। অতিরিক্ত বড় পার্টিশন IVF ফর্ক ঘোষণা করে। অফ-কী ফিল্টার scatter-gather-এ ফলব্যাক করে — এবং পেলোড জানায় কেন।
hits = col.search(qvec, where={"tenant_id": "acme"}, top_k=10, explain=True)
hits["explain"]["plan"]
# on the partition key → "PartitionSliceExactF32" # one contiguous slice, exact, recall 1.0
# oversized partition → "PartitionIVFRerankF32" # per-partition IVF + exact rerank
# off-key filter → "ScatterGatherExact" # fallback — and it says why:
hits["explain"]["fallback_reason"]
# "path is not the physical partition key"কিছুই ওভাররাইট হয় না। সংস্করণ superseded হয়।
রাইট মডেলটি append-only MVCC। upsert একটি logical id-এর নতুন সংস্করণ লেখে এবং আগেরটিকে superseded চিহ্নিত করে; delete একটি delete LSN-এ tombstone স্থাপন করে; snapshot() একটি সামঞ্জস্যপূর্ণ রিড ভিউ পিন করে; compact() ডেল্টাকে বেসে ভাঁজ করে এবং কোনো স্ন্যাপশট দেখতে পাবে না এমন সব কিছু বাদ দেয়।
col.upsert(vectors, ids=ids, metadata=metadata) # a new version; the prior one is superseded col.delete(["doc-41"]) # tombstone at a delete LSN — no in-place erase lsn = col.snapshot() # pin a consistent read view at an LSN col.compact() # fold delta into base; drop superseded rows col.build_ivf(min_rows=20000, target_recall=0.98)
| কল | যা করে |
|---|---|
| যোগ করুন / টেক্সট যোগ করুন | নতুন রো সন্নিবেশ করে। ডুপ্লিকেট id প্রত্যাখ্যাত হয় — একটি logical id-এর জন্য দ্বিতীয় ফিজিক্যাল রো ইচ্ছাকৃতভাবে upsert প্রয়োজন। |
| আপসার্ট করুন / টেক্সট আপসার্ট করুন | একটি logical id-এর নতুন সংস্করণ লেখে; আগের সংস্করণ superseded হয়, কখনো সরাসরি ওভাররাইট হয় না। |
| অনুসন্ধান করুন / টেক্সট অনুসন্ধান করুন | ফিল্টার করা top-k। explain=True ফিজিক্যাল প্ল্যান ফলাফলের সাথে সংযুক্ত করে। |
| delete | একটি delete LSN-এ logical রোগুলো tombstone করে। |
| compact | ডেল্টাকে বেস সেগমেন্টে ভাঁজ করে; tombstone করা ও superseded সংস্করণ বাদ দেয়। |
| build_ivf | রো থ্রেশহোল্ড ছাড়িয়ে যাওয়া পার্টিশনে per-partition IVF তৈরি করে, একটি recall floor-এর বিপরীতে ক্যালিব্রেট করা। |
| snapshot | একটি সামঞ্জস্যপূর্ণ রিড ভিউ পিন করে এমন LSN ফেরত দেয়। |
| save / stats | কালেকশন ডিস্কে সংরক্ষণ করে; রো কাউন্ট, পার্টিশন ও লেআউট তথ্য রিপোর্ট করে। |
নিচের সবকিছু স্পেসিফিকেশন, শিপড API রেফারেন্স নয়। এটি সেই substrate যার দিকে রানটাইম অগ্রসর হচ্ছে। SDK-facing seam স্থির, তাই নিচের পরিবর্তন কলারদের কাছে অদৃশ্য।
এক প্ল্যানার। এক flat IR। এক executor।
তিনটি ফ্রন্ট এন্ড এক প্ল্যানারে নামে, যা এক flat ফিজিক্যাল intermediate representation নির্গত করে, Arrow বাফারের উপর সরাসরি এক Mojo ভেক্টরাইজড executor দ্বারা কার্যকর হয়।
মেমরি মডেল (remember · recall · as_of), কোয়েরি API (point_get · scan · search · hybrid_search), এবং ফ্যাব্রিক। একটি এন্ট্রি কন্ট্র্যাক্ট; কোনো per-API ইঞ্জিন নেই।
লজিক্যাল ও ফিজিক্যাল প্ল্যানিং এক জায়গায়। সেগমেন্ট পরিসংখ্যান থেকে selectivity অনুমান করা হয়; প্ল্যান স্পষ্ট এবং ফলাফলের সাথে ফেরত আসে।
ইন্টিজার স্লট দ্বারা আবদ্ধ অপারেটরের একটি flat অ্যারে। inter-operator রেজিস্টার হলো একটি row set — একটি bitmap, sorted row-id, বা selection vector।
Arrow বাফার ও FAISS ক্যান্ডিডেট অ্যারের উপর ভেক্টরাইজড এক্সিকিউশন। SIMD হট পাথ Python-এর বাইরে থাকে; কম্প্রেসড Parquet পেজ প্রথমে স্ক্র্যাচ বাফারে ডিকোড হয়।
মিউটেশন লেয়ার
স্থায়িত্ব ও ক্রমবিন্যাসের জন্য একটি write-ahead log, এবং তাৎক্ষণিক দৃশ্যমানতার জন্য একটি mutable Arrow-আকৃতির ডেল্টা — Parquet একা যে টেবিল লেয়ার দিতে পারে না।
সিলড, অপরিবর্তনীয়
টেকসই কম্প্রেসড কলামার সেগমেন্ট। ফুটার পরিসংখ্যান সেগমেন্ট ও row-group pruning চালায়; সিলড ফাইল কখনো পরিবর্তিত হয় না।
FAISS ANN
Per-segment FAISS ইন্ডেক্স, সেগমেন্টের চেকসাম ও সংস্করণের সাথে আবদ্ধ, রিড স্ন্যাপশটের সাথে আজীবন যুক্ত read-only ম্যাপড।
Pruning ও লেক্সিক্যাল
Pruning-এর জন্য zone map, bloom filter ও bitmap; sparse retrieval ও score fusion-এর জন্য একটি BM25 sidecar।
SCAN FILTER PROJECT POINT_GET RANGE_GET AGGREGATE TOP_K HASH_JOIN HASH_GROUP_BY SORT ANN_SEARCH SPARSE_SEARCH FUSE RERANK MATERIALIZE
আগে WAL। তাৎক্ষণিক দৃশ্যমান। পটভূমিতে সিলড।
চেকসাম ও monotonic LSN সহ append-only ফ্রেম। রিকভারি শেষ সিলড LSN-এর পরের রেকর্ড রিপ্লে করে এবং প্রথম খারাপ চেকসামে ট্রাংকেট করে।
রাইট mutable ডেল্টায় পৌঁছায় এবং তাৎক্ষণিক কোয়েরিযোগ্য হয় — সিলড সেগমেন্ট ও ডেল্টা এক স্ক্যান পাথে মিলিত হয়।
আকার, সারি বা বয়সের সীমা অতিক্রম করলে, delta সাজিয়ে .vidx ও sidecar-সহ একটি Parquet সেগমেন্ট হিসেবে লেখা হয়, তারপর atomic manifest swap-এর মাধ্যমে প্রকাশিত হয়।
ব্যাকগ্রাউন্ড মার্জ ছোট সেগমেন্টগুলো একত্রিত করে, tombstone করা সারি বাদ দেয় এবং sidecar পুনর্নির্মাণ করে — বাজেট-নিয়ন্ত্রিত, তাই অন-ডিভাইস ডিপ্লয়মেন্ট নিরুপদ্রব থাকে।
Sealed সেগমেন্ট কখনো পরিবর্তিত হয় না। একটি রিড (manifest snapshot, LSN) পিন করে; রাইটাররা নতুন সেগমেন্ট seal করে এবং চলমান রিডারদের বিঘ্নিত না করে manifest swap করে। Garbage collection সবচেয়ে পুরনো সক্রিয় snapshot-এর জন্য অপেক্ষা করে।
ফিল্টারই পরিকল্পনা বেছে নেয়, উল্টোটা নয়।
Filtered ANN হলো selectivity-ভিত্তিক adaptive planning: planner সেগমেন্ট পরিসংখ্যান থেকে অনুমান করে কতটি সারি ফিল্টার পেরিয়ে টিকবে, তারপর recall চুক্তি বজায় রাখে এমন সবচেয়ে সাশ্রয়ী কৌশল বেছে নেয়।
প্রি-ফিল্টার → এক্সাক্ট
প্রথমে scalar বা bitmap prefilter, তারপর টিকে থাকা সারিগুলোর উপর exact SIMD স্কোরিং। একটি সারির সীমার নিচে ANN সম্পূর্ণ বাদ — exact scan, recall 1.0।
Allow-bitmap ট্র্যাভার্সাল
ANN traversal একটি allow-bitmap বহন করে, ফলে ইন্ডেক্স কেবল ফিল্টার-অনুমোদিত সারিগুলোই উপস্থাপন করে।
ANN → পোস্ট-ফিল্টার
প্রথমে adaptive over-fetch সহ ANN, তারপর post-filter। ফিল্টার সামান্যই বাদ দেয়, তাই candidate generation এগিয়ে থাকে।
গতির সংখ্যার আগে আসে correctness gate।
শিপ করা runtime উভয় ইঞ্জিন বাস্তবায়নের বিপরীতে চালানো parity suite দ্বারা যাচাইকৃত, এবং প্রতিটি কোয়েরি তার নেওয়া physical plan নাম দিতে পারে। এখানে অপারেশনের ক্রম এটাই: আগে correctness gate, পরে পরিমাপ।
Benchmark একটি fairness চুক্তির অধীনে প্রকাশিত হয় — matched recall, matched hardware, transport-পৃথক ফলাফল, জয় / টাই / পরাজয় রিপোর্টসহ। প্রথম পরিমাপকৃত ফলাফল এখন benchmarks পেজে সরাসরি রয়েছে, প্রতিটি সংখ্যা তার পূর্ণ শর্তসহ: হার্ডওয়্যার, ডেটাসেট, ডাইমেনশন, selectivity, recall এবং transport। প্রতিটি গুণক তার পাশে উল্লিখিত শর্তের বাইরে একটি অনুমান মাত্র।