作者在漏洞研究中发现,LLM在长时间对话中会遗忘已确认的事实。为解决此问题,他尝试改进记忆系统,而非简单存储对话记录,以提升模型在复杂研究中的实用性。
正文
好的,这是根据您的要求,对原文进行的中文重述,保留了核心细节,并删减了与主题无关的冗余内容。
标题:我意外地把大语言模型记忆变成了程序分析
核心观点: 作者在利用大语言模型(LLM)进行漏洞研究时,发现模型会逐渐“遗忘”已建立的结论,导致重复劳动和错误推理。为解决此问题,作者没有采用传统的向量数据库记忆方案,而是借鉴程序分析的思想,开发了一个名为 Lemmalog 的 Datalog 引擎,用于维护 LLM 的“当前已知状态”。
问题描述: 在进行数小时的复杂漏洞研究时,LLM 会慢慢丢失已确认的信息。例如,它会忘记某个假设已被推翻,或基于已失效的观察继续推理。传统的记忆系统(如向量数据库)虽然能存储和检索历史对话,但无法处理“事实更新”带来的连锁反应。当一条旧事实被否定后,系统无法自动使所有依赖该事实的结论失效,导致新旧矛盾信息并存,最终仍需 LLM 自行判断,这并不可靠。
解决方案:Datalog 引擎(Lemmalog) 作者意识到,漏洞研究的过程本质上与程序分析高度相似:有输入事实(观察)、规则(关系)、推导事实(结论)和固定点(当前已知)。因此,他开发了 Lemmalog,将问题一分为二:
- LLM 负责“模糊”部分: 理解自然语言、源代码、调试器输出等非结构化信息,并将其转化为结构化的事实(如
freed(object_a))。 - Lemmalog 负责“确定性”部分: 基于事实和预设的规则,自动推导出新的结论,并维护一个一致的、可追溯的知识库。
关键特性:
- 事实撤销与依赖追踪: 当一条事实被删除或否定时,Lemmalog 能自动追踪并更新所有依赖该事实的推导结论。如果一个结论有多个独立的事实支持,删除其中一个不会导致结论失效。
- 可解释性(Why?): 系统能追溯任何结论的推导过程,展示其依赖的原始观察和规则。这有助于验证 LLM 的断言是否真实,防止未经支持的结论混入研究。
- 时间有效性: 事实可以关联有效时间区间。例如,
viable(primitive_a)在某个时间段内为真,之后变为not_viable。这允许系统回答“当前是否可行”和“当时为何认为可行”两种问题,而无需保留矛盾信息。
与传统向量数据库的对比: 向量数据库擅长检索“相关”信息,但无法判断信息的“真伪”和“时效性”。Lemmalog 则专注于解决“基于当前所有已知信息,什么是真实可信的”这一核心问题。两者可以结合使用。
基准测试结果:
- LongMemEval: Lemmalog 的 F1 分数为 0.463,虽不及 PropMem (0.550) 和 SimpleMem (0.480),但远超全量上下文 (0.222)。其优势在于“知识更新”类别,得分 0.579,高于 PropMem (0.528),这正是其设计初衷。同时,其查询上下文仅为全量上下文的 1/38(约 2700 tokens vs 104000 tokens)。
- LoCoMo: Lemmalog 的 F1 分数为 0.533,在专用记忆系统中排名第三。在“对抗性”问题(包含错误前提)上表现突出(0.707 vs 全量上下文的 0.509),因为结构化记忆能直接发现缺乏支持事实而拒绝回答。
经验教训与改进: * 前端(信息提取)至关重要: 大部分性能提升并非来自 Datalog 引擎本身,而是来自改进信息提取和实体解析。例如,将“Honda Civic”、“my car”、“the Civic”关联到同一实体。 * 避免过度拒绝: 最初因指令不当,导致模型拒绝回答需要简单推理(如计数、比较)的问题。修复后,模型能区分“前提缺失”和“需要推理”。 * 模糊信息处理: 对于“我通常喜欢安静的餐厅,除非和朋友一起”这类条件性知识,简单的扁平化事实会丢失信息。未来方向是让记忆保持条件性,并保留原始文本作为上下文。
结论: Lemmalog 的实验证明,解决 LLM 遗忘问题不一定需要更大的上下文窗口。通过借鉴程序分析和数据库的成熟技术(事实、依赖、失效、固定点),可以更有效地维护 LLM 的“当前已知状态”。虽然它在某些任务上仍不如顶尖的记忆系统,但在知识更新、时间推理和拒绝错误前提方面表现出色,证明了“维护状态”这一思路的价值。
评论
根据评论内容,主要观点和论据总结如下:
1. 结合传统AI与LLM的潜力 - 评论1(linguae)认为,将“老派”AI技术(如启发式搜索、逻辑编程)与LLM结合,能提升代理的规划能力。关键引用:“The use of Datalog in this article resonates with me, since logic programming was a major part of old-fashioned symbolic AI.” - 评论4(keeda)指出,类似方法(如用LLM分解文章为事实图,再用图查询)在时间线查询上效果显著,并认为这是LLM响应基于权威数据源的有效基础。关键引用:“I think approaches like this are going to be... the basis of effective grounding of LLM responses in authoritative data sources.”
2. 对LLM记忆与事实管理的批评 - 评论3(trinsic2)和评论9(iamflimflam1)强调,LLM容易忘记已排除的结论,导致事实污染。评论3提到:“I ran into the very same problem of the LLM forgetting that we ruled out a conclusion... I had to keep reminding we ruled out that conclusion prior.” 评论9补充:“What is currently true can get easily contaminated with old ‘facts’.” - 评论11(coder-pm)提出解决方案:使用决策日志(如CLAUDE.md)记录上下文和决策,帮助代理保持追踪。关键引用:“My way of handling that is a decision log... The agent is using this file as an index of decisions and rarely lose a track.”
3. 对现有方法的质疑与扩展 - 评论2(fizx)质疑该方法是否只是“从另一个角度重新发明Graph RAG”,或具有新颖性。关键引用:“Is this sort of re-inventing Graph RAG from another angle, or does it feel novel?” - 评论10(bbeonx)建议探索非单调逻辑(如答案集编程),以处理“遗忘”事实的需求。关键引用:“Check out answer set programming, it actually does exactly what you want of ‘unlearning’ facts that you’ve learned.” - 评论15(Animats)指出,该方法可能重蹈Cyc的覆辙,需要处理量词和模糊性。关键引用:“Soon, he’ll discover that he needs quantifiers... That way lies Cyc.”
4. 实用建议与工具 - 评论12(cookiengineer)提出优化LLM代理的实践:使用短生命周期工作流、符号函数契约、CLI linter等。关键引用:“The linter part is mindblowing... With linters the output quality of agents is just soo much better.” - 评论8(sim04ful)提出“风化”原则:LLM应仅处理输入输出,中间推理应机械化为可复用的结构。关键引用:“With continued use, a weathering-capable system should therefore require less and less probabilistic intelligence for recurring work.”
5. 历史与相关项目 - 评论4、5、6、13提及Prolog、Lambda Prolog、Cave语言等,强调逻辑编程的复兴潜力。评论5(vatsachak)说:“Eventually lambda prolog will rise again.” 评论13(mirekrusin)推荐Cave语言:“Compact knowledge language that explores this area.”
平衡性总结:评论普遍认可将LLM与形式化推理(如Datalog)结合的价值,但对其记忆管理、事实污染和重复历史问题(如Cyc)提出批评。支持者强调其可追溯性和效率提升,反对者则质疑其新颖性并建议探索非单调逻辑或实用工具(如决策日志、linter)。