AWS展示用Quick聊天Agent配合MCP服务器与规则引擎,自动扫描数千份租约合规性的参考架构与CDK示例。
大规模合规挑战
一家投资组合运营商在多个州持有 50,000 份租约。每个州都会发布房东-租客法规(滞纳金上限、通知期限、押金限额),这些法规按立法机构的日程变化,而非运营商的日程。当法规发生变化时,负责合规的团队必须确定哪些租约现在已不符合规定。
在小规模情况下Paralegal 会阅读租约。答案是可信的,因为有人类为其背书。超过某个阈值后,这变得不可能了。工作转移到软件,但出现了一个新问题:答案现在只是屏幕上没有人能独立验证的一个数字。
从这一现实出发会产生两个属性:
可证明的完整性:像"我们检查了全部 22,910 份德克萨斯州租约"这样的声明必须是真的且可演示的。从未被评估的记录应被报告为未评估,而不是被静默省略。
可辩护性:调查结果可能在数月后的诉讼、审计或监管审查中被质疑。为其辩护意味着要知道应用了哪个规则的哪个版本,应用于哪个条款文本,通过什么方法,在什么日期,由谁执行的。
这两个属性是将此问题与企业搜索区分开来的关键。检索增强生成(RAG)解决了可访问性差距,但无法满足任一属性。相似性搜索没有意味着"全部"的阈值。排序后的样本永远不知道它排除了什么。
Text-to-SQL 缩小了这一差距,但带有类别级风险:幻觉的谓词可能静默地减少总体,而得到的数字看起来是精确的,即使范围是错误的。
Adjudicated Query 模式如何解决它
Adjudicated Query 模式是确定性规则引擎之上的有界会话层。模型只做两件事:将自然语言问题翻译为对固定类型化操作集的调用,并叙述返回的结果。它从不编写查询,从不修复总体,也从不执行判定。
边界后面是一个规则引擎。规则是版本化的数据,而非代码。引擎知道通用的比较运算符(gte、lte、equals、exists),不包含命名管辖区域或主题的分支。法律变更只是规则书的行编辑,而非代码部署。
每次合规扫描都会生成一份完整性收据:一个断言的不变式,其中 compliant + in-breach + ambiguous + unreadable 必须等于 scanned。这是根据计数计算的,并在任何数据持久化之前断言。无法解释其总体的运行永远不会完成。不存在记录被静默跳过的路径。
会话表面携带计数、收据和带标签的样本。完整结果集(可能达数万行)位于仪表板表面上,读取相同的数据存储,可按每条记录深入查看。这种分离意味着模型永远不会通过总结来消除保证。
为什么不用 RAG 或 text-to-SQL?
Adjudicated Query 模式在不牺牲保证的前提下,为规则引擎添加了自然语言访问以及商业智能(BI)方法。当需要对话访问且遗漏记录是负债而非轻微不便时,这是正确的选择。
参考架构
下图展示了组件如何端到端组合。合规官员在 Amazon Quick 中通过两个界面进行交互:一个用于提问的聊天 Agent,以及一个用于浏览完整结果集的 Amazon QuickSight 仪表板。聊天 Agent 首先从 Amazon Cognito 获取 OAuth 令牌。然后它通过 Amazon API Gateway HTTP API 发送模型上下文协议(MCP)请求,该 API 在转发到 AWS Lambda 函数之前验证令牌。Lambda 函数托管 MCP 服务器和规则引擎,通过 RDS Data API 读写 Amazon Aurora Serverless v2,并仅在探索性条款搜索路径中调用 Amazon Bedrock。Amazon QuickSight 仪表板通过虚拟私有云(VPC)连接直接读取相同的 Aurora 存储。因此两个界面从同一存储读取,这正是使完整性收据成为单一真实来源的原因。
图 1:Adjudicated Query 模式的参考架构
两个界面读取相同的存储。聊天 Agent 携带完整性收据和指向仪表板的链接。仪表板携带数据量,因为 10,800 行无法在聊天消息中渲染。Amazon Bedrock 仅由 AWS Lambda 通过探索性操作调用。在合规扫描中不涉及任何模型,Amazon Aurora Serverless v2 也不调用模型。
有界操作表面
MCP 服务器暴露了恰好六个工具,每个都有不同的语义:
这种有界表面消除了生成查询静默收窄风险的路径。因为模型只能从一组固定的操作中选择,这些操作的总体逻辑是由人编写、审查和测试的,所以它无法组合出错误的总体。
关键架构组件
借助 Amazon Quick 会话界面和 Agent 编排层,你可以提出自然语言合规问题,Amazon Quick 聊天 Agent 将其转换为对有界 MCP 操作表面的调用。Amazon Quick 通过 Amazon Cognito 使用 OAuth 2LO 向 MCP 服务器进行身份验证,并处理工具发现和响应叙述。确定性引擎处理合规逻辑。
Amazon Aurora Serverless v2(Postgres + pgvector)在单一关系存储中存储规则书、租约记录、提取状态、判定和运行。将所有内容放在一个数据库中使完整性收据成为 SQL 计数,这是一种具有成本效益的方式,使中心保证可被检查。
AWS Lambda 托管 MCP 服务器(通过流式可 HTTP 的 JSON-RPC 2.0,使用服务器发送事件(SSE)框架进行响应,这是 Amazon Quick 客户端所需的)和规则引擎。有界操作通过使用绑定为参数的规则值转换为基于集合的 SQL。没有自然语言到达查询层。
Amazon API Gateway HTTP API 通过由 Amazon Cognito 支持的 JSON Web Token(JWT)授权器提供前端入口。不存在未经身份验证的路由。
Amazon Cognito 通过两足式(客户端凭证)流程颁发 OAuth 令牌。客户端密钥在注册时从 Amazon Cognito 读取,不写入磁盘。
Amazon Bedrock 仅驱动探索性路径,使用 Amazon Titan Text Embeddings V2(amazon.titan-embed-text-v2:0)进行语义相似性排名,并通过跨区域推理配置文件调用 Anthropic Claude Sonnet 5 进行定性条款评估。它不参与官方合规判定。Amazon Bedrock 模型可用性,包括 Amazon Titan Text Embeddings V2 和 Anthropic Claude Sonnet 5,因 AWS 区域而异,因此在部署之前请确认模型在您的区域可用。
Amazon QuickSight 通过 VPC 连接连接到 Aurora,并渲染完整调查结果表,可按扫描和严重程度区间进行筛选,每条记录上已经包含了辩护判定所需的所有列。
不可协商的设计规则
规则是数据。法律变更是规则书的一行。引擎不包含特定管辖区域的分支。
没有自然语言到达 SQL。操作员选择固定的 SQL 模板。规则值绑定为参数。
确定性优先于 AI。数字比较回答扫描。不咨询模型。
精确过滤以保证完整性,向量仅用于排名。相似性从不决定成员资格。
收据是计算出来的,不是手工写的。不变式在扫描提交之前被断言。
不可读的文档被命名,而不是被丢弃。每份租约精确落入一个桶中。
调查结果仅追加。代码库中不存在对调查结果的 UPDATE 或 DELETE。
将总结模型视为不受信任的渲染器
一个设计元素值得单独一节,因为它看起来会很陌生:工程保护措施,用于在聊天模型进行转述时幸存。
将模型从决策路径中排除、但将其重新放入交付路径会在链路的末端重新引入风险。在实践中,我们观察到:
模型剥离了警告前缀。在释义过程中,一个说明性引用标签被移除,模型将一个虚构的引用呈现为法规。
模型从样本中进行了外推。给定 20 行预览数据,模型推断出一个在数据中并不存在的全量范围。
三种技术可以解决这一问题:
将警告措辞为不可剥离的括号后缀,在多个有效载荷层级重复,而不是作为可移除元数据读取的前导标签。
提供使正确答案成为简单答案的数据。对每条记录计算真实聚合值并交给模型。拥有真实数字的模型不需要从样本中猜测。
在多个结构层级(字段、字符串、摘要)重复模式标签,以便至少有一个在释义后存活。
原则:有效载荷中的安全防护,其强度取决于其通过释义后的存活能力。
完整的参考实现可在 GitHub 上获取。它附带合成数据(无真实客户租赁数据)、确定性语料库生成,以及针对部署堆栈的验收测试。
在部署之前,验证你拥有:
一个 AWS 账户,在 US East(N. Virginia)区域(us-east-1)启用了 Amazon Bedrock 模型访问权限,可访问 Amazon Titan Text Embeddings V2 和 Anthropic Claude Sonnet 5。
AWS Command Line Interface(AWS CLI)v2 且已配置凭证(aws sts get-caller-identity 应该成功)。
用于 AWS Cloud Development Kit(AWS CDK)CLI 的 Node.js 24。mise 是可选的,仅用于配置 Node 24。你可以通过任意方式安装 Node 24(CDK 已不再支持 Node 18)。
克隆示例仓库并设置 Python 环境:
git clone https://github.com/aws-samples/sample-quick-adjudicated-query.git
cd sample-quick-adjudicated-query
python3 -m venv .venv && .venv/bin/pip install -q -r requirements.txt
引导 CDK(如尚未进行)并部署堆栈。Aurora 配置通常需要约 11 分钟,时间因账户和区域而异。
eval "$(mise env -s zsh)"
export CDK_DEFAULT_ACCOUNT=$(aws sts get-caller-identity --query Account --output text)
npx aws-cdk@2.261.0 bootstrap aws://$CDK_DEFAULT_ACCOUNT/us-east-1
npx aws-cdk@2.261.0 deploy --outputs-file outputs.json
CDK 版本固定为 2.261.0 以匹配 requirements.txt。堆栈部署内容:
Amazon Cognito(2LO 客户端)。
带 JWT 授权器的 Amazon API Gateway。
AWS Lambda(MCP 服务器 + 规则引擎)。
Amazon Aurora Serverless v2。
Amazon QuickSight 网络连接。
按顺序运行迁移、语料库生成、摄取和 Amazon QuickSight 设置脚本:
PY=.venv/bin/python
$PY db/migrate.py # schema, rulebook, views (7 checks)
$PY gen_corpus.py # deterministic corpus + manifest
$PY ingest.py # load + embed (timing varies by environment)
$PY setup_dashboard.py # Quick Sight wiring
$PY acceptance.py # 28 checks against the live stack
语料库是确定性的,因此重建的堆栈会生成相同的结果。
Amazon Quick 在注册时对工具列表进行快照。Amazon Quick 不会检测到新的或重命名的工具,除非你删除并重新创建集成。单独部署 Lambda 是不够的。
从部署输出中打印注册输入:
python3 - <<'PY'
import json
o = json.load(open('outputs.json'))['QuickPocStack']
for k in ('McpUrl', 'TokenEndpoint', 'ClientId', 'Scope'):
print('%-14s %s' % (k, o[k]))
PY
获取客户端密钥(每次从 Amazon Cognito 读取,不写入磁盘)。使用输出中 Issuer URL 里的用户池 ID:
aws cognito-idp describe-user-pool-client \
--user-pool-id <UserPoolId> \
--client-id <ClientId> \
--query UserPoolClient.ClientSecret --output text
然后在 Amazon Quick 中:Connectors > 为你的团队创建 > Model Context Protocol。先删除任何现有条目,然后使用这些值创建一个新条目(OAuth client-credentials/2LO)。将客户端密钥直接复制到 Amazon Quick,而不是写入文件或 shell 变量。
按以下顺序验证端到端部署:
$PY show_payload.py check_connection # transport alive
$PY acceptance.py # 28/28 checks
验收套件证明服务器正常工作。下一节将介绍 Amazon Quick 聊天体验,以确认 Amazon Quick 选择了正确的工具。
部署并验证堆栈后,你现在可以从 Amazon Quick 聊天运行合规扫描并检查结果。
在 Amazon Quick 聊天中输入:"Which Texas leases violate the late fee cap? Use rules effective 01/01/2026."
Amazon Quick 将此识别为合规扫描并选择 sweep_compliance 工具。该工具对人口中的每条德克萨斯州租赁进行穷举检查,应用所述日期生效的规则。确定过程中不涉及任何模型。
Amazon Quick 叙述结构化结果。图 2 显示了聊天响应:不合规发现结果的简短样本、以计数呈现的完整性收据、一个合成数据警告,以及打开完整仪表板的链接。
图 2:Amazon Quick 聊天响应,包含完整性收据和发现样本
响应包括不合规发现样本和以计数呈现的完整性收据:10,111 个违规、689 个歧义、20 个不可读。它还包括一个合成数据警告和 Amazon QuickSight 仪表板的链接。它有意不尝试渲染全部 10,111 行。
通过检查不变量来验证完整性收据:合规 + 违规 + 歧义 + 不可读应等于扫描的总人口。在本例中,计数总和等于德克萨斯州租赁总人口,确认每条记录都落在唯一一个桶中。
按照聊天响应中的仪表板链接打开 Amazon QuickSight 仪表板。图 3 显示了发现标签页,扫描中的每对租赁-规则都作为自己的行出现,包含完整的证据链。
图 3:Amazon QuickSight 仪表板列出扫描中的每项发现
仪表板显示扫描中的每项发现,每对租赁-规则占一行。使用严重性频段过滤器隔离违规发现。每行包含租赁 ID、触发的规则、提取的值和期望值。按规则排序可将相关违规分组并识别整个投资组合中的模式。
选择一行打开发现详情。图 4 显示了一个单一发现,一侧是租赁条款原文,另一侧是触发的规则,包括其版本、引用和比较的值。
图 4:显示租赁条款与触发规则的发现详情
这就是可辩护性在实践中的样子。该发现显示了提取的值(7% 滞纳金)、期望的值(5% 上限)和规则引用(TX Prop. Code ch. 92 subch. B,修订生效日期 2026-01-01)。所有这些都与租赁原文条款文本并排显示,因此无需重建任何内容。
通过测试其余操作来确认 Amazon Quick 路由到正确的工具:
"Find Texas clauses that read like liability waivers."(应调用 explore_clauses)。
"What if the Texas late fee cap dropped to 3%?"(应调用 simulate_rule_change)。
为避免持续产生费用,完成后销毁堆栈:
npx aws-cdk@2.261.0 destroy
Aurora Serverless v2 可缩减至 0 Aurora Capacity Units(ACU)并在非活跃期后自动暂停(参见 Amazon Aurora 定价)。本示例故意设置了一个较小的非零最小容量,因为暂停的集群会增加会话第一个问题的恢复延迟。未部署 NAT 网关。
如果你计划稍后返回堆栈但希望在会话之间最小化成本,请在 infra/stack.py 中设置 serverless_v2_min_capacity=0 并重新部署,以启用缩放至零和自动暂停。预期集群暂停后第一次查询会有短暂的恢复延迟。语料库是确定性的,因此完全销毁并重新部署的堆栈会生成相同的结果。
由于此模式专为合规工作而构建,安全性是设计的一部分而非附加项。本示例应用了以下实践,你在适配之前应根据自身需求逐一审查:
仅限认证访问。Amazon Quick 的每个请求都通过受 JSON Web Token(JWT)授权器保护的 Amazon API Gateway HTTP API 到达 MCP 服务器,该授权器由 Amazon Cognito 提供支持。不存在未认证的路由,双足(客户端凭证)OAuth 流程发放短期令牌而非长期密钥。
密钥处理。Amazon Cognito 客户端密钥在注册时读取,不会写入磁盘或提交到源代码控制。仅将其存储在 Amazon Quick 连接器配置中,并按正常计划进行轮换。
最小权限模型访问。AWS Lambda 执行角色仅授予 Amazon Bedrock InvokeModel 权限,且仅限于示例使用的特定 Amazon Titan Text Embeddings V2 和 Anthropic Claude Sonnet 5 模型 ARN,而非对所有模型的通配符。在您自己的构建中,同样以这种方式限定 AWS Identity and Access Management(IAM)权限。
数据路径的网络隔离。Amazon QuickSight 通过 VPC 连接而非公共端点访问 Amazon Aurora Serverless v2,且数据库安全组仅接受预期的来源。将存储位置保持在公共互联网之外。
查询路径中无自然语言。规则引擎仅从固定的操作符到模板表组装 SQL,规则值作为参数绑定,这消除了模型编写查询所带来的注入面。这既是安全属性,也是正确性属性。
可审计的仅追加结果。结果仅追加,代码库中没有 UPDATE 或 DELETE 路径,因此合规记录在事后无法被静默更改。每项裁定都附带其证据链,供后续审查。
合成数据边界。示例附带合成租约数据,并明确标注了占位符规则和引用。在对真实记录运行之前,完成组织的数据分类、访问审查以及任何规则内容的法律验证。
批量扫描的人工归属。Amazon Quick 通过双足(客户端凭证)流程对 MCP 服务器进行机器对机器身份验证,因此令牌标识的是 Amazon Quick 应用程序,而非在聊天中提问的个人。引擎记录了被决定的内容、规则版本、证据、方法以及日期,但它不会收到最终用户身份来与结果一起存储。对于"由谁做出"的可辩护性部分,归属位于 Amazon Quick 审计层,该层记录了哪个用户运行了哪个聊天操作。结果通过其批量扫描 ID 和时间戳与该记录相关联来回溯到个人。如果您需要将归属记录在合规存储本身中,请将最终用户 ID 从 Amazon Quick 传递到工具调用并将其持久化到批量扫描行中。这样"谁"就与结果一起携带,而非仅存在于 Amazon Quick 审计层中。
何时使用此模式
在以下情况下,裁定查询模式适用:
遗漏记录是负债而非轻微不便。
答案可能在数月后受到当时不在场的人的质疑。
治理逻辑由外部拥有,并按自身时间表变化。
记录主体是可枚举的(您可以列出问题所涵盖的每条记录)。
这一描述涵盖了广泛的领域。例如租约合规性、保险理赔裁定、制裁筛查、出口管制、临床试验方案监控、建筑规范检查、财务报告控制测试以及凭证验证。
当可信答案足够且用户可以重新提问时,RAG 是更简单的选择。Text-to-SQL 适用于能够验证生成查询并容忍偶尔错误结果的团队。如果负责任的用户接受没有对话层的仪表板,请考虑直接使用规则引擎加 BI:它以更低的成本提供相同的保证。
何时做出错误选择
该模式较重:规则引擎、有界的工具表面以及完整性收据。这套机制只有在正确的问题上才能发挥作用,而将其复制到错误的问题上只会增加成本而不会增加信任。在以下三种情况下避免使用此模式。
规则并非真正确定性的。当合规性是清晰的比较时(例如费用小于或等于上限,或通知大于或等于所需天数),此模式有效。当判断是真正的裁量时(例如条款是否显失公平或披露是否充分),将其强制纳入此模式会将主观性隐藏在规则编写中,并使结果看起来精确而实际上并非如此。对于这些裁定,在流程中保留人工判断,而非将它们伪装成确定性的。
完整性对该问题并不重要。如果用户只想要几个代表性示例,或者是在探索而非裁定,则完整性收据对于他们不需要的保证来说是开销。对于这类问题,RAG 是更简单、正确的答案。
群体本身是模糊的。收据证明您覆盖了群体中的每条记录,而非群体本身是正确的。如果"所有德克萨斯州租约"的定义本身存在争议,则保证是精确针对错误的分母。在依赖收据之前,确保群体可以通过精确的、可辩护的谓词来绘制。
在本文中,我们介绍了裁定查询模式,并演示了它如何通过 Amazon Quick 对话界面提供可证明完整、可辩护的合规答案。该模式将有限 MCP 操作表面与确定性规则引擎配对,因此模型翻译问题并叙述结果,但不接触产生保证的决策。
通过部署示例堆栈、在 Amazon Quick 聊天中提问合规问题,并跟随结果进入 Amazon QuickSight 仪表板,您从头到尾完成了整个模式。完整性收据计算了每条记录,结果携带其完整的证据链,拆分表面传递保证了整个过程的保证完好。
要开始使用,请克隆示例存储库,部署堆栈,在 Amazon Qui 注册 MCP 集成。