コードに埋め込むAIチップの実践: Hello Worldで見るEvolveChipパターン

https://qiita.com/EasyCording/items/26168725cceccafee08a


## はじめに

プログラミングにおけるAI活用といえば、ChatGPTやCopilotのようなツールを思い浮かべることが多いと思います。しかし、これらは「外部ツール」として開発をサポートするもので、コードそのものとは分離されています。

では、コード自体にAIを「埋め込む」ことはできないでしょうか？

**EvolveChip**は、そんな発想から生まれた新しい設計パターンです。コードに「AIチップ」を埋め込み、開発時には自己進化をサポートしながら、本番環境ではその痕跡を完全に取り除くというアプローチです。

この記事では、簡単なHello Worldプログラムを例に、EvolveChipパターンの実装方法を解説します。

## EvolveChipパターンとは

EvolveChipパターンの本質は次の3点です：

1. **開発時AI支援**: コードに埋め込まれたAIチップが開発中にコード改善を提案
2. **痕跡レス化**: ビルド/コンパイル時にAIチップを完全に除去
3. **モジュール分離**: 環境依存を最小化し、クリーンなコードを保持

Pythonを使った具体的な例を見ていきましょう。

## Hello World実装例

### 1. 基本的なHello World

まずは、最も単純なHello Worldプログラムから始めます：

```python
# hello_world.py
print("Hello, World!")
```

### 2. EvolveChipの実装

次に、AIチップの実装です。独立したモジュールとして作成します：

```python
# evolve_chip.py
import inspect
import functools
import os

class EvolveChip:
    """コードを進化させるAIチップ"""
    
    def __init__(self, func=None):
        self.func = func
        if func:
            self.original_source = inspect.getsource(func)
            functools.update_wrapper(self, func)
        self.dev_mode = os.environ.get("EVOLVE_MODE") == "development"
        self.suggestions = []
    
    def __call__(self, *args, **kwargs):
        # 元の関数を実行
        result = self.func(*args, **kwargs)
        
        # 開発モードかつ分析が未実行の場合のみ実行
        if self.dev_mode and not self.suggestions:
            self._analyze()
        
        return result
    
    def _analyze(self):
        """AIを使ってコードを分析し改善案を生成"""
        try:
            # 実際の実装ではここでAI APIを呼び出す
            # このサンプルではシミュレーション
            if "Hello, World" in self.original_source:
                self.suggestions = [
                    "ユーザー名を入力できるように拡張する",
                    "時間帯に応じた挨拶に変更する"
                ]
                self._display_suggestions()
        except Exception as e:
            print(f"分析エラー: {e}")
    
    def _display_suggestions(self):
        """進化の提案を表示"""
        print("\n" + "="*50)
        print("🧠 EvolveChip提案:")
        for i, suggestion in enumerate(self.suggestions, 1):
            print(f"{i}. {suggestion}")
        print("="*50 + "\n")
        print("適用するには: EVOLVE_APPLY=1,2 python apply_evolution.py hello_world.py")

# デコレータ関数
def evolve(func):
    """EvolveChipデコレータ"""
    if os.environ.get("EVOLVE_MODE") == "development":
        return EvolveChip(func)
    return func
```

### 3. AIチップを埋め込んだHello World

次に、Hello Worldプログラムにデコレータを追加してAIチップを埋め込みます：

```python
# hello_world_dev.py
from evolve_chip import evolve

@evolve
def say_hello():
    message = "Hello"
    message = message + ", World!"
    print(message)

if __name__ == "__main__":
    say_hello()
```

### 4. 進化適用スクリプト

AIチップの提案を適用するための簡単なスクリプトも作成します：

```python
# apply_evolution.py
import sys
import os
import ast
import re
import astunparse

def apply_evolution(file_path, suggestions_to_apply):
    """提案を適用して進化させる"""
    with open(file_path, 'r') as f:
        source = f.read()
    
    # 現在はシンプルな置換だが、本来はもっと洗練された変換が必要
    evolved_source = source
    
    # Hello World特化の変換ルール
    if "1" in suggestions_to_apply and "@evolve" in source:
        evolved_source = re.sub(
            r'(\s+)print\(message\)',
            r'\1name = input("Please enter your name: ") or "World"\n\1print(f"Hello, {name}!")',
            evolved_source
        )
    
    if "2" in suggestions_to_apply and "@evolve" in source:
        evolved_source = re.sub(
            r'(\s+)message = "Hello".*?print',
            r'\1import datetime\n\1current_hour = datetime.datetime.now().hour\n\1greeting = "Good morning" if 5 <= current_hour < 12 else "Good afternoon" if 12 <= current_hour < 18 else "Good evening"\n\1print',
            evolved_source
        )
        # メッセージフォーマットも更新
        if "1" in suggestions_to_apply:
            evolved_source = re.sub(
                r'print\(f"Hello, \{name\}!"\)',
                r'print(f"{greeting}, {name}!")',
                evolved_source
            )
        else:
            evolved_source = re.sub(
                r'print\(message\)',
                r'print(f"{greeting}, World!")',
                evolved_source
            )
    
    # 進化したコードを保存
    evolved_file = file_path.replace('.py', '_evolved.py')
    with open(evolved_file, 'w') as f:
        f.write(evolved_source)
    
    print(f"進化したコードを {evolved_file} に保存しました。")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("使用法: EVOLVE_APPLY=1,2 python apply_evolution.py file.py")
        sys.exit(1)
    
    suggestions = os.environ.get("EVOLVE_APPLY", "")
    apply_evolution(sys.argv[1], suggestions.split(','))
```

### 5. ビルドスクリプト（AIチップ除去）

最後に、AIチップを除去して本番用コードを生成するスクリプトを作成します：

```python
# build.py
import ast
import sys
import astunparse

class AIChipRemover(ast.NodeTransformer):
    """AIチップを除去するASTトランスフォーマー"""
    
    def visit_ImportFrom(self, node):
        """evolve_chipからのインポートを除去"""
        if node.module == 'evolve_chip':
            return None
        return self.generic_visit(node)
    
    def visit_FunctionDef(self, node):
        """evolveデコレータを除去"""
        node.decorator_list = [d for d in node.decorator_list 
                              if not (isinstance(d, ast.Name) and d.id == 'evolve')]
        return self.generic_visit(node)

def build_clean_code(source_file, output_file):
    """AIチップを除去したクリーンなコードを生成"""
    with open(source_file, 'r') as f:
        source = f.read()
    
    # ASTパースしてAIチップ関連コードを除去
    tree = ast.parse(source)
    transformer = AIChipRemover()
    clean_tree = transformer.visit(tree)
    
    # クリーンなソースコードを生成
    clean_source = astunparse.unparse(clean_tree)
    
    with open(output_file, 'w') as f:
        f.write(clean_source)
    
    print(f"AIチップを除去し、クリーンなコードを{output_file}に生成しました")

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("使用法: python build.py ソースファイル 出力ファイル")
        sys.exit(1)
    
    build_clean_code(sys.argv[1], sys.argv[2])
```

## 使用例

### 開発モードでの実行

環境変数を設定して開発モードで実行します：

```bash
$ export EVOLVE_MODE=development
$ python hello_world_dev.py
Hello, World!

==================================================
🧠 EvolveChip提案:
1. ユーザー名を入力できるように拡張する
2. 時間帯に応じた挨拶に変更する
==================================================

適用するには: EVOLVE_APPLY=1,2 python apply_evolution.py hello_world_dev.py
```

### 進化の適用

EvolveChipの提案を適用します：

```bash
$ EVOLVE_APPLY=1,2 python apply_evolution.py hello_world_dev.py
進化したコードを hello_world_dev_evolved.py に保存しました。

$ cat hello_world_dev_evolved.py
from evolve_chip import evolve

@evolve
def say_hello():
    import datetime
    current_hour = datetime.datetime.now().hour
    greeting = "Good morning" if 5 <= current_hour < 12 else "Good afternoon" if 12 <= current_hour < 18 else "Good evening"
    name = input("Please enter your name: ") or "World"
    print(f"{greeting}, {name}!")

if __name__ == "__main__":
    say_hello()

$ python hello_world_dev_evolved.py
Please enter your name: Taro
Good afternoon, Taro!
```

### 本番用コードの生成

最後に、AIチップを除去して本番用コードを生成します：

```bash
$ python build.py hello_world_dev_evolved.py hello_world_prod.py
AIチップを除去し、クリーンなコードをhello_world_prod.pyに生成しました

$ cat hello_world_prod.py
def say_hello():
    import datetime
    current_hour = datetime.datetime.now().hour
    greeting = "Good morning" if 5 <= current_hour < 12 else "Good afternoon" if 12 <= current_hour < 18 else "Good evening"
    name = input("Please enter your name: ") or "World"
    print(f"{greeting}, {name}!")

if __name__ == "__main__":
    say_hello()
```

ご覧の通り、本番コードからはAIチップ関連のコード（importやデコレータ）が完全に除去されています。

## まとめ

EvolveChipパターンの特徴をおさらいしましょう：

1. **開発モードでの支援**：デコレータを使用して既存の関数にAIチップを埋め込み、改善提案を表示
2. **進化の適用**：開発者の判断で提案を選択的に適用
3. **本番環境向けクリーンアップ**：AST操作によってAIチップ関連コードを完全に除去

このパターンは、Hello Worldのような単純な例だけでなく、より複雑なプロジェクトにも適用できます。例えば：

- ウェブアプリケーションの最適化
- データ処理パイプラインの効率化
- アルゴリズムの改善提案

今回はPythonでの実装を紹介しましたが、JavaScript（HOCパターン）やJava（アノテーション）など、他の言語でも同様のアプローチが可能です。

AIの支援を受けながらも、最終的には余計なコードやオーバーヘッドのないクリーンな成果物を生成できる—それがEvolveChipパターンの魅力です。

https://github.com/chnmotoTmz/evolve-chip