Files
hakorune/docs/private/ideas/new-features/2025-08-29-ai-compact-notation-protocol.md

13 KiB
Raw Blame History

AI-Nyash Compact Notation Protocol (ANCP)

Status: Idea → Design Complete Created: 2025-08-29 Updated: 2025-08-29 (Gemini & Codex分析統合、スモークテスト統合追加) Priority: High Category: AI Integration / Code Compression / Testing Infrastructure

概要

AIとNyashの効率的な通信のための圧縮記法プロトコル。予約語を1-2文字の記号に変換し、トークン数を大幅削減しながら、副次的にコード整形機能も提供する。さらに、既存のスモークテスト基盤との統合により、品質保証も自動化する。

動機

  • AIのコンテキストウィンドウ制限への対応50-90%削減目標)
  • 人間が書いたコードをAIに効率的に渡す必要性
  • Nyashパーサーとの100%同期による確実性
  • 圧縮→展開プロセスでの自動コード整形
  • 既存テスト基盤との統合による品質保証

設計詳細

基本的な変換例

// 元のコード
box Cat from Animal {
    init { name, age }
    birth() { 
        me.name = "Tama" 
    }
}

// ANCP圧縮後
$Cat@Animal{#{name,age}b(){m.name="Tama"}}

// プロトコルヘッダー付き
;ancp:1.0 nyash:0.5;
$Cat@Animal{#{name,age}b(){m.name="Tama"}}

記号マッピング体系

【型・オブジェクト操作系】
box      → $   # Box定義
new      → n   # インスタンス生成
me       → m   # 自己参照

【構造・スコープ系】
from     → @   # 継承/デリゲーション
init     → #   # フィールド初期化
static   → S   # 静的定義
local    → l   # ローカル変数

【制御フロー系】
if       → ?   # 条件分岐
else     → :   # else節
loop     → L   # ループ
return   → r   # 戻り値

【メソッド系】
birth    → b   # コンストラクタ
override → O   # オーバーライド

技術的実装設計Rust

1. Lexer拡張設計

// 双方向トランスコーダー
pub struct AncpTranscoder {
    // 静的マップphf使用でO(1)ルックアップ)
    nyash_to_ancp: phf::Map<&'static str, &'static str>,
    ancp_to_nyash: phf::Map<&'static str, &'static str>,
    
    // 位置情報マッピングSource Map相当
    span_map: SpanMap,
    
    // バージョン情報
    version: AncpVersion,
}

// LosslessToken層空白・コメント保持
struct Token {
    kind: TokenKind,
    span: Span,
    raw: RawLexemeId,
    leading_trivia: Trivia,
    trailing_trivia: Trivia,
}

// Dialect検出
enum Dialect {
    Nyash,
    ANCP(Version),
}

2. トークン効率最適化

# tiktoken実測スクリプト
import tiktoken
enc = tiktoken.get_encoding("cl100k_base")  # GPT-4等

def measure_tokens(code):
    return len(enc.encode(code))

# 実測して最適な記号を選定
original = 'box Cat from Animal { init { name } }'
ancp = '$Cat@Animal{#{name}}'

reduction = 1 - (measure_tokens(ancp) / measure_tokens(original))
print(f"Token reduction: {reduction:.1%}")

3. 双方向変換保証テスト戦略

// プロパティベーステスト
#[test]
fn roundtrip_property(code in any_valid_nyash()) {
    let transcoder = AncpTranscoder::new();
    let (ancp, _) = transcoder.encode(&code)?;
    let (restored, _) = transcoder.decode(&ancp)?;
    assert_eq!(code, restored);  // 完全一致
}

// AST同値性テスト
#[test]
fn ast_equivalence(code: &str) {
    let ast_original = parse_nyash(code);
    let ancp = transcode_to_ancp(code);
    let ast_ancp = parse_ancp(ancp);
    assert_ast_eq!(ast_original, ast_ancp);
}

// ファジングテスト
#[cfg(fuzzing)]
fuzz_target!(|data: &[u8]| {
    if let Ok(s) = std::str::from_utf8(data) {
        let _ = transcode_roundtrip(s);
    }
});

4. デバッグ体験の維持

// ハイブリッドエラー表示
fn format_error(span: Span, ancp_src: &str, nyash_src: &str) {
    let ancp_token = get_token_at(ancp_src, span);
    let nyash_token = map_to_original(ancp_token);
    eprintln!("Error at {} ({})", ancp_token, nyash_token);
    // 例: "Error at @f (from)"
}

// IDE統合LSP
impl LanguageServer for NyashLsp {
    fn hover(&self, position: Position) -> Hover {
        // ANCP記号にホバーすると元の予約語を表示
        let original = self.map_to_original(position);
        Hover { contents: format!("ANCP: {} → Nyash: {}", ...) }
    }
}

スモークテストとの統合

統一検証フレームワーク

// 検証用Box - スモークテストとANCP検証を統合
box TestValidatorBox {
    init { patterns, mode, transcoder }
    
    birth() {
        me.patterns = new ArrayBox()
        me.mode = "smoke"  // smoke/full/ancp/roundtrip
        me.transcoder = new AncpTranscoder()
    }
    
    // 共通のパターンチェック(既存スモークテストの仕組み)
    checkPatterns(output) {
        loop(me.patterns.hasNext()) {
            local pattern
            pattern = me.patterns.next()
            
            if (not output.contains(pattern)) {
                return false
            }
        }
        return true
    }
    
    // Nyashコード実行して検証既存
    validateScript(scriptPath) {
        local output
        output = me.runNyash(scriptPath)
        return me.checkPatterns(output)
    }
    
    // ANCP変換して実行・検証新規
    validateAncp(ancpPath) {
        // 1. ANCP → Nyash変換
        local nyashCode
        nyashCode = me.transcoder.decode(ancpPath)
        
        // 2. 実行(既存の実行パスを再利用)
        local output
        output = me.runNyashCode(nyashCode)
        
        // 3. パターン検証既存のcheckPatternsを再利用
        return me.checkPatterns(output)
    }
    
    // 双方向テストANCP特有
    validateRoundtrip(scriptPath) {
        // 元の実行結果
        local originalOutput
        originalOutput = me.runNyash(scriptPath)
        
        // Nyash → ANCP → Nyash → 実行
        local ancp
        ancp = me.transcoder.encode(scriptPath)
        local restored
        restored = me.transcoder.decode(ancp)
        local roundtripOutput
        roundtripOutput = me.runNyashCode(restored)
        
        // 実行結果が同一か検証
        return originalOutput == roundtripOutput
    }
}

統合スモークテストスクリプト

#!/bin/bash
# 統一スモークテストNyash & ANCP対応

# 共通の検証関数
run_test() {
    local mode=$1    # nyash/ancp/roundtrip
    local file=$2    # ファイルパス
    local pattern=$3 # 期待パターン
    
    case "$mode" in
        "ancp")
            # ANCP → Nyash変換 → 実行
            output=$(./target/release/nyash --from-ancp "$file" 2>&1)
            ;;
        "roundtrip")
            # Nyash → ANCP → Nyash → 実行
            ancp=$(./target/release/nyash --to-ancp "$file")
            output=$(echo "$ancp" | ./target/release/nyash --from-ancp - 2>&1)
            ;;
        *)
            # 通常のNyash実行
            output=$(./target/release/nyash "$file" 2>&1)
            ;;
    esac
    
    # 共通のパターン検証(既存のスモークテストと同じ!)
    echo "$output" | grep -q "$pattern"
}

# 自動テスト生成
generate_ancp_tests() {
    for test in examples/*.nyash; do
        # Nyashテストから自動的にANCPテストを生成
        ./tools/nyash2ancp "$test" > "${test%.nyash}.ancp"
        
        # 同じ期待値パターンで両方をテスト
        pattern=$(extract_expected_pattern "$test")
        
        echo "Testing $test (Nyash)..."
        run_test nyash "$test" "$pattern"
        
        echo "Testing ${test%.nyash}.ancp (ANCP)..."
        run_test ancp "${test%.nyash}.ancp" "$pattern"
        
        echo "Testing roundtrip for $test..."
        run_test roundtrip "$test" "$pattern"
    done
}

CI/CD統合

# .github/workflows/smoke.yml への追加
jobs:
  smoke-ancp:
    runs-on: ubuntu-latest
    needs: smoke  # 通常のスモークテスト後に実行
    env:
      CARGO_TERM_COLOR: always
      NYASH_DISABLE_PLUGINS: '1'
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      
      - name: Build with ANCP support
        run: cargo build --release -j32 --features ancp
      
      - name: Run ANCP roundtrip tests
        run: |
          # すべてのサンプルでANCP往復テスト
          for f in examples/*.nyash; do
            echo "Testing ANCP roundtrip: $f"
            ./tools/test_ancp_roundtrip.sh "$f"
          done
      
      - name: Run ANCP smoke tests
        run: |
          # 既存のスモークテストをANCPモードでも実行
          ANCP_MODE=1 bash tools/smoke_phase_10_10.sh
      
      - name: Measure token reduction
        run: |
          # 実際のトークン削減率を測定・報告
          ./tools/measure_ancp_efficiency.sh examples/*.nyash

共通化のメリット

  1. コード再利用:

    • 既存のパターン検証ロジックをそのまま活用
    • grepベースの柔軟な検証方法を継承
  2. テスト網羅性:

    • すべてのNyashテストが自動的にANCPテストにもなる
    • 双方向変換の正確性を継続的に検証
  3. 開発効率:

    • 新機能追加時、Nyashテストを書けばANCPテストも自動生成
    • スモークテストの期待値パターンを共有
  4. 品質保証:

    • ANCP変換によるセマンティクスの保持を自動検証
    • AIが生成したANCPコードも同じ基準で検証可能
  5. 将来の拡張性:

    • WebAssembly出力との統合も同じフレームワークで可能
    • 他の中間表現MIR等も同様に統合可能

実装ロードマップ(更新版)

Phase 1: 基礎実装2週間

  • tiktoken実測による最適記号選定
  • 固定辞書20語でTranscoder実装
  • 基本的な往復テスト
  • 既存スモークテストとの基本統合

Phase 2: パーサー統合3週間

  • Lexer拡張Dialect検出
  • TokenKind統一化
  • SpanMapによるエラー位置マッピング
  • TestValidatorBox実装

Phase 3: 品質保証2週間

  • プロパティベーステスト
  • ファジングテスト
  • ベンチマーク(性能測定)
  • 自動ANCP テスト生成スクリプト

Phase 4: ツール統合3週間

  • CLI: --view=ancp|nyash|hybrid
  • VSCode拡張ホバー変換
  • プロトコルヘッダー処理
  • CI/CDパイプライン統合

Phase 5: AI統合4週間

  • 並列コーパス生成
  • ファインチューニング実験
  • 実運用評価
  • AIコード検証の自動化

リスクと対策

技術的リスク

  1. 記号衝突: 既存演算子との衝突 → 慎重な記号選定
  2. デバッグ困難: 圧縮コードの可読性 → ハイブリッド表示
  3. バージョン互換: 将来の拡張 → ヘッダーによるバージョニング
  4. テスト複雑性: ANCP特有のバグ → スモークテスト統合で早期発見

運用リスク

  1. AIの誤解釈: 記号の誤認識 → 明示的なヘッダー
  2. 人間の混乱: 2つの記法混在 → 明確な使い分け
  3. ツール対応: エコシステム分断 → 段階的移行
  4. テスト負荷: 2倍のテスト実行 → 並列実行とキャッシュ活用

成功指標(更新版)

  • トークン削減率: 50%以上目標70%
  • 往復変換成功率: 100%
  • パース時間増加: 10%以内
  • AIエラー率改善: 30%以上
  • スモークテスト合格率: 100%Nyash/ANCP両方
  • CI実行時間増加: 20%以内

関連技術・参考

  • JavaScript Minification (Terser, UglifyJS)
  • WebAssembly (.wat ⇔ .wasm)
  • Protocol Buffers (スキーマベース圧縮)
  • Source Maps (位置情報マッピング)
  • Nyashスモークテスト基盤(パターン検証方式)

専門家レビュー

  • Gemini: トークナイザ最適化、記号体系化の重要性を指摘
  • Codex: Rust実装設計、テスト戦略の詳細を提供
  • Claude: スモークテストとの統合可能性を発見

次のアクション

  1. tiktoken実測実験の実施
  2. 最小プロトタイプの作成
  3. ChatGPTさんとの実装協議
  4. 既存スモークテストへのANCPモード追加

このアイデアは2025-08-29にGeminiさん、Codexさんとの深い技術討論を経て、実装可能な設計として成熟し、さらにスモークテストとの統合により品質保証も含めた完全なソリューションとなりました。