Oracular Programming: A Modular Foundation for Building LLM-Enabled Software

📄 arXiv: 2502.05310v3 📥 PDF

作者: Jonathan Laurent, André Platzer

分类: cs.PL, cs.AI

发布日期: 2025-02-07 (更新: 2025-11-20)


💡 一句话要点

提出Oracular Programming,用于构建可模块化、可控的LLM驱动软件

🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)

关键词: 大型语言模型 软件工程 模块化编程 程序合成 人工智能

📋 核心要点

  1. 现有方法难以控制LLM,缺乏在合约下模块化组合计算的能力,限制了LLM在可靠软件构建中的应用。
  2. Oracular Programming将显式计算与LLM集成,核心在于分离核心逻辑和搜索逻辑,并将少量示例视为可演化的程序组件。
  3. 该方法将问题解决策略表示为带选择点的程序,由LLM在运行时解决,并通过策略、演示等组件实现模块化和可演化。

📝 摘要(中文)

大型语言模型(LLM)仅需少量示例即可解决各种任务,但它们仍然难以控制,并且缺乏构建大规模可靠软件的关键能力:在可执行的合约下进行模块化计算组合。因此,它们通常嵌入到更大的软件流程中,利用领域特定知识来分解任务,并通过验证和搜索提高可靠性。然而,编写、调整和维护此类流程的复杂性限制了它们的复杂性。我们提出了oracular programming:一种将传统显式计算与LLM等归纳预言机集成的基础范例。它基于两个指导原则:核心逻辑和搜索逻辑的完全分离,以及将少量示例视为已确定且可演化的程序组件。在该范例中,专家将高级问题解决策略表示为具有未解决选择点的程序。这些选择点在运行时由LLM解决,LLM从用户提供的正确和错误决策示例中进行泛化。一个oracular程序由三个正交组件组成:一个策略,它由一个具有可以选择点的非确定性程序组成,该程序可以具体化为搜索树;一个策略,它指定如何在LLM预言机的帮助下导航此树;以及一组演示,描述了跨不同问题实例的成功和不成功的树导航场景。每个组件都用一种专门的编程语言表达,并且可以独立改进或替换。我们解决了模块化组合oracular程序以及在它们演化时强制执行其组件之间一致性的关键编程语言设计挑战。

🔬 方法详解

问题定义:现有方法在利用大型语言模型(LLM)构建复杂软件系统时,面临着LLM难以控制、缺乏模块化组合能力以及难以保证可靠性的问题。传统的软件开发方法依赖于明确的规则和可预测的行为,而LLM的行为往往难以预测和解释,这使得将LLM集成到需要高可靠性的软件系统中变得困难。此外,现有方法在调整和维护包含LLM的复杂流程时,成本很高。

核心思路:Oracular Programming的核心思路是将问题解决过程分解为明确的计算部分(核心逻辑)和由LLM驱动的搜索部分(搜索逻辑),并对两者进行完全分离。通过将LLM视为一个“预言机”,负责在程序的选择点提供建议,从而利用LLM的泛化能力,同时保持对程序整体行为的控制。关键在于将少量示例视为程序组件,允许程序根据新的示例进行演化和改进。

技术框架:Oracular Programming框架包含三个主要组件:策略(Strategy)、策略(Policy)和演示(Demonstration)。策略是一个带有选择点的非确定性程序,描述了解决问题的高层步骤。策略指定了如何利用LLM预言机来导航搜索树。演示则提供了一组成功和失败的案例,用于训练和指导LLM预言机的行为。这三个组件使用专门的编程语言表达,可以独立地进行改进和替换。

关键创新:Oracular Programming的关键创新在于其模块化的设计和对LLM的抽象。通过将问题解决过程分解为独立的策略、策略和演示组件,该框架实现了高度的灵活性和可维护性。将LLM视为一个预言机,并通过示例进行指导,使得开发者可以在不深入了解LLM内部机制的情况下,有效地利用LLM的能力。

关键设计:Oracular Programming的关键设计包括:用于表达策略、策略和演示的专用编程语言,用于在运行时解析选择点的机制,以及用于保证组件之间一致性的方法。具体的技术细节,例如损失函数、网络结构等,取决于所使用的LLM和具体的应用场景。论文强调了模块化组合和一致性保证的重要性,但没有提供具体的参数设置或网络结构的细节。

🖼️ 关键图片

fig_0
fig_1
fig_2

📊 实验亮点

论文提出了Oracular Programming这一新的编程范式,并详细阐述了其核心思想、技术框架和关键设计。虽然摘要中没有明确提及具体的实验结果和性能数据,但该方法在模块化、可控性和可维护性方面的优势,为LLM驱动软件的开发提供了一种新的思路。

🎯 应用场景

Oracular Programming可应用于各种需要将LLM与传统计算相结合的领域,例如自动化程序修复、机器人控制、游戏AI和智能助手。它能够提高LLM驱动软件的可靠性、可控性和可维护性,从而加速LLM在实际应用中的部署。该方法有望简化复杂软件流程的开发,并降低维护成本。

📄 摘要(原文)

Large Language Models can solve a wide range of tasks from just a few examples, but they remain difficult to steer and lack a capability essential for building reliable software at scale: the modular composition of computations under enforceable contracts. As a result, they are typically embedded in larger software pipelines that use domain-specific knowledge to decompose tasks and improve reliability through validation and search. Yet the complexity of writing, tuning, and maintaining such pipelines has so far limited their sophistication. We propose oracular programming: a foundational paradigm for integrating traditional, explicit computations with inductive oracles such as LLMs. It rests on two directing principles: the full separation of core and search logic, and the treatment of few-shot examples as grounded and evolvable program components. Within this paradigm, experts express high-level problem-solving strategies as programs with unresolved choice points. These choice points are resolved at runtime by LLMs, which generalize from user-provided examples of correct and incorrect decisions. An oracular program is composed of three orthogonal components: a strategy that consists in a nondeterministic program with choice points that can be reified into a search tree, a policy that specifies how to navigate this tree with the help of LLM oracles, and a set of demonstrations that describe successful and unsuccessful tree navigation scenarios across diverse problem instances. Each component is expressed in a dedicated programming language and can be independently improved or substituted. We address the key programming language design challenges of modularly composing oracular programs and enforcing consistency between their components as they evolve.