মেকানিজম · 0.1.0b4

একটি ডিরেক্টরি লুকআপ।
একটি সংলগ্ন স্ক্যান।

ফিল্টারড ভেক্টর সার্চ সাধারণত এমন একটি ইনডেক্সে স্ক্যাটার-গ্যাদার যা আপনার ফিল্টার সম্পর্কে কিছু জানে না। Telys পরিবর্তে ফিজিক্যাল লেআউটের মালিক: পার্টিশন কী-তে, nearest-neighbours-where-key-equals-x হলো একটি O(1) ডিরেক্টরি লুকআপ এবং একটি সংলগ্ন ব্লকের একটি সিকোয়েন্শিয়াল স্ক্যান। এই পেজটি আজ শিপ করা রানটাইম, তারপর এটি যে আর্কিটেকচারের দিকে এগোচ্ছে তা দেখায় — স্পেক হিসেবে চিহ্নিত।

Panel 01 · আজ — শিপড রানটাইম
01 ফিজিক্যাল লেআউট

ইঞ্জিন প্রতিটি ভেক্টরের অবস্থানের মালিক।

একটি কালেকশন তৈরির সময় partition_by ঘোষণা করে, এবং লেআউট কী অনুসরণ করে। বেস সেগমেন্ট পার্টিশন অনুযায়ী ক্লাস্টারড — প্রতিটি কী একটি সংলগ্ন স্লাইসে ম্যাপ হয় — এবং সাম্প্রতিক রাইটগুলো তার পাশে একটি মিউটেবল, Arrow-আকৃতির ডেল্টায় থাকে।

বেস সেগমেন্ট

পার্টিশন-ক্লাস্টারড

ভেক্টরগুলো পার্টিশন কী অনুযায়ী সাজানো, তাই প্রতিটি পার্টিশন একটি সংলগ্ন ব্লক। একটি স্কোপড কোয়েরি মেমরির একটি সিকোয়েন্শিয়াল রান পড়ে, ইনডেক্সে ছড়িয়ে থাকা রো নয়।

পার্টিশন ডিরেক্টরি

O(1) key → slice

একটি ডিরেক্টরি প্রতিটি পার্টিশন মানকে বেস সেগমেন্টে তার (offset, length)-এ ম্যাপ করে। ফিল্টার রিজলভ করা একটি ডিকশনারি লুকআপ, ইনডেক্স ট্র্যাভার্সাল নয়।

মিউটেবল ডেল্টা

Arrow-আকৃতির রাইট

add ও upsert এখানে অ্যাপেন্ড করে, প্রতিটি রো একটি মনোটোনিক রাইট LSN দিয়ে স্ট্যাম্পড। ডেল্টা তাৎক্ষণিক কোয়েরিযোগ্য এবং একটি স্ক্যান পাথের মাধ্যমে বেস স্লাইসের সাথে ইউনিয়ন করে।

02 রিড পাথ

একটি স্কোপড কোয়েরি যা এক্সিকিউট করে।

কোয়েরি

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-আকৃতির ডেল্টার রোগুলো একই পথে স্কোর করা হয়। একটি রাইট পরবর্তী কোয়েরিতেই দৃশ্যমান হয়।

MVCC দৃশ্যমানতা

স্ন্যাপশট LSN-এ হিট ফিল্টার করা হয়: tombstone করা ও superseded সংস্করণ কখনো উঠে আসে না। Top-k ফলাফল explain পেলোড সহ ফেরত আসে।

অতিরিক্ত বড় পার্টিশন একটি ঘোষিত ফর্ক নেয়: build_ivf রো থ্রেশহোল্ড ছাড়িয়ে যাওয়া যেকোনো পার্টিশনে per-partition IVF স্থাপন করে, এবং কোয়েরিগুলো exact rerank সহ সেই পথে রুট হয় — একটি recall floor-এর বিপরীতে ক্যালিব্রেট করা, এবং প্ল্যানে নামকরণ করা।

03 explain শাখা

প্রতিটি ফলাফল তার প্ল্যান জানায়।

explain=True কোয়েরি আসলে যে ফিজিক্যাল প্ল্যান নিয়েছে তা ফেরত দেয়। পার্টিশন কী-তে আপনি পাবেন contiguous-slice স্ক্যান। অতিরিক্ত বড় পার্টিশন IVF ফর্ক ঘোষণা করে। অফ-কী ফিল্টার scatter-gather-এ ফলব্যাক করে — এবং পেলোড জানায় কেন।

