最新n1n v2.0.1 正式上线!企业级大模型接口聚合平台 (LLM API Gateway),为您接入 500+ AI Models,价格低至 1 折, 立即尝试

零代码 6 小时构建零幻觉 MCP 规则裁决 AI Agent

作者
  • avatar
    姓名
    Nino
    职业
    Senior Tech Editor

在黑客松及敏捷软件开发中,团队的主要瓶颈往往集中在编写模版代码、排查语法错误或应对大语言模型(LLM)不可预测的非确定性输出上。在构建 AERO-KIT——一个旨在解决复杂工业与法律规则冲突的确定性 Model Context Protocol (MCP) Agent 项目时,开发范式发生了彻底变革。整个开发过程没有人工编写一行应用层代码。

开发者完全转变为首席架构师与系统指挥官的角色,而具体的文件输出、测试用例构建与配置调试,则交由精密编排的 AI 工具栈协同完成。在实际落地中,通过使用像 n1n.ai 这样的统一模型聚合平台,可以高效调度不同性能优势的 LLM 接口,大幅提升系统构架与代码生成的精准度。

本文将深度拆解该系统的架构设计、数据建模方案及确定性 MCP Guardrails 机制,展示如何在 6 小时内快速搭建出一款零幻觉的规则裁决 Agent。


为什么传统 Vector RAG 无法应对严苛的规则裁决

在涉及法规、标准及工程规范的裁决场景中,基于向量相似度搜索(Vector RAG)的常规 AI Agent 常常会出现严重的“幻觉”现象。

思考以下典型的规则冲突案例:

  • 基础规则 (ID: R-101):“组件 A 的最高允许运行温度为 75°C。”
  • 勘误/修正案 (ID: E-502,优先级 3):“在高压环境下,组件 A 的最高允许运行温度降至 60°C,本条款优先于规则 R-101。”
传统向量搜索 (语义相似度匹配)
  ├── 规则 R-101 (75°C) ── 余弦相似度: 0.89 ──┐
  │                                           ├──> 产生冲突!LLM 选择折中或随机猜测 (如输出 67.5°C 或误采纳 R-101)
  └── 勘误 E-502 (60°C) ── 余弦相似度: 0.88 ──┘

当用户查询高压环境下组件 A 的安全温度时,向量检索系统将两段文本转化为向量。由于两段文字语义高度重合(均讨论组件 A 的温度限制),其余弦相似度分数极其接近。向量检索将这两段存在逻辑矛盾的上下文同时送入 LLM 窗口,导致 LLM 产生如下严重问题:

  1. 数值折中幻觉:机械地计算中间值(如回答 67.5°C)。
  2. 权威倒置:因基础规则与用户关键词更匹配而误用已作废的旧条款。
  3. 输出不确定:相同问题在不同请求中给出截然不同的裁决结果。

AERO-KIT 彻底放弃了依赖概率匹配的向量相似度搜索,转向将知识图谱化,托管于 Sanity Content Lake,并借助 Model Context Protocol (MCP) 实现严格的确定性图遍历。


系统整体架构:零代码多 Agent 协同体系

为了在不手动编写代码的前提下保证 Agent 的严谨性,系统在架构上分化为三大核心层级:战略指挥层、本地执行引擎与结构化知识湖。

+-----------------------------------------------------------------------+
|                        首席架构师 (人类开发者)                        |
|                   提供设计意图、边界条件与声明式规范                   |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
|                        战略大脑与任务编排层                           |
|            通过 n1n.ai 调用 Gemini 1.5 Pro / Claude 3.5              |
|      - 制定结构化 Schema 数据模型                                     |
|      - 生成确定性 GROQ 图查询逻辑                                     |
|      - 设定严格的反幻觉 Guardrails 指令集                             |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
|                         本地自动化执行引擎                            |
|                       OpenCode (Big Pickle)                           |
|      - 自动输出配置文件、接口代码与测试脚本                            |
|      - 执行 Node.js 自动化测试套件 (node --test)                      |
+-----------------------------------------------------------------------+
+-----------------------------------------------------------------------+
|                        结构化知识图谱 Lake                            |
|                       Sanity Content Lake                             |
|      - 严格关联的数据类型: policyOrRule, errataOrAmendment            |
|      - 通过 GROQ 与确定性 MCP 端点进行逻辑遍历                        |
+-----------------------------------------------------------------------+

在接入大模型 API 时,选择 n1n.ai 能够帮助开发者以极低延迟连接全球主流模型,确保逻辑推理与自动化代码生成环节的高可用性与稳定输出。


第一步:Sanity Content Lake 结构化数据建模

与其将非结构化文档直接切片存入向量数据库,AERO-KIT 在 Sanity 中构建了强类型的关联数据模型。

核心 Schema 设计

系统定义了三种核心文档类型:

  1. policyOrRule:存储基础规则条款、适用范围及初始标准参数。
  2. errataOrAmendment:包含指向目标规则的强关联引用(targetRuleRef)、生效条件及整数型优先级字段(precedenceLevel)。
  3. resolutionCase:存储历史人工裁决案例,用于审计与边界判定。

以下是由战略 Agent 自动生成的声明式 Schema 定义示例:

// Schema 定义: errataOrAmendment.js
export default {
  name: 'errataOrAmendment',
  title: 'Errata or Amendment',
  type: 'document',
  fields: [
    { name: 'title', type: 'string', title: 'Title' },
    { name: 'amendmentCode', type: 'string', title: 'Amendment Code' },
    { 
      name: 'targetRuleRef', 
      type: 'reference', 
      to: [{ type: 'policyOrRule' }],
      title: 'Target Base Rule' 
    },
    { 
      name: 'precedenceLevel', 
      type: 'number', 
      title: 'Precedence Level (Higher overrides lower)' 
    },
    { name: 'conditionContext', type: 'string', title: 'Condition Context' },
    { name: 'updatedValue', type: 'string', title: 'Updated Normative Value' }
  ]
}

第二步:基于 GROQ 的确定性 MCP 逻辑遍历

Model Context Protocol (MCP) 允许 LLM 以标准化的方式安全调用外部工具。AERO-KIT 并没有让大模型自由检索文本,而是向 Agent 暴露了固化的 MCP 工具,该工具在后台执行针对 Sanity 的 GROQ(Graph-Relational Object Queries)查询。

当用户提问:“在高压环境下组件 A 的最高允许运行温度是多少?” 时,Agent 会触发 MCP 工具执行如下 GROQ 逻辑:

*[ _type == "policyOrRule" && component == "Component A" ] {
  _id,
  ruleCode,
  baseValue,
  "amendments": *[ 
    _type == "errataOrAmendment" && 
    references(^._id) && 
    conditionContext match "high-pressure"
  ] | order(precedenceLevel desc) {
    amendmentCode,
    precedenceLevel,
    updatedValue,
    conditionContext
  }
}

逻辑裁决执行路径

图数据库引擎在底层完成如下图遍历:

  1. 精确定位基线规则 R-101
  2. 沿图边检索所有指向 R-101errataOrAmendment 修正案节点。
  3. 按上下文(high-pressure)过滤并根据 precedenceLevel 降序排列。
  4. 直接返回包含基线值与最高优先级修正值的确定性 JSON 载荷。

由于冲突裁决是在数据库引擎层而非 LLM 上下文中计算出来的,因此从根本上消除了混淆与幻觉。


第三步:零幻觉 Guardrails 与 Skills 方法论

为了保证 Agent 在任何情况下都不会伪造数据,系统提示词必须作为严格的运行时契约。参考工程团队的测试规范(如 testCompletfixe-de-bug),Agent 被赋予了强制性的执行策略:

### 系统执行契约:确定性规则裁决规范

1. 零猜想原则 (NO GUESSING POLICY):
   当查询得到的规则数据存在歧义,且没有更高优先级的 `errataOrAmendment` 节点明确解除冲突时,你必须直接返回: "UNRESOLVED_CONTRADICTION" 并列出冲突文档 ID。严禁拼接或推算中间数值。

2. 强制引用原则 (MANDATORY CITATION POLICY):
   回答中给出的每一个参数,必须明确附带 `groq_query` MCP 工具返回的准确 `_id``precedenceLevel`
3. 边界拒绝原则 (OUT-OF-BOUNDS BOUNDARY):
   若用户查询的实体在 Sanity Content Lake 中不存在,必须立即拒绝回答,不得借助 LLM 预训练知识进行补全。

方案对比:传统 Vector RAG vs. 确定性 MCP 图查询

评估维度传统 Vector RAG确定性 MCP 图查询 (AERO-KIT)
检索机制向量余弦相似度计算GROQ 强类型图遍历
冲突处理容易混淆失效;机械拼接冲突片段根据 precedenceLevel 确定性裁决
引用精准度粗粒度(文本切片级别)极精准(Sanity 节点 ID 与版本)
幻觉风险较高(尤其是数值范围与边界问题)数学意义上的零幻觉(受 Schema 约束)
检索延迟中等(需生成 Embedding + 向量索引检索)极低(Direct Database Query < 50ms)
** Token 成本**高(需要将大段未过滤文本塞入上下文)极低(精确提取结构化 JSON 载荷)

在构建复杂的 Agent 系统时,稳定、高性能的模型 API 基础设施至关重要。借助 n1n.ai 提供的高可用 API 路由,开发者可以轻松实现多模型备用机制,确保关键 MCP 工具调用在并发高峰期依然保持稳定性。


第四步:自动化 Node.js 测试套件验证

为验证系统的可靠性,本地纳米引擎(OpenCode)根据架构指令自动生成了独立的自动化集成测试套件(node --test),对 MCP 工具的返回值进行断言检验。

import test from 'node:test';
import assert from 'node:assert/strict';
import \{ executeMcpQuery \} from './mcpClient.js';

test('TEST 2: 基于优先级的确定性冲突裁决', async (t) => \{
  const result = await executeMcpQuery(\{
    query: "高压环境下组件 A 的最高温度是多少?