
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10年+数据库行业经验
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP,ITPUB认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭

在之前的文章里,我提到过一个观点:AI带给人的最大幻觉之一,就是让人混淆了“功能实现”和“工程化落地”。
很多人觉得——只要靠AI能把功能一个个跑通,就等于能做出一套复杂系统。但真不是这么回事。
昨天在成都参加 WorkBuddy 的活动,和沈忻老师、梁桐铭老师也聊到了这些,聊得挺投机,回来就想着把这个话题好好写一篇。
先说个大前提:无论你用的是通用Agent(OpenClaw、Hermes Agent之类),还是Vibe Coding工具(Claude Code、Codex、OpenCode、WorkBuddy等),就日常使用而言,你本质上都是在"描述功能",而AI也是在帮你"一个一个把功能做出来"。
问题就出在这儿——当所有功能都实现之后,AI 几乎不会去考虑:
它顶多把当下有明显关联的部分做个简单串联,很少会站在全局视角去考量整体性。
也许有人要反驳:所有功能都实现了,一个系统不就完成了吗?
那这篇,我就用我自己项目的演进过程,来给大家讲讲——什么叫工程化落地。
老规矩,先打个广告:https://db4agent.top 。
这个阶段,我的项目在GitHub上还叫oracle-memory-by-yhw。
顾名思义,最初的目标很朴素——就是想解决AI Agent运行过程中"记忆"的各类问题。所以这篇我就以“记忆”和“知识”这两个核心功能在数据库中的实现为线索,来展开讲功能实现与工程化落地的差别。
一开始,我也是走的最典型的路子:通过聊天,把记忆与知识的需求完整描述给Agent,让它生成对应功能。虽然我引导Agent使用了Oracle AI Database 26ai非常丰富的能力,但最早Agent的视线本质上就是一个功能一个功能地往上拼——毕竟那会儿需求也没那么多,够用就行。
从数据库设计上看,那时候的记忆和知识,是两套相对独立的存储体系:

可真到Agent实际跑起来,问题就暴露了——记忆和知识根本不是完全独立的:
两者一旦要打通,v1.x的设计缺陷就全冒出来了。核心问题有这么几条:
EMBEDDING VECTOR(1024),记忆却没有嵌入列;MEMORY_EDGES和KNOWLEDGE_GRAPH是两套彼此独立的关系系统;memory_id,知识用CONCEPT_ID,无法统一引用;一句话总结v1.x:功能都实现了,但它是"拼"出来的,不是"设计"出来的。
到了这个阶段,项目名还没改,但为了应对后面要往平台上加的一堆功能——任务计划、经验、Harness模板、SDD等等,如果按照原本方式,数据库只会越来越冗杂,最直接的问题就是多Agent场景下性能会非常差。我结合自己多年的企业级数据库运维经验,向Agent提出了一个思路: 用"实体表向外扩展"的方式,推动数据库逻辑设计的进化。

在这个版本中的核心改进:
ENTITIES表用ENTITY_TYPE一列,来区分记忆/知识/任务/经验/模板/规格;ENTITY_ID(RAWTOHEX(SYS_GUID())),跨类型可以互相引用;ENTITY_EDGES替代原来的MEMORY_EDGES+KNOWLEDGE_GRAPH,所有关系收拢到一处;ENTITY_EMBEDDINGS独立成引用分区表,所有类型共用,不再各自内联;ENTITY_EDGES/KNOWLEDGE_META/ENTITY_EMBEDDINGS全部通过PARTITION BY REFERENCE,自动继承ENTITIES的分区策略;ENTITIES采用LIST(ENTITY_TYPE)+RANGE(CREATED_AT)复合分区,记忆和知识自动落到不同分区。这个版本妙就妙在两点:一是充分吃透了数据库特性,在功能与性能之间找到了平衡;二是数据库表的逻辑设计本身,就为平台功能扩展铺好了路——以后要加功能,往往只需要给实体表增加一种分区类型即可。
所以v2.x,是整个项目真正的转折点——从这里开始,我做的不再是"功能",而是"架构"。
到了这个大版本,整个项目正式更名为AI Agent Infra with DB。
它的定位也随之拔高——从最初“解决记忆与知识的问题”,扩展成了以数据库为底座,去应对企业级Agent应用场景下的各类问题。
以目前最新的v3.10.0为例。其实在数据库逻辑设计层面,它和v2.x并没有本质变化,主要的突破在于:用通用属性图,解决了语义层面的融合问题。

可以说,v2.x的实体化统一是架构基础,而v3.10.0是在这个基础上的进一步深化。相较于v2.x与v3.10.0通过下面这些变更实现了语义融合: 相较于v2.x,v3.10.0通过下面的变更实现了语义融合的功能:
v2.x的实体化统一是架构基础, v3.10.0在此基础上进一步深化:
维度 | v2.0(统一实体) | v3.10(通用属性图) |
|---|---|---|
ENTITY_TYPE | 7种 | 13种(+SKILL,LOOP_DEFINITION,AGENT,TASK_STEP,APPROVAL,LOOP_ITERATION) |
EDGE_TYPE | 1种(SIMILAR_TO) | 23种(CAUSES,TRUSTS,FEEDS_INTO,PROMOTED_TO,BUILDS_ON等) |
记忆->知识 | 无关联 | PROMOTED_TO边(记忆提升为知识时自动创建) |
知识->知识 | 无关联 | CAUSES/CONTRADICTS/SUPERSEDES/DERIVED_FROM边 |
搜索 | 5信号统一搜索 | 同+图邻近信号(graph_proximity, BFS遍历) |
属性图 | ORACLE_MEMORY_GRAPH(仅邻接查询) | 同+30+图函数(因果追溯/矛盾检测/血缘追踪等) |
分区 | 7 LIST x 7 RANGE = 49叶子 | 8 LIST x 7 RANGE = 56叶子(+SKILL) |
其中,v3.10.0 新增的这批语义化边类型,是实现"语义融合"的关键:
边类型 | 方向 | 含义 | 触发时机 |
|---|---|---|---|
PROMOTED_TO | Memory -> Knowledge | 记忆提升为知识 | promote_to_semantic()调用时 |
MERGED_INTO | Memory -> Memory | 记忆合并到目标 | consolidate_branch_memories()调用时 |
SUPERSEDED_BY | Knowledge -> Knowledge | 旧知识被新知识替代 | supersede_knowledge()调用时 |
CAUSES | Knowledge -> Knowledge | 因果关系 | add_causal_edge()调用时 |
CONTRADICTS | Knowledge -> Knowledge | 矛盾关系 | add_causal_edge()调用时 |
DERIVED_FROM | Entity -> Entity | 来源追溯 | 知识/记忆创建时引用源实体 |
BUILDS_ON | Iteration -> Iteration | Loop迭代构建于 | record_iteration()调用时 |
INFORMS | Iteration -> Iteration | 信息传递 | Loop评估修正时 |
CORRECTS | Iteration -> Iteration | 修正关系 | Loop评估发现错误时 |
既然整个项目已经拔高到了AI Agent基础设施架构的层面,那么依托实体表这套优秀设计,我就能在几乎不影响原有功能、也不牺牲性能的前提下,实现一大批功能扩展:

回头看我这个项目的三个大版本演进,其实已经把"功能实现"和"工程化落地"的区别,讲得很清楚了:
功能实现,是把一个个需求单独跑通;而工程化落地,是要做整体考量。
具体来说,工程化至少要额外扛住这三件事:
昨天和沈忻老师聊我这个项目时,他有句话点得特别准——他光是把整个网页从头到尾看一遍,就明白了我到底在解决什么问题:说白了,就是让AI Agent变得"可被管理"。
他还给了我一个很实在的建议:给整个项目加一句Slogan,把项目的目标一句话点透。于是我琢磨了一下:

本期,我从自己的项目经历出发,用三个版本的真实演进,给大家展示了“功能实现”与“工程化落地”的区别。如果只记一句话,我希望是这句:能把功能跑通,只是起点;能把功能之间的关系、扩展性和那些"看不见的地方"一起扛住,才叫工程化落地。AI 能帮你飞快地实现功能,但它替代不了你对系统的全局设计——而这,恰恰是一个工程师最值钱的地方。
老规矩,知道写了些啥。