top of page

Imp DSPy 移植版将可优化的 AI 程序带到 BEAM,但生产验证仍在后面

4分钟前
讀畢需時 15 分鐘

Imp 已为 BEAM 发布了 Imp DSPy 移植版,并作出一项雄心勃勃的承诺:将可优化的语言模型程序引入 Elixir 以进程为导向的运行时。首次 Hex 发布包含类型化签名、推理模块、评估、优化器、检索和受监督的智能体运行。这种广度让 Imp 不只是又一个模型 API 封装器。

该项目将自己定位为 DSPy 的完整移植版;DSPy 是一个用于构建可度量、可优化语言模型程序的 Python 框架。Imp 保留了这种编程模型,同时更换了宿主环境。一个 Imp 程序是不可变的 Elixir 值,而智能体可以作为受监督的 BEAM 进程运行。

这种组合带来了真正的张力。Python 仍是 AI 框架开发的中心,而 Elixir 擅长并发、长时间运行的服务。Imp 认为,开发者不应必须在 DSPy 风格的优化能力与 Erlang/OTP 的运维模型之间二选一。

代码现已可用,但尚未有生产环境的定论。Imp 0.5 仍处于实验阶段,其 API 可能变动,优化器也仍需要更广泛的基准测试。因此,此次发布确立的是技术范围,而非已在所有工作负载中得到验证的对等能力。

Imp DSPy 移植版不止于基础模型调用

Imp 重建了 DSPy 的主要编程模型,而非只转换其最简单的预测接口。

Imp repository 将该项目描述为 DSPy 到 BEAM 的完整移植。其公开接口涵盖签名、模块、示例、指标、评估、优化器、工具、检索和已保存程序,也包括智能体循环及基于进程的执行。

签名是对模型步骤接收内容和返回内容的类型化声明。开发者可以描述问题、分类和摘要等任务,而无需手工拼装每一条提示词。随后,Imp 会格式化请求、调用选定模型、解析响应并验证其字段。

这种结构遵循了 DSPy programs 背后的核心理念。DSPy 将模型行为视为可评估、可改进的程序,而不是一组手写提示词字符串。Imp 将这一理念带入 Elixir,同时保留了熟悉的名称和概念。

Imp 中的基础示例定义了一个 GitHub issue 分流任务。其输出会将问题类型限制为 bug、feature 或 question,同时生成摘要。如果模型返回无效类型,调用会产生错误,而非让格式错误的数据悄然流入下游。

开发者无需更改签名,即可将直接预测替换为链式思维推理或 ReAct 智能体。ReAct 是一种循环:模型选择工具、观察工具结果,并持续执行直到返回答案。任务契约仍与推理策略分离。

Imp 还提供多种 DSPy 风格的优化器。LabeledFewShot 选择示例,BootstrapFewShot 生成额外演示,MIPROv2 则在指令和示例之间搜索。SIMBA 从较强和较弱的尝试中学习,而 GEPA 会反思失败并提出修订后的指令。

这些组件之所以重要,是因为优化能力正是 DSPy 与普通模型客户端库的分野。客户端库标准化请求;优化器则根据指标反复评估程序变体,并返回观察到的最佳配置。

Imp 要求开发者将示例划分为训练、验证和测试集。指标为程序评分,优化器则调整指令、演示或相关参数。所得程序可以被检查、保存为 JSON,并与早期版本进行比较。

该项目还支持检索、best-of-N 选择、输出优化、程序化思维执行,以及递归语言模型工作流。它包括 MCP 工具导入和 ACP 服务,使 Imp 程序能够连接外部工具及兼容的智能体宿主。

这是一个覆盖面很广的初始功能集。它支持这样一种说法:Imp 的目标是 DSPy 的架构,而不只是其术语。不过,功能的存在并不能证明行为对等、性能或运维成熟度。

发布文档也承认这一差别。Imp 0.5 是该项目首次 Hex 发布,维护者将其描述为实验性版本。他们还警告称,API 可能变动,大规模优化器基准测试尚未完成。

这一警告是解读此次发布的关键。Imp 已交付了相当完整的实现,但“完整移植”仍是项目自身的说法。独立测试必须证明,在真实条件下,其模块和优化器与 DSPy 的匹配程度是否足够稳定。

为什么 BEAM 改变了智能体运行时

重要的变化不是 Elixir 语法,而是能够将每个长时间运行的智能体建模为隔离、受监督的进程。

BEAM 是 Erlang 和 Elixir 使用的虚拟机。它会调度大量轻量级进程,这些进程通过消息通信并维持隔离状态。OTP 则提供了成熟的监督、故障处理和长时间运行服务模式。

Imp 直接利用这些特性。普通调用可以在调用方进程内执行,而 start_run 会将程序作为独立的受监督进程启动。调用方可以监控该运行、停止它、收集事件,并控制哪些工具调用获得授权。

Elixir 的 GenServer model 说明了这种方式为何不同于仅在 Python 库中增加异步函数。GenServer 是一种可保留状态、处理同步和异步消息,并可纳入监督树的进程。

对于 AI 智能体,这种模型为状态和生命周期管理提供了天然归宿。一个进程可代表一次智能体运行;其他进程能够监控它、接收事件、施加截止时间,或在不共享可变内存的情况下重启周边服务。

Imp 会记录运行创建、模型请求、模型响应、工具调用、工具结果和完成等事件。这些事件构成可观测的执行历史,也为优化器提供了评估完整智能体轨迹的材料,而不只局限于最终答案。

工具授权成为运行时边界的一部分。项目示例允许智能体仅从获批宿主获取内容。被拒绝的工具调用不会仅因模型提出请求就获得许可。

这并不意味着模型生成的操作默认安全,但它确实让授权决策变得明确且可编程。当智能体能够读取内部系统、执行工具或调用外部服务时,这一边界很有价值。

Imp 也会谨慎处理不确定的工具结果。即使调用方从未收到确认,超时工具也可能已经完成了外部操作。该项目会将此类结果报告为未知,而不会自动重试。

这种区分针对的是智能体可靠性中的常见问题。重复读取通常无害,但重复付款、发送消息、部署或删除则可能造成损害。运行时应区分观察失败和已确认的操作失败。

截止时间提供了另一层边界。Imp 表示,模型请求和工具执行可以受附加在运行上的截止时间约束。当所有者进程结束时,受监督工作也可以随之结束,而不会沦为被遗弃的后台活动。

BEAM 还提供并发能力,无需每个应用团队都自行设计新的智能体调度器。多个进程可以独立运行、发送消息,并相互隔离地失败。监督器定义了一个组件退出时相关进程的响应方式。

这种设计尤其适用于智能体活跃时间超过单个 Web 请求的应用。例子包括监控智能体、支持工作流、后台研究任务,以及等待人工授权的系统。

Python 可以支持所有这些工作负载。不同之处在于,Python 框架通常会将生命周期行为组装自任务队列、异步运行时、工作进程系统及应用特定的状态管理。BEAM 则将这些概念置于其编程模型的核心位置。

因此,Imp 挑战的是一个特定假设,而非整个 Python AI 生态。它质疑的是:当生产宿主是并发服务时,DSPy 风格程序是否必须仍然绑定于 Python。

对于 Elixir 团队而言,这减少了一道语言边界。他们可以在同一运行时中保留模型逻辑、应用状态、监督机制和周边业务规则,并可能避免仅为获得声明式模型编程而运营独立的 Python 服务。

其潜在价值在现有 Elixir 系统中最为清晰。运行 Phoenix、Broadway、Oban 或其他 BEAM 工作负载的团队,可以通过熟悉的部署和可观测性模式集成 Imp 程序。新组件会成为应用的一部分,而不是毗邻的 AI 孤岛。

这种架构契合度是本次发布最有力的论点。语法对等可以复制;而围绕进程隔离、消息传递和监督构建的运行时模型,会改变开发者在部署后运营智能体的方式。

Imp 与 DSPy 的差异是宿主运行时选择

主要竞争并非 Imp 与 DSPy 作为竞品之间的较量,而是 BEAM 原生运行与以 Python 为中心的 AI 开发之间的选择。

DSPy 仍是参照点。其生态、研究历史、文档、贡献者基础和生产案例,使其拥有首次 Hex 发布无法立即复制的优势。Imp 继承了这项工作的理念,但并未继承其积累的验证成果。

项目的 DSPy mapping 明确说明了这种关系。DSPy 签名映射到 Imp 签名,Predict 映射到 Imp.predict,ReAct 映射到 Imp.react。评估、检索、并行执行、保存及多种优化器都具有对应接口。

Imp 表示,截至 2026 年 9 月,它跟踪 DSPy 3.3.1,同时正持续推进对 DSPy 3.4 新增功能的支持。这一细节既表明了项目的雄心,也反映出其未来的维护负担。DSPy 的演进速度可能快于独立实现的跟进速度。

移植项目必须决定何处需要精确兼容,何处应由宿主语言塑造设计。Imp 并不尝试让 Elixir 看起来与 Python 完全一致。程序是不可变值,模型依赖可以显式传入,上下文则限定在调用进程内。

这是合理的做法,因为目标并非直接的源代码兼容。Elixir 开发者无法原样复制 Python 应用。真正有价值的目标,是在签名、模块、指标、优化器和已保存工件之间实现概念与行为的兼容。

Imp 的维护者已针对固定版本的 DSPy 构建差异检查。代码库包含提示词模板的对等性门槛,以及用于比较行为的测试。其构建配置引用了固定的 DSPy 3.2.1 环境,以进行 golden-trace 比较。

这些检查是工程意图的重要证据。它们表明该项目正在衡量兼容性,而非完全依赖相似的方法名称。不过,代码库测试并非独立基准测试。

最难实现一致性的问题涉及优化器。预测模块可以通过已知输入和输出来比较。优化器则包含随机性、重复模型调用、搜索策略、预算以及依赖数据集的行为。

Imp 对 GEPA 的实现说明了其中的难度。GEPA 是一种优化器,会读取执行轨迹、反思失败原因,并提出新的指令。Imp 包含面向 DSPy 的执行配置,以及一个具有不同选项的独立 BEAM 原生配置。

根据 Imp 的更新日志,其默认 DSPy 配置固定了随机数生成、预算、合并设置和选择规则等行为。这些细节会实质性地影响优化器最终返回哪一种程序。

Imp 还将优化扩展到受监督的代理运行中。GEPA 可以检查轨迹中的思考过程、工具调用、工具结果和最终输出。这项功能使优化器与 Imp 基于进程的运行时保持一致,而不是将代理视为不透明的调用。

DSPy 本身仍在持续演进。其优化器目录包含用于示例、指令、微调和组合优化的多种策略。要保持同步,不能只一次性实现固定 API。

这场维护竞赛正是完整移植的核心成本。每一个新的 DSPy 模块、适配器、优化器或行为变化,都会让 Imp 面临选择。项目必须将其移植、记录差异,或暂时落后于兼容性声明。

BEAM 一侧也有自身的约束。Imp 0.5 要求 Elixir 1.19 或更高版本,以及 C 和 C++ 编译器。两个依赖项包含原生构建要求,首次编译还需要网络访问以获取部分工具链。

这些要求并非不可管理,但它们让“BEAM 原生包天然意味着更简单部署”的说法变得更复杂。团队必须审查原生依赖、发布配置、协议适配器和模型提供商连接。

Imp 通过 ReqLLM 接入模型提供商,ReqLLM 是一个用于标准化语言模型请求的 Elixir 库。这在程序框架与提供商传输层之间实现了有益的分离。同时,这也使 ReqLLM 的兼容性成为 Imp 实际提供商覆盖范围的一部分。

因此,在两个框架之间做选择取决于系统边界。以 Python 为主的研究团队仅为进程监督而迁移到 Elixir,收益有限。Elixir 产品团队则可能因避免维护独立的 Python 服务而获得显著收益。

这一决策还取决于谁负责优化。数据科学家可能更偏好 DSPy 的 Python 环境及其周边评估工具。后端工程师可能更偏好将 Imp 程序部署在他们已在运行的服务和数据流旁边。

Imp 不需要取代 DSPy 才有价值。它需要做的是,让 DSPy 的编程模型在那些已由 BEAM 提供运维基础的生产系统中具备可信度。

“完整移植”这一说法仍需独立测试

Imp 广泛的功能列表确实存在,但其成熟度取决于优化器质量、行为一致性,以及持续负载下的故障处理能力。

第一个不确定性在于“完整”的含义。Imp 覆盖了可辨识的 DSPy 层级,但其自身文档称,它跟进的是较早版本的 DSPy,而较新的功能仍在陆续加入。因此,全面覆盖是一个不断移动的目标。

一些模块还带有不同的实现约束。Program-of-thought、CodeAct 和递归语言模型功能会通过 Imp 的受限解释器运行模型编写的代码。它们的行为未必能在所有情况下与 DSPy 的 Python 执行环境一致。

这种差异也可能带来好处。受限解释器可以提供更窄、更可控的执行面。它同样可能阻止程序使用 DSPy 用户所期待的库或运行时行为。

已保存程序的兼容性也值得同样仔细审视。Imp 可以将程序保存为 JSON,但共享概念并不保证 DSPy 和 Imp 能直接交换每一种产物。字段格式、提供商配置、模块状态和优化器元数据都可能不同。

提供商行为是另一个变量。两个框架可以生成等效的提示词,却因为它们的适配器以不同方式格式化消息、工具调用或结构化输出约束,而得到不同结果。细微的格式变化就可能改变模型行为。

Imp 已投入资源提升适配器保真度。其更新日志描述了多项调整,使结构化值、ReActV2 消息和 GEPA 反思提示词更接近 DSPy 行为。这项工作也揭示了实现一致性需要做出多少细微决策。

每个提供商还会带来更多边缘情况。流式响应、并行工具调用、部分文本、用量记录、超时和格式错误的结构化输出在不同 API 间各不相同。框架必须在不掩盖重要故障的前提下对其进行标准化。

当前更新日志记录了涉及流式工具调用、缺失模型记录、调用方取消、优化器指令和不确定工具结果的修复。这些都是早期项目的常见问题,但也显示了生产复杂性累积的位置。

大规模优化器基准测试是最重要的缺失证据。Imp 的维护者明确表示,这项工作仍有必要。用户需要在不同数据集、模型、预算和重复运行条件下的对比结果。

一项有用的测试不应只问两个框架是否都能完成运行。它还应比较基线分数、优化后分数、模型调用总数、token 用量、耗时、可复现性和失败率。代理基准测试还应衡量工具准确率和未完成操作。

基准测试应将框架质量与模型波动区分开来。两种实现都需要使用相同的模型、数据集、评估指标、预算和可比的随机种子。由于优化器搜索可能产生不同结果,多次运行是必要的。

运维测试应衡量故障发生时的监督能力。研究人员应终止所有者进程、中断模型请求、让工具超时、使队列过载,并重启周边应用。每种情况的预期结果都必须明确。

安全测试同样重要,因为代理工具会跨越应用边界。Imp 提供授权钩子,但应用开发者仍需定义策略。薄弱的主机检查、过度的工具权限和不安全的参数都可能破坏运行时边界。

长期运行的状态也会引发问题。开发者需要知道进程重启后哪些内容得以保留、检查点如何持久化,以及升级后的代码如何与已保存程序交互。监督可以重启进程,但不会自动重建正确的业务状态。

可观测性必须超越事件捕获。团队需要可搜索的轨迹、成本记录、模型元数据、工具结果,以及代理运行与周边请求之间的关联。原始事件流只是基础,而不是完整的监控系统。

采用风险也不容忽视。Elixir 拥有活跃的社区,但 AI 工具市场仍集中于 Python 和 JavaScript。Imp 必须吸引同时理解语言模型优化和 BEAM 应用设计的贡献者。

文档将影响这种采用。项目已经提供入门路径、DSPy 迁移指南、教程、生产说明和 Livebook notebooks。要让这些材料与快速演进的代码同步,将需要持续投入。

版本稳定性同样重要。团队会犹豫是否将核心工作流建立在可能频繁变化的 API 上。清晰的兼容性政策和迁移路径将使实验性标签更易于管理。

这些担忧都不会否定此次发布。它们定义了令人印象深刻的实现与可靠平台之间的距离。Imp 已经让前一部分变得可见;现在用户和贡献者需要检验后一部分。

考虑进行早期评估的开发者应隔离实验。受边界约束的分类或信息提取工作流,比拥有广泛权限的自主代理更适合作为起点。它能产生可衡量的输出,并限制运维风险。

团队也应保留基线实现。让同一数据集同时经过 DSPy 和 Imp,可以直接获得关于质量、延迟和成本的证据。比较应使用优化期间未曾见过的留出样本。

对于生产试验,围绕研究发现的工程工作流同样重要。团队需要保存可搜索的测试案例、故障、配置变更和基准结果记录。否则,有前景的演示可能变成缺乏支撑的架构决策。

三个信号将决定 Imp 能否站稳脚跟

Imp 的下一阶段将由对比基准、生产采用,以及其在不失去 BEAM 原生优势的前提下跟进 DSPy 的能力决定。

第一个信号是可复现的一致性基准。Imp 已经包含差异测试和基准基础设施,但外部用户需要可重新运行的公开结果。最有力的证据将是在相同任务和预算下对 Imp 与 DSPy 进行比较。

这类结果应包含直接预测、结构化提取、检索、工具使用和多步骤代理。优化器比较应涵盖 GEPA、MIPROv2 和少样本方法,因为这些功能支撑着该移植工作的核心价值主张。

如果 Imp 在重复运行中产生可比的质量和成本,“完整移植”的说法就会更有说服力。如果结果存在实质性波动,用户需要文档解释差距是否由适配器、搜索行为、随机化或运行时差异造成。

第二个信号是在真实 Elixir 应用中的生产使用。可信的部署不应只是展示代理回答问题。它应展示监督、背压、追踪、授权、持久化、升级,以及从部分工具失败中恢复的能力。

来自 Phoenix 服务、任务处理系统或事件驱动应用的证据将尤其有参考价值。这些环境揭示了选择 BEAM 的理由。它们能够说明进程隔离究竟是否简化了运维,还是仅仅转移了复杂性。

案例研究应披露工作负载形态和故障边界。短生命周期的信息提取端点与持续活跃数小时的代理,测试的是不同属性。两者都有价值,但它们支撑的是不同主张。

如果 Elixir 团队报告更简单的部署和更清晰的生命周期控制,Imp 的运行时论据就更有分量。如果大多数采用者只使用同步预测,更广泛的代理进程设计仍将大体停留在理论层面。

第三个信号是 Imp 跟进 DSPy 3.4 及后续版本的速度。项目表示正在引入这些新增内容。更新速度将揭示完整移植是否可持续,还是兼容性缺口会不断累积。

精确的功能匹配不应是唯一目标。Imp 应保留那些因充分理由而由 BEAM 改变设计的部分。进程作用域上下文、受监督运行、显式依赖和谨慎的取消行为,都可以为有意为之的差异提供正当理由。

维护者需要一套清晰的兼容性术语。功能可以标记为等效、适配、实验性或有意不支持。这将让“完整移植”更易于评估,而无需期待逐字节一致。

用户还应关注 Hex 的发布节奏和迁移质量。频繁发布可能表明开发活跃,但反复的破坏性变更会提高采用成本。升级指南和稳定的核心接口可以平衡这些压力。

社区活跃度提供了另一项信号。那些获得详细回应、外部拉取请求和独立示例支持的议题,能够反映项目是否正在超越其原始作者的范围不断发展。对于这样一个覆盖面广泛的框架而言,贡献者的多样性同样重要。

安全性与依赖维护也值得关注。MCP 连接、原生依赖、受限代码执行以及提供商集成都会扩大攻击面。清晰的安全公告与及时修复,将是建立生产环境信心的关键。

决定性的问题在于,Imp 是否会成为在 Elixir 应用中构建可衡量 AI 程序的默认方式。这一结果并不要求它主导整个 AI 市场,而是需要赢得那些已经深度投入 BEAM 生态团队的信任。

Imp 的 DSPy 移植版已经迈出了可信的第一步。它提供了出人意料地完整的编程能力,并将其连接到适合并发服务的运行模型中。项目自身的实验性警告,也让这一成果得以置于恰当的语境下理解。

开发者现在可以验证这一论点,而非停留在抽象讨论中。选择一个可衡量的工作流,建立固定的训练集和测试集,并通过 Imp 与 DSPy 运行相同任务。记录质量、模型使用情况、延迟、失败情况与运维成本。

接着测试 Python 对比中常被忽略的部分。将 Imp 工作流作为受监督进程运行,中断它、拒绝一个工具调用,并检查由此产生的事件。如果这一生命周期变得更容易推理和理解,那么这个 BEAM 移植版所带来的价值就不只是语法层面的对等。

接下来的几个版本将显示,Imp 能否在维持这一优势的同时,跟上 DSPy 快速演进的能力。就目前而言,最好将该项目理解为一个严肃的实验性运行时,而非已经完成的替代方案。

 
 

免费开始使用

一款本地优先的AI助手

为了获得更好的人工智能体验,

remio 目前仅支持Windows 10+ (x64)和M-Chip Mac 。

你的 AI 工作伙伴

和 remio 一起高效工作

规划、创作、交付

一站式完成

bottom of page