跳到主要内容
AI News HubLIVE
站内改写5 分钟阅读

使用 EDB Postgres AI 和 Amazon Bedrock AgentCore 为代理式 AI 构建语义层

文章摘要

本文介绍如何在 EDB Postgres AI 内部构建受治理的语义层,并通过 Amazon Bedrock AgentCore 上的 Strands Agents 代理进行查询。业务含义、连接路径和访问控制都存储在 Postgres 中,利用 GRANT 和行级安全来约束每个代理可以读取的内容。

来源AWS Machine Learning Blog作者: Rajesh Nagpal
使用 EDB Postgres AI 和 Amazon Bedrock AgentCore 为代理式 AI 构建语义层
报告错误

纠错通道尚未开通,可先复制下方文章信息留存。

查看更正说明
直接读正文

本文展示了如何利用 EDB Postgres AI 为代理式 AI 构建语义层,并在 Amazon Bedrock AgentCore 上运行 Strands Agents 代理来查询该层,以回答客户 360(C360)相关问题。这是该系列文章的一部分,此前曾使用 Stardog 知识图谱、Denodo 数据虚拟化平台、AtScale 维度模型和 Strategy Mosaic 关联模型实现相同的 C360 模式。

EDB Postgres AI 将语义层作为 AIDB 扩展放置在运营型 Postgres 数据库内部。业务含义通过标准 Postgres COMMENT 语句与数据一起存储,连接图来自 Postgres 外键,治理则通过 AIDB 自带的模型上下文协议(MCP)端点使用 Postgres GRANT 和行级安全来实现。

通过阅读本文,您将了解:如何在 Postgres 模式上构建 AIDB 语义知识库(SemKB),如何利用 COMMENT ON 语句和 aidb.create_semantic_alias 作为编写界面,以及外键如何爬取连接路径;如何通过内置 EDB MCP 端点将 AIDB 工具目录暴露给外部代理,该端点由应用负载均衡器(ALB)前端,并注册为 AgentCore Gateway(Amazon Bedrock AgentCore 的一项能力)上的 MCP 目标;Postgres 角色、列级 GRANT 语句和行级安全如何为不同调用者产生不同结果,而提示、工具目录和代理代码保持不变;AIDB 如何为每次 SQL 执行捕获 OpenTelemetry 跟踪,并以行形式存储在 aidb_otel 模式中,可使用普通 SQL 查询。

代理所需的三层

从实时数据回答业务问题的代理需要三层:规划和编写查询的模型、告知代理数据含义的语义层,以及托管代理并控制身份和访问的运行时。本系列中的 Stardog 文章介绍了这一框架。本文中的模型层是 Amazon Bedrock 上的 Anthropic Claude(模型可用性因 AWS 区域而异)。运行时层是 AgentCore 运行时,这是 Amazon Bedrock AgentCore 的能力。AgentCore Gateway 处理入站授权,AgentCore Identity(Amazon Bedrock AgentCore 的能力)持有工具目标的外站凭证。EDB Postgres AI 在数据库本身内托管代理和工具,并通过其 MCP 端点作为外部代理的连接点。

语义层是本文与其他文章的不同之处。这里,语义层是位于运营型 Postgres 数据库内部的 SemKB。模式和业务定义一起被索引。Postgres GRANT、行级安全和列级授权执行访问控制,而不是建议性系统提示。后续章节将介绍 AIDB 如何构建该层、AgentCore 如何暴露该层,以及两个 Postgres 角色提出相同问题时如何得到不同答案。

示例用例:EDB Postgres AI 上的 C360

数据集是 Stardog C360 Knowledge Kit,加载到 EDB Postgres AI 实例中专门的 c360 模式中。数据模型包含四张表和一个派生视图。

物理模式是一个普通的 Postgres 连接图:customers 表中的客户位于某个 location,下订单,每个订单引用一个产品。语义工作建立在三个列名无法揭示的业务概念上。

州不在客户行上。它位于 locations 中,通过 customers.location 外键到达,该列上的注释告诉 SemKB 在哪里找到它。

purchases.price 记录订单总额。如果代理将其误读为单位价格并乘以数量,则顶级客户会返回 502,529 美元而不是 27,991.66 美元。

大额消费者是业务拥有的术语。通过带有 COMMENT ON VIEW 语句的视图捕获,其定义留在一个地方,每个代理、仪表盘和查询都从中读取。

我们通过代理端到端运行的问题:

按总支出排名前 10 的客户是谁,每个客户在哪个州?

每个州有多少大额消费者?

能否列出 10 位客户及其所在州?

哪些 10 个产品销量最高?

能否列出五位客户及其社会安全号码?(用于治理重跑)。

参考架构

下图展示了从分析师通过 Amazon Bedrock AgentCore 到 EDB Postgres AI 内部语义层的请求路径。分析师使用 Amazon Cognito 进行身份验证,并使用颁发的 JSON Web Token(JWT)作为 Bearer 令牌调用 AgentCore Gateway。网关路由到 AgentCore 运行时,后者使用 Amazon Bedrock 上的 Claude 进行规划。代理通过网关调用 MCP 工具,网关将请求转发到 EDB Postgres AI 虚拟私有云(VPC)中的应用负载均衡器,再转发到 AIDB 内部的 edb-endpoints MCP 服务器。AIDB 提供 SemKB、语义别名和只读 PostgreSQL 表。AgentCore 跟踪发送到 Amazon CloudWatch,AIDB 将 OpenTelemetry 跟踪捕获为 Postgres 内 aidb_otel 模式中的行。

图 1:EDB Postgres AI 和 Amazon Bedrock AgentCore 的参考架构

两条流跨越 AgentCore 和 EDB Postgres AI 之间的边界。

入站:客户端使用 Amazon Cognito 用户池颁发的持有者令牌调用 AgentCore Gateway。网关入站 JWT 授权器根据 Cognito 发现 URL 验证令牌。然后网关根据令牌声明评估其 Cedar 策略,以决定此代理代表此用户可以调用哪些工具。之后路由到 AgentCore 运行时。代理调用 Amazon Bedrock 上的 Claude 进行规划和答案组合。

出站到语义层:代理的工具调用是 MCP 请求。AgentCore Gateway 直接支持 MCP 服务器目标。AIDB 的 edb-endpoints HTTP 服务器使用流式 HTTP MCP 和 HTTP 基本认证,使网关可以将其视为 MCP 服务器目标而无需转换层。带有 HTTPS 侦听器和 AWS Certificate Manager(ACM)证书的应用负载均衡器在 Amazon Elastic Compute Cloud(Amazon EC2)实例上前端 edb-endpoints。ALB URL 注册为网关目标。AgentCore Identity 凭证提供程序持有 Postgres 角色凭证,并在每个出站请求中以 Basic 认证方式注入。代理代码看不到 Postgres 凭证。

可观测性:AgentCore 将工具调用、大型语言模型(LLM)调用和令牌使用情况的跟踪发送到 CloudWatch Transaction Search。AIDB 将 SQL 执行的 OpenTelemetry 跟踪捕获为 Postgres 内 aidb_otel 模式中的行,在数据库配置写入后可使用普通 SQL 查询(参见在源数据库上启用遥测)。

此架构中不需要 AWS Lambda。AIDB 已经使用 MCP,因此网关通过 ALB 直接将其作为 MCP 服务器目标进行通信。本系列中的 Denodo 文章在其 MCP 服务器前使用相同的 ALB 模式,除供应商外架构不变。

构建语义层

这些步骤假设 AIDB 已在 EDB Postgres AI 实例上安装并启用,并且 Stardog C360 工具包中的四个 CSV 文件已加载到专门的 c360 模式中,并具有前面显示的主键和外键。由于该层与数据位于同一数据库中,因此无需部署第二个系统,也无需同步目录。语义层在 SQL 中定义,与写入行的应用程序位于同一数据库中。

AIDB 语义知识库索引 Postgres 模式而非数据。它将每个表、视图和列的定义(连同 COMMENT ON 文本)嵌入到向量存储中,代理可以用自然语言搜索。三个编写任务帮助代理按含义找到正确的表和列:编写 COMMENT ON 语句、将业务术语定义为带有自己注释的视图,以及将重复问题注册为语义别名。注释是三种编写任务中最简单的一种,并且最能提高用户和代理的文本到 SQL 准确性。

在代理会查看的地方添加注释

COMMENT ON COLUMN c360.purchases.price IS '客户为整个订单支付的总金额,以美元计。不是单价。'; COMMENT ON COLUMN c360.purchases.cid IS '下订单的客户。连接到 customers.cid。'; COMMENT ON COLUMN c360.customers.location IS '客户的家庭地址。连接到 locations.id。州在 locations.state 中。'; COMMENT ON COLUMN c360.customers.ssn IS '美国社会安全号码。敏感,需要列级授权。';

CREATE VIEW c360.big_spender AS SELECT c.cid, c.full_name, l.state, count(*) AS large_orders, max(pu.price) AS largest_order FROM c360.purchases pu JOIN c360.customers c ON c.cid = pu.cid JOIN c360.locations l ON l.id = c.location WHERE pu.price > 250 GROUP BY c.cid, c.full_name, l.state;

COMMENT ON VIEW c360.big_spender IS '大额消费者。大额消费者是至少有一笔超过 250 美元的订单的客户。' '使用此视图回答任何关于大额消费者的问题。';

视图将业务定义保存在一个地方,因此没有代理或仪表盘需要重新定义大额消费者。前期花在注释上的时间会在代理之后运行的每个查询中得到回报。

创建语义知识库

在 c360 模式上创建 SemKB。该调用注册名称、嵌入模型、目标模式和自动处理模式。

SELECT aidb.create_semantic_kb( name => 'c360_kb', model => 'bge-small-en-v1.5-f16', schemas => ARRAY['c360'], auto_processing => 'Live' );

嵌入模型是 AIDB Amazon Machine Image(AMI)附带的本地 llama.cpp 模型(llamacpp_embeddings)。SemKB 每个知识库使用一个嵌入模型,因此每个条目都位于同一向量空间中。AIDB AMI 附带一个名为 semkb 的默认 SemKB 覆盖 public,因此创建 c360_kb 后实例上会有两个 SemKB。当存在多个 SemKB 时,每次 aidb.semantic_kb_search 调用都必须显式传递 kb_name。要将本地模型替换为远程嵌入模型(例如 Amazon Bedrock 上的 Amazon Titan Text Embeddings),请使用 aidb.create_model 注册远程模型,并将其名称作为 SemKB 的 model 参数传递。auto_processing 参数接受 Disabled、Live 或 Background。Live 通过 Postgres 事件触发器对模式更改做出反应。Background 从工作进程异步处理它们。Disabled 等待显式的 aidb.refresh_semantic_kb()。SemKB 同时将外键爬取为关系。purchases.cid 外键成为代理可以按含义而非列名发现的连接路径。

将重复问题捕获为语义别名

语义别名是一个命名的、参数化的只读 SELECT,带有自然语言描述,SemKB 将其与模式元数据一起索引。代理按含义找到它,用参数调用它,并返回受治理的答案。

SELECT aidb.create_semantic_alias( name => 'big_spenders_by_state', description => '按州统计大额消费者,从多到少排序。', query_text => $$SELECT state, count(*) AS big_spenders FROM c360.big_spender GROUP BY state ORDER BY big_spenders DESC, state$$, params => '[]' );

别名是 AIDB 可重用的文本到 SQL 构建块。它们与表和视图一起位于 SemKB 索引中,并作为工具呈现给代理。有关完整的文本到 SQL 演练,请参阅 EDB 文档。

治理访问

此架构中的治理完全通过 Postgres 原语运行。AIDB MCP 端点没有自己的权限系统:“Postgres 授权决定每个代理可以读取什么。”

展开要点与分析

文章情报

工程师中级

要点

  • EDB Postgres AI 将语义知识库(SemKB)作为 AIDB 扩展内置在运营数据库 Postgres 中。
  • 通过 COMMENT ON 语句和 aidb.create_semantic_alias 定义业务含义,并利用外键自动发现连接路径。
  • 通过 EDB 内置的 MCP 端点将工具目录暴露给外部代理,并由 AgentCore Gateway 管理入站授权。
  • 使用 Postgres 角色、列级 GRANT 和行级安全为不同调用者提供不同结果,同时保持代理代码不变。

要点与分析由自动化流程生成,可能有误,请结合原始来源核实。