explain
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"
04 রাইট ও সময়

কিছুই ওভাররাইট হয় না। সংস্করণ superseded হয়।

রাইট মডেলটি append-only MVCC। upsert একটি logical id-এর নতুন সংস্করণ লেখে এবং আগেরটিকে superseded চিহ্নিত করে; delete একটি delete LSN-এ tombstone স্থাপন করে; snapshot() একটি সামঞ্জস্যপূর্ণ রিড ভিউ পিন করে; compact() ডেল্টাকে বেসে ভাঁজ করে এবং কোনো স্ন্যাপশট দেখতে পাবে না এমন সব কিছু বাদ দেয়।

python
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কালেকশন ডিস্কে সংরক্ষণ করে; রো কাউন্ট, পার্টিশন ও লেআউট তথ্য রিপোর্ট করে।
Panel 02 · দিকনির্দেশনা — আর্কিটেকচার স্পেক

নিচের সবকিছু স্পেসিফিকেশন, শিপড API রেফারেন্স নয়। এটি সেই substrate যার দিকে রানটাইম অগ্রসর হচ্ছে। SDK-facing seam স্থির, তাই নিচের পরিবর্তন কলারদের কাছে অদৃশ্য।

05 লক্ষ্য substrate

এক প্ল্যানার। এক flat IR। এক executor।

তিনটি ফ্রন্ট এন্ড এক প্ল্যানারে নামে, যা এক flat ফিজিক্যাল intermediate representation নির্গত করে, Arrow বাফারের উপর সরাসরি এক Mojo ভেক্টরাইজড executor দ্বারা কার্যকর হয়।

ফ্রন্ট এন্ড

মেমরি মডেল (remember · recall · as_of), কোয়েরি API (point_get · scan · search · hybrid_search), এবং ফ্যাব্রিক। একটি এন্ট্রি কন্ট্র্যাক্ট; কোনো per-API ইঞ্জিন নেই।

এক প্ল্যানার

লজিক্যাল ও ফিজিক্যাল প্ল্যানিং এক জায়গায়। সেগমেন্ট পরিসংখ্যান থেকে selectivity অনুমান করা হয়; প্ল্যান স্পষ্ট এবং ফলাফলের সাথে ফেরত আসে।

এক flat IR

ইন্টিজার স্লট দ্বারা আবদ্ধ অপারেটরের একটি flat অ্যারে। inter-operator রেজিস্টার হলো একটি row set — একটি bitmap, sorted row-id, বা selection vector।

এক Mojo executor

Arrow বাফার ও FAISS ক্যান্ডিডেট অ্যারের উপর ভেক্টরাইজড এক্সিকিউশন। SIMD হট পাথ Python-এর বাইরে থাকে; কম্প্রেসড Parquet পেজ প্রথমে স্ক্র্যাচ বাফারে ডিকোড হয়।

Arrow ডেল্টা + WAL

মিউটেশন লেয়ার

স্থায়িত্ব ও ক্রমবিন্যাসের জন্য একটি write-ahead log, এবং তাৎক্ষণিক দৃশ্যমানতার জন্য একটি mutable Arrow-আকৃতির ডেল্টা — Parquet একা যে টেবিল লেয়ার দিতে পারে না।

Parquet সেগমেন্ট

সিলড, অপরিবর্তনীয়

টেকসই কম্প্রেসড কলামার সেগমেন্ট। ফুটার পরিসংখ্যান সেগমেন্ট ও row-group pruning চালায়; সিলড ফাইল কখনো পরিবর্তিত হয় না।

.vidx সাইডকার

FAISS ANN

Per-segment FAISS ইন্ডেক্স, সেগমেন্টের চেকসাম ও সংস্করণের সাথে আবদ্ধ, রিড স্ন্যাপশটের সাথে আজীবন যুক্ত read-only ম্যাপড।

স্কেলার + স্পার্স সাইডকার

Pruning ও লেক্সিক্যাল

Pruning-এর জন্য zone map, bloom filter ও bitmap; sparse retrieval ও score fusion-এর জন্য একটি BM25 sidecar।

flat IR — অপারেটর সেট
SCAN  FILTER  PROJECT  POINT_GET  RANGE_GET  AGGREGATE  TOP_K
HASH_JOIN  HASH_GROUP_BY  SORT
ANN_SEARCH  SPARSE_SEARCH  FUSE  RERANK  MATERIALIZE
06 রাইট পাথ

