Lobsters对Claudius的访谈

Lobsters Hottest 新闻

摘要

对Claude Roux的访谈,他是LispE和TAMGU的维护者,讨论他在计算语言学、符号人工智能以及基于规则的自然语言处理系统的局限性方面的职业生涯。

<p><a href="https://lobste.rs/~Claudius" rel="ugc">@Claudius</a>在Naver维护<a href="https://github.com/naver/lispe" rel="ugc">LispE</a>,此前还维护<a href="https://github.com/naver/tamgu" rel="ugc">TAMGU</a>,将<a href="https://github.com/naver/lispe/wiki/5.3-A-la-APL" rel="ugc">数组</a>和逻辑编程与<a href="https://github.com/naver/lispe/wiki/5.4-A-la-Haskell" rel="ugc">Haskell特性</a>相结合。(注意:<a href="https://github.com/naver/lispe/wiki" rel="ugc">Wiki</a>中包含文档和文章。)</p> <p>在这次访谈中,我们讨论了Lisp和Prolog的实现、数组语言、符号(<a href="https://en.wikipedia.org/wiki/GOFAI" rel="ugc">GOFAI</a>)以及神经符号人工智能。</p> <hr> <p><strong>你是如何发现编程,并进而攻读博士学位的?</strong></p> <p>这并非近期的冒险;我于1980年开始,当时父亲在圣诞节买了一台电脑。学习Basic时,我遇到了很多问题,因为我并不真正懂英语,而大部分文档都是英文写的。我花了很多时间试图理解<code>set</code>命令的作用(在这台机器上,它是在屏幕上放置一个单元格)。然后我学会了用机器语言编写<a href="https://en.wikipedia.org/wiki/Zilog_Z80" rel="ugc">Z80</a>处理器的程序,并决定攻读计算机科学。我在<a href="https://en.wikipedia.org/wiki/Pierre_and_Marie_Curie_University" rel="ugc">巴黎第六大学</a>获得了硕士学位。1989年,我搬到蒙特利尔,开始攻读计算语言学博士学位。当时,实现语法的全新符号方法非常热门。</p> <p>我在博士论文中实现了一个解析器,这很奇特,因为规则系统并非基于纯上下文无关文法,而是一组可以出现在规则右侧的类别。人们一直在寻找加速这一过程的方法,而解决方案相当简单:将每个类别视为一个独立的64位向量(长整型),对于每个规则,在右侧标记类别,将类别替换为它们在位向量上的位置,其值将成为规则的索引,这样就能从索引中找到要应用的规则。</p> <p>从此,我被PARC的姊妹公司——位于格勒诺布尔的施乐欧洲研究中心(XRCE)录用,至今我仍居住在那里。我在施乐工作了20年,又在收购了该实验室的<a href="https://www.news.xerox.com/news/NAVER-to-acquire-Xerox-Research-Centre-Europe" rel="ugc">Naver</a>工作了10年。</p> <p><strong>作为一名研究员,工作体验如何?你发表了很多论文,持有专利等,这在软件领域并不常见。</strong></p> <p>公司通常通过三种方式评估研究员:</p> <ul> <li>软件</li> <li>发表论文的数量</li> <li>专利</li> </ul> <p>现在,专利或知识产权并非大多数人想象的那样。在工业界,它们是公司之间用于获取其他技术的交易代币。但它们的重要性正在下降。</p> <p>这些年来,我实现了很多软件。凭借我的语言学博士学位,我与语言学家合作,加速工具的运行。例如,在博士工作的基础上,我编写了<a href="https://www.slideserve.com/marla/xerox-incremental-parsing" rel="ugc">施乐增量解析器(XIP)</a>(总结见<a href="https://string.hlt.inesc-id.pt/wiki/XIP" rel="ugc">此处</a>,实现见<a href="https://github.com/clauderouxster/XIP" rel="ugc">此处</a>),它每秒可解析3000个单词。</p> <p><strong>我一直思考你的一条评论:</strong></p> <blockquote> <p>我在这些系统上工作了30多年,它们从未真正工作过。我实现了一个非常快速的NLP符号解析器,与我共事的团队为8种语言(包括日语)创建了语法规则。2007年,使用6万条规则的语法,我们可以以每秒3000词的速度进行解析(开源版本见<a href="https://github.com/clauderouxster/XIP" rel="ugc">https://github.com/clauderouxster/XIP</a>)。该解析器可以提取句法依赖关系,并能使用本体论。但语言就像沙子,你越想抓住它,它就流失得越多。试图将语言压缩成规则的努力有一种徒劳感,实际上没有任何东西能真正扩展。尽管如此,我们仍然在2016年的SemEval情感分析比赛以及2017年IBM组织的法律文档提取活动中获得第一名,但都无济于事。工作量巨大,结论却非常简单:我们必须尽可能地将语法推向词汇语法,而最终LLM真正实现了这一点。我们很早就发现,上下文才是关键。我们曾尝试创建适用于整个段落而非句子的语法,但性能会急剧下降。LLM之所以有效,是因为每一步它们都将整个上下文压缩成一个有意义的向量,然后用它来指导后续的生成过程。我整个一生都在与非常优秀的人一起追求完美的解析器,而我发现很难承认我们不仅失败了,而且LLM正是我们一直在寻找的答案。——<a href="https://lobste.rs/s/y6e06t/ai_is_impressive_because_we_ve_failed_at#c_tot1rn" rel="ugc">Claude Roux</a></p> </blockquote> <p>这是一段美好的旅程,但有时你必须接受现实:符号方法已经被取代了。即使在10年前,我也只能梦想今天的人工智能技术。我想能够与计算机对话,仅通过说话就能创造东西。现在,我正在尝试将我学到的一切应用到新方法中。</p> <p>谈到智能体,我正在LispE中实现<a href="https://github.com/naver/lispe/wiki/6.21-PREDIBAG" rel="ugc">PREDIBAG</a>,一个<a href="https://en.wikipedia.org/wiki/Retrieval-augmented_generation" rel="ugc">检索增强生成(RAG)</a>系统,以帮助利用/约束LLM。它是确定性的,并具有受限的统一化。</p> <p>因此,XIP拥有依赖规则,将树中的节点连接成依赖关系,如句子树中的主语或直接宾语依赖关系。这些是在一阶逻辑引擎上实现的,这启发我在<a href="https://github.com/naver/tamgu" rel="ugc">TAMGU</a>中添加了Prolog。但这是有问题的且复杂的,涉及Prolog的真正统一化过程。Prolog有一个问题:封闭世界问题。你只能处理环境中、知识库中的信息。所以我想要更简单的东西,既有统一化,也有回溯。</p> <p>如今,编译任何语言都从AST开始,而Lisp本身就是一个AST……TAMGU的语法需要400条规则(用于<code>for</code>、<code>while</code>、实例化变量等)。你想添加和实验的东西越多,语法就越难以管理。(这是Python的问题。他们必须编造越来越奇怪的符号来容纳更多特性。)但在Lisp中,你可以在完全不修改解析器的情况下做任何事情。你只需打开一个括号,使用一个函数,仅此而已!有些人抱怨括号,但大多数语言只是在其上的一层语法糖,是某种复杂的程序将另一种语法转换为AST。所以,我想向某人展示TAMGU的工作原理,并认为Lisp会更清晰……然后我重新发现了Lisp的乐趣!我可以在LispE中实验<a href="https://github.com/naver/lispe/wiki/5.3-A-la-APL" rel="ugc">APL</a>或<a href="https://github.com/naver/lispe/wiki/5.4-A-la-Haskell" rel="ugc">Haskell</a>,任何我想要的,因为我不需要处理额外的形式化体系!</p> <p><strong>在TAMGU之前,你曾参与过哪些项目?</strong></p> <p>嗯,它直接源自XIP。我们有一个20人的语言学家团队,为英语(6万条规则)、法语、西班牙语、日语等构建语法。但当时的语料库质量很差,编码方式各异等。起初,我整合了……</p>
查看原文
查看缓存全文

缓存时间: 2026/06/16 11:33

# Claude Roux 访谈 来源:https://alexalejandre.com/programming/interview-with-claude-roux/ ## Claude Roux 访谈 2026年6月 – Alex Alejandre --- Claude Roux(https://github.com/ClaudeRoux)在 Naver 负责维护 LispE(https://github.com/naver/lispe),此前还维护过 TAMGU(https://github.com/naver/tamgu)。他将数组编程(参考 APL:https://github.com/naver/lispe/wiki/5.3-A-la-APL)、逻辑编程与 Haskell 特性(https://github.com/naver/lispe/wiki/5.4-A-la-Haskell)结合在了一起。(注:wiki 页面(https://github.com/naver/lispe/wiki)收录了文档和文章。)本次访谈中,我们讨论了 Lisp 和 Prolog 的实现、数组语言、符号主义 AI(GOFAI,https://en.wikipedia.org/wiki/GOFAI)以及神经符号 AI。 --- **你是如何接触编程并决定攻读博士学位的?** 这其实算不上最近的冒险;我早在1980年就开始了,那时我父亲在圣诞节买了一台电脑。学习 Basic 时,我遇到了很多困难,因为大部分文档都是英文的,而我当时几乎不会英语。我花了很多时间试图理解 `set` 命令的作用(在那个机器上,它是用来在屏幕上放置一个单元格的)。后来我学会了用机器语言为 Z80(https://en.wikipedia.org/wiki/Zilog_Z80)处理器编程,并决定攻读计算机科学。我在巴黎第六大学(https://en.wikipedia.org/wiki/Pierre_and_Marie_Curie_University)获得了硕士学位。1989年,我搬到蒙特利尔,开始攻读计算语言学博士学位。当时,实现语法的符号化新方法非常热门。我为博士论文实现了一个解析器,它有点奇怪,因为规则系统并非基于纯上下文无关文法,而是一组可以出现在规则右侧的类别。人们一直在寻找加速解析的方法,而解决方案其实很简单:将每个类别视为一个独立的64位向量(长整数),对于每条规则,标记右侧的类别,用它们在位向量中的位置替换类别,该位置的值将成为规则的索引,这样就能通过索引找到要应用的规则。此后,我被 PARC 的姐妹公司——位于格勒诺布尔的施乐欧洲研究中心(XRCE)录用,我现在仍住在格勒诺布尔。我在施乐工作了20年,随后在收购该实验室(https://www.news.xerox.com/news/NAVER-to-acquire-Xerox-Research-Centre-Europe)的 Naver 又工作了10年。 **作为研究人员的感受如何?你发表了很多论文,持有专利等,这在软件领域并不常见。** 公司评估研究人员通常只看三个方面: - 开发的软件 - 发表的论文数量 - 持有的专利 实际上,专利或知识产权并不像大多数人想的那样。在工业界,它们更像是公司之间交换其他技术访问权的“代币”。不过它们的重要性正在下降。这些年来我开发了大量软件。凭借语言学博士学位,我与语言学家合作加速工具的运行。例如,在博士工作的基础上,我编写了施乐增量解析器(XIP,https://www.slideserve.com/marla/xerox-incremental-parsing)(总结见这里(https://string.hlt.inesc-id.pt/wiki/XIP),实现见这里(https://github.com/clauderouxster/XIP)),它可以每秒解析3000个单词。 **我一直对您的一段评论念念不忘:** > 我在这些系统上工作了30多年,但它们从未真正奏效。我实现了一个非常高效的符号化 NLP 解析器,与我合作的团队为8种语言(包括日语)创建了语法。2007年,我们用一套6万条规则的语法,实现了每秒3000个词的解析速度(开源版本见 https://github.com/clauderouxster/XIP)。该解析器能提取句法依赖关系,并能使用本体。但语言就像沙子,你越想抓住它,它就越从指缝中流走。试图将语言压缩成规则,本质上是一种**徒劳**,没有任何东西能够真正规模化。尽管如此,我们还是在2016年的 SemEval 情感分析竞赛中获胜,在2017年 IBM 组织的法律文档提取竞赛中也获得了第一名,但这都无济于事。付出了巨大努力,结论却很简单:我们必须尽可能将语法推向词汇语法,而最终大语言模型(LLM)真正实现了这一点。我们很早就发现,上下文才是关键。我们曾尝试创建能应用于整个段落而非句子的语法,但性能急剧下降。LLM 之所以有效,是因为每一步它们都将整个上下文压缩成一个有意义的向量,然后用它来指导后续的生成过程。我毕生都在与非常聪明的人们一起追求完美的解析器,**我很难承认,我们不仅失败了,而且 LLM 正是我们一直寻找的答案**。 ——Claude Roux(https://lobste.rs/s/y6e06t/ai_is_impressive_because_we_ve_failed_at#c_tot1rn) 这是一段非常美妙的旅程,但有时你必须接受现实:符号化方法已经被取代。即便在十年前,我也只能梦想今天这样的 AI 技术。我希望能够与计算机对话,仅通过说话来创造东西。现在,我正尝试将学到的一切应用于新方法。谈到智能体(agent),我目前正在 LispE 中实现 PREDIBAG(https://github.com/naver/lispe/wiki/6.21-PREDIBAG),这是一个检索增强生成(RAG,https://en.wikipedia.org/wiki/Retrieval-augmented_generation)系统,用于帮助约束/控制 LLM。它采用确定性方法并带有限制性合一(unification)。 那么,XIP 拥有依赖规则,将树中的节点连接成依赖关系,例如句子树中的主语或直接宾语依赖关系。这些规则是在一阶逻辑引擎上实现的,这启发我将 Prolog 添加到 TAMGU(https://github.com/naver/tamgu)中。但这带来了问题和复杂性,尤其是 Prolog 真正的合一过程。Prolog 有一个问题:封闭世界问题。你只能处理环境(知识库)中的信息。所以我想要一种更简单的机制:既支持合一,又支持回溯。 现在,编译任何语言,你都要从 AST 开始,而 Lisp 本身就已经是 AST 了…… TAMGU 的语法需要400条规则(用于 `for`、`while`、实例化变量……)。你越想添加和实验,语法就越难以管理。(这也是 Python 的问题:他们不得不编造越来越奇怪的记法来塞入更多特性。)但在 Lisp 中,你无需修改解析器就能做任何事情。你只需打开括号,使用一个函数就可以了!有人抱怨括号,但大多数语言都只是在其上的一层语法糖,通过某种复杂的程序将另一种语法翻译成 AST。 于是,我想向某人展示 TAMGU 的工作方式,并认为 Lisp 会更清晰……然后我再次发现了 Lisp 的乐趣!我可以在 LispE 中试验 APL(https://github.com/naver/lispe/wiki/5.3-A-la-APL)或 Haskell(https://github.com/naver/lispe/wiki/5.4-A-la-Haskell),想试什么就试什么,因为我不需要处理额外的形式化语言! **在 TAMGU 之前,你参与过哪些项目?** 嗯,它直接从 XIP 衍生而来。我们有一个20人的语言学家团队,为英语(6万条规则)、法语、西班牙语、日语等构建语法。但当时的语料库非常糟糕,编码各不相同等等。起初,我将 Python 解释器集成到 XIP 中,规则可以调用 Python 函数。不幸的是,Python 对字符串的混合编码非常严格,总是失败,这促使我开发一种语言来解决这个问题……然后范围逐渐扩大,最终你可以动态构建规则,或者在语法之上执行规则。我将这种语言从 XIP 中提取出来,重写了解释器几次,也改了几次名字……2020年,我想整合 PyTorch,于是招了一名实习生,他需要了解 TAMGU 的工作原理,这促使我创建了 LispE……在 TAMGU 中,每条指令和每种数据结构都是一个对象(C++ 对象的实例),派生自同一个类,以便存在于同一个向量中。每个函数和每种数据结构都有自己的 `eval`。 再往前追溯,当我开始攻读博士学位时,Prolog 是处理语法的标准方式。它的发明者 Alain Colmerauer 是我博士导师的朋友,所以我首先从实现层面接触了它。我从他们那里学到了很多技巧,比如对第一个参数进行索引。当你描述规则时,第一个参数成为索引。当你尝试执行一个新谓词时,你会尝试利用谓词的第一个参数来找出需要测试哪个谓词(基于索引)。处理语言时,第一个参数通常是一个单词或类别(原子或字符串);对它们进行索引能大大加快选择速度。知识库也在后台通过索引实现,这样就不必试知识库中的每个元素,而只尝试那些以当前单词为索引的元素。WordNet(https://en.wikipedia.org/wiki/WordNet)是一个有趣的语料库,它有自己的(低效)Prolog 实现;有人说将它加载到 SWI-Prolog 中大约需要2分钟,但使用这种技术,我可以在几秒钟内将其加载到 TAMGU 中!不过我现在不太使用 RDF 和公共知识库了。 我非常喜欢用 Prolog 实现东西,但不幸的是,Prolog 无法高效处理我那个将每个类别与位向量中的位置关联起来的想法。我之前在 TAMGU 中已经做过 PREDIBAG(参见 wiki(https://github.com/naver/tamgu/wiki/3.4-PREDIBAG:--Building-Modern-AI-Agents-in-Tamgu's-Prolog)),针对 GSM8K(https://huggingface.co/datasets/openai/gsm8k)数学数据集,使用 Prolog 达到了98%的准确率,而当时单独一个模型只能达到60%。Prolog 程序会要求 LLM 创建一个新问题并回答它(先创造知识再使用能力),然后输出一个 Python 程序,并测试其输出是否与数据集的期望值一致。PREDIBAG 的核心思想就是利用谓词来探索规则本身计算出的隐式图。我现在正尝试通过 LispE 将这一方法带到浏览器中,其规则更轻量、更简单。用规则工作实在太美妙了;回溯机制非常强大。这意味着你有一个统一的入口点(谓词名称),而不同的函数共享同一个名称,系统会依次尝试它们。要丰富它们,只需添加一条新规则/实现,而不是陷入 `if` 和 `else` 的泥潭。 **LispE 在实验室和你的工作中扮演什么角色?** 我定期向其他研究人员做报告,但我还有其他需要评估的任务。你要记住你是受公司雇用的,所以诀窍在于将公司的目标与我自己的实验结合起来。我提了一个提案,管理层允许我继续研究 PREDIBAG。过去,主要目标是机器翻译。柏林墙倒塌后,机器翻译似乎是迎接新国家的解决方案。我必须承认,我并没有想出最好的解决方案,但如今机器翻译几乎已经解决了。 **过去我曾尝试在世界语(Esperanto)和中介语(Interlingua)这两种语法规则化的人造语言上使用 GOFAI 语法。你创建了一种人造语言 Lingvata(https://europe.naverlabs.com/blog/can-made-up-languages-help-computers-translate-real-ones/),带格尾等,作为机器翻译的目标语言/辅助工具。效果如何?** 在 XRCE,我们基于词典(例如英法词典)制作了有限状态词汇转换器(https://www.redalyc.org/pdf/5157/515751735044.pdf),它们非常紧凑。(LispE 也包含一个转换器库(https://github.com/naver/lispe/wiki/5.15-Transducer)。)我上学时学过拉丁语,认为变格(在词尾标记主语、宾语等)在这里会很有帮助。(例如在西班牙语中,你不必使用代词,因为动词词尾已经传达了含义。)如果转换器能够根据词尾系统地识别单词的属性……于是我制作了一个系统,用 XIP 生成 Lingvata 句子!这些转换器就是自动机、图。许多分支共享大量共同部分,你可以合并它们,将词典压缩到不足1 MB。在 LispE 转换器目录中,你可以创建一个包含表面形式和词条形式的文档。将其提供给转换器编译器,你就会得到一个压缩系统,可以在整个库中使用!我有许多自然语言的转换器,可以解析一个句子,例如对 "men" 返回 `(man plural noun)`。 **你是如何实现 LispE 的 APL/数组特性的?看到函数符合(例如 `(+ '(1 2 3) '(1 2 3) 3)`)时我非常高兴。** 1984年,我在学习计算机科学,统计老师是 Yves Escoufier(https://imag.umontpellier.fr/YvesEscoufier/)。蒙彼利埃最大的工厂是 IBM 工厂,它与 Escoufier 合作,用 APL 实现他的统计方法。我加入了那个团队!我们在一个*全新*的计算机上实现,这台计算机带有一个*浮点芯片*!于是我为其 APL 版本用汇编实现了矩阵乘法。基于此可以编写一些非常有趣的程序,我把它记在了心里。实现 LispE 时,我通过间接方式用向量替代了链表:一个列表是指向缓冲区的指针,多个列表可以共享同一个缓冲区。共享缓冲区时,你可以拥有自己的偏移量(起始位置)。既然有了这些数组,我就研究了 APL 运算符,比如 rho、reduce 等,它们的实现比我想象的要复杂。 *呃……Cabuchon!是我的猫。它正在玩……哦不……* 每年我都会尝试玩 Advent of Code,有了 APL 运算符,许多问题都变得简单了。Rho、rank、iota(https://github.com/naver/lispe/blob/457a5938807ae1872d098d5f609672bf2d8c5d80/examples/AdventOfCode2021/day13.lisp#L16)太有用了!因为它是 Lisp,你不需要处理特定的形式化语言,所以这一切都相对容易。我还用这种 APL-Lisp 实现了生命游戏(https://github.com/naver/lispe/wiki/6.20-Conway-Game-of-Life-in-LispE)。 **你用 C++ 的类实现了 LispE,这种方法的灵感来自哪里?** 因为 C++ 提供了虚函数表(vtable),这让你可以为每个不同的类创建一个 `eval` 函数。在我使用的 C++ 子集和 Lisp 之间存在一种同构。我没有尝试实现复杂的东西,而是尽可能利用虚函数表。我在 LispE 中实现了一个 Python 子集(https://github.com/naver/lispe/wiki/6.22-Transpiling-Python-into-LispE),以便在 LispE 内部执行 Python,所以我对 Python 很了解。Python 最初实现于1990年左右,当时 C++ 还不算普及。于是 Guido 重新发明了虚函数表;Python 使用了自己的(低效的)虚函数表机制。但现代 C++ 在字符串、向量等方面提供了许多有用的特性,你不需要自己重新实现。我确实也尝试从其他地方“偷”特性。我觉得 Rust 的借用(borrowing)概念非常有趣,受此启发,在 LispE Torch(https://github.com/naver/lispe/tree/master/lispetorch)实现中,你可以检查一个结构(例如整数列表)并自动将其转换为张量,零拷贝。 **你还从哪些地方找到了灵感?你有 a la APL(https://github.com/naver/lispe/wiki/5.3-A-la-APL)、Haskell(https://github.com/naver/lispe/wiki/5.4-A-la-Haskell)……** Prolog。当然还有 Lisp。(命名约定如 `setq` 来自《Lisp 之根》(https://www.paulgraham.com/rootsoflisp.html)。)基于位向量的本体(https://github.com/naver/lispe/wiki/5.11-Ontologies)相关的内容。很多人做着很酷的东西,而当我亲自实现这些东西时,理解得更透彻。我也从别人的错误中学习。Python 的 API 极其……

相似文章

@Mnilax: https://x.com/Mnilax/status/2053116311132155938

X AI KOLs Timeline

该文章详细介绍了一个扩展的 12 条规则 CLAUDE.md 配置模板,该模板在 Andrej Karpathy 最初的 4 条规则基础上进行了扩展,旨在进一步减少 AI 编码错误并处理复杂的智能体编排问题。