Docless APIs:LLM 从二进制和流量里重建隐式契约

论文arXiv:2609.04567(示例占位,对应 LLM-for-protocol-inference / binary contract recovery 方向)


那个永远过期的文档

每个工程师都见过这种场景:

「这个接口谁有文档?」 「张哥,他去年离职了。」 「那有没有 swagger?」 「那是三年前加的,早就过期了。」 「那……我看代码吧。」 「代码里没有注释,而且这个服务是收购来的,原始团队已经散了。」

现实系统里有大量「三无」服务:无 OpenAPI 文档、无注释、源码不可读。遗留系统、第三方私有 SDK、内部微服务——这些接口的真实契约只存在于两个地方:流量里二进制里

传统的解决方案是「找人要文档」,但文档永远过期,或者根本没人记得了。最终工程师靠「猜」和「试」来集成,每一次都是技术债。


从行为反推契约:ciphertext-only attack 思路

这篇论文的核心想法很简单:不要问人要文档,让机器自己观察

用 LLM + 轻量符号执行,从请求/响应字节流与二进制入口点中恢复以下信息:

  • 字段语义:这个整数字段是 user_id 还是 session_timeout?
  • 状态机:第 3 个请求为什么返回 409?这个状态转换的前置条件是什么?
  • 鉴权前置条件:为什么这个请求带了 token 那个没带?
  • 隐式速率限制:这个端点实际能承受多少 QPS?

这不是传统的静态分析——它不依赖源码,也不依赖文档。它做的是从行为反推契约,就像密码学里的 ciphertext-only attack:攻击者只有密文,没有明文密钥,靠统计和结构推断来恢复语义。

对应到 API 场景:流量就是密文,二进制入口点提供结构线索,LLM 负责做语义推断。


关键洞察:契约维护范式的根本迁移

这件事的意义不只是「减少文档工作量」,而是代表软件工程的一个根本性迁移:

从「人写文档 → 机读文档」转向「机观察行为 → 机重建契约」

过去的契约管理模式是:人先写文档,其他系统读文档。文档是 ground truth。如果文档过期了,系统就失效。

新的契约管理模式是:没有中央化的 ground truth,契约从系统行为中涌现。机器通过观察流量和二进制来恢复隐式协议,文档变成了观察的副产品,而不是前提条件。

这对三个场景有直接价值:

  1. 集成测试:基于「推断出的隐式协议」生成测试用例,比基于「那份永远过期的文档」更可靠
  2. Mock 生成:有了推断出的协议,可以自动生成符合真实行为模式的 Mock,而不只是随机假数据
  3. 回归测试:接口变更时,自动检测新旧协议的差异,而不是靠人工 review

局限性和适用边界

流量噪声问题:实际流量里有重试、错误响应、异常数据混在里面。如果直接拿原始流量做推断,会把噪声当信号。需要清洗或加权,这是工程成本。

加密和私有协议:如果协议本身有加密层,或者字段做了哈希/混淆,推断质量会严重下降。这套方法适合「相对稳定的遗留系统」,而不适合快速迭代期的接口——那些接口的行为模式还没收敛,推断出来的契约也会跟着变。

多路径问题:同一个状态机可能有多条等价路径,推断时可能得到一个「所有路径的超集」而不是「实际使用的那条子集」。这会导致 over-approximation,需要人工确认。


产品启示

如果你的团队正在做遗留系统重构或者第三方 SDK 集成,这篇论文指向的工具可以直接减少「接口猜测试」的工作量。

具体来说:

  • 遗留系统集成:先用流量录制 + LLM 推断出一份「行为协议」,再让工程师 review 这份推断结果,而不是直接让人猜。推断出来的契约比人猜的更接近真实。
  • Mock 服务生成:不再手工写 Mock,而是从真实流量中推断协议,再基于推断结果生成行为正确的 Mock。测试环境的一致性会大幅提升。
  • 接口变更检测:在 CI 里加一层「协议差异检测」,当接口变更时自动推断新旧行为差异,主动发现「文档没提」的 breaking change。

底层趋势

「文档即契约」范式的失效不是孤立的。它和另一条更大的趋势交织在一起:契约正在从「人写的」变成「机涌现的」

不只是 API 协议。数据库 schema、服务拓扑、事件流——这些契约在现实系统里往往也是「人写了但没人维护」的。未来的系统会越来越多地依赖「从观察中恢复契约」而不是「从文档中读取契约」。

这条路的终点,不是 AI 帮工程师读文档,而是 AI 帮工程师不需要文档