一个 crate,三种形态(零第三方依赖,std only):
| 形态 | 入口 | 用途 |
|---|---|---|
库 mdcg_eval |
src/lib.rs → engine::SearchEngine |
嵌入 Rust 宿主:大批量记忆检索、多线程并发 |
进程实例 --serve |
src/serve.rs |
每智能体一进程,stdin/stdout 逐行 JSON——语言无关的多智能体并发 |
评测器 mdcg-eval |
src/main.rs |
公开数据集评测(LoCoMo 等),与 Python 口径逐位对齐 |
读侧 only:写入(写入闸门/凭据/冲突检测)仍由 Python MCP 承担——职责分离,避免双写实现漂移。
[dependencies]
mdcg-eval = { path = "../dsh-memory/rust" }use mdcg_eval::{EngineConfig, SearchEngine};
let engine = SearchEngine::open("path/to/memory-root", &EngineConfig::default())?;
println!("docs={} 候选={}", engine.doc_count(), engine.candidate_count());
let hits = engine.search("评测复现脚本", 5);
for h in hits {
println!("{} {:.6} {} {}", h.score, h.score, h.layer, h.path);
}EngineConfig 字段(全部可选,缺省与 Python search_rrf 默认一致):
paths(参与融合的路,缺省四路)、weights(路权重覆盖)、fusion_max(每路先取前 50 再 RRF)、
jaccard(相似度口径,缺省 true)、graph_seeds_sorted、order(候选序)、threads(载入并行度)。
并发模型:SearchEngine 持全 owned 数据,search(&self) 纯读 → 自动 Send + Sync。
大批量检索 = 宿主持一个引擎 + 线程池并发调 search(索引只载入一次,零拷贝共享)。
cargo build --release
./target/release/mdcg-eval --serve --root /path/to/memory-root
# 无 Rust 工具链 / cargo 不在 PATH 时的等价做法见 §5「环境兜底」。进程存活 = 检索实例(模式参照 protocol-compiler 蜂群实例基座)。 多智能体并发 = 协调器 spawn N 个实例——索引只读共享,OS 页缓存复用,单实例崩溃不扩散。 Python 宿主示例:
import json, subprocess
p = subprocess.Popen(["mdcg-eval", "--serve", "--root", root],
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
text=True, encoding="utf-8")
def search(query, k=5):
p.stdin.write(json.dumps({"op": "search", "query": query, "k": k}) + "\n")
p.stdin.flush()
return json.loads(p.stdout.readline())协议(一行一请求,一行一响应;quit 或 EOF 退出):
| 请求 | 响应 |
|---|---|
{"op":"ping"} |
{"ok":true,"pong":true} |
{"op":"info"} |
{"ok":true,"root":...,"docs":N,"candidates":N,"paths":[...]} |
{"op":"search","query":"...","k":5} |
{"ok":true,"count":N,"took_ms":T,"hits":[{"id","path","layer","score"}...]} |
| 非法请求 | {"ok":false,"error":"..."} |
# 需 Rust 工具链;构建兜底见 §5。
cargo run --release -- --dataset lc # LoCoMo T-REC 三组 + 负例组
cargo run --release -- --n 2 # 2 题快速冒烟
cargo run --release -- --help # 全参数口径说明(paths/weights/fusion/jaccard/order/graph-seeds)见 --help 与 docs/ 评测报告;
结果落 data/external/eval_results/。
- 检索编排与评测 CLI
main.rs::search逐行一致;文本/存储层与 Pythonmd_cg逐函数对齐(text.rs/store.rs头注释标注了对应 Python 源位置)。 - 任何口径改动必须评测 CLI 与库两边同步,否则评测分数与线上检索漂移。
- 零第三方依赖(D-005):评测机离线可构建。
本 crate 零第三方依赖(D-005),但仍需 Rust 工具链本身(cargo + rustc)。
| 情形 | 等价做法 |
|---|---|
已装 rustup,但 cargo 不在 PATH(Windows 常见:装完未重启终端) |
绝对路径:"%USERPROFILE%\.cargo\bin\cargo.exe" build --release(unix:~/.cargo/bin/cargo) |
| 完全未装 Rust | ① 装工具链 https://rustup.rs;或 ② 不构建——rust/ 是只读侧可选加速内核,Python 面 md_cg(mdcos.search_rrf)是等价检索本体(见 §4:文本/存储层与 Python md_cg 逐函数对齐),功能不缺失 |
| PATH 混乱 / 想固定版本 | rustup toolchain list、rustup default stable |
零第三方依赖 ≠ 零工具链:前者指不必联网拉 crate,后者指构建仍需
cargo。 已有产物路径:rust/target/release/mdcg-eval(Windows 为.exe)。
cargo test # 8 项:文本层 4 + 引擎 2(含多线程并发安全)+ serve 协议 2
cargo build --release