ローカルLLM(DeepSeek-R1)を活用したPythonプログラミングアシスタントの構築

## はじめに
RTX 4060搭載PCでDeepSeek-R1を動作させる環境構築（別記事： [RTX 4060搭載ノートPCでDeepSeek-R1を動かす最短手順(Windows 11 Home/WSL2/Ubuntu-24.04/Python仮想環境/Ollama) #Windows11 - Qiita](https://qiita.com/vpkaerun/items/bd9a9523bba8da1167fb)）が完了したら、実際にプログラミング支援ツールとして活用する方法を解説します。Jupyter Notebook環境で対話的に利用できるアシスタントの構築手順をご紹介します。

## 基本的な実装手順

### 1. Jupyter Notebookの作成
```bash
# 仮想環境が有効化されていることを確認
cd ~/workspace  # 作業ディレクトリに移動
jupyter notebook
```

### 2. 新規ノートブックの作成
Jupyter Lab/Notebookで「New」→「Python 3」を選択し、`deepseek_assistant.ipynb`という名前で保存します。

### 3. 基本的なアシスタント機能の実装
```python
# deepseek_assistant.ipynb
import requests
from IPython.display import display, Markdown

class DeepSeekAssistant:
    def __init__(self):
        self.base_url = 'http://localhost:11434/api/generate'
        self.model = 'deepseek-ja'
        
    def ask(self, question, system_prompt=None):
        prompt = f"{system_prompt}\n\n{question}" if system_prompt else question
        
        response = requests.post(
            self.base_url,
            json={
                'model': self.model,
                'prompt': prompt,
                'stream': False
            }
        )
        
        return response.json()['response']
    
    def ask_code(self, question):
        system_prompt = """
        あなたはPythonプログラミングの専門家です。
        コードの説明は必ず日本語で行い、実行可能なサンプルコードを含めてください。
        エラーハンドリングも適切に行ってください。
        """
        return self.ask(question, system_prompt)

# アシスタントの初期化
assistant = DeepSeekAssistant()
```

### 4. 使用例
同じノートブック内で以下のように使用できます：

```python
# プログラミング質問の例
question = "Pythonでファイル入出力を行う方法を教えてください"
response = assistant.ask_code(question)
display(Markdown(response))
```

## 実用的な拡張機能の追加

### 1. コード実行機能付きアシスタント
```python
# code_assistant.ipynb
import requests
from IPython.display import display, Markdown
import subprocess
import tempfile
import os

class CodeExecutionAssistant(DeepSeekAssistant):
    def execute_code(self, code):
        """生成されたコードを実行する"""
        with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
            f.write(code)
            temp_file = f.name
        
        try:
            result = subprocess.run(['python', temp_file], 
                                  capture_output=True, 
                                  text=True)
            return result.stdout
        except Exception as e:
            return f"実行エラー: {str(e)}"
        finally:
            os.unlink(temp_file)
    
    def ask_and_execute(self, question):
        """コードを生成して実行"""
        response = self.ask_code(question)
        
        # コードブロックを抽出
        import re
        code_blocks = re.findall(r'``````', response, re.DOTALL)
        
        results = []
        for code in code_blocks:
            results.append(self.execute_code(code))
        
        return response, results

# 使用例
assistant = CodeExecutionAssistant()
question = "1から10までの数の合計を計算するプログラムを書いてください"
response, results = assistant.ask_and_execute(question)
display(Markdown(response))
print("\n実行結果:")
for result in results:
    print(result)
```

## 活用シーン別の使い方

### 1. コード生成支援
```python
# 新しいプログラムの作成支援
response = assistant.ask_code("ファイルからCSVデータを読み込んで集計するプログラムを作成したい")
display(Markdown(response))
```

### 2. デバッグ支援
```python
# エラーの解決支援
error_code = """
def calculate_average(numbers):
    return sum(numbers) / len(numbers)

result = calculate_average([])
"""
response = assistant.ask_code(f"このコードでZeroDivisionErrorが発生します。修正方法を教えてください:\n{error_code}")
display(Markdown(response))
```

## パフォーマンスとリソース管理

### GPUリソースのモニタリング
```python
import subprocess
import json

def check_gpu_usage():
    result = subprocess.run(['nvidia-smi', '--query-gpu=memory.used,memory.total', '--format=csv,nounits,noheader'], 
                          capture_output=True, text=True)
    used, total = map(int, result.stdout.strip().split(','))
    return f"GPU Memory: {used}MB / {total}MB ({used/total*100:.1f}%)"

print(check_gpu_usage())
```

## まとめ
ローカルで動作するDeepSeek-R1を活用することで、プライバシーを保ちながら高度なプログラミング支援が実現できます。Jupyter Notebook環境との連携により、対話的なコード開発とデバッグが可能になります。

注意点：
- GPUメモリ使用量に注意（RTX 4060の8GB VRAMの範囲内で動作）
- 長時間の利用時はGPU温度をモニタリング
- 生成されたコードは必ず検証してから本番環境で使用