ai-audit-trail について
ai-audit-trailは、AIやエージェントの判断を記録し、検証するためのPythonライブラリです。規制対象のチームや監査担当者向けに、署名とハッシュチェーンによる記録保護、オフライン検証可能な証拠パッケージを提供します。
主な機能
- 01Ed25519署名とハッシュチェーンによる記録
- 02PIIのマスキングと暗号学的消去
- 03コンプライアンス対応表とレポート生成
- 04オフライン検証可能な証拠パッケージ
- 05エージェントのツール呼び出しと複数エージェントの記録
- 06ドリフトと認証状態の監視
活用シーン
- 01エージェントの判断を改ざん検知可能な形で記録
- 02外部監査向けの証拠パッケージを作成
- 03監査記録に含まれる個人データの処理を追跡
- 04動作のドリフトとコンプライアンス状態を監視
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
ai-audit-trail
AI が何を行い、なぜそうしたのか、そして記録が誰にも改ざんされていないことを証明します。
Ed25519 署名、SHA-256 ハッシュチェーン、 そして正式なコンプライアンス対応付けを備えた、改ざんを検知できる意思決定レシートです。ブロックチェーン、SaaS、ベンダーロックインは不要です。 セルフホスト可能で、オフラインで検証でき、Python ネイティブです。
これが必要な理由
EU AI Act は、ハイリスク AI システムに対して 2026 年 8 月に義務化されます。すべての意思決定が適切に行われたことを証明する、改ざんを検知できるログが求められます(第 12 条)。多くのチームは通常のロギングで対応していますが、これは改ざんを検知できず、監査において法的な根拠にもなりません。
ai-audit-trail は、監査担当者がシステムにアクセスせず、オフラインで検証できる暗号学的なレシートによって、このギャップを埋めます。ブロックチェーンと同じ原理を、ブロックチェーンのオーバーヘッド、SaaS への依存、ベンダーロックインなしで実現します。
対象ユーザー
- コンプライアンスを証明する必要がある規制対象の AI チーム(FinTech、HealthTech、LegalTech、InsurTech)
- ツールにアクセスする LLM エージェントをデプロイするエンタープライズのプラットフォームチーム
- 監査対応済みの証拠パッケージを必要とするセキュリティおよびコンプライアンス担当者
- プラットフォームの移行ではなく、
pip installと 3 行のコードで済ませたい開発者
このライブラリが提供するもの
ai-audit-trail は、EU AI Act、ISO 42001、NIST AI RMF への準拠を支援する技術的な構成要素を提供します。このライブラリ単独で規制への準拠を保証するものではありません。コンプライアンスは、単一のソフトウェアコンポーネントの範囲を超える、組織としての義務です。以下の共有責任モデルをご覧ください。
インストール
pip install ai-audit-trail # Core (Ed25519 + SHA-256 + PII)
pip install "ai-audit-trail[redis]" # + Redis persistence
pip install "ai-audit-trail[otel]" # + OpenTelemetry metrics
pip install "ai-audit-trail[all]" # Everything
要件: Python 3.11 以降 | 外部サービス不要 | エアギャップ環境で動作
クイックスタート
from ai_audit import (
AuditConfig, init_audit_config,
ReceiptCollector, ReceiptStore, ReceiptAction,
verify_chain, get_verify_key_hex,
)
# 1. Configure once at startup
init_audit_config(AuditConfig(is_production=False))
store = ReceiptStore()
# 2. Wrap every AI request
collector = ReceiptCollector(trace_id="req-1", tenant_id="acme")
collector.set_input("What is our GDPR policy?")
collector.add_check("safety", score=0.02, threshold=0.8, fired=False)
collector.set_output("Our GDPR policy states that...")
collector.set_action(ReceiptAction.ALLOW)
collector.emit(store)
collector.cleanup()
# 3. Verify tamper-evidence
result = verify_chain(store.get_by_tenant("acme"), get_verify_key_hex())
assert result.valid # Ed25519 + SHA-256 + hash-chain verified
アーキテクチャ概要
Receipt Creation Verification & Compliance Agentic AI Audit
───────────────── ────────────────────────── ──────────────────
ReceiptCollector ──> verify_chain() ToolCallReceipt
set_input() build_compliance_summary() TraceGraph (DAG)
add_check() build_crosswalk() BehavioralContract
set_output() export_evidence_package() ProvenanceChain
set_action() SPRTMonitor
emit() DriftMonitor
│ EpochManager
v
ReceiptStore ──> StorageBackend ABC
(in-memory LRU) InMemoryBackend
+ Redis (optional) (your custom backends)
+ AuditBuffer
主な機能
意思決定レシート(Ed25519 + SHA-256 + ハッシュチェーン)
AI パイプラインの意思決定ごとに、暗号学的に封印されたハッシュチェーン形式の記録である意思決定レシートが生成されます。
| 証明できる内容 | 方法 |
|---|---|
| 入力の完全性 | NFKC 正規化され、PII を除去した入力の SHA-256 |
| 出力の完全性 | 生成された出力の SHA-256 |
| チェック結果 | スコアとしきい値を含む、順序付けられたチェック記録 |
| 意思決定 | 実行されたアクション(ALLOW / REJECT / ESCALATE / ...) |
| モデルの来歴 | モデル ID + 設定ダイジェスト |
| 否認防止 | Ed25519 署名(libsodium) |
| 順序 | ハッシュチェーンによるリンク(prev_receipt_hash) |
3 段階の検証(レシート 1 件あたり 0.1 ms 未満):
Ed25519 signature → detects forgery
SHA-256 self-hash → detects corruption
Hash-chain link → detects insertions / deletions / reordering
PII の秘匿化(GDPR 第 17 条)
個人データはハッシュ化する前に除去されるため、監査ログに生の PII が含まれることはありません。
from ai_audit import PiiConfig, PiiMode, PiiType
config = PiiConfig(
enabled_types=frozenset({PiiType.EMAIL, PiiType.PHONE, PiiType.IP}),
mode=PiiMode.REDACT, # or HASH (SHA-256) or MASK (a***m)
)
collector = ReceiptCollector(tenant_id="acme", pii_config=config)
| モード | [email protected] の変換後 |
|---|---|
REDACT | [EMAIL] |
HASH | 3d4e5f8a...(決定論的な SHA-256) |
MASK | a***@c***.com |
暗号シュレッディング(GDPR の消去権)
テナントごとの AES-256-GCM キーで PII フィールドを暗号化します。キーを破棄すれば、ハッシュチェーンを保ったまま、データは永久に読み取り不能になります。
from ai_audit.shredding import AESGCMDEKStore, encrypt_field, shred_tenant
dek_store = AESGCMDEKStore()
dek_store.create_dek("tenant-acme")
field = encrypt_field("sensitive PII", dek_store, "tenant-acme")
shred_tenant("tenant-acme", dek_store) # Key destroyed — data unrecoverable
# Hash-chain remains mathematically intact (hashes ciphertext, not plaintext)
コンプライアンスとガバナンス
ISO 42001 / NIST AI RMF 対応表
レシートデータを、証拠への参照情報とともに、認知された管理策に直接対応付けます。
from ai_audit.crosswalk import build_crosswalk, nist_function_map
crosswalk = build_crosswalk(receipts, chain_intact=True)
for entry in crosswalk:
print(f"[{entry.status}] {entry.framework} {entry.control_id} — {entry.control_name}")
nist = nist_function_map(receipts)
print(nist["GOVERN"].coverage) # 0.0–1.0
print(nist["MEASURE"].status) # PASS / PARTIAL / FAIL
ISO 42001 の管理策: A.6.2.8(ロギング)、A.7.5(来歴)、A.6.2.6(パフォーマンス)、A.8.4(出力)、A.5.3(リスク) NIST AI RMF: GOVERN、MAP、MEASURE、MANAGE — 定量的なカバレッジスコア付き
EU AI Act コンプライアンスレポート
from ai_audit.report import ComplianceReportGenerator
gen = ComplianceReportGenerator(summary, verify_key_hex=get_verify_key_hex())
gen.to_markdown() # Documentation portals
gen.to_json() # Automated pipelines
gen.to_html() # Air-gapped servers
第 9 条(リスク)、第 12 条(記録保持)、第 13 条(透明性)、第 17 条(品質)、第 18 条(ロギング)を対象とします。
証拠パッケージのエクスポート(オフライン検証)
外部監査人向けの、自己完結型の署名付き ZIP です。システムへのアクセスは不要です。
from ai_audit.export import export_evidence_package, verify_evidence_package
export_evidence_package(receipts, verify_key_hex, signing_key, "audit_2026.zip")
# Bundle: receipts.jsonl + chain_metadata.json + public_key.hex + manifest.json (signed) + verify.py
# Auditor verifies offline:
# python -m ai_audit verify audit_2026.zip
継続的な認証(SPRT)
逐次確率比検定 — テナントごとのコンプライアンス状況をリアルタイムで確認できます。
from ai_audit.sprt import SPRTMonitor
monitor = SPRTMonitor(tenant_id="acme")
for receipt in receipts:
state = monitor.update(is_reject=(receipt.action == "reject"))
print(state.status) # CERTIFIED | MONITORING | FLAGGED
print(state.confidence) # 0.0–1.0
ドリフト検出(Jensen-Shannon ダイバージェンス)
動作の変化をリアルタイムで検出します — scipy は不要で、純粋な Python で動作します。
from ai_audit.drift import DriftMonitor
monitor = DriftMonitor(window_size=100)
for receipt in receipts:
state = monitor.update(receipt.action.value)
print(state.status) # STABLE | DRIFTING | CRITICAL_DRIFT
print(state.drift_score) # JSD 0.0–1.0
エージェント型 AI の監査(世界初)
エージェントの動作契約
信頼性インデックス Theta による形式的な (p, delta, k)-充足性 — EU AI Act の要件を検証可能な仕様に変換します。
from ai_audit.contracts import BehavioralContract, Constraint, ContractMonitor
contract = BehavioralContract(
contract_id="safety-v1",
constraints=[
Constraint(name="no_pii_leak", kind="hard", field="action", operator="!=", value="reject"),
Constraint(name="quality", kind="soft", field="checks.safety.score", operator="<=", value=0.1, delta=0.5),
],
)
monitor = ContractMonitor(contract)
for receipt in receipts:
state = monitor.evaluate(receipt)
print(state.p) # Hard constraint satisfaction probability
print(state.delta) # Maximum soft deviation observed
print(state.k) # Recovery steps after last violation
print(state.reliability_index) # Theta: single compliance metric (0.0–1.0)
print(state.status) # COMPLIANT | DEGRADED | VIOLATED
暗号学的なツール呼び出しレシート
すべてのエージェント API 呼び出しに Ed25519 署名を付与します — これを提供する既存のフレームワークはありません。
from ai_audit.toolcall import seal_tool_call, verify_tool_call_chain
receipt = seal_tool_call(
agent_id="researcher",
tool_name="web_search",
tool_args={"query": "EU AI Act compliance"},
tool_result="Found 5 relevant documents...",
private_key=signing_key,
tenant_id="acme",
)
assert receipt.verify(signing_key.verify_key)
マルチエージェントのトレースグラフ(DAG)
委任、引き継ぎ、並列オーケストレーションを監査します — 直線的なログだけではありません。
from ai_audit.tracegraph import TraceGraph
graph = TraceGraph(trace_id="workflow-1", tenant_id="acme")
root = graph.add_node(agent_id="orchestrator", action="plan")
graph.add_node(agent_id="researcher", action="search", parent_id=root.node_id)
graph.add_node(agent_id="writer", action="draft", parent_id=root.node_id)
assert graph.verify_integrity() # Hash-based tamper detection
assert not graph.has_cycles() # DAG validation
lineage = graph.get_agent_lineage(leaf_node.node_id) # Root-to-leaf trace
認識論的完全性 / 改ざん不能な来歴
あらゆる情報の出所を追跡します — 意思決定がプロンプトインジェクションの影響を受けていないことを証明します。
from ai_audit.provenance import ProvenanceChain, ProvenanceRecord, SourceType
chain = ProvenanceChain(receipt_id="r1", tenant_id="acme")
chain.add(ProvenanceRecord(source_type=SourceType.SYSTEM, source_id="prompt", trust_level=1.0, content_hash="..."))
chain.add(ProvenanceRecord(source_type=SourceType.DOCUMENT, source_id="doc-123", trust_level=0.8, content_hash="..."))
chain.add(ProvenanceRecord(source_type=SourceType.UNKNOWN, source_id="???", trust_level=0.0, content_hash="..."))
summary = chain.trust_summary()
print(summary.system_grounded) # True — has SYSTEM source
print(summary.potentially_injected) # True — has UNKNOWN source
print(summary.min_trust) # 0.0 — weakest link
高スループットアーキテクチャ
Merkle ツリーによるバッチ封印(RFC 6962)
レシートのチェーンではなくルートのチェーンを使用し、バッチごとの検証を O(log N) で行います。
from ai_audit.batch import MerkleBatcher
batcher = MerkleBatcher(tenant_id="acme", private_key=key, max_batch_size=2048)
for receipt in receipts:
seal = batcher.add(receipt.receipt_id, receipt.seal_payload())
if seal: # Auto-flushed at 2048 receipts
print(f"Batch sealed: {seal.merkle_root[:16]}...")
assert batcher.verify_chain_of_roots(key.verify_key)
チェーンエポック / ロールオーバー
チェーンの無制限な拡大を防ぎます。古いエポックはアーカイブまたは削除できます。
from ai_audit.epochs import EpochManager
mgr = EpochManager(tenant_id="acme", private_key=key, max_epoch_size=10_000)
for receipt in receipts:
seal = mgr.add_receipt(receipt) # Auto-seals at 10k
mgr.seal_epoch() # Or explicit rollover
assert mgr.verify_epoch_chain(key.verify_key)
バックプレッシャー対応リングバッファー
高スループットのデータ取り込みに対応する有界バッファーです — フェイルクローズで、データが黙って失われることはありません。
from ai_audit.buffer import AuditBuffer, AuditBufferFullError
buffer = AuditBuffer(maxsize=50_000) # ~5 seconds at 10k req/s
try:
buffer.put(receipt)
except AuditBufferFullError:
# Backpressure — reject the request rather than lose audit data
pass
batch = buffer.drain(max_items=2048)
ストレージバックエンド ABC
永続化方式をプラグインで拡張できます — お好みのデータベースを使用できます。
from ai_audit.storage import StorageBackend, InMemoryBackend
# Use the reference implementation for dev/test
backend = InMemoryBackend(max_receipts=50_000)
# Or implement your own:
class PostgresBackend(StorageBackend):
def write_receipt(self, receipt): ...
def read_receipt(self, receipt_id): ...
def query_by_tenant(self, tenant_id, limit=100): ...
def healthcheck(self) -> bool: ...
OpenTelemetry インストルメンテーション
SRE ダッシュボード向けのネイティブメトリクスを提供します — OTel SDK がない場合も、正常に何も行わず動作します。
# pip install "ai-audit-trail[otel]"
from ai_audit.telemetry import record_seal, record_append, record_drift
record_seal(duration_seconds=0.000045, tenant_id="acme")
record_append(tenant_id="acme", async_mode=True)
record_drift(score=0.03, tenant_id="acme")
メトリクス: ai_audit.seal_duration_seconds、ai_audit.append_total、ai_audit.redis_fallback_total、ai_audit.chain_break_total、ai_audit.drift_score、ai_audit.buffer_size、ai_audit.epoch_sealed_total
本番環境のセットアップ
永続署名キー
python -c "import nacl.signing; print(nacl.signing.SigningKey.generate().encode().hex())"
init_audit_config(AuditConfig(is_production=True, signing_key_hex="your-64-char-hex-key"))
KMS 統合
from ai_audit import KeyProvider, init_key_provider
class VaultKeyProvider(KeyProvider):
def get_signing_key(self) -> nacl.signing.SigningKey:
secret = vault_client.secrets.kv.read_secret("secret/ai-audit/key")
return nacl.signing.SigningKey(bytes.fromhex(secret["data"]["key"]))
def get_verify_key_hex(self) -> str:
return self.get_signing_key().verify_key.encode().hex()
init_key_provider(VaultKeyProvider())
Redis の永続化
import redis
store = ReceiptStore(redis_client=redis.Redis(), use_lua=True) # Lua mode: 10k+ req/s
共有責任モデル
| 責任 | ライブラリ | デプロイ担当者 |
|---|---|---|
| Ed25519 + SHA-256 による署名とハッシュ化 | X | |
| ハッシュチェーンの完全性 | X | |
| PII の編集(REDACT/HASH/MASK) | X | |
| Merkle ツリーによるバッチ封印(RFC 6962) | X | |
| SPRT コンプライアンス認証 | X | |
| ISO 42001 / NIST AI RMF のマッピング | X | |
| 証拠パッケージのエクスポート + 検証 | X | |
| 暗号シュレッディング(AES-256-GCM) | X | |
| エージェントの動作契約 | X | |
| OpenTelemetry メトリクス | X | |
| 安全なキー保管(HSM/Vault) | X | |
| PII タイプの設定 | X | |
| 耐久性のあるストレージバックエンド | X | |
| アクセス制御 / RBAC | X | |
| 人間による監督(EU AI Act 第 14 条) | X | |
| クロック同期(NTP) | X | |
| インシデント対応 | X | |
| 規制コンプライアンス認証 | X |
例
examples/ ディレクトリを参照してください。
- end_to_end_audit.py — レシート、検証、対応表、証拠のエクスポートを含む完全なライフサイクル
- fastapi_middleware.py — FastAPI 監査ミドルウェアのパターン
- langchain_callback.py — LangChain コールバックハンドラー
パフォーマンス
| 操作 | 典型的なレイテンシ | 備考 |
|---|---|---|
seal()(ハッシュ化+署名) | < 100 us | libsodium C による Ed25519 |
verify_chain(1000) | < 50 ms | 線形にスケールします |
merkle_root(2048) | < 5 ms | RFC 6962 SHA-256 |
| レシートあたりのメモリ | ~1 KB | Pydantic V2 + orjson |
ベンチマークの実行:pytest tests/test_benchmark.py -v -s
プロジェクトの統計情報
| 指標 | 値 |
|---|---|
| テスト | 196 |
| ソースモジュール | 26 |
__all__ のエクスポート | 60 |
| 型チェック | mypy --strict、エラー 0 件 |
| リンティング | ruff、エラー 0 件 |
| Python のバージョン | 3.11、3.12、3.13 |
| セキュリティスキャン | 3 件完了、6 件修正 |
| NB バリデーターへの相談 | 5 名(アーキテクチャ、エンタープライズ、パフォーマンス、エージェント、ブランディング) |
セキュリティ
脅威モデル、脆弱性の報告手順、サポート対象バージョンの全容については、SECURITY.md をご覧ください。
アーキテクチャ上の不変条件、責任共有モデル、貢献ガイドラインについては、CONTRIBUTING.md をご覧ください。
ライセンス
MIT — 商用利用は無料です。
作成・メンテナンス
S&S Connect — 自律型 AI システムのための信頼インフラを構築しています。
- メンテナー: Fabrice (@sundsoffice-tech)
- リポジトリ: github.com/sundsoffice-tech/ai-audit-trail
- PyPI: pypi.org/project/ai-audit-trail
- 課題とフィードバック: GitHub Issues
本番環境または研究で ai-audit-trail をご利用の場合は、ぜひお知らせください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。