আগে WAL। তাৎক্ষণিক দৃশ্যমান। পটভূমিতে সিলড।

WAL append

চেকসাম ও monotonic LSN সহ append-only ফ্রেম। রিকভারি শেষ সিলড LSN-এর পরের রেকর্ড রিপ্লে করে এবং প্রথম খারাপ চেকসামে ট্রাংকেট করে।

Arrow delta

রাইট mutable ডেল্টায় পৌঁছায় এবং তাৎক্ষণিক কোয়েরিযোগ্য হয় — সিলড সেগমেন্ট ও ডেল্টা এক স্ক্যান পাথে মিলিত হয়।

ব্যাকগ্রাউন্ড সিল

আকার, সারি বা বয়সের সীমা অতিক্রম করলে, delta সাজিয়ে .vidx ও sidecar-সহ একটি Parquet সেগমেন্ট হিসেবে লেখা হয়, তারপর atomic manifest swap-এর মাধ্যমে প্রকাশিত হয়।

Compaction

ব্যাকগ্রাউন্ড মার্জ ছোট সেগমেন্টগুলো একত্রিত করে, tombstone করা সারি বাদ দেয় এবং sidecar পুনর্নির্মাণ করে — বাজেট-নিয়ন্ত্রিত, তাই অন-ডিভাইস ডিপ্লয়মেন্ট নিরুপদ্রব থাকে।

Sealed সেগমেন্ট কখনো পরিবর্তিত হয় না। একটি রিড (manifest snapshot, LSN) পিন করে; রাইটাররা নতুন সেগমেন্ট seal করে এবং চলমান রিডারদের বিঘ্নিত না করে manifest swap করে। Garbage collection সবচেয়ে পুরনো সক্রিয় snapshot-এর জন্য অপেক্ষা করে।

07 পরিকল্পনা হিসেবে Filtered ANN

ফিল্টারই পরিকল্পনা বেছে নেয়, উল্টোটা নয়।

Filtered ANN হলো selectivity-ভিত্তিক adaptive planning: planner সেগমেন্ট পরিসংখ্যান থেকে অনুমান করে কতটি সারি ফিল্টার পেরিয়ে টিকবে, তারপর recall চুক্তি বজায় রাখে এমন সবচেয়ে সাশ্রয়ী কৌশল বেছে নেয়।

Selective

প্রি-ফিল্টার → এক্সাক্ট

প্রথমে scalar বা bitmap prefilter, তারপর টিকে থাকা সারিগুলোর উপর exact SIMD স্কোরিং। একটি সারির সীমার নিচে ANN সম্পূর্ণ বাদ — exact scan, recall 1.0।

Moderate

Allow-bitmap ট্র্যাভার্সাল

ANN traversal একটি allow-bitmap বহন করে, ফলে ইন্ডেক্স কেবল ফিল্টার-অনুমোদিত সারিগুলোই উপস্থাপন করে।

Broad

ANN → পোস্ট-ফিল্টার

প্রথমে adaptive over-fetch সহ ANN, তারপর post-filter। ফিল্টার সামান্যই বাদ দেয়, তাই candidate generation এগিয়ে থাকে।

08 স্ট্যাটাস

গতির সংখ্যার আগে আসে correctness gate।

শিপ করা runtime উভয় ইঞ্জিন বাস্তবায়নের বিপরীতে চালানো parity suite দ্বারা যাচাইকৃত, এবং প্রতিটি কোয়েরি তার নেওয়া physical plan নাম দিতে পারে। এখানে অপারেশনের ক্রম এটাই: আগে correctness gate, পরে পরিমাপ।

Benchmark একটি fairness চুক্তির অধীনে প্রকাশিত হয় — matched recall, matched hardware, transport-পৃথক ফলাফল, জয় / টাই / পরাজয় রিপোর্টসহ। প্রথম পরিমাপকৃত ফলাফল এখন benchmarks পেজে সরাসরি রয়েছে, প্রতিটি সংখ্যা তার পূর্ণ শর্তসহ: হার্ডওয়্যার, ডেটাসেট, ডাইমেনশন, selectivity, recall এবং transport। প্রতিটি গুণক তার পাশে উল্লিখিত শর্তের বাইরে একটি অনুমান মাত্র।

benchmark পদ্ধতি পড়ুনপণ্যের পরিধি দেখুন