ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Xberg C 批量抽取容错实战:URI 不存在时 ExtractBatchAsync 的行为与错误处理

Xberg C 批量抽取容错实战:URI 不存在时 ExtractBatchAsync 的行为与错误处理 后端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# 批量抽取测试片段 extract_batch_uri_not_found.md深入讲解当批量抽取extract_batch的输入 URI 指向一个不存在的本地文件时XbergConverter.ExtractBatchAsync会如何响应整体调用不会抛出异常而是将单个条目的失败收集到Summary.Errors中。读完本文你将掌握 URI 类型输入的构造方式、ExtractionSummary各字段的语义、批量任务的容错模型以及如何在实际项目中解读结果数为 0、错误数为 1这类返回。一、场景定位批量抽取中的坏条目输入Xberg 的批量抽取入口允许在一次调用中提交多个输入ExtractInput每个输入可以是内存字节kind: bytes或 URI 引用kind: uri。URI 可以指向本地路径、file://URI 或 HTTP(S) URL而本地路径一旦写错例如文件被删除、路径拼写错误就会产生条目级失败。本片段对应的 fixture 位于 fixtures/batch/extract_batch_uri_not_found.json其输入为一个指向/nonexistent/a.pdf的 URI{ call: extract_batch, input: { inputs: [ { kind: uri, uri: /nonexistent/a.pdf } ] }, assertions: [ { type: not_error }, { type: equals, field: summary.results, value: 0 }, { type: equals, field: summary.errors, value: 1 } ] }fixture 的断言清晰定义了这个场景的预期行为not_error批量调用本身不抛异常summary.results 0没有产出任何抽取结果summary.errors 1有 1 个条目级错误。这是 Xberg 批量接口的重要设计批量失败是部分失败partial failure语义——单个条目的错误不会让整批调用崩溃而是被汇总到结果的摘要中由调用方自行决定如何处理。二、C# 端完整调用代码解读片段 extract_batch_uri_not_found.md 中给出的 C# 代码如下using System; using System.Text.Json; using Xberg; var ConfigOptions new JsonSerializerOptions { PropertyNameCaseInsensitive true }; var result await XbergConverter.ExtractBatchAsync(new ListExtractInput() { JsonSerializer.DeserializeExtractInput({\kind\:\uri\,\uri\:\/nonexistent/a.pdf\}, ConfigOptions)! }, new ExtractionConfig()); Console.WriteLine(result.Summary.Results); Console.WriteLine(result.Summary.Errors);逐行拆解这段代码JSON 反序列化构造输入用JsonSerializer.DeserializeExtractInput将{kind:uri,uri:/nonexistent/a.pdf}解析为ExtractInput。注意ConfigOptions开启了PropertyNameCaseInsensitive即使 JSON 键的大小写与属性名不完全一致也能正确绑定。调用批量抽取XbergConverter.ExtractBatchAsync(ListExtractInput, ExtractionConfig)接收输入列表和全局抽取配置。此处配置为默认的new ExtractionConfig()未做任何覆盖。读取摘要result.Summary.Results与result.Summary.Errors分别输出成功结果数与错误数。在本场景下程序将打印0和1。2.1 为什么用 JSON 构造而非强类型构造ExtractInput类型见 ExtractInput.cs本身提供了强类型的工厂方法ExtractInput.FromBytes(byte[] bytes, string mimeType, string? filename)——构造内存字节输入ExtractInput.FromUri(string uri)——构造 URI 输入ExtractInput.Default()——构造默认输入Kind默认为Uri。而片段选择直接反序列化 JSON是为了让 C# 端测试与仓库内其他语言绑定以及 REST/MCP 契约共享同一份输入描述保证跨语言行为一致。两种写法在语义上等价实战中推荐使用ExtractInput.FromUri(/nonexistent/a.pdf)更直观var input ExtractInput.FromUri(/nonexistent/a.pdf); var result await XbergConverter.ExtractBatchAsync(new ListExtractInput { input }, new ExtractionConfig());2.2 ExtractInput 的字段语义ExtractInput是统一抽取输入见 ExtractInput.cs各字段如下字段JSON 键说明Kindkind输入类型bytes或uri见 ExtractInputKind.csBytesbyteskind bytes时的原始字节Uriurikind uri时的本地路径、file://URI 或 HTTP(S) URLMimeTypemime_typeMIME 类型提示Filenamefilename文件名提示用于 MIME 检测与元数据Configconfig单条目级抽取覆盖配置当Kind Uri时引擎会尝试解析该 URI对于本地路径会执行文件系统访问。/nonexistent/a.pdf不存在因此该条目在解析阶段即失败。三、返回结构与摘要语义Results 与 Errors 的精确含义批量抽取返回ExtractionResult其Summary属性类型为ExtractionSummary见 ExtractionSummary.cs包含以下计数字段JSON 键含义Inputsinputs调用方提交的输入总数Resultsresults成功产出的抽取结果数Errorserrors条目级错误数RemoteUrlsremote_urls解析为远程 HTTP(S) URL 的 URI 数PagesCrawledpages_crawled被抓取/爬取的 HTML 页面数DocumentsDownloadeddocuments_downloaded从 URL 下载并抽取的非 HTML 文档数在本场景中提交 1 个 URI 输入由于文件不存在Results 0、Errors 1同时满足Inputs Results Errors 1的守恒关系。这就是 fixture 断言所验证的行为。从源码层面看批量调用的封装位于 XbergConverter.cs 的ExtractBatchAsync它将输入列表序列化为 JSON通过 FFI 调用原生ExtractBatch最后把原生结果反序列化为ExtractionResult。整个封装是异步的await Task.Run但单个条目的失败并不会让ExtractBatch返回非零错误码——这正是not_error断言的底层原因条目错误已经被原生层收纳进结果摘要而不是作为顶层异常向上抛。四、底层原理Rust 引擎的批量容错与并发模型C# 绑定只是薄封装真正的容错逻辑在 Rust 核心引擎中。批量入口extract_batch定义于 crates/xberg/src/engine/extract_impl.rs其执行流程可以概括为批次级缓存判断根据输入与配置计算batch_content_cache_key命中缓存则直接复用结果对应extract_batch_cache_hit阶段。执行计划解析resolve_engine_batch_execution_plan会根据输入特征如是否为 PDF、布局类型决定并发 worker 数与线程预算。并发执行extract_batch_concurrent通过run_bounded_batch_tasks在有界并发池内逐条处理输入每个条目运行于独立的tokio任务中单条目失败只影响该条目的槽位。结果归约所有条目执行完后统一归约。任何槽位为None即失败条目都会被跳过最终汇总为ExtractionResult。关键设计是条目级失败与批次级失败被严格区分。URI 解析失败文件不存在属于条目级失败因此引擎继续处理其他条目并正常返回整体结果只是该条目的results不计入、errors加一。与之对照只有配置校验等批次级错误才会让整个调用抛出XbergException。值得注意的细节是引擎的批量路径会对任务进行优先级调度对于本地 URI 输入引擎会尝试探测文件大小作为排序成本提示见prioritize_pending_batch_items在并发预算内尽量让小任务先行而在受限环境中如未启用并发特性则会退化为extract_batch_sequential顺序执行。无论哪种路径单条目失败都不会中断整批。五、对比其他批量场景从基础到边界该片段属于仓库批量测试系列中的坏路径一族可通过同一目录下的其他片段对比理解批量语义的全貌见 docs-site/src/snippets-generated/csharp/batch片段场景预期摘要extract_batch_uri_basic.md正常 URI 输入全部成功extract_batch_uri_partial_failure.md部分 URI 失败有成功也有错误extract_batch_uri_all_missing.md所有 URI 均缺失全部计入错误extract_batch_uri_not_found.md单个 URI 不存在results 0、errors 1对应的 JSON fixture 位于 fixtures/batch其中 extract_batch_uri_not_found.json 与本文场景一一对应。仓库在 e2e/csharp/tests 中还提供了端到端测试用于在真实运行时验证这些批量语义。六、实战建议如何正确处理批量抽取中的坏条目结合本片段的容错语义在实际业务中应遵循以下模式不要把有错误当作调用失败只要ExtractBatchAsync正常返回就说明引擎完成了整批调度。应优先检查result.Summary.Errors 0来判断是否存在坏条目而不是依赖 try-catch。先核对计数守恒正常情况下Inputs Results Errors。若不等说明存在未知的批次级异常此时才需要检查异常路径。使用摘要字段定位问题当Errors非零时可结合结果中的条目级错误信息fixture 中表现为条目被跳过进一步排查是路径错误、MIME 不支持还是网络下载失败。利用单条目配置覆盖若批次中某个输入需要特殊参数如 OCR 开关可通过ExtractInput.Config传入FileExtractionConfig覆盖全局ExtractionConfig无需拆分成多次调用。对高频失败的 URI 做前置校验本地路径建议先做File.Exists检查远程 URL 则可依靠RemoteUrls、PagesCrawled、DocumentsDownloaded三个字段区分远程文档被抓取与非 HTML 文档被下载的统计口径。七、小结extract_batch的URI 不存在场景是 Xberg 批量接口容错设计的最小可验证样本一次调用、零结果、一条错误且调用本身不抛异常。理解这一语义是正确使用批量抽取能力无论是 C# 绑定、REST API 还是 MCP 服务器的前提。C# 端的ExtractBatchAsync、ExtractInput与ExtractionSummary三层结构与 Rust 引擎中条目级失败收纳、批次级结果归约的实现相互印证共同保证了大规模文档抽取任务的稳定性——坏条目永远不该拖垮整批任务。赞分享后端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 批量 URI 提取错误处理实战extract_batch 对不存在 URI 的容错语义xberg C FFI 批量 URI 提取错误处理实战extract_batch 对不存在 URI 的容错语义 本篇技术指南聚焦 xberg 的 C FFI后端AI 应用NLPxberg C 批量抽取边界场景实战ExtractBatchAsync 空批次调用的行为与校验xberg C 批量抽取边界场景实战ExtractBatchAsync 空批次调用的行为与校验 本文基于 xberg 仓库中自动生成的 C 端到端E2E用后端AI 应用NLPxberg 批量 URI 提取的部分失败处理用 C ExtractBatchAsync 应对混合好坏输入xberg 批量 URI 提取的部分失败处理用 C ExtractBatchAsync 应对混合好坏输入 xberg 的 extract_batch 提供一次后端AI 应用NLP上一篇UltimateAndroidReference中的网络安全HTTPS与数据加密下一篇Robo 3T自定义主题编辑器可视化修改界面样式的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表