
后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载导读本文聚焦 xberg 在 C# 侧提供的重排序Reranker插件管理 API 中的ClearRerankerBackends()方法讲解如何一次性清空所有已注册的RerankerBackend实现并结合仓库源码剖析其从 C# 绑定层到 Rust 核心注册表的完整调用链、shutdown语义与测试验证。读完本文你将掌握 reranker 后端注册、注销、列出与清空这一组管理 API 的正确用法理解清空操作在进程内插件生命周期管理中的作用以及如何用 e2e 测试验证清空后的状态。Reranker 插件机制在 xberg 中的定位xberg 的 Rust 核心为文档处理提供了一套插件系统允许宿主语言在进程内注册自定义后端。其中RerankerBackend是用于对(query, document)对进行打分排序的进程内插件与基于 HTTP 的RerankerModelType::Llm路径互补宿主语言只需注册一次后续 xberg 在做独立 rerank 请求时会回调到该实现而不必再运行本地 ONNX 交叉编码器或调用外部 Provider API见 registry/reranker.rs 模块头注释。该机制的典型使用场景是调用方已经自行加载交叉编码器例如sentence-transformers、微调过的 ONNX 模型或某个 Provider 客户端将其封装为一个RerankerBackend实现并注册之后在配置中通过RerankerModelType::Plugin按名字引用见 plugins/reranker.rs。C# API一次调用清空全部注册项本文的主角来自自动生成的 API 片段文档 clear_reranker_backends.md其完整用法如下using Xberg; XbergConverter.ClearRerankerBackends();该调用对应场景为Clear all reranker backends and verify list is empty清空所有重排序后端并验证列表为空对应 fixture 定义在 clear_reranker_backends.json 中其断言仅有一条not_error即该方法必须能够在不抛异常的情况下完成清空操作。在 C# 绑定层中XbergConverter.ClearRerankerBackends()的实现位于 XbergConverter.cs/// summaryClear all registered RerankerBackend implementations/summary public static void ClearRerankerBackends() { RerankerBackendRegistry.Clear(); }也就是说XbergConverter是面向用户的静态门面facade真正的清空逻辑在RerankerBackendRegistry这个管理类中。底层调用链从 C# 到 Rust 核心注册表RerankerBackendRegistry.Clear()定义在 TraitBridges.cs其核心动作有两步/// summaryClear all registered RerankerBackend implementations/summary public static void Clear() { var result NativeMethods.ClearRerankerBackend(out var outError); if (result ! 0) { var errorMsg global::System.Runtime.InteropServices.Marshal.PtrToStringUTF8(outError) ?? Unknown error; global::System.Runtime.InteropServices.Marshal.FreeCoTaskMem(outError); throw new InvalidOperationException($Failed to clear RerankerBackend registry: {errorMsg}); } _bridges.Clear(); }通过 P/Invoke 调用 FFI 函数NativeMethods.ClearRerankerBackend声明见 NativeMethods.cs让 Rust 核心清空其全局注册表若 FFI 返回非 0 错误码则抛出InvalidOperationException成功后同步清空 C# 侧用于保持 bridge 存活的_bridges静态字典ConcurrentDictionarystring, RerankerBackendBridge。跨过 FFI 边界后Rust 核心对应入口是 plugins/reranker.rs 中的clear_reranker_backends()/// Clear all reranker backends from the global registry. /// /// Calls shutdown() on every registered backend, then empties the registry. pub fn clear_reranker_backends() - Result() { use crate::plugins::registry::get_reranker_backend_registry; let registry get_reranker_backend_registry(); let mut registry registry.write(); registry.shutdown_all() }该函数从全局单例中获取RwLockRerankerBackendRegistry的写锁然后调用shutdown_all()。这条调用链可以总结为XbergConverter.ClearRerankerBackends() └─ RerankerBackendRegistry.Clear() ├─ NativeMethods.ClearRerankerBackend() // FFI │ └─ clear_reranker_backends() // Rust 核心 │ └─ RerankerBackendRegistry::shutdown_all() └─ _bridges.Clear() // C# 侧 bridge 清理shutdown_all 的语义尽力而为、先清理再报告shutdown_all()的实现位于 registry/reranker.rs值得特别说明其错误处理语义pub fn shutdown_all(mut self) - Result() { let names: Vec_ self.backends.keys().cloned().collect(); let mut first_error: Optioncrate::XbergError None; for name in names { if let Some(backend) self.backends.remove(name) let Err(err) backend.shutdown() { if first_error.is_none() { first_error Some(err); } else { tracing::warn!(...); } } } match first_error { Some(err) Err(err), None Ok(()), } }从源码可以读出以下关键行为先移除、再 shutdown每个后端先被从backends字典中移除再调用其shutdown()保证即使某个后端shutdown失败注册表也不会残留半关闭但仍被索引的后端尽力而为best-effort即使某个后端返回错误其余后端仍会继续被 shutdown第一个错误被返回给调用方后续错误仅记录warn日志整体一致性无论是否发生错误注册表最终都会被清空——这正是 fixture 断言not_error之外隐含的不变量。另外注意RerankerBackendRegistry还提供了clear()作为shutdown_all()的别名供 alef trait-bridge 代码生成使用见 registry/reranker.rs。此外与OcrBackendRegistry不同RerankerBackendRegistry不注册任何默认后端——reranker 后端全部由宿主语言在运行时提供因此清空操作面对的是一个完全由用户管理的注册表见 registry/reranker.rs。与 Register / Unregister / List 的完整配合ClearRerankerBackends()是插件生命周期管理四件套中的一环。C# 侧对应的整套 API 均定义在 XbergConverter.cs操作C# API说明注册RegisterRerankerBackend(IntPtr handle)/RerankerBackendRegistry.Register(IRerankerBackend)将宿主语言的IRerankerBackend实现注册进 Rust 核心返回原生句柄注销UnregisterRerankerBackend(string name)按名字移除单个后端并调用其shutdown()列出ListRerankerBackends()返回所有已注册后端名字列表清空ClearRerankerBackends()一次性清空全部后端本文主题其中IRerankerBackend接口定义在 TraitBridges.cs宿主语言需要实现Name、Version、Initialize()、Shutdown()以及核心的Rerank(string Query, Liststring Documents)返回与输入文档一一对应的分数列表。对应的 Rust 侧 trait 契约要求rerank()返回的分数数量必须与输入文档数量一致且分数是原始 logit任意取值范围由 xberg 的调度器统一做 sigmoid 转换、降序排序和 top-k 截断见 plugins/reranker.rs。在典型流程中ClearRerankerBackends()通常用于热重载场景应用需要整体替换一批 reranker 后端例如切换到另一组模型配置先清空旧注册再重新注册新实现测试隔离单元测试或 e2e 测试套件在每个用例之间清空全局注册表避免用例间相互污染优雅关闭应用退出前清空注册表确保每个后端插件都能收到shutdown()通知以释放自身资源。测试验证单元测试与 e2e 测试的双重保障清空操作的正确性在两层测试中得到验证Rust 核心层单元测试在 plugins/reranker.rs 中的register_list_clear_list_roundtrip测试完整覆盖了注册 → 列出 → 清空 → 列出的往返流程#[test] fn register_list_clear_list_roundtrip() { let _guard RerankerRegistryGuard::acquire(); let name mock-reranker-clear.to_string(); register_reranker_backend(Arc::new(MockRerankerBackend { name: name.clone() })).unwrap(); assert_eq!(list_reranker_backends().unwrap(), vec![name]); clear_reranker_backends().unwrap(); assert!(list_reranker_backends().unwrap().is_empty()); }该测试证明了清空后list_reranker_backends()返回空列表与本文文档片段验证列表为空的语义完全对应。C# e2e 层测试在 RerankerBackendManagementTests.cs 中[Fact] public void Test_ClearRerankerBackends() { // Clear all reranker backends and verify list is empty var exception Record.Exception(() XbergConverter.ClearRerankerBackends()); Assert.Null(exception); }该测试直接对应 fixture clear_reranker_backends.json 中的not_error断言——清空操作即使在注册表为空时调用也必须成功、不抛异常这是幂等性的一种体现因为shutdown_all对空注册表就是简单返回Ok(())。注意事项与边界对空注册表调用是安全的shutdown_all遍历空集合后直接返回Ok(())C# 侧_bridges.Clear()同样对空字典无害因此ClearRerankerBackends()可以随时调用清理的是进程内注册表不是配置文件该操作只影响当前进程运行时注册的插件实例不会改动任何持久化配置shutdown 失败不会导致数据残留得益于先移除再 shutdown的顺序即便某个后端的Shutdown()抛错该后端也已从注册表移除不会出现幽灵条目C API 没有对应的清空函数根据 fixture 的coverage_exceptions说明见 clear_reranker_backends.json由于插件注册表接收宿主语言回调C API 不暴露注册调用因此也没有配对的 clear/unregister 调用C# 等其他语言绑定则完整保留该能力。小结XbergConverter.ClearRerankerBackends()虽然是一行简单的 C# 调用其背后是一条完整且经过测试加固的链路C# 静态门面 →RerankerBackendRegistry.Clear()→ FFI → Rust 核心clear_reranker_backends()→shutdown_all()的尽力而为清理。理解这条调用链及其语义可以帮助你在 C# 应用中安全、正确地管理 xberg 的重排序插件生命周期无论是热重载模型、隔离测试还是优雅退出都能得心应手。赞分享后端AI 应用NLP【免费下载链接】xbergPolyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with CLI, REST API, and MCP server.项目地址https://gitcode.com/gh_mirrors/kr/xberg点击查看免费下载相关推荐xberg C 插件 API 实战用 xberg_clear_embedding_backend 清空全局嵌入后端注册表xberg C 插件 API 实战用 xberg_clear_embedding_backend 清空全局嵌入后端注册表 本文围绕 xberg 的 C FFI后端AI 应用NLPUmi 项目如何接入 Vue 编写 .vue 页面与配置路由Umi 项目如何接入 Vue 编写 .vue 页面与配置路由 如果你的 Umi 项目里需要加入用 Vue 编写的 .vue 页面而不是全部使用 React官后端AI 应用NLPxberg C FFI用 xberg_clear_reranker_backend 清空 reranker 后端注册表xberg C FFI用 xberg_clear_reranker_backend 清空 reranker 后端注册表 在 xberg一个以 Rust 为核后端AI 应用NLP上一篇魔兽世界API与宏工具3分钟掌握游戏开发与战斗优化终极指南 下一篇5分钟掌握AI图像分层从单张图片到专业PSD的智能转换革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考