什么是图工程?
今天我们要聊图工程。现场有多少人听说过“图工程”这个说法?好,知道的人还不少。那我也想了解一下:有多少人熟悉 Neo4j、用过 Neo4j?好,看来有几位,这样我就知道今天该跟大家讲到什么程度了。
先说说这个说法的来历。今年夏天前后,Peter Steinberger 发过一条推文,谈到图工程。大家当时有点像是在问:这是不是一种新兴的学科,是从提示工程、上下文工程演化出来的?围绕它确实有不少炒作。
这个名字是新的,但背后的机制并不新。计算机科学早就有状态机、工作流图、知识图谱等等。真正变化的是我们如何把这些东西用到智能体上。
今天我想分享我们对图工程的看法,也提供一个新角度。要给图工程下个定义,我觉得可以说:它就是把智能体的工作设计成一张明确的图。节点负责执行任务,边则负责在节点之间传递状态。我通常会把它分成三类图。
三类图
第一类是通用的执行图,大家应该很熟悉。也就是工作流图:路由器和智能体本身都是节点,运行在智能体框架里。
图工程还有其他相互交叠的形态。比如上下文图,它记录决策轨迹、发生过的具体实例,以及这些内容如何与领域里的其他数据相连。
还有一类我称为程序性图。可以把技能或程序性知识表示成一张图。图里的步骤未必是智能体,也可能是完成某件事的具体步骤:调用不同工具、让决策模型判断、调用不同智能体、决定是否升级处理、执行验证等等。
我会重点讲后两类,因为我们谈得还不够多。理解它们,也能看清第一类执行图想实现什么,而且能用一种更便于迁移、更高效的方式做到。图工程让智能体能够承担规模更大、复杂度更高的工作,这正是我们关注它的原因。
可预测、可治理、可移植
图在这个场景下能给智能体带来什么好处?我会分成三点。第一是可预测性:约束智能体走什么路径,确保它执行任务时给出的答案基本准确。
第二是治理能力:我们可以控制、引导智能体的行为,并对它进行审计,弄清它做了什么,从而下次做得更好。
第三是可移植性,这一点很有意思。我们不必只把图看成运行时里发生的东西,也可以把它存起来,在不同运行时之间迁移,并放进知识层。这样互操作性更强,技术栈也能更简单。
在运行时里,图通常是一种编排方式。我们很多人可能都熟悉 LangGraph、ADK 以及其他智能体框架。某种程度上,Anthropic 的多智能体研究系统和一些其他系统,也可以归入图工程。
今天我想讲的是:把这类图放到数据旁边,作为上下文图,以及我们刚才提到的其他东西,会发生什么。这样做会增加一个可移植层,让这些知识基本上能适配任何类型的运行时。这就是我今天要介绍的内容,也是 Neo4j 正在做的事:定义这样一个知识层。
Neo4j 的知识层
这个知识层位于通常用来检索数据的记录系统与智能体之间。数据可以来自 DataStax、BigQuery、Snowflake 这类地方,也可以来自文档、Obsidian 或 Markdown 文件。我们能不能在这一层建立标准协议和标准产物,再用图工程流程把它们提供给任何运行时、任何智能体?
简单介绍一下 Neo4j 的产品:我们有核心数据库,也在上面构建了很多 AI 能力,包括数据库和分析层。今天我会展示其中一些,但重点会放在更上层的智能体大脑或记忆工具上,它们围绕数据库运行。
接下来你们会看到数据从多个来源加载到数据库里,构成我们的知识层。我展示的一些工具扩展和实验性功能,则属于图 AI,它会连接到这个知识层,把数据加载进去,也从中取出数据。那我们在 Neo4j 做的事情……
上下文图与智能体记忆
Neo4j 现在的思路,是从上下文图这个概念出发。它包含不同类型的记忆:短期记忆,比如对话历史;长期记忆,比如从对话或数据里提取出的实体;以及其中的推理过程或决策树。
我们研究中一个有意思的方向,最初其实并非从整个图入手,而是从单个技能开始。今年早些时候,我们写了一篇论文并在一个研讨会上发表,当时想问的是:能不能把程序性知识——无论来自过去的决策,还是像这里这样的技能——编译成图?
把技能编译成图
我们设计了一套流程,把书面材料——通常是 `SKILL.md` 文件,以及脚本、参考资料和资源——转换成真正的图结构,也就是你们在另一边看到的内容。
把这种图结构交给智能体使用后,图里的不同节点就可以代表技能中的决策、路由点,以及必须执行的脚本。把这些步骤整理并编译成确定性的脚本后,再要求智能体按这张图运行,我们看到任务奖励和表现都有提升。
这项结果是之前做的。我还在把实验更新到最新模型上。起初我记得用的是 Sonnet,现在实际上已经换到 Haiku。即使面对很有挑战性的任务,涉及物理学、计算机科学、安全、体能训练等多个领域,我们仍然看到任务奖励和整体表现有所提升。
从记忆图中提炼技能
之后我们把这个想法继续往前推进。我们实验室团队的产品经理 Will Lein 想到:既然能对技能这么做,也许也能对记忆图这么做。我们可以从刚才展示的上下文图里提炼出一个技能,同时让它继续在同一张图里连接到过去的决策轨迹和数据。
这样既能获得性能上的好处,也能保留每一步的来源记录。整个过程有版本、有跟踪,随着时间推移还能进行治理:评估漂移,查清某些工具调用从何而来、历史是什么。人也可以在 NAMS(Neo4j Agent Memory Service,Neo4j 智能体记忆服务)里实际查看。这是我们为此提供的参考架构。屏幕上有一个二维码,最后还会再出现一个;你可以借此了解它究竟怎么运作、编辑和修改它,还能做很多事。
所以我们现在谈的是可以迁移的产物。这个东西会生成一个技能;任何能接收该技能的智能体框架,都可以运行这些图并执行其中的逻辑。我们也有一些客户……
客户案例
有些客户用 Neo4j 来处理图工程类任务。我会讲快一点,因为时间快不够了。即使他们用的未必正是我们实验室的项目,也有咨询公司在帮其他资产管理机构解决棘手的合规问题。
比如要撰写审计报告,数据可能来自多个来源。怎样才能自动化处理,同时确保过程受治理、值得信任?你可能有合规文档,也可能在不同数据库里看到同一实体对应不同股票代码和名称,这些都需要对齐。把表达所需处理逻辑的图与数据放在一起交给智能体,就能以可信的方式自动完成这些工作。
还有 Uber 这样的公司会用配置图。可以想象,他们在全国各地都有司机;不同地区的合规要求和法规差异很大,相关信息散落在一大片微服务中,需要从中调取数据,才能判断每个地区、每个汽车部件分别适用什么规则。把这些逻辑明确表达出来并放在数据旁边,也有助于他们把相关工作有效地投入实际运营。
演示:贷款审批智能体
现在我来演示一下。先提醒大家,内容会比较多,我会讲得快一些,但很有意思。我想展示的是如何用刚才提到的 AIP 库来编译技能,把一个治理不到位、运行耗时很长的任务,成本降低大约 100%,同时大幅加快运行速度。当然这只是个演示,不是正式的研究提案;大家可以去看代码,整个过程都很透明。
这个例子是贷款审批。审批贷款要遵循很多政策。我不是金融专家,不过在场有不少人是。通常会有政策文档、一套必须严格遵守的步骤;智能体还得清楚地解释这些步骤,尽量像人工审核那样给出正确答案。
我大概没时间现场从头跑一遍,而且网络会比较慢,好在我已经预先加载好了。要回答的问题是:“这笔给 Rosa's Bakery 这家企业的新贷款该不该批?”这里有一份上传的 PDF 商业计划书。图里橙色的部分就是商业计划书。它还连着从 Databricks 拉来的历史交易数据、贷款政策数据,以及过去真正做出的决策。智能体可以遍历这些信息,发现申请人以前可能贷过款,或者之前发生过某个错误或其他事情,随后生成审计记录并很快给出方案。
这是个很好的起点。通过这种方式可以解决数据对齐问题、遵循政策,也能理解不同事物之间的关联。
但它有一个问题。我可以给大家看这张图——这是我多次运行这些政策的例子。放大后能看到一段对话,以及图里的推理轨迹。每一步都有时间戳,也记录了工具调用。看起来这里有两条决策链,长度不一样:其中一条更长,因为它找到了先例,也就是过去发生过类似的事。
问题在于,如果一遍又一遍地运行,并没有东西真正强制智能体遵循完全相同的路径。你可以写个技能告诉它该做哪些事,但决策环节还有别的问题:有的步骤只是批准或拒绝,有的则是批准或转交人工审核;这些步骤还会给出置信度分数,或者依据对某件事有多大把握作决定,但这些判断并没有校准好。
所以,我们或许可以把其中一些内容交给类似 TypeSafe 或“Jev”一类的模型,来处理这类判断。
把运行记录编译成图形化技能
我们可以把这些运行记录提取出来,编译成图形化技能,这就是我们在这里做的。这个技能图可能看不清细节,没关系。重点是我们把几次成功运行中的信息编译到一起,尽管这些运行之间存在一些不一致,然后放进这个技能的图形 YAML 结构里。
这个技能里有脚本、资源,有时还会有其他参考材料;这次没有。它也包含贷款政策的源文档。里面有很多用于追溯的信息,同时也告诉智能体怎样运行这项技能。技能一旦采用这种 YAML 格式,就能移植到各种工具里,包括其他图系统,因为它是一种确定性的格式。
放到图里大概就是眼前这个样子。让我再运行一次。你能看到这些步骤。我刚才给它套了一个小型 CLI,这样智能体只要说“运行这个技能”,路由步骤就会由程序执行,而不是让智能体自己逐一决定。我们把很多政策逻辑下沉到执行脚本里。
概括一下:执行流程会先检查是否满足政策中的硬性规则。如果根据这些规则不能自动批准或拒绝,就会转给决策模型,比如“Jave”或 TypeSafe。模型会拿到风险等级、是否存在重大风险敞口,以及批准还是拒绝等选项。之后流程会继续生成报告;路由器还会判断是否要升级到人工审核。如果不用升级,智能体就生成报告,并通过一个循环检查、校验报告。
这套模型和流程跑起来之后,我们就有了一个可以直接运行的 CLI。我再试着运行一遍,看看它能不能识别并使用 AIP 技能。整个过程大约需要两分钟。即使智能体能很快运行它,我们也可以追踪每次运行。比如查看单次运行,把运行过程持久化到图里。这个例子展示了一次运行及其执行的各个步骤;之后可以持续保存这些记录,检查效果。
从治理角度看,我很快搭了一个小型检查器,可以查看所有运行的状态,也可以查看某次具体运行是怎么执行的、过程中批准了什么、拒绝了什么,以及走过哪些分支。
观察图中的执行分支
有了图之后,还能做一些很有意思的可观测性分析,比如问:哪些分支走过,哪些没走?从治理角度看,这很有价值。图里还保存了其他各种信息,都在你的数据旁边。
这里我们并没有在智能体内部创建循环,只是给它一个 CLI,让它运行一项程序化技能。这项技能是从文档编译出来的,或者像这个例子一样,从记忆图中编译出来的。
运行可能会花些时间,主要是网络原因。我们试过几次,单独用 Fable 在图上运行,几乎每次都能答对,但要花 2.7 分钟。加入这套流程后,仅使用 AIP 就几乎把时间减半。因为有了程序化流程,我们还能改用 Haiku 这类更简单的模型,进一步缩短模型耗时,成本当然也会大幅下降。原本由模型承担的路由判断和其他工作,现在放进了执行脚本、Java 模型等组件里,整体效率就高得多。
这一轮要跑起来会太久,主要还是网络问题。你们可以看到,平均墙钟时间大约在半分钟到两分钟之间,原来大概是七分半。总之,我就讲到这里……
资源
最后给大家一些可以了解的资源。如果你对这类内容感兴趣,可以看看 Aura,这是我们的云服务,你可以在上面使用我刚才展示的数据库,并获得 100 美元的免费额度。我们还有即将举办的活动,应该是面向演讲者的活动;另外还有一个创业公司计划。
我刚才提到的其他项目,以及用于连接智能体记忆的代码,都可以在下面找到。我把页面留一会儿,直到有人把我请下台为止。今天就先到这里。