打开文档导航

APPL:异步语义能否成为普通 Python pass

Primary source: APPL: A Prompt Programming Language for Harmonious Integration of Programs and Large Language Model Prompts

一句话

APPL 把 Future 和 asynchronous execution 设计进自己的 prompt language;Pysolate 可以吸收 first-demand synchronization,但 Future state 应完全留在 Host,compiler 只插入隐藏的 submit / blocking materialize

原工作做了什么

APPL 将 prompt 构造和 LLM generation嵌入 Python function。gen() 可以返回 Future,运行时在 value 真正需要时同步,从而并行 self-consistency、question answering 和其他独立 generations。系统还提供 tracing 和 cached replay。

因为异步行为属于 APPL language semantics,APPL program作者已经在该语义下编程。把同样机制事后施加到普通顺序 Python,需要额外证明。

论文中最具体的 runtime ideas 是:

  • StringFuture 尽量推迟同步;字符串拼接可以继续组合 Future,直到 str() 或其他必须得到普通字符串的方法;
  • BooleanFuturebool() 时同步,因此 branch 自然成为 demand barrier;
  • prompt context 有 newcopysameresume 四种传递方式;new/copy 容易形成独立 generation,same/resume 则引入共享或历史状态依赖。

可以吸收的 pass

对显式 model/tool calls,Pysolate可以识别:

  • call result在之后才被读取;
  • calls之间没有 control/data dependency;
  • arguments、model/tool configuration 和 privacy partition已冻结;
  • allowed effect contract支持并发 physical work。

AST 可以先做语义不移动的 split:

x = tools.search(q)
_h = __host_submit__("search", q)
x = __host_materialize__(_h)

再分别研究:

  • dispatch hoisting:参数已知且 early physical work 被允许时,把 hidden submit 向前移动;
  • await sinking:中间代码不依赖结果,也不会改变错误或 side-effect visibility 时,把 blocking materialize 推到第一次必须观察值的位置。

这里没有 Python Future:_h 是 compiler-only token,Host 保存 pending/ready/failed 状态。__host_materialize__ 对 Guest 只是同步调用;Host 已完成时直接返回,仍在运行时等待后返回。这样不会让 Future proxy 进入 object identity、type、method dispatch 或 introspection。

若只优化 ordinary immutable workspace reads,该机制也可以与现有 staged observation 接合。需要强调:dispatch hoisting + await sinking 是 Pysolate 从 APPL 吸收出的设计,不是 APPL 论文对任意 tool call 所做的转换。

Correctness 与副作用

APPL 的 trace replay用于复用 LLM response和故障诊断。Replay不是 rollback:它不能撤销已发送邮件、数据库写入或其他工具 effect。

异步 lifting还可能改变:

  • 请求发起顺序和 provider-side random batching;
  • exception发生和被观察的时间;
  • shared prompt/context的更新顺序;
  • cancellation后仍在运行的请求;
  • stochastic model response。

对普通同步 Python,resolve 还不能越过原调用异常本应阻止的 statement:

try:
    x = tool.call()
    mutate_local_state()
except ToolError:
    recover()

如果把 resolve 移到 mutate_local_state() 后面,tool failure 时就会执行原程序不会执行的 mutation。因此 first value use 不是唯一 barrier,exception timing 同样是 barrier。

论文的 speedup和案例正确性不能替代同步 Python 的 equivalence proof。

Pysolate 结论

APPL提供 first-demand synchronization、value-specific Future composition 和 context-independence 的语言设计参考。Pysolate V1 应从 pure/immutable reads 开始,不对 stochastic LLM calls声称语义等价。Trace可以记录调用,但不能成为 rollback 证明。

完整的 split-phase 候选设计见 implementation/11-split-phase-call-scheduling.md。当前 runtime 仍是单次 blocking host_call,尚未实现 Host-owned pseudo-future table、submit / materialize ABI、materialization sinking 或 dynamic ready queue。