Skip to content

feat(ai): expose configurable HNSW search breadth - #438

Merged
jimezesinachi merged 2 commits into
mainfrom
feat/ai-hnsw-ef-search
Oct 9, 2026
Merged

jimezesinachi merged 2 commits into
mainfrom
feat/ai-hnsw-ef-search

Conversation

@jimezesinachi

Copy link
Copy Markdown
Collaborator

AI searches currently omit DB's configurable HNSW search breadth, so callers cannot tune ef_search through the AI API. Add optional ef_search to AI GetSimN and forward it unchanged to DB. Reject zero before model inference; omission preserves the server default max(closest_n, 50), and DB raises positive values to at least closest_n for HNSW. Other algorithms ignore positive values.

Update Rust, Python, Go, and TypeScript bindings, existing Rust request constructors, and the similarity-search parameter documentation. Existing DSL queries continue to omit the field.

Validation:

  • Focused AI test passed: optional-field roundtrips and rejection of zero before inference, without loading models.
  • All 38 DSL tests passed.
  • Python AI request and pipeline roundtrips passed.
  • Go AI query and service bindings compiled.
  • Rust/Python formatting and diff whitespace checks passed.

Signed-off-by: Jim Ezesinachi <ezesinachijim@gmail.com>
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Test Results

508 tests   508 ✅  21m 56s ⏱️
 43 suites    0 💤
  4 files      0 ❌

Results for commit e886bc1.

♻️ This comment has been updated with latest results.

Signed-off-by: Jim Ezesinachi <ezesinachijim@gmail.com>
@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Benchmark Results

group                                                        main                                   pr
-----                                                        ----                                   --
predicate_query_with_index/size_100                          1.07      2.7±0.01µs        ? ?/sec    1.00      2.5±0.00µs        ? ?/sec
predicate_query_with_index/size_1000                         1.02     25.4±0.05µs        ? ?/sec    1.00     24.9±0.05µs        ? ?/sec
predicate_query_with_index/size_10000                        1.00    250.7±0.20µs        ? ?/sec    1.00    250.9±1.08µs        ? ?/sec
predicate_query_with_index/size_100000                       1.03      4.9±0.17ms        ? ?/sec    1.00      4.8±0.22ms        ? ?/sec
predicate_query_without_index/size_100                       1.02      5.1±0.00µs        ? ?/sec    1.00      5.0±0.00µs        ? ?/sec
predicate_query_without_index/size_1000                      1.01     46.9±0.18µs        ? ?/sec    1.00     46.6±0.03µs        ? ?/sec
predicate_query_without_index/size_10000                     1.01    835.4±5.71µs        ? ?/sec    1.00    823.7±3.05µs        ? ?/sec
predicate_query_without_index/size_100000                    1.05     33.4±1.19ms        ? ?/sec    1.00     31.9±0.73ms        ? ?/sec
store_batch_insertion_without_predicates/size_100            1.00    158.3±0.43µs        ? ?/sec    1.00    157.8±1.23µs        ? ?/sec
store_batch_insertion_without_predicates/size_1000           1.00    963.9±4.59µs        ? ?/sec    1.01    969.1±4.42µs        ? ?/sec
store_batch_insertion_without_predicates/size_10000          1.00     10.8±0.06ms        ? ?/sec    1.00     10.9±0.03ms        ? ?/sec
store_batch_insertion_without_predicates/size_100000         1.00    108.7±1.02ms        ? ?/sec    1.00    109.1±1.19ms        ? ?/sec
store_retrieval_linear_cosine_similarity/size_100            1.00     16.9±0.05µs        ? ?/sec    1.00     17.0±0.03µs        ? ?/sec
store_retrieval_linear_cosine_similarity/size_1000           1.00    102.0±0.32µs        ? ?/sec    1.00    101.9±0.53µs        ? ?/sec
store_retrieval_linear_cosine_similarity/size_10000          1.00   1460.4±9.35µs        ? ?/sec    1.01   1478.4±7.92µs        ? ?/sec
store_retrieval_linear_cosine_similarity/size_100000         1.00     22.1±0.15ms        ? ?/sec    1.01     22.4±0.20ms        ? ?/sec
store_retrieval_linear_dot_product/size_100                  1.00     15.0±0.01µs        ? ?/sec    1.03     15.5±0.02µs        ? ?/sec
store_retrieval_linear_dot_product/size_1000                 1.00     97.5±0.39µs        ? ?/sec    1.00     97.0±0.37µs        ? ?/sec
store_retrieval_linear_dot_product/size_10000                1.00   1238.3±6.67µs        ? ?/sec    1.03   1272.4±9.94µs        ? ?/sec
store_retrieval_linear_dot_product/size_100000               1.00     20.6±0.15ms        ? ?/sec    1.00     20.6±0.33ms        ? ?/sec
store_retrieval_linear_euclidean_distance/size_100           1.00     15.2±0.04µs        ? ?/sec    1.05     15.9±0.01µs        ? ?/sec
store_retrieval_linear_euclidean_distance/size_1000          1.02     99.7±0.38µs        ? ?/sec    1.00     98.0±0.59µs        ? ?/sec
store_retrieval_linear_euclidean_distance/size_10000         1.01  1351.0±12.27µs        ? ?/sec    1.00   1334.8±6.23µs        ? ?/sec
store_retrieval_linear_euclidean_distance/size_100000        1.01     22.1±0.19ms        ? ?/sec    1.00     21.8±0.09ms        ? ?/sec
store_retrieval_no_condition/size_100                        1.00     17.0±0.01µs        ? ?/sec    1.00     17.0±0.02µs        ? ?/sec
store_retrieval_no_condition/size_1000                       1.00    102.6±0.47µs        ? ?/sec    1.00    102.3±0.56µs        ? ?/sec
store_retrieval_no_condition/size_10000                      1.00  1458.8±16.37µs        ? ?/sec    1.00  1457.6±11.14µs        ? ?/sec
store_retrieval_no_condition/size_100000                     1.00     22.9±0.23ms        ? ?/sec    1.01     23.0±0.06ms        ? ?/sec
store_retrieval_non_linear_hnsw/size_100                     1.02    125.1±0.27µs        ? ?/sec    1.00    122.9±0.15µs        ? ?/sec
store_retrieval_non_linear_hnsw/size_1000                    1.00    260.1±0.11µs        ? ?/sec    1.00    260.3±0.96µs        ? ?/sec
store_retrieval_non_linear_hnsw/size_10000                   1.00    397.9±0.13µs        ? ?/sec    1.14    453.7±4.10µs        ? ?/sec
store_retrieval_non_linear_hnsw/size_100000                  1.14    498.9±2.75µs        ? ?/sec    1.00    438.4±4.16µs        ? ?/sec
store_retrieval_non_linear_kdtree/size_100                   1.00    170.2±0.15µs        ? ?/sec    1.00    171.0±0.07µs        ? ?/sec
store_retrieval_non_linear_kdtree/size_1000                  1.00    964.2±2.94µs        ? ?/sec    1.00    967.2±0.58µs        ? ?/sec
store_retrieval_non_linear_kdtree/size_10000                 1.00     11.0±0.13ms        ? ?/sec    1.01     11.1±0.06ms        ? ?/sec
store_retrieval_non_linear_kdtree/size_100000                1.01    129.9±1.20ms        ? ?/sec    1.00    129.1±0.70ms        ? ?/sec
store_sequential_insertion_without_predicates/size_100       1.00    217.3±0.43µs        ? ?/sec    1.00    217.7±0.32µs        ? ?/sec
store_sequential_insertion_without_predicates/size_1000      1.00      2.2±0.00ms        ? ?/sec    1.00      2.2±0.00ms        ? ?/sec
store_sequential_insertion_without_predicates/size_10000     1.00     21.7±0.06ms        ? ?/sec    1.00     21.8±0.01ms        ? ?/sec
store_sequential_insertion_without_predicates/size_100000    1.00    218.5±0.57ms        ? ?/sec    1.00    219.1±0.07ms        ? ?/sec

@jimezesinachi
jimezesinachi merged commit b84baef into main Oct 9, 2026
10 checks passed
@jimezesinachi
jimezesinachi deleted the feat/ai-hnsw-ef-search branch October 9, 2026 20:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants