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()或其他必须得到普通字符串的方法;BooleanFuture在bool()时同步,因此 branch 自然成为 demand barrier;- prompt context 有
new、copy、same、resume四种传递方式;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。