温故知新:如果用 2026 年的认知重做 DGI 项目

AI Engineering
#AI#Software Engineering#Architecture#Best Practices

这是「从炼丹到通用」系列的第四篇,也是终章。

第一篇考古了 2024 年的 DGI 项目。第二篇分析了 LLM 崛起后的冲击。第三篇提出了 BOUND 原则在 DGI 场景下的落地。这篇要回答的问题是:如果用 2026 年的认知重做这个项目,系统会长什么样?

不是用 LLM 替代 DGI,是 DGI + LLM + 规则引擎的融合架构。具体设计,具体代码,具体权衡。


一、重做前的三个原则

在画架构图之前,先明确三个原则。这些原则来自前三篇的反思:

原则一:不做无意义的替代

DGI 在实时嵌入、结构化推理、大规模处理上的优势,LLM 替代不了。LLM 在语义理解、异常解释、新型模式识别上的优势,DGI 也替代不了。重做的目标不是”新技术替代旧技术”,是”让各自做各自擅长的事”。

原则二:不重复造轮子

2024 年的 DGI 项目从零构建了数据生成器、Hash-Hot 编码、训练 pipeline、评估框架。2026 年,这些轮子已经存在:向量数据库(Milvus)、图数据库(Neo4j)、LLM 编排框架(LangGraph / Temporal)、模型服务(vLLM / Triton)。重做的系统要尽量用现成工具,把精力花在”怎么组合”上。

原则三:不迷信端到端

LLM 时代最大的诱惑是”端到端”——一个 Prompt 解决所有问题。但这个诱惑在支付风控场景里是危险的。端到端意味着失去确定性边界、失去可审计性、失去成本控制。重做的系统必须保留明确的层次和边界。


二、系统架构:三层 + 两库

2026 版的 DGI 系统,可以简化为三层 + 两库

应用层
- API Gateway:契约校验、路由、熔断、限流
- LLM 服务:语义分析、异常解释、自然语言交互
- 运营后台:告警审核、反馈标注、规则管理

计算层
- DGI 服务:图构建、GCN 推理、嵌入生成
- 规则引擎:硬性约束校验、合规检查
- 向量搜索:Milvus 相似度检索

数据层
- Neo4j:交易图存储
- Milvus:嵌入向量索引
- ClickHouse:审计日志

对比 2024 年的 12 步 pipeline,2026 版的系统把数据生成、ETL、图化、训练、评估、聚类、标注这些步骤,压缩成了三个服务 + 两个数据库。不是功能少了,是基础设施成熟了。


三、核心代码:从 15,000 行到 1,500 行

2024 年的 DGI 项目有 15,000 行代码。2026 年的重做版,核心代码可以控制在 1,500 行左右。下面是几个关键模块的代码骨架。

1. DGI 嵌入服务

2024 年的 DGI 服务需要处理数据生成、ETL、图构建、训练、评估。2026 年的 DGI 服务只做一件事:输入交易数据,输出嵌入向量

# dgi_service.py
from torch_geometric.data import Data
from models import GCNEncoder, DGIModel
import torch

class DGIEmbeddingService:
    def __init__(self, model_path: str):
        self.encoder = GCNEncoder(in_channels=512, hidden_channels=256)
        self.dgi = DGIModel(self.encoder, hidden_channels=256)
        self.dgi.load_state_dict(torch.load(model_path))
        self.dgi.eval()
    
    def embed(self, transaction: dict) -> dict:
        # 图构建:从交易分录到 PyG Data
        graph = self._build_graph(transaction["journal_entries"])
        # GCN 前向传播
        z = self.encoder(graph.x, graph.edge_index)
        # 聚合得到图级别嵌入
        graph_emb = z.mean(dim=0)
        return {
            "node_embeddings": z.tolist(),
            "graph_embedding": graph_emb.tolist(),
            "model_version": "dgi_v2.1.3",
            "latency_ms": 45
        }
    
    def _build_graph(self, entries: list) -> Data:
        # 节点:科目_实体,边:资金流动方向
        nodes = list(set([e["dr"] for e in entries] + [e["cr"] for e in entries]))
        node_map = {n: i for i, n in enumerate(nodes)}
        edge_index = torch.tensor(
            [[node_map[e["dr"]], node_map[e["cr"]]] for e in entries],
            dtype=torch.long
        ).t()
        x = torch.eye(len(nodes), 512)  # Hash-Hot 编码
        return Data(x=x, edge_index=edge_index)

关键变化:服务只暴露 embed() 一个方法,不做异常判断,不做语义分析,不做告警触发。职责单一,边界清晰。

2. 规则引擎

2024 年的规则引擎被弃用了,因为”无法适应新型异常”。2026 年的规则引擎重新变得重要,但角色变了:只做硬性约束校验,不做异常模式识别

# rule_engine.py
from typing import List, Dict, Optional

class RuleEngine:
    def __init__(self, rules: List[dict]):
        self.rules = rules  # 从配置中心加载
    
    def check(self, transaction: dict) -> Dict:
        violations = []
        
        # 规则 1:借贷平衡
        total_dr = sum(e["amount"] for e in transaction["journal_entries"])
        total_cr = sum(e["amount"] for e in transaction["journal_entries"])
        if abs(total_dr - total_cr) > 0.01:
            violations.append({"rule": "DEBIT_CREDIT_BALANCE", "severity": "CRITICAL"})
        
        # 规则 2:金额上限
        if transaction["amount"] > 1_000_000:
            violations.append({"rule": "AMOUNT_LIMIT", "severity": "CRITICAL"})
        
        # 规则 3:用户月累计限额
        monthly_total = self._get_monthly_total(transaction["from_account"])
        if monthly_total + transaction["amount"] > 2_000_000:
            violations.append({"rule": "MONTHLY_LIMIT", "severity": "HIGH"})
        
        return {
            "passed": len(violations) == 0,
            "violations": violations,
            "latency_ms": 5
        }

关键变化:规则引擎只检查”已知的、不可违反的硬性约束”。新出现的业务场景?不归规则引擎管,归 LLM 管。但底线规则一旦被违反,直接拦截,不需要 LLM 确认。

3. LLM 分析服务

2024 年没有 LLM 服务。2026 年的 LLM 服务是新增的,只做语义分析。

# llm_service.py
from openai import OpenAI
import json

class LLMAnalysisService:
    def __init__(self, model: str = "gpt-5"):
        self.client = OpenAI()
        self.model = model
    
    def analyze(self, transaction: dict, context: dict) -> dict:
        prompt = self._build_prompt(transaction, context)
        response = self.client.chat.completions.create(
            model=self.model,
            messages=[{"role": "user", "content": prompt}],
            response_format={"type": "json_object"},
            temperature=0.1  # 金融场景,低温度减少幻觉
        )
        return json.loads(response.choices[0].message.content)
    
    def _build_prompt(self, transaction: dict, context: dict) -> str:
        return f"""
        你是一个金融风控专家。请分析以下交易是否存在异常。
        
        交易信息:
        {json.dumps(transaction, ensure_ascii=False, indent=2)}
        
        上下文信息:
        - 用户历史平均单笔金额:{context['avg_amount']}
        - 用户跨境支付频率:{context['cross_border_freq']} 次/月
        - DGI 嵌入相似度:最近邻距离 {context['nearest_neighbor_distance']}(阈值 0.30)
        - 规则引擎校验:{context['rule_check_result']}
        
        请输出 JSON 格式:
        {{
            "anomaly_probability": float,
            "risk_level": "LOW" | "MEDIUM" | "HIGH",
            "explanation": str,
            "recommended_action": "AUTO_PASS" | "AUTO_ALERT" | "MANUAL_REVIEW"
        }}
        """

关键变化:LLM 的输出是”建议”不是”决策”。最终决策由规则引擎(硬性违规)或人工复核(高风险)做出。

4. 编排服务

2024 年的 pipeline 是串行的 bash/python 脚本。2026 年的编排服务用状态机定义整个流程。

# orchestrator.py
from statemachine import StateMachine, State

class FraudDetectionWorkflow(StateMachine):
    received = State(initial=True)
    dgi_checked = State()
    rule_checked = State()
    llm_analyzed = State()
    completed = State(final=True)
    manual_review = State()
    
    check_dgi = received.to(dgi_checked)
    check_rules = dgi_checked.to(rule_checked)
    analyze_llm = rule_checked.to(llm_analyzed)
    complete = llm_analyzed.to(completed)
    escalate = llm_analyzed.to(manual_review)
    
    def on_check_dgi(self, transaction):
        result = dgi_service.embed(transaction)
        nearest_dist = milvus.search(result["graph_embedding"])
        transaction["dgi_result"] = result
        transaction["nearest_dist"] = nearest_dist
        # 如果距离太远,标记可疑,进入规则引擎
        return nearest_dist > 0.30
    
    def on_check_rules(self, transaction):
        result = rule_engine.check(transaction)
        transaction["rule_result"] = result
        # 如果违反硬性规则,直接拦截,流程结束
        if not result["passed"]:
            transaction["final_decision"] = "REJECT"
            self.complete(transaction)
            return False
        return True
    
    def on_analyze_llm(self, transaction):
        context = {
            "avg_amount": user_history.get_avg(transaction["from_account"]),
            "cross_border_freq": user_history.get_freq(transaction["from_account"]),
            "nearest_neighbor_distance": transaction["nearest_dist"],
            "rule_check_result": "PASSED"
        }
        result = llm_service.analyze(transaction, context)
        transaction["llm_result"] = result
        if result["risk_level"] == "HIGH":
            self.escalate(transaction)
        else:
            self.complete(transaction)

关键变化:流程是确定性的(状态机),但节点内部是概率性的(DGI 推理、LLM 生成)。状态机保证”卡住能降级”,节点保证”概率性能力”。


四、数据流:从 12 步到 4 步

2024 年的完整 pipeline 有 12 步。2026 年的重做版,一笔交易的审核流程只有 4 步:

交易进入 → DGI 嵌入(50ms)→ 规则校验(5ms)→ LLM 分析(1s)→ 决策输出
              ↓                      ↓                  ↓
           99% 放行              违规拦截          风险分级

Step 1:DGI 嵌入(50ms)

  • 输入:交易 + 分录
  • 输出:图嵌入 + 最近邻距离
  • 99% 的交易在此层被判定为”正常”,直接放行
  • 1% 的”可疑”进入下一步

Step 2:规则校验(5ms)

  • 输入:可疑交易 + 硬性规则
  • 输出:通过 / 拒绝 + 原因
  • 拒绝的交易直接拦截,不进入 LLM
  • 通过的交易进入下一步

Step 3:LLM 分析(1s)

  • 输入:可疑交易 + 用户历史 + DGI 结果
  • 输出:异常概率 + 风险等级 + 解释 + 建议 action
  • 高风险 → 人工复核
  • 中风险 → 自动告警 + 审计
  • 低风险 → 放行

Step 4:决策输出

  • 输入:LLM 建议
  • 输出:最终决策 + 完整审计日志

五、关键权衡

重做的过程中,有几个必须做的权衡。

1. 延迟 vs 能力

2024 年的 DGI 系统,平均延迟 50ms,但只能做结构相似度判断。2026 年的融合系统,99% 的交易延迟 50ms,1% 的交易延迟 1s,但能力覆盖范围大了一个数量级。

权衡:接受 1% 交易的延迟,换取整体能力的提升。不是所有交易都需要 LLM,只需要对”可疑”交易做深度分析。

2. 成本 vs 覆盖

2024 年的纯 DGI 系统,成本 $480/天,但覆盖的异常类型有限。2026 年的融合系统,成本 $2,000/天,但覆盖了新型异常、语义异常、复杂模式。

权衡:成本增加 4 倍,但能力不是线性增加,是指数级增加——因为 LLM 让系统能处理”没见过”的异常。

3. 自动化 vs 人工

2024 年的系统追求”全自动”——反馈闭环自动调优,希望 eliminating 人工。2026 年的系统明确”人工终审”——高风险交易必须人工确认。

权衡:接受人工参与,换取合规安全和责任清晰。不是所有决策都能交给机器。

4. 确定性 vs 灵活性

规则引擎提供确定性,LLM 提供灵活性。规则引擎说”借贷不平衡必须拦截”,LLM 说”这笔交易看起来可疑,但可能是正常业务创新”。

权衡:用规则引擎守住底线,用 LLM 探索上线。底线不可突破,上线可以试错。


六、没有解决的难题

2026 年的重做版能解决很多 2024 年的问题,但也有一些难题依然没有完美答案。

1. LLM 幻觉

即使温度调到 0.1,LLM 仍可能生成看似合理但实际错误的解释。在金融场景里,“解释错误”比”判断错误”更危险——因为错误的解释可能误导人工复核。

当前解法:多模型交叉验证 + 知识图谱约束 + 人工抽查。不是消除幻觉,是控制幻觉的影响范围。

2. 反馈数据质量

运营人员的自然语言反馈仍然可能出错。“这笔不是异常,因为用户签了新合同”——如果这个合同本身是假的,反馈就是错的,LLM 会学到错误的知识。

当前解法:反馈需要双人复核 + 定期评估反馈效果 + 异常反馈追溯。不是信任所有反馈,是管理反馈的质量。

3. 新型异常的评估

LLM 能识别新型异常,但怎么评估它识别新型异常的能力?用已知的异常评估,逻辑上不成立;用未知的异常评估,没有 ground truth。

当前解法:A/B 测试 + 人工标注 + 业务指标跟踪。不是评估”能不能识别所有新型异常”,是评估”上线后业务指标是否改善”。


七、终章:从炼丹到通用,再从通用回到具体

四篇文章写到这里,终于可以画一个完整的圆。

第一篇说:2024 年的 DGI 项目是一座工整的城堡,但城堡建在了即将漂移的地基上。

第二篇说:LLM 的崛起没有让 DGI 过时,它让 DGI 的定位更清晰了——DGI 做结构化推理,LLM 做语义理解。

第三篇说:通用能力和垂直约束的融合,需要 BOUND 原则——边界、编排、验证、收窄、冗余。

第四篇说:如果重做,系统可以更简单,也更强大。不是因为它用了更新的技术,是因为它的设计者更清楚地知道每个组件该做什么、不该做什么。

这个系列的真正主题,不是技术演进,是认知演进。

2024 年的我,相信”模型能力决定系统能力”。2026 年的我知道,系统能力取决于边界设计,而不是单一组件的能力。2024 年的我,追求”用一个模型解决所有问题”。2026 年的我,追求”用多个组件的协作,解决一个复杂问题”。

这不是退步,是成熟。

炼丹时代的工程师,把模型当作火箭,想尽一切办法让它飞得更高。通用时代的工程师,把系统当作机场,想尽一切办法让每个飞机安全起降。

机场没有火箭浪漫,但机场能让更多的人到达更远的地方。


“2024 年的我,用 12 步 pipeline 告诉世界’我很努力’。2026 年的我,用 4 步流程告诉业务’我值得信任’。”

“技术越通用,工程越具体。”

“好的架构不是让最强的组件更强大,是让最弱的组件不拖累全局。”

“从炼丹到通用,再从通用回到具体——这才是工程师的成年礼。”


本文首发于「谢先生的 AI 深析札记」

「从炼丹到通用」系列至此完结。