@lianapatel_: 非常兴奋地宣布我们发布了 LOTUSPlan,一个全新的 API 和优化器,用于更高性能的 LLM 驱动数据处理...
摘要
LOTUSPlan 是一个用于基于 LLM 的数据处理的新 API 和优化器,通过惰性执行和全局规划,可将成本降低最多 2.4 倍,准确率提升 4.6 倍。由伯克利和斯坦福开发,支持代理轨迹分析、RAG 和文档提取等任务。
查看缓存全文
缓存时间: 2026/06/11 13:58
非常激动地宣布,我们发布了LOTUSPlan,这是一个新的 API 和优化器,用于更高性能的 LLM 驱动数据处理,来自我们伯克利和斯坦福的团队。LOTUS 现在允许你编写基于 LLM 的查询,并对其进行优化,在代理轨迹分析、LLM 评估、RAG、文档提取和深度研究等任务中,成本降低高达 2.4 倍,准确率提升高达 4.6 倍。查看我们的新博客:https://liana313.github.io/blog/lotusplan.html…
基于 LLM 的数据编程 — Liana Patel
来源:https://liana313.github.io/blog/lotusplan.html
链接
仓库github.com/lotus-data/lotus (https://github.com/lotus-data/lotus)基准测试lotus-data/lotus/benchmarks (https://github.com/lotus-data/lotus/tree/main/benchmarks)论文参考语义运算符 (arXiv:2407.11418) (https://arxiv.org/abs/2407.11418)DiscordLOTUS 社区 (https://discord.gg/ZWQBurm5bt)我们很高兴地宣布发布 LOTUSPlan,它是 LOTUS 的新 API,通过语义运算符程序的惰性执行来优化基于 LLM 的数据处理。
一年多前,LOTUS 引入了 语义运算符,这是一种用于基于 LLM 的数据编程的声明式编程模型。LOTUSPlan 代表了 LOTUS API 的下一步演进,旨在使基于 LLM 的数据处理更简单、更便宜、更准确。LOTUSPlan 为您的 LLM 查询带来了全局规划和惰性执行,利用我们的一套优化器(现在包括您最喜欢的文本优化器,如 DSPy 的 GEPA (https://gepa-ai.github.io/gepa/))来实现最先进的性能。LOTUS API 让您可以无缝地在急切执行(非常适合快速开发和调试)和惰性执行(显著优化性能)之间切换,两全其美。
结果: 在多样化的任务中,例如代理轨迹分析、LLM 评估和 RAG,基于 LLM 的处理实现了成本降低高达 2.4 倍,准确率提升高达 4.6 倍。
摘要图表:与未优化的基线相比,LOTUSPlan 在语义算子工作负载上提高了准确性并降低了成本。全局规划和优化器在代表性 LOTUS 工作负载上带来的端到端收益(成本和准确率)。在这篇博客中,我们将向您介绍 LOTUS 的新功能,并在以下方面展示该系统非常令人兴奋的结果:
- 代理轨迹分析 (https://liana313.github.io/blog/lotusplan.html#agent-trace-analysis)
- LLM 评估 (https://liana313.github.io/blog/lotusplan.html#llm-judge-evals)
- RAG (https://liana313.github.io/blog/lotusplan.html#rag)
- 深度研究 (https://liana313.github.io/blog/lotusplan.html#deepresearch-agents)
- 文档提取 (https://liana313.github.io/blog/lotusplan.html#document-extraction)
LOTUS 由斯坦福大学和加州大学伯克利分校开发,自 2025 年冬季起已部署在 DeepScholar 的 DeepScholar Research Preview (https://deep-scholar.vercel.app/) 中,在发布后的前 3 个月内已处理了超过 10K 个 DeepResearch 查询,服务了数千名用户。LOTUS 框架使处理大型数据集变得高效且准确,即使是资源受限的团队也能扩展其基于 LLM 的处理管道。
访问我们的 GitHub 仓库并开始使用 LOTUS:https://github.com/lotus-data/lotus。我们还提供了所有 基准测试代码 (https://github.com/lotus-data/lotus/tree/main/benchmarks) 供社区使用,以便大家能够基于这项工作进行构建。
背景:为什么基于 LLM 的数据处理需要新的原语
在过去的几年里,我们看到了一组新的工作负载,这些工作负载要求我们的人工智能系统能够处理越来越庞大的数据集。无论是综合数百篇论文的 DeepResearch 代理、大规模 LLM 评估,还是复杂的文档提取,这些我们称之为 语义批量处理 的工作负载都面临着一个共同的挑战:它们需要处理大量数据,通常以复杂的并行或递归模式进行。
一年多前,我们的研究引入了 语义运算符 (https://www.vldb.org/pvldb/vol18/p4171-patel.pdf) 来服务于这些任务。语义运算符是用于基于 LLM 的数据处理(例如,基于 LLM 的语义过滤、映射、聚合和连接)的声明式原语——每个运算符都对非结构化数据集实现一种转换,并且可以在保证准确率的情况下进行优化。从概念上讲,我们通过两个互补的视角来看待语义运算符:
- 用于 AI 驱动数据处理的关系运算符的演进: 类似于 SQL 中的关系运算符通过将应用程序逻辑与底层存储和执行系统解耦来改变结构化数据处理,语义运算符是声明式基于 LLM 的数据编程的类似物。语义运算符为优化创建了巨大的设计空间(例如,在我们的实验中实现了 1000 倍的加速 (https://arxiv.org/abs/2407.11418)),并且这些优化是在保证相对于定义良好的参考算法的准确率的情况下执行的,使其执行行为稳健,类似于传统的查询优化器。
- RAG 的超集: 传统的 RAG 系统通过两个关键原语实现:
search()用于检索相关上下文,以及LM()调用用于摘要。语义运算符不仅实现了这些原语,还实现了更丰富的转换集合,允许您(更重要的是,您的代理)构建更具表现力和更强大的管道(稍后我们将看到!)。
我们很高兴看到语义运算符在用户、社区研究人员以及行业内得到了很多早期采用——我们认为这些原语将变得至关重要,尤其是当我们继续扩大我们希望 AI 系统和代理处理的数据量时。
让我们在 LOTUS 中试用语义运算符
如果您是 LOTUS 的新手,这里有一个小例子来说明语义运算符的实际应用。让我们使用 LOTUS 过滤我们的 GitHub 问题数据集,找到适合首次贡献者的问题。
首先进行一些基本设置。我们将配置模型,并创建一个小的数据集,这是一个标准的 pandas DataFrame,包含一个 issue_title 列,列出 GitHub 风格的问题。
`` import pandas as pd import lotus from lotus.models import LM
1. 配置 LM — 运行前导出您的 API 密钥(例如 OPENAI_API_KEY)
lm = LM(model=“gpt-4.1-nano”) lotus.settings.configure(lm=lm)
2. 加载数据 — 示例 GitHub 风格的问题标题
issues = pd.DataFrame({ “issue_title”: [ “修复 README 中的拼写错误”, “为仪表板添加深色模式支持”, “重构整个认证系统以使用 OAuth2”, “更新 LICENSE 中的版权年份”, “实现跨微服务的分布式事务支持”, “更改设置页面上的按钮颜色”, “将数据库从 Postgres 13 迁移到 16,零停机时间”, “在错误消息中添加缺少的逗号”, “构建自定义查询规划器以替换第三方依赖”, “升级 lodash 以修复已知 CVE”, “支持多区域主动-主动复制”, “删除 utils.py 中未使用的导入”, ] }) ``
由于我们要执行基于语言的过滤操作,我们将使用 LOTUS 的 sem_filter 运算符。这是 LOTUS 中的一个简单程序。当我们在数据集上调用 sem_filter 时,我们向运算符传递一个自然语言表达式(langex)——对于语义过滤器,该指令被编写为一个可以用布尔值逻辑评估的谓词。langex 将数据集属性(此处为 issue_title)放在花括号中,以指定我们希望将其作为上下文传递。
``
3. 运行 LOTUS 程序 — sem_filter
good_first_issues = issues.sem_filter( “{issue_title} 描述了一个微小、自包含的任务,新开源贡献者无需深入理解代码库即可处理” ) ``
LOTUS 提供了一组丰富的语义运算符。每个运算符都接受一个自然语言参数,实现特定的数据转换,并且可以在 LOTUS 中针对定义良好的参考算法进行优化,并提供准确率保证。下面我们重点介绍一些关键的语义运算符:
| 运算符 | 目的 | 参数 |
|---|---|---|
sem_filter | 基于自然语言谓词过滤数据集,返回满足谓词的实体。 | 自然语言谓词 |
sem_map | 基于自然语言指令投影数据集,为每个实体返回一个属性。 | 自然语言投影 |
sem_join | 根据自然语言谓词连接两个数据集。 | 自然语言谓词和要连接的表 |
sem_agg | 执行多对一聚合,从多个实体生成单个答案。 | 自然语言聚合器 |
sem_topk | 根据自然语言指令执行排序。 | 自然语言比较器:如何对任意两个输入进行排序 |
sem_search | 执行基于嵌入的语义搜索。 | 查询和要返回的 K 个项目 |
LOTUSPlan API
LOTUSPlan API 是 LOTUS 框架的一次重大演进,旨在通过声明式优化使基于 LLM 的数据处理更具性能且更简单。它弥合了 Python 的灵活性与编译查询引擎的性能之间的差距。
LOTUS 现在允许您在两种执行模式之间无缝切换:
- 急切执行 非常适合迭代开发、探索性数据分析和多步骤 LLM 程序的原型设计。您编写一个语义查询,然后立即对数据执行——就像标准的 pandas 一样。
- 惰性执行 通过最先进的优化器提供性能。通过将您的逻辑包装在 LOTUS
LazyFrame中,LOTUS 可以看到“全局图景”——在底层,引擎会创建一个抽象语法树 (AST),该 AST 可以在执行最终程序之前进行全局优化。
新的 LOTUS LazyFrame 模块允许您在调用 .optimize() 和 .execute() 之前,链式调用任意数量的语义运算符和 pandas 运算符。在底层,LOTUS 在您声明 LOTUS 管道后立即构建 AST。AST 定义了 LLM 程序的逻辑计划,其中每个语义运算符由一个单独的节点表示,该节点由用于该运算符执行的 LLM 和自然语言提示指定。
当您在程序上调用 .optimize() 时,LOTUS 可以重写 AST 逻辑——例如重新排序运算符、执行提示优化,或使用模型级联将昂贵的模型调用替换为更便宜的调用。
语义运算符程序(例如,sem_filter、sem_map、sem_agg、sem_join、…)→ 解析器 → 逻辑计划构建为抽象语法树(每个运算符一个节点)→ 优化器(.optimize())基于准确率和成本的优化器(例如,模型级联、GEPA、运算符重排序)→ 执行引擎运行优化后的计划并调用 LLM、嵌入模型等。
LOTUSPlan 管道。 语义运算符程序被解析为 AST(逻辑计划,每个运算符一个节点),通过 .optimize() 由优化器全局重写,然后由执行引擎运行——将每个运算符分派给适当的 LLM 和嵌入模型。
我们将 LOTUS 设计为模块化地支持自定义优化器,这样当新的优化器可用时,我们可以无缝地支持它们(请告诉我们您希望我们接下来支持哪些优化器!)。除了始终开启的优化器(例如运算符重排序),LOTUS 目前支持两个关键的自定义优化器:
- GEPA 优化器: GEPA 是一种最先进的提示优化器,它允许您指定一个小的标注数据集,并重写所有提示指令以优化您的准确率指标。LOTUS 允许您利用 GEPA 来优化任何语义运算符。
- 级联优化器: 级联优化器通过在可能的情况下将示例路由到便宜的代理模型,从而显著降低成本。关键的是,该优化器提供统计准确率保证,允许您针对特定应用调整目标(例如语义过滤器的召回率和精确率),以便在保持准确率的同时控制成本。级联可用于在 LOTUS 中优化语义过滤器、语义连接和成对 LLM 评估。
惰性执行三部曲
之前,我们看到了如何使用 LOTUS 的急切执行 API 编写一个简单的语义过滤器程序。现在让我们看看如何使用 LOTUSPlan API 编写相同的程序。我们可以通过三个基本步骤从代码的急切版本迁移过来。
首先,我们使用 LazyFrame() 类来包装我们的语义运算符程序,从而定义我们的管道。使用 LOTUS LazyFrame API,您可以链式调用任意数量的语义运算符和传统的 pandas 运算符(例如,.filter()、.assign()、.head())来构建您的管道。然后我们调用 LOTUS 的 .optimize() 方法,传入我们选择的优化器和训练数据。最后,我们使用 .execute() 执行我们的管道,以实现快速准确的基于 LLM 的处理。
`` from lotus.ast import LazyFrame from lotus.ast.optimizer import GEPAOptimizer, CascadeOptimizer
步骤 1:构建 LOTUS 管道 — 尚未执行任何操作
pipeline = LazyFrame().sem_filter( “{issue_title} 描述了一个微小、自包含的任务,新开源贡献者无需深入理解代码库即可处理” )
步骤 2:优化 — 在这里传入选择的优化器和训练数据集
optimized = pipeline.optimize(…)
步骤 3:在数据集上执行优化后的管道
res = optimized.execute(df) ``
LOTUS 的 LazyFrame API 还提供了一些实用工具。您始终可以使用 .print_tree() 来检查 LOTUS 在底层构建的 AST。.save() 和 .load() 实用工具使保存 LOTUS 程序的优化状态,然后在未来的会话中重新加载变得容易。
``
检查执行计划
optimized.print_tree()
保存优化后的 LOTUS 管道
optimized.save(“optimized_lf.pkl”)
在后续会话中加载管道
pipeline.load(“optimized_lf.pkl”) ``
令人兴奋的结果
1. 代理轨迹分析
代理轨迹对于理解系统的系统性故障模式来说绝对是一座金矿,这些模式使我们能够持续迭代和改进代理。不幸的是,手动分析代理轨迹既缓慢又费力,形成了开发周期中的关键瓶颈。
我们很高兴地发现,使用 LOTUSPlan,我们通过优化一个简单的语义运算符程序,在达到接近人类水平的覆盖性能的同时,还最小化了 LLM 推理的成本,从而自动化了这一处理过程。
比较基线 LOTUS 与优化后 LOTUS 在 MAST 代理轨迹分析任务上的覆盖率和推理成本的柱状图。MAST 上的代理轨迹分析。 优化后的 LOTUS 将覆盖率从 21% 提高到 97%(人类水平),同时将推理成本从 $0.054 降低到 $0.038。
任务与数据集: 我们使用 MAST 数据集进行分析,该数据集包含多个流行基准任务(包括 GAIA、GSM、ProgramDev 和 SWE-Bench)的代理轨迹。MAST 数据集包含数百条轨迹,以及通过人工标注和分析开发的系统性故障模式分类法。我们考虑的任务是自动创建跨 100 条轨迹的代理故障模式系统性分类法。为了评估生成的故障模式分类法的质量,我们计算 覆盖率得分,该得分衡量专家标注的失败轨迹中被故障分类法中至少一个类别描述的比例。
深入分析: 使用 LOTUS,从代理轨迹数据集中发现故障模式的整个管道只有两个运算符:sem_filter 用于查找具有故障模式的轨迹,以及 sem_agg 用于综合跨轨迹的分类法。
使用 gpt-4o-mini 对此代码进行简单执行仅得到 21% 的覆盖率:
`` failu
相似文章
@jerryjliu0:我们不是Palantir,但我们在文档处理方面确实对评估和爬山优化思考很多。如果你真的有很…
Jerry Liu 推广 LlamaParse 和 LlamaAgents,用于大规模文档提取,强调 LLM 评估和爬山优化以提高准确性和成本效益。他还将 FDE 工作与评估和 RL 环境联系起来。
PlanE: 面向基于抽取的大型语言模型的数据、微调与推理的元规划
PlanE 提出了一种用于构建基于抽取的LLMs的元规划框架,通过数据-微调-推理规划器优化数据分解、指令微调和提示推理,以提高构建效率。
@jerryjliu0:我们在过去约 3 个月里全面大幅提升了文档解析能力。我们的 LlamaParse 成本……
LlamaIndex 在过去三个月里显著改进了 LlamaParse。在 ParseBench 基准测试中,其在复杂表格、图表和 grounding 方面的准确率提升了 10%–20%,同时每页成本仍控制在 0.4 美分以下。
@jerryjliu0:当前代理框架(Codex, Cowork)的最新RAG趋势是进行两次文档处理以解决…
文章讨论了AI代理的两阶段文档处理趋势,其中快速OSS阶段实现高效检索,基于VLM的阶段确保准确性,推广Llama Index的LiteParse和LlamaParse工具以提高成本和性能。
我们不再手动优化 LLM 技术栈——现在它实现了自我优化
本文描述了一家企业如何实现向自我优化 LLM 技术栈的转型。该系统利用生产环境中的调用追踪数据,自动路由请求并微调模型,从而显著降低了成本并提升了性能。