Tags: anatolykoptev/memdb
Tags
fix(goreleaser): rename archives to strip -SNAPSHOT-<sha> suffix
v0.23.0 — M10 user_profiles + perf + security audit (72.5% LLM Judge) Headline: 72.5% LLM Judge on LoCoMo chat-50 stratified (excl cat-5, Memobase methodology). Up from M9 70.0% (+2.5pp). Position: between MemOS (73.31%) and Zep (75.14%); -3.28pp behind Memobase leader (75.78%). What shipped (8 streams + 5 audit fixes): - S1 user_profiles schema + cube_id security fix (#121, #129) - S2 PROFILE-EXTRACT — Memobase verbatim prompt extractor (#124) - S3 PROFILE-RETRIEVE — chat prompt injection (#123) - S4 LEVELS-API — l1/l2/l3 query param (#122) - S5 HELM chart for K8s install (#120) - S6 CE-PRECOMPUTE — pre-compute pairwise CE scores at D3 (#125) - S7 PageRank background goroutine + D1 boost (#127, #132) - S8 REWARD-SCAFFOLD — feedback_events tables (#128) - C1+C2+C3+I4+P3 — security audit fixes Performance: 7.5x faster ingest (40min vs 5h M9). Pure-Go stack. See docs/release-notes/v0.23.0.md for full notes.
chore(locomo): polish dual-speaker harness — drop walrus, unused para… …m, magic constant (#95) Follow-up to PR #89 quality review (3 Minor items from reviewer): - test_query_dual.py: drop unused walrus binding - query.py: drop unused `query` parameter from _build_dual_speaker_system_prompt - query.py: promote magic 0.99 threshold to _CHAT_RETRIEVAL_SUPPRESS_THRESHOLD constant Co-authored-by: Anatoly Koptev <anatolykoptev@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
chore(release): m9 stage 3 v3 final numbers — 70% llm judge headline (#… …116) Write verified M9 Stage 3 v3 benchmark numbers into all release docs: - MILESTONES.md: new 2026-04-26 section with chat-50 + retrieval-only tables and public leaderboard comparison (between Mem0 66.88% and MemOS 73.31%) - CHANGELOG.md: prepend "Headline result" subsection to v0.22.0 entry - docs/release-notes/v0.22.0.md: replace "measurement in flight" placeholder with actual ## Headline benchmark result section (70.0% LLM Judge table) - README.md: update comparison table row from TBD to 70.0% (excl cat-5) Add result artifacts (git add -f to override gitignore): - m9-stage3-v3-retrieval.json (25M, 1986 predictions) - m9-stage3-v3-retrieval-score.json (1.5M) - m9-stage3-v3-chat50-preds.json (971K) - m9-stage3-v3-chat50-score.json (33K) - m9-stage3-v3-summary.md Co-authored-by: Anatoly Koptev <anatolykoptev@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(search): cross-encoder rerank via embed-server /v1/rerank
* feat(feedback): NativeFeedback skeleton + validation + response types
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(search): CrossEncoderRerank HTTP client for embed-server /v1/rerank
Adds a best-effort cross-encoder reranker backed by embed-server's Cohere-
compatible /v1/rerank endpoint (BGE-reranker-v2-m3).
Design:
- Pure HTTP client + reorder logic, no service coupling yet (wired in CE3).
- Empty URL or any error returns input unchanged, the pipeline keeps going.
- MaxDocs caps the documents shipped over the wire (default 50) so a large
top-K of multi-KB memories cannot blow up embed-server tokenization.
- Items missing the text field pass through unchanged.
- On success overwrites metadata.relativity with the CE score and sets
metadata.cross_encoder_reranked=true.
- Errors go through slog.Default().Warn for ops visibility (LLMRerank is
silent; CE errors are rarer and worth surfacing).
Tests cover: reorder, empty input, no URL, HTTP 5xx, timeout, MaxDocs cap,
items missing the text key.
* feat(config): CROSS_ENCODER_* env vars for cross-encoder rerank
Wires the step-6.05 cross-encoder reranker into the search service with
sensible defaults. No SearchParams flag — the env is the on/off knob so
every handler, MCP path, and profile gets consistent behavior.
Env vars (with defaults):
CROSS_ENCODER_URL http://embed-server:8082
CROSS_ENCODER_MODEL bge-reranker-v2-m3
CROSS_ENCODER_TIMEOUT_MS 2000
CROSS_ENCODER_MAX_DOCS 50
Changes:
- Config struct: adds CrossEncoderURL/Model/Timeout/MaxDocs fields.
- Load(): reads the env vars with defaults above.
- SearchService: adds CrossEncoder CrossEncoderConfig field (zero value = off).
- server_init_search: populates svc.CrossEncoder when URL is non-empty and
logs the resulting configuration for operational visibility.
- config_test.go: covers default values, env overrides, and the empty-env
fallback behavior.
* fix(feedback): use writeJSON envelope for 500 response (review I1)
* fix(ci): errcheck excludes for Close/Fprint — idiomatic ignorables
* feat(search): add step 6.05 cross-encoder rerank before LLM rerank
Wires the cross-encoder into the main pipeline. The new step:
- Runs AFTER cosine (step 6) and BEFORE LLM rerank (step 6.1).
- Applies to text_mem only (skill/tool/pref keep cosine ordering).
- Gated solely on s.CrossEncoder.URL != "" and len(text) > 1, so no
SearchParams flag is needed. Env is the on/off knob.
- Overwrites metadata.relativity with the CE score so downstream steps
(temporal decay, relativity threshold) operate on the sharper signal.
- ceRerankDur is added to the postProcessResults return tuple and logged
alongside llm_rerank and iterative timings.
Also fixes a latent sort bug in cross_encoder_rerank.go: sorting the head
slice with an external scores array made Less/Swap inconsistent once any
elements were swapped. Now we build an index permutation ("order") from
scores, sort the permutation, then materialize the reordered slice so
scores[order[i]] always corresponds to the correct position.
Tests (cross_encoder_step_test.go):
- CrossEncoderCalledWhenURLSet: httptest stub, verifies text is reordered
by CE score after the full post-process chain runs.
- CrossEncoderSkippedWhenURLEmpty: zero-value config, verifies cosine
ordering is preserved and no cross_encoder_reranked flag is set.
- ReturnsCrossEncoderDuration: ceRerankDur > 0 when CE runs.
* docs(roadmap-search): Phase 3 cross-encoder rerank shipped (apr 2026)
Replaces the 'Phase 3 NLI Reranker deferred' section with the shipped
cross-encoder implementation:
- Renames phase to 'Cross-Encoder Reranker' and flips status to
Реализовано (апрель 2026).
- Documents embed-server /v1/rerank (Cohere-compatible) + BGE-reranker-v2-m3
as a concept superior to the original NLI path: reuses the existing
embed-server, is a state-of-the-art cross-encoder, and the API shape
allows drop-in replacement with commercial rerankers.
- Adds implementation details: file paths, env vars, MaxDocs guard, metadata
writeback, timing log, and the 7+3+3 test coverage breakdown.
- Adds the +3-5 points LoCoMo line to the 'Путь к лидерству' projection.
- Updates the Go-vs-Python-vs-MemOS feature table to include the
cross-encoder row with MemDB ✅ / MemOS ✅ (optional NLI).
* fix(ci): sync .golangci.yml with main (rebase took wrong side)
---------
Co-authored-by: Anatoly Koptev <anatolykoptev@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>