任务架构

Android 本地 AI 的 RFC 9535 JSONPath 字段选择策略

解释 JSONPath nodelist、Normalized Path、重复选择与资源限制;区别模型输出校验、全文检索及 JSON-LD context 解析。

审核状态: 内容已校验;中文稿供用户审核 · 2026-10-08 · Fact IDs: ANDROID-JSONPATH-SELECTION-2026-10, RAG-01, ANDROID-PRIVACY-01

直接回答

RFC 9535 将 JSONPath 标准化为对 JSON 值树执行的查询表达式。查询从根节点开始,可选择零个或多个节点,结果是 nodelist;具体 evaluator API 可能返回节点值、Normalized Path 或两者。这和定位一个具体位置的 JSON Pointer,以及匹配索引文本词项的全文检索不同。引入依赖前先说明为何需要结构化多选。若只取一个固定字段,直接读取有类型的属性或使用 JSON Pointer 通常更简单,也更易审计。 固定符合 RFC 9535 的 evaluator 及版本。旧 JSONPath 库在语法、过滤器、函数扩展、顺序和结果序列化方面可能不同。规范把 query 是否语法正确/有效与对特定 JSON 文档执行区分开:无效语法是独立错误,有效表达式则可能返回空 nodelist。不能把空结果当成整份文档回退,也不能从错误推断字段存在;不要静默换用语义不同的 evaluator。 若应用需要追踪来源,可将 Normalized Path 或等价节点引用和选中值一起返回。它能说明某个 prompt 或预览字段来自文档哪个节点,但作用域仍是当前文档结构和版本,不是永久数据库主键或权限。RFC 9535 保留重复选中的节点,不自动去重。数组 wildcard 按数组次序遍历,但不能推广为所有结果列表都按下标升序:selector list 的结果按各 selector 的顺序拼接,负 step 的 slice 可以反向遍历。对象子节点顺序没有保证。需要顺序时要另写应用规则,不能依赖对象通配符遍历顺序。 JSONPath selector 不是访问控制。查询可能选出超过预期的字段;RFC 9535 也提醒,精心构造的 query 或数据可能让朴素实现消耗异常多甚至指数级 CPU。尽可能由字段 allowlist 构造产品路径。如果查询由用户或模型提供,就限制语法与函数,用固定 evaluator 校验,并限制文档字节/深度、query 长度、结果节点数和评估工作量。若目标库不能限制恶意递归,不要接受不可信的任意复杂查询。 将 JSON 原文档和选取投影分开。用有界 parser 解析来源,保留来源标识/版本,再运行批准的 path 并同时返回值和位置。插入 prompt 前还要按任务 schema 校验;路径选出密码、联系人或私人备注,并不意味着该字段适合暴露。授权和同意仍是应用决策。不要对 JSONPath 文本使用宿主语言 eval,也不要把路径组件转成反射调用。 为无结果、重复和多结果定义明确行为。空 nodelist 是有效 JSONPath 结果,应进入 no-match 状态,而不是扩大查询。所选节点值为 JSON null 不等于没有节点:对 `{"a":null}`,`$['a']` 选中一个值为 null 的节点,`$['b']` 则是空 nodelist。重复结果应按书面消费规则保留或去重。RFC singular query 最多返回一个节点,并不保证一定有节点;调用方真正需要一个值时仍要断言结果数等于一。顺序重要时,应明确 selector 顺序,或依据 schema 稳定键排序。 建立能暴露 evaluator 语义的夹具:键名含斜线和波浪号的嵌套对象;一个 null 字段与一个缺失字段;按不同顺序写的 selector list、按负 step 反向遍历的 array slice;嵌套 descendant、过滤器空结果、重复选中同一节点,以及成员序列化顺序不同的对象。记录 query 文本、库版本、来源版本、Normalized Path、结果数、时间预算和拒绝类别。尽可能使用固定合规夹具对照 RFC 示例。不要在没有设备证据时发布速度或普遍实现合规结论。 本文讨论来源字段选择,不是模型回答方法。它不证明 JSON 值可信、不证明所选字段足以支持答案,也不表示 Cove 使用 JSONPath。展示或导出前,仍须检查权威来源行和当前访问策略。path 结果只是在一次文档求值中的节点位置,不是语义检索、数据库授权或“没有私人数据”的证明。

只把本地报告中批准的字段加入模型上下文

离线助手可总结用户选择的 JSON 导出,其中包含客户备注、账号 token、状态和行项目。产品只需要两个批准字段和一个过滤列表,但宽泛 descendant 查询也选出了 token,并重复返回一个行项目节点。

决策

固定 RFC 9535 evaluator,构造或校验 allowlist query,保留 Normalized Path 和重复节点,再按任务策略过滤后才构建 prompt。

预期结果

模型只获得能追溯至来源版本的投影;空结果和重复结果均有明确状态,不会扩大访问或猜答案。

需要收集的证据

只有将以下证据与同一模型文件和测试运行关联起来,结论才可复核:

  • ANDROID-JSONPATH-SELECTION-2026-10:RFC 9535 定义 JSONPath 节点列表语义;空列表有效,重复节点不自动去重,查询本身不是授权策略。
  • RAG-01:本地流程的摄取、索引、检索和提示构建应分别验证;该事实不定义 JSONPath 语法或结果顺序。
  • ANDROID-PRIVACY-01:被选择的字段是否可以进入 prompt 仍由应用数据策略决定。

