]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Fix] Fix external neural model merge defects
authorVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 10 Mar 2026 17:35:51 +0000 (17:35 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 10 Mar 2026 17:35:51 +0000 (17:35 +0000)
- merge_weights returns boolean, not ANN object: use ext_ann directly
- Add missing digest/symbols/distance fields for external-only set.ann
- Fix inverted alpha in merge call (alpha meant external weight, not local)
- Add missing newline at EOF in lua_kann.c

src/lua/lua_kann.c
src/plugins/lua/neural.lua

index 51742b22fba0a761c89ed5966f042ea9e001cc9e..a4b220db1d938ab40faeece4238a453285afc52c 100644 (file)
@@ -1504,4 +1504,4 @@ lua_kann_is_compatible(lua_State *L)
        else {
                return luaL_error(L, "invalid arguments: two kann objects required");
        }
-}
\ No newline at end of file
+}
index e5b3d04763884e120256a89560f6b58eff17db7f..42f81cfac91a8b884fff0a7f08180517fbaa2f66 100644 (file)
@@ -783,10 +783,12 @@ local function apply_external_model(rule, set, model, ev_base)
       return true
     end
 
-    -- Merge weights
+    -- Merge weights (modifies ext_ann in place, returns boolean)
+    -- C merge: w_dst = (1-a)*w_dst + a*w_src, so to get alpha*ext + (1-alpha)*local
+    -- we pass (1 - alpha) as the C alpha parameter
     local alpha = ext_cfg.merge_alpha or 0.5
-    local merged, merge_err = ext_ann:merge_weights(set.ann.ann, alpha)
-    if not merged then
+    local merge_ok, merge_err = ext_ann:merge_weights(set.ann.ann, 1.0 - alpha)
+    if not merge_ok then
       rspamd_logger.errx(rspamd_config, 'failed to merge ANNs for %s:%s: %s',
         rule.prefix, set.name, merge_err or "unknown")
       return false
@@ -796,8 +798,8 @@ local function apply_external_model(rule, set, model, ev_base)
       'merged external model (version=%s, alpha=%s) with local ANN for %s:%s',
       model.model_version, alpha, rule.prefix, set.name)
 
-    -- Update ANN reference
-    set.ann.ann = merged
+    -- Update ANN reference (merge_weights modifies ext_ann in place)
+    set.ann.ann = ext_ann
     set.ann.version = (set.ann.version or 0) + 1
     set.ann.external_version = model.model_version
     set.ann.external_source = ext_cfg.url
@@ -823,6 +825,9 @@ local function apply_external_model(rule, set, model, ev_base)
       external_source = ext_cfg.url,
       ann = ext_ann,
       providers_digest = ext_cfg.providers_digest,
+      digest = 'external:' .. (model.model_version or '0'),
+      symbols = set.symbols,
+      distance = 0,
     }
 
     -- Store base model for future re-merge