概述
AgentSystems Notary 为 AI 智能体交互创建防篡改审计追踪。
为什么
当客户、审计员、监管机构、保险商等对 AI 行为提出质疑时,你需要证明实际发生了什么。传统日志不起作用:你控制着它们,所以第三方必须信任你没有篡改它们。
防篡改日志消除了这种信任需求。
工作原理
原始 LLM 交互保留在你的存储中。正常操作期间没有第三方看到它们。但每次交互的密码学哈希会同时写入独立的防篡改存储(Arweave 或 AgentSystems 托管服务)。
如果出现审计或争议,你提供原始日志。审计员重新计算哈希并与存储的哈希进行比较。匹配表示日志未被篡改。不匹配表示存在篡改或损坏。
你控制你的数据,但无法在不被察觉的情况下篡改它。
记录的内容: - 到你的存储:完整的原始 LLM 有效载荷(提示、响应、元数据、时间戳) - 到哈希存储:SHA-256 哈希 + 元数据(如命名空间、会话 ID、时间戳)
哈希存储选项
哈希(而非原始数据)可以写入任一存储选项:
| 存储 | 适用场景 | 特性 |
|---|---|---|
| 去中心化(Arweave) | 无供应商锁定 | 公共仅追加账本、开源验证、无需账户 |
Custodied | 托管合规 | 一次写入存储、验证 UI、用于审计的签名证明 |
前置条件
pip install agentsystems-notary langchain langchain-anthropic python-dotenv
示例(去中心化)
Generate signing key
openssl genrsa -out arweave-key.pem 4096
对于生产环境,请使用 云密钥管理服务.
Create .env file
在你的项目中创建 .env 根目录下的文件:
# AWS S3 for raw payload storage
ORG_AWS_S3_BUCKET_NAME=your-bucket
ORG_AWS_S3_ACCESS_KEY_ID=AKIA...
ORG_AWS_S3_SECRET_ACCESS_KEY=...
ORG_AWS_S3_REGION=us-east-1
# Path to signing key
ARWEAVE_PRIVATE_KEY_PATH=./arweave-key.pem
# Anthropic
ANTHROPIC_API_KEY=sk-ant-...
Run the example
from agentsystems_notary import (
LangChainNotary,
ArweaveHashStorage,
AwsS3StorageConfig,
LocalKeySignerConfig,
RawPayloadStorage,
)
from langchain_anthropic import ChatAnthropic
from dotenv import load_dotenv
load_dotenv()
# Your S3 bucket for raw LLM payloads
s3_config = AwsS3StorageConfig(
bucket_name=os.environ["ORG_AWS_S3_BUCKET_NAME"],
aws_access_key_id=os.environ["ORG_AWS_S3_ACCESS_KEY_ID"],
aws_secret_access_key=os.environ["ORG_AWS_S3_SECRET_ACCESS_KEY"],
aws_region=os.environ["ORG_AWS_S3_REGION"],
)
raw_payload_storage = RawPayloadStorage(storage=s3_config)
# Local RSA key for signing
signer = LocalKeySignerConfig(
private_key_path=os.environ["ARWEAVE_PRIVATE_KEY_PATH"],
)
# Arweave for decentralized hash storage
# Namespace is public — written to the ledger and used to segment stored data
# Namespace should be one anonymous ID per customer, agent, or environment
# Retain a record of your namespace mappings
arweave_storage = ArweaveHashStorage(
namespace="tenant_a1b2c3d4", # See namespace comments above
signer=signer,
)
# Create notary callback
notary = LangChainNotary(
raw_payload_storage=raw_payload_storage,
hash_storage=[arweave_storage],
debug=True,
)
# Attach to model
model = ChatAnthropic(
model="claude-sonnet-4-6",
api_key=os.environ["ANTHROPIC_API_KEY"],
callbacks=[notary],
)
response = model.invoke("What is the capital of France?")
print(response.content)
验证
去中心化(Arweave):从存储桶下载原始有效载荷并压缩,然后使用开源 CLI 进行验证:
aws s3 sync s3://your-bucket/arweave/tenant_a1b2c3d4/ ./logs
zip -r logs.zip logs
npm install -g agentsystems-verify
agentsystems-verify --logs logs.zip
CLI 重新计算每个有效载荷的哈希,并与存储在 Arweave 上的哈希进行比较。参见 完整验证指南 了解更多详情。
另外, 验证 UI 支持去中心化和托管验证。
配置
- - 原始有效载荷存储选项
- - 签名配置
- - 哈希存储选项