任务质量需要有版本记录的语料和验收规则;流畅的单条样例不等于准确度结果。

实施流程

  1. 选择结构查询合同. 明确使用有类型属性访问、JSON Pointer 还是 JSONPath 多选。记录确切 RFC 9535 实现/版本与启用的语法,不假定旧库行为等同于标准。
  2. 有界解析来源文档. 限制来源字节数、嵌套深度、节点数和解析工作。保留不可变来源或版本;格式错误与有效 query 选择不到节点是不同结果。
  3. 约束查询构造与求值. 优先使用固定字段 allowlist 路径。若接受调用方输入,则通过固定 evaluator 校验,限制 query 长度和函数,并约束遍历/结果工作量。不要使用 eval,也不要把 path 当权限。
  4. 连同来源记录返回节点. 在 API 支持时捕获选中值及 Normalized Path。区分所选 null 与没有节点,保留重复选择,明确 wildcard/selector/slice 顺序;调用方需要一个值时断言 count == 1,因为 singular query 只保证至多一个。
  5. 构建 prompt 或导出前执行字段策略. 对每个选中节点再执行独立字段 allowlist 和当前授权检查。测试空结果、重复、错误表达式、深层嵌套、通配符和敏感字段夹具。

让每个阶段的状态都可观察。失败信息应指出阶段、模型、运行时和恢复动作,同时避免记录用户私密内容。

验收标准

  • 记录准确 RFC 9535 evaluator/version 和受支持语法子集,不假定旧库语义等同标准。
  • 无效 query、空 nodelist 与所选 null、重复、selector 顺序、负 step slice、对象顺序不确定和恰好一项基数都有明确处理方式。
  • 来源数据与求值上限经过测试;query 结果与 Normalized Path 保留来源版本。
  • 路径选择不替代字段授权、来源校验、用户同意或支持模型答案的证据。

决策对照表

维度选择或证据解读方式
直接有类型属性读取按应用 schema 读取已知字段。路径固定时最简单,也无需接受查询语言。
JSON Pointer用 pointer token 序列定位一个具体值。用于单点定位,不提供 JSONPath 的过滤器或多节点选择。
RFC 9535 JSONPath从 JSON 树中选择零个或多个节点。其 nodelist、重复节点及对象顺序语义都要由消费方遵守。
FTS/AppSearch 查询在文本索引中按词项找文档。作用于索引文本,不会遍历结构化 JSON 节点或返回源路径。

需要避免的失败模式

  • 把 JSONPath 当成 JSON Pointer,或把旧版库语法假定为 RFC 9535。
  • 把空 nodelist 当作查询错误,或静默退回整份文档。
  • 假定结果去重且对象成员有固定顺序。
  • 把 path string 当权限边界,或开放未设限的递归/过滤查询。

还要避免静默回退、版本未固定、缺少取消处理,以及把不同配置的结果混在一起下结论。失败运行也应与成功记录一并保存。

最小复现记录

层级记录内容
设备厂商、型号、芯片、内存档位、操作系统版本
软件应用版本和 Git 提交号
模型系列、变体、版本、格式、文件长度、摘要、量化方式
运行时名称、版本、请求后端及实际后端证据
工作负载样例版本、输入摘要、提示词摘要、输出策略
结果完成、失败、取消、回退及保护隐私的诊断信息

发布检查表

  • ☐ 主要搜索问题已回答,且没有未经支持的数字。
  • ☐ 所有模型文件和运行时版本均已固定。
  • ☐ 代表性任务和失败处理策略均有说明。
  • ☐ 生命周期、取消、清理和回退均已测试。
  • ☐ 用户内容与网络边界均有说明。
  • ☐ 结论只适用于被记录的配置。
  • ☐ 新增测试结果时链接到原始方法或证据。

来源与相关证据

中文部署与排错专题见。奇连 AI 端侧专题。

常见问题

有效 JSONPath 一定能找到值吗?

不一定。有效表达式在特定文档上可以返回空 nodelist。应把 no-match 与语法错误、解析失败和授权拒绝分开。

JSONPath 结果会自动去重并统一排序吗?

不会。重复节点保留;数组 wildcard 按数组顺序,但 selector list 按 selector 顺序拼接,负 step slice 可反向遍历;对象 wildcard 顺序未规定。

singular query 能保证恰好返回一个节点吗?

不能。RFC 的 singular 限制为最多一个节点,仍可能没有匹配项。调用方确实需要一个值时,必须另外验证结果数恰好为一。

选中 JSON null 与没有匹配项是一样的吗?

不一样。`{"a":null}` 上 `$['a']` 选中一个值为 null 的节点;`$['b']` 则选不到节点,结果是空 nodelist。适配层应保留两者区别。

能用 JSONPath 字符串决定用户有权访问哪些字段吗?

不能。path 是选择表达式,不是授权。prompt、展示或导出前,应用必须按自有字段策略和当前访问权校验每个结果。

RFC 9535 与 JSON Pointer 是同一种语法吗?

不是。JSON Pointer 用字符串定位一个值;JSONPath 可用选择器和过滤器产生节点列表。不需要多选时优先使用 Pointer 或有类型属性读取。