
后端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# 绑定提供的XbergConverter.ClearPostProcessors()方法展开讲解如何在 .NET 应用中一次性清空全部已注册的后处理器post-processor、其底层 Rust 注册表语义、与单点移除UnregisterPostProcessor的差异以及使用时的并发与恢复注意事项。读者读完本文后能够正确理解并安全调用该清理 API将其应用于插件生命周期管理、测试环境隔离和动态管线重置等实战场景。什么是后处理器Post-Processor以及为什么要清空它们在 Xberg 的多语言文档智能管线中提取引擎完成文档解析后会进入后处理阶段。后处理器是对ExtractedDocument结果做二次加工的插件组件典型能力包括关键词抽取、文本质量评估、摘要、翻译、标题生成captioning、二维码识别、命名实体识别NER、脱敏redaction等。这些处理器以插件形式注册到全局注册表中并由管线在执行提取时按快照方式调用。在以下场景中你需要一次性清空整个后处理器注册表插件生命周期管理宿主应用卸载或重载一组插件时需要把注册表恢复到空白状态避免残留处理器影响后续提取测试隔离E2E 测试中需要在每个用例前清空注册表确保用例之间互不污染仓库中的 C# 测试即为这一目的而调用该 API动态管线重置运行期切换“干净管线”或自定义处理器集合时先清空再按需注册清理自定义处理器但保留内置处理器与直觉不同ClearPostProcessors会连同内置处理器一起清空但下一次提取时会自动恢复内置处理器详见下文源码分析因此它也可以作为“回归默认内置集合”的手段。核心 API一段代码清空全部后处理器官方生成文档 post_processors_clear.md 给出的用法极为简洁using Xberg; XbergConverter.ClearPostProcessors();调用后所有已注册的后处理器包括用户通过RegisterPostProcessor注册的自定义处理器以及内置的自动注册处理器都会从注册表中移除ListPostProcessors()将返回空列表。该 API 是同步的、无返回值的并且是安全的副作用操作在官方文档的 fixture 元数据中标记为side_effect: saferequires: []意味着不依赖任何前置条件也不会对外部系统产生持久影响。对应的 E2E 测试位于 e2e/csharp/tests/PostProcessorManagementTests.cs其中Test_PostProcessorsClear用Record.Exception包裹调用并断言不抛出异常同时Test_PostProcessorsList验证ListPostProcessors()正常返回[Fact] public void Test_PostProcessorsClear() { // Clear all post-processors and verify list is empty var exception Record.Exception(() XbergConverter.ClearPostProcessors()); Assert.Null(exception); }调用链从 C# 到 Rust 注册表的三层旅程ClearPostProcessors并非孤立实现它的背后是一条完整的 FFI 调用链逐层深入可以看到清晰的职责划分公共门面层XbergConverter.ClearPostProcessors()定义在 packages/csharp/src/Xberg/XbergConverter.cs#L1961-L1964实现只有一行直接委托给PostProcessorRegistry.Clear()托管注册表层PostProcessorRegistry.Clear()定义在 packages/csharp/src/Xberg/TraitBridges.cs#L1617-L1627它做两件事——调用原生方法NativeMethods.ClearPostProcessor(out var outError)若返回非零错误码则抛出InvalidOperationException并携带 Rust 侧错误信息成功后清空托管侧的ConcurrentDictionarystring, PostProcessorBridge _bridges原生 FFI 层NativeMethods.ClearPostProcessor声明在 packages/csharp/src/Xberg/NativeMethods.cs#L996通过 P/Invoke 进入 Rust 核心的clear_post_processors函数定义见 crates/xberg/src/plugins/processor/mod.rs#L77-L81。// TraitBridges.cs 中 Clear 的核心逻辑 public static void Clear() { var result NativeMethods.ClearPostProcessor(out var outError); if (result ! 0) { var errorMsg Marshal.PtrToStringUTF8(outError) ?? Unknown error; Marshal.FreeCoTaskMem(outError); throw new InvalidOperationException($Failed to clear PostProcessor registry: {errorMsg}); } _bridges.Clear(); }这条链路体现了 Xberg 语言绑定的一致设计托管层负责桥接与错误翻译原生层负责真正的注册表状态变更。桥接层还通过PostProcessorBridge见 packages/csharp/src/Xberg/TraitBridges.cs#L1046-L1117维护一个 vtable 函数指针表把 C# 的IPostProcessor接口方法暴露给 Rust 侧调用。Rust 核心的注册表清空语义内置处理器会自动恢复从源码看Rust 侧的clear_post_processors与“仅移除单个处理器”的unregister_post_processor语义完全不同理解这一点对正确使用 C# API 至关重要// crates/xberg/src/plugins/processor/mod.rs /// Remove all registered post-processors. /// The next post-processed extraction restores enabled built-in processors before it snapshots /// the processor cache. Custom processors remain removed. pub fn clear_post_processors() - crate::Result() { use crate::plugins::registry::get_post_processor_registry; crate::core::pipeline::with_builtin_registration_recovery(|| get_post_processor_registry().write().shutdown_all()) }源码注释明确指出了关键行为清空是“彻底”的自定义处理器和内置处理器都会被移除注册表进入一个刻意为之的空状态内置处理器会在下一次提取时自动恢复下一次需要后处理的提取开始前管线会先恢复启用的内置处理器再对处理器缓存做快照而自定义处理器不会恢复它们保持被移除状态单点移除请用UnregisterPostProcessor如果只想让某一个命名处理器保持缺席、同时保留其余注册表内容应使用 crates/xberg/src/plugins/processor/mod.rs#L65-L69 的unregister_post_processor它会把该内置处理器名称加入抑制列表AUTOMATIC_REGISTRATION_SUPPRESSIONS直到被显式重新注册或被clear_post_processors整体重置。这一“清空后内置自动恢复、自定义保持移除”的机制由 crates/xberg/src/core/pipeline/initialization/mod.rs#L199-L208 的with_builtin_registration_recovery实现它先清空所有自动注册抑制项再置位BUILTIN_REGISTRATION_REQUIRED标志最后执行注册表的shutdown_all()。也就是说调用ClearPostProcessors并非永久禁用内置后处理能力——下一次提取管线会自动把它们“带回来”这是刻意设计而非缺陷。并发安全进行中的提取不会被打断后处理器在提取过程中会被快照并执行如果在快照执行期间清空注册表会导致运行中的提取引用已销毁的处理器。Rust 核心通过引用计数快照租约ProcessorSnapshotLease与ACTIVE_PROCESSOR_SNAPSHOTS计数器解决这一问题每次提取获取处理器快照时会递增ACTIVE_PROCESSOR_SNAPSHOTS见 crates/xberg/src/core/pipeline/initialization/mod.rs#L500当该计数器非零有提取正在进行时clear_post_processors会被拒绝执行返回可重试的“注册表使用中”registry-in-use错误C# 侧因此可能抛出InvalidOperationException提示清空操作失败——此时应在提取结束后重试。相关测试通过retry_while_registry_in_use(crate::plugins::clear_post_processors)模式验证了这一并发语义见 crates/xberg/src/core/pipeline/tests.rs#L397 等多处。这提醒 C# 开发者在生产环境调用ClearPostProcessors前应确保没有并发提取任务在运行或对可能的失败做好重试策略。与相邻注册表清理 API 的关系ClearPostProcessors并不是孤立的清理入口。在 packages/csharp/src/Xberg/XbergConverter.cs#L1955-L1993 中可以看到一组对称的清理方法它们共享同一设计模式委托给各自的托管注册表Clear()再进入原生层方法清理对象对应托管注册表ClearOcrBackends()OCR 后端OcrBackendRegistryClearPostProcessors()后处理器PostProcessorRegistryClearValidators()校验器ValidatorRegistryClearDocumentExtractors()文档提取器DocumentExtractorRegistryClearEmbeddingBackends()嵌入后端EmbeddingBackendRegistryClearRenderers()渲染器RendererRegistryClearRerankerBackends()重排序后端RerankerBackendRegistryClearTokenizerBackends()分词器后端TokenizerBackendRegistry如果你的业务需要同时重置多条插件线例如插件包整体卸载可以按需组合调用这些方法但请注意它们各自独立并不会级联清空其他注册表。完整实战示例插件卸载 管线重置下面是一个更完整的 C# 使用场景——在插件生命周期结束时清空后处理器注册表并验证结果using System; using Xberg; class PostProcessorResetDemo { static void Main() { // 1. 模拟注册一个自定义后处理器实现 IPostProcessor 的类 // XbergConverter.RegisterPostProcessor(handle); // 2. 查看当前注册情况 var before XbergConverter.ListPostProcessors(); Console.WriteLine($注册的后处理器数量: {before.Count}); // 3. 清空全部后处理器内置 自定义 XbergConverter.ClearPostProcessors(); // 4. 验证列表为空 var after XbergConverter.ListPostProcessors(); Console.WriteLine($清空后数量: {after.Count}); // 5. 说明下一次执行提取时启用的内置处理器会自动恢复 // 自定义处理器保持移除状态 } }使用时请注意ListPostProcessors()返回Liststring可用于在清空前记录/打印当前注册项见 packages/csharp/src/Xberg/XbergConverter.cs#L338-L340该方法没有返回值清空失败会以异常形式暴露例如并发提取进行中导致的 registry-in-use 错误若只想移除某个具名处理器而不影响其他处理器请改用XbergConverter.UnregisterPostProcessor(name)见 packages/csharp/src/Xberg/XbergConverter.cs#L1802-L1808。总结XbergConverter.ClearPostProcessors()是 Xberg C# 绑定提供的后处理器注册表整体重置入口用法一行即可完成但背后承载了精心设计的语义清空是彻底的、内置处理器会在下次提取时自动恢复、自定义处理器保持移除、并发提取期间清空会被拒绝并抛出可重试错误。理解这些行为后你就可以放心地把它用在插件生命周期管理、测试隔离与动态管线重置中并与UnregisterPostProcessor按需配合精确控制后处理阶段的插件集合。赞分享后端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 FFI 后处理器注册表管理xberg_clear_post_processor 与 post_processors_clear 实战解析xberg C FFI 后处理器注册表管理xberg_clear_post_processor 与 post_processors_clear 实战解析 本文后端AI 应用NLPXberg C 插件 API 实战使用 ListPostProcessors 查询已注册后处理器Xberg C 插件 API 实战使用 ListPostProcessors 查询已注册后处理器 导读 本文围绕 Xberg一个以 Rust 为核心的多语言后端AI 应用NLPxberg C FFI 实战用 xberg_list_post_processors 查询已注册的后处理器xberg C FFI 实战用 xberg_list_post_processors 查询已注册的后处理器 在 xberg 的插件体系中后处理器post后端AI 应用NLP上一篇全面解析MindSpore-Lab/qwen1_5_14b14B参数大语言模型的终极指南下一篇electerm 插件完全指南3 步给终端装上小工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考