From: Vsevolod Stakhov Date: Tue, 10 Mar 2026 17:35:51 +0000 (+0000) Subject: [Fix] Fix external neural model merge defects X-Git-Tag: 4.0.0~42^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1f0bcf3b2543762493471c416adae6153fbcef29;p=thirdparty%2Frspamd.git [Fix] Fix external neural model merge defects - 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 --- diff --git a/src/lua/lua_kann.c b/src/lua/lua_kann.c index 51742b22fb..a4b220db1d 100644 --- a/src/lua/lua_kann.c +++ b/src/lua/lua_kann.c @@ -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 +} diff --git a/src/plugins/lua/neural.lua b/src/plugins/lua/neural.lua index e5b3d04763..42f81cfac9 100644 --- a/src/plugins/lua/neural.lua +++ b/src/plugins/lua/neural.lua @@ -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