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

412 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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%同期による確実性
- 圧縮→展開プロセスでの自動コード整形
- 既存テスト基盤との統合による品質保証
## 設計詳細
### 基本的な変換例
```nyash
// 元のコード
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拡張設計
```rust
// 双方向トランスコーダー
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. トークン効率最適化
```python
# 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. 双方向変換保証テスト戦略
```rust
// プロパティベーステスト
#[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. デバッグ体験の維持
```rust
// ハイブリッドエラー表示
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: {}", ...) }
}
}
```
## スモークテストとの統合
### 統一検証フレームワーク
```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
}
}
```
### 統合スモークテストスクリプト
```bash
#!/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統合
```yaml
# .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さんとの深い技術討論を経て、実装可能な設計として成熟し、さらにスモークテストとの統合により品質保証も含めた完全なソリューションとなりました。*