前些天发的文章DuckDB发明MTL,这个岗位可能消失!对应的论文来了!
好的,为了完全理解《Beyond Quacking: Deep Integration of Language Models and RAG into DuckDB》这篇论文,您需要掌握以下几个核心领域的 foundational knowledge。我会用尽量通俗易懂的方式,结合图表来解释这些概念。
这篇论文的核心在于,它尝试将两种强大的技术——数据库和大语言模型——无缝地结合在一起,从而创造出一种更强大、更易于使用的数据分析方式。
以下是您需要了解的基础知识,可以看作是攀登这座技术高峰前的“登山装备”:
想象一下,数据库管理系统 (DBMS) 就像一个纪律严明、效率极高的数字图书馆管理员。
SQL (Structured Query Language) 则是你与这位“管理员”沟通的语言。你想找书、添加新书或修改信息,都得用SQL告诉他。
例如,你想找所有关于“犯罪”主题的书籍,你可能会用类似这样的SQL语句:SELECT 书名, 作者 FROM 图书馆 WHERE 主题 = '犯罪';
这篇论文的工作就是建立在一个数据库系统之上的。
DuckDB 是一个非常特别的数据库。论文标题中的 "Quacking" (鸭子叫) 就是在玩 DuckDB 的梗。
下面这个图可以帮助理解:

这样做的好处是什么?速度极快!因为它避免了应用程序和数据库之间的数据来回传输,这在处理大规模数据分析时能节省大量时间 。这篇论文选择 DuckDB 正是因为它本身的高性能和易于扩展的特性 。
这可能是你最熟悉的部分,ChatGPT、Gemini 就是著名的大语言模型 (LLM)。
你可以把 LLM 想象成一个见多识广、精通语言艺术的“实习生”。
RAG 是一种解决 LLM 上述局限性的绝佳策略。你可以把它理解为给 LLM 开卷考试。
传统的问答方式是直接问 LLM (闭卷考试),它只能凭记忆回答。而 RAG 不同,它的流程是:
下面是 RAG 的工作流程图:

RAG 使得 LLM 的回答更可靠、更贴近事实,因为它被“锚定”在了你提供的具体数据上。
了解了以上基础知识后,你就能明白这篇论文的出发点了。
llm_complete() 或 llm_filter() 这样的新函数 。简单来说,这篇论文的目标就是把原来需要多个厨房、多个厨师才能完成的复杂菜肴(数据分析与语义理解),变成在一个高度智能化的“中央厨房”(集成了 LLM 的 DuckDB)里,用一套统一的指令 (SQL) 就能高效完成。
好的,我们来深入解读一下这篇名为《Beyond Quacking: Deep Integration of Language Models and RAG into DuckDB》的论文。这篇论文提出了一种名为 FLOCKMTL 的创新方案,旨在彻底改变开发者构建知识密集型数据应用的方式。
首先,我们来概括一下它的核心思想:
传统的做法是让数据“跑”向模型(从数据库中取出数据,在应用程序中处理,再发给语言模型),这既麻烦又低效。而 FLOCKMTL 的思想是让模型“入住”到数据中(将语言模型的功能直接内置于数据库),让开发者可以用最熟悉的 SQL 语言,在一个系统内完成所有操作。
接下来,我们将分步深入讲解论文的关键内容。
现代数据分析应用,尤其是知识密集型的应用,常常面临一个巨大的挑战:它们需要同时从结构化数据(如数据库中的表格)和非结构化数据(如文本文档)中检索信息并进行决策 。
随着大语言模型(LLM)和检索增强生成(RAG)技术的兴起,虽然原型开发变得容易了 ,但高效地实现这些数据流程仍然困难重重 ,开发者仿佛回到了关系型数据库诞生前的“蛮荒时代” 。
具体痛点如下:
FLOCKMTL 的诞生,正是为了解决以上所有问题,它希望将开发者从这些低级别的实现负担中解放出来 。
FLOCKMTL 是一个针对 DuckDB 的开源扩展 。选择 DuckDB 是因为它是一个先进的、可嵌入的分析型数据库,并且其扩展机制非常灵活,允许对 SQL 解析、优化器和执行引擎进行深度修改 。
FLOCKMTL 的核心是将 LLM 的能力和 RAG 流程深度集成到数据库内部 。它通过两大创新基石来实现这一点。

MODEL 和 PROMPT 成为一等公民为了实现“资源独立性” (resource independence),FLOCKMTL 引入了两个全新的数据库定义语言(DDL)对象:MODEL 和 PROMPT 。它们和我们熟悉的 TABLE 一样,是数据库中的一等公民 。
CREATE MODEL: 定义一个可以复用的模型。比如,定义一个名为 model-relevance-check 的模型,它指向 OpenAI 提供的 gpt-40-mini 。CREATE PROMPT: 定义一个可复用的提示词。比如,定义一个名为 joins-prompt 的提示词,用于判断论文是否和连接算法相关 。这样做的好处是什么?极大地增强了灵活性和可维护性。数据工程师或管理员可以直接修改模型或提示词的定义,而无需改动任何应用程序的 SQL 查询代码 。例如,当 OpenAI 发布了更强的模型时,只需 ALTER MODEL 更新一下模型指向即可,所有使用该模型的查询将自动受益。
FLOCKMTL 的核心功能是通过一系列强大的标量函数 (Scalar Functions) 和聚合函数 (Aggregate Functions) 来体现的 。
标量函数 (Scalar Functions): 对每一行输入进行操作,并返回一个值 。
llm_filter(model, prompt, ...): 根据 LLM 的判断返回 True 或 False,用于过滤数据行 。llm_complete(model, prompt, ...): 对每一行数据生成一段文本描述,比如做总结 。llm_complete_json(model, prompt, ...): 对每一行数据提取结构化的 JSON 信息,比如提取关键词和论文类型 。llm_embedding(model, ...): 将文本转换为向量(嵌入),这是语义搜索的基础 。聚合函数 (Aggregate Functions): 对多行输入进行操作,并返回一个聚合后的值 。
llm_rerank(model, prompt, ...): 对一组输入行(比如搜索结果)进行重新排序,以提高相关性 。llm_first/llm_last(...): 从一组输入行中,根据 LLM 的判断选出最相关或最不相关的那一行 。通过将这些函数与 SQL 的公用表表达式(CTE,即 WITH 子句)结合,用户可以构建出强大的、可链式调用的 LLM 预测流水线 。
如果仅仅是封装 API,FLOCKMTL 的价值将大打折扣。它的真正强大之处在于系统会自动处理那些繁琐但至关重要的底层优化,用户无需关心 。
论文重点介绍了两个优化:
此外,系统还会无缝地处理缓存 (Caching)(重复的请求直接使用缓存结果)和对去重后的值进行预测等优化 。
论文中的查询3 (Query 3) 完美展示了 FLOCKMTL 的强大能力,它首次在 SQL 内部实现了一个完整的混合搜索(Hybrid Search)流程 。
目标:从海量论文段落中,找到与“数据库中的连接算法”相关的文章,并从中进一步找出优先提及“循环连接查询”的段落 。
这个复杂的任务被分解为清晰的 SQL 步骤:
llm_embedding 将用户的查询意图 "join algorithms in databases" 转换为一个向量 。llm_embedding 计算所有论文段落的向量,并通过向量相似度计算,找出最相关的100个段落 。FULL OUTER JOIN 合并,并使用 fusion 函数对它们的得分进行归一化和融合 。llm_rerank,并给出一个新的、更具体的提示词 "mentions cyclic joins",让 LLM 对这10个结果进行智能的、更精准的重新排序 。这个案例雄辩地证明,过去需要多个系统、复杂编排才能完成的任务,现在可以用一个声明式的 SQL 查询一气呵成。
《Beyond Quacking》提出的 FLOCKMTL 方案,通过以下几个关键创新,极大地简化了知识密集型应用的开发:
MODEL 和 PROMPT 作为一等公民,实现了应用逻辑与 AI 资源的解耦,易于维护。FLOCKMTL 让数据库不仅仅是一个存储和检索数据的仓库,更将其提升为一个能够进行深度语义理解和推理的智能分析引擎。
以下是论文《Beyond Quacking: Deep Integration of Language Models and RAG into DuckDB》中的一些重要术语及其详细解释:
LLM_COMPLETE 和 LLM_FILTER 是 FLOCKMTL 支持的标量函数 。LLM_RERANK 和 LLM_FIRST/LAST 是 FLOCKMTL 支持的聚合函数 。LLM_EMBEDDING)和全文搜索(例如 BM25),然后融合结果并重新排序 [cite: 146, 147, 152, 155, 156, 157]。以下是这些术语之间关系的图形表示:

解释图示:
LLM_FILTER, LLM_COMPLETE_JSON) 和 聚合函数 (如 LLM_RERANK, LLM_FIRST/LAST)。https://arxiv.org/pdf/2504.01157