不久前,我的系统遇到了瓶颈。
这不是崩溃,而是信任问题。我看到客户数据被导入,系统却创建了一个重复的混乱。同一个组织在知识图谱中出现了三次,因为源数据使用了三种不同的命名约定:“McKinsey & 公司”, “McKinsey 和公司”, 和 “麦肯锡”。 对于人类来说,这显然是一个实体。对于图谱来说,这是三个独立的节点,具有三个断开的关系集。三个平行版本的真相。
那是我停止将数据视为简单存储并开始将其视为需要架构的东西的时刻。
一切都比模式更复杂
当你构建处理人类生成数据的系统时,没有人会为你准备好:人类非常不一致。我不是指这是一种迷人的方式;我是指这会打破你的模式的每个假设。
一个人写“Python”。另一个人写“Python 编程语言”。第三个人用小写写“python”。对于一个天真的字符串比较,这四个是完全不同的实体。四个节点。四个图中的谎言。
我并没有试图解决这个问题;我只是想构建一个干净的数据管道。但是,当你的管道摄取人类数据时,这个混乱就是问题。其他一切都是下游的。
视觉层次作为工程协议
在我深入讨论技术架构之前,让我为工程师们讨论的东西做一个辩护:信息的外观与其内容一样重要。
当你浏览一个结构良好的报告或仪表盘时,你的大脑在三秒钟内建立了一个心理模型。你直觉地知道关键数据的位置和每个部分的相对重要性。这不是“设计”——这是一个数据通信协议。
数据的呈现方式决定了人们从中做出的决定。当构建一个结构化信息的系统时,不能仅仅考虑模式的正确性,还必须考虑感知权重。人类的眼睛首先落在什么上?如何将这些优先级编码到数据结构中,以便渲染引擎可以执行?
知识图谱:关系即数据
数据库表存储事实,知识图谱存储意义。
在我的图谱中,每一条信息都是一个节点,但实际的智能存在于边中:
- HAS_ATTRIBUTE:将实体链接到其特定的、上下文相关的属性。
- BELONGS_TO:将记录关联到其父组织,该组织具有自己的属性和关系。
- REQUIRES:将项目或记录连接到所涉及的特定技术或技能。
当数据以这种方式链接时,它不仅仅是一个列表;它是一个叙述。它自然地从结构中产生——不需要编写特殊的“叙述生成”代码。关系就是故事。
数据密度:约束即特征
我痴迷于数据密度——每单位视觉空间中的有意义的信息。一个密集的文档不是一个混乱的文档;它是一个每个元素都值得其位置的文档。在我的系统中,密度是通过严格的结构约束来强制的:
- items_per_category: 5:您不列出47个属性,您列出五个重要的属性。约束强制优先级。
- summary_max_sentences: 2:两句话。仅此而已。说明是什么以及为什么重要。其他一切都是噪音。
- 禁止的填充短语:编写了实际的验证逻辑,拒绝空白单词,如*“最佳级别”或“协同作用”*。它们占据了空间,却没有传达任何信息。
标准化栈:无人见的管道
为了解决那个“McKinsey”问题,构建了一个四层栈以确保数据完整性:
- 规范化: 在输入时清理名称并去除冗长的后缀。
- 模糊去重: 使用一个 0.82 相似性阈值——足够高以捕获“Docker 容器”和“Docker”,但足够低以保持“Go”和“Git”分开。
- 确定性 ID: 每个节点从其内容中派生出一个 ID(例如,attr_python)。处理相同的混乱输入两次,得到相同的干净图表一次。
- 变异引擎: 一个处理更新和更正的调度系统,而不会丢失数据来源的出处。
从失败中学习
该系统以教会我比成功更多的方式失败。它曾经因为共享高相似度而合并了“机器学习”和“机器操作”。这种失败教会我“结构上有效”和“语义上有意义”之间的巨大差距。
我还学会了将自动提取视为不可信输入。我现在使用噪声模式过滤器,以确保系统不会“幻觉”听起来合理但不存在的记录。
结论
信息的架构是信任的架构。当数据规范化并语义链接时,人们信任输出。当它充满孤儿和重复时,内容无关紧要。
這份工作不僅僅是編寫代碼,而是要將混亂轉化為可查詢的東西。如果你想將噪音轉化為知識,你不僅需要儲存空間,你還需要架構