OpenAI APIを利用するフィルタfilter-OpenAIとVimへの応用 by Claude Code

2025年6月27日

概要

本レポートでは、OpenAI APIを活用したテキストフィルタリングツール「filter-OpenAI」の実装と、Vimエディタとの統合について紹介します。このツールは、Unix哲学に従ったシンプルなパイプラインツールとして設計されており、標準入力からテキストを受け取り、OpenAIのGPT-4oモデルで処理した結果を標準出力に返します。

関連リンク

1. filter-OpenAIの実装

1.1 ソースコード

#!/bin/bash

# 環境変数からAPIキーを取得
if [ -z "$FILTER_OPENAI_API_KEY" ]; then
  echo "Error: FILTER_OPENAI_API_KEY environment variable is not set" >&2
  exit 1
fi

# 環境変数からプロンプトを取得
if [ -z "$FILTER_OPENAI_PROMPT" ]; then
  echo "Error: FILTER_OPENAI_PROMPT environment variable is not set" >&2
  exit 1
fi

# 標準入力からテキストを読み込む
INPUT_TEXT=$(cat -)
if [ -z "$INPUT_TEXT" ]; then
  echo "Error: No input text provided" >&2
  exit 1
fi


# JSONを適切に構築
JSON_PAYLOAD=$(jq -n \
  --arg model "gpt-4o" \
  --arg system "$FILTER_OPENAI_PROMPT" \
  --arg user "$INPUT_TEXT" \
  '{
    model: $model,
    messages: [
      {role: "system", content: $system},
      {role: "user", content: $user}
    ],
    max_tokens: 1024
  }')

curl -s https://api.openai.com/v1/chat/completions \
  -H "Authorization: Bearer $FILTER_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$JSON_PAYLOAD" | jq -r '.choices[0].message.content'

1.2 設計上の特徴

  • 環境変数による設定: APIキーとプロンプトを環境変数で管理
  • 適切なAPIコール: システムメッセージとユーザーメッセージを分離
  • JSONエスケープ: jqを使用した安全なJSON構築
  • エラーハンドリング: 必須環境変数のチェック
  • GPT-4o使用: 最新の高性能モデルを採用

2. 使用例

2.1 基本的なフィルタとしての使い方

翻訳フィルタ

# 環境変数を設定
export FILTER_OPENAI_API_KEY="sk-..."
export FILTER_OPENAI_PROMPT="あなたは優秀な翻訳者です。与えられたテキストを自然な日本語に翻訳してください。"

# 英語のテキストファイルを日本語に翻訳
./filter-OpenAI < english.txt > japanese.txt

# 複数ファイルの一括処理
for file in *.txt; do
  ./filter-OpenAI < "$file" > "translated_$file"
done

実行例

$ cat sample-email.txt
Dear Mr. Tanaka,

Thank you for your email regarding the project timeline. I've reviewed the proposal with our team, and we're excited to move forward with the implementation phase.

As discussed, we'll begin the initial development next Monday. Our technical lead will reach out to schedule a kick-off meeting with your team. Please let me know if you have any preferred dates or times.

We anticipate completing the first milestone by the end of March. I'll send you weekly progress reports to keep you updated on our status.

If you have any questions or concerns, please don't hesitate to contact me.

Best regards,
Sarah Johnson
Project Manager
Tech Solutions Inc.

$ cat sample-email.txt | ./filter-OpenAI
田中様

この度はプロジェクトのタイムラインに関するメールをいただき、ありがとうございます。提案内容をチームと共に確認し、実施段階に移行することにワクワクしています。

お話ししていた通り、来週の月曜日から初期開発を開始します。技術担当者が田中様のチームとのキックオフミーティングを設定するために連絡いたします。ご希望の日程や時間がありましたら、お知らせください。

第一のマイルストーンは3月末までに完了する予定です。進捗状況をお伝えするために、毎週進捗レポートをお送りします。

ご質問やご不明な点がございましたら、どうぞお気軽にご連絡ください。

よろしくお願いいたします。

サラ・ジョンソン
プロジェクトマネージャー
Tech Solutions Inc.

2.2 パイプラインでの使用

# ウェブページを取得して翻訳
curl -s https://example.com | ./filter-OpenAI > translated.txt

# gitのログメッセージを翻訳
git log --oneline -10 | ./filter-OpenAI

# manページを翻訳
man ls | ./filter-OpenAI | less

2.3 対話的な使用

# 標準入力から直接入力
./filter-OpenAI
Hello, how are you today?
^D
# → こんにちは、今日はお元気ですか?

# echoコマンドと組み合わせ
echo "Good morning!" | ./filter-OpenAI
# → おはようございます!

2.4 プロンプトのカスタマイズ

# 要約
FILTER_OPENAI_PROMPT="あなたは要約の専門家です。以下の文章を3行で簡潔に要約してください。" ./filter-OpenAI < article.txt

# コード説明
FILTER_OPENAI_PROMPT="あなたはプログラミングの専門家です。以下のコードの動作を分かりやすく説明してください。" ./filter-OpenAI < script.py

# 文章校正
FILTER_OPENAI_PROMPT="あなたは校正の専門家です。以下の文章の誤字脱字を修正し、より読みやすく改善してください。" ./filter-OpenAI < draft.txt > corrected.txt

2.5 実用的なシェルスクリプト例

#!/bin/bash
# translate-docs.sh - ドキュメントフォルダ内の全ファイルを翻訳

export FILTER_OPENAI_API_KEY="sk-..."
export FILTER_OPENAI_PROMPT="あなたは技術文書の翻訳専門家です。技術用語を適切に訳し、読みやすい日本語に翻訳してください。"

mkdir -p translated

for file in docs/*.md; do
  echo "Translating $file..."
  ./filter-OpenAI < "$file" > "translated/$(basename "$file")"
done

echo "Translation complete!"

2.6 エラー処理の例

# APIキーが設定されていない場合
unset FILTER_OPENAI_API_KEY
echo "test" | ./filter-OpenAI
# → Error: FILTER_OPENAI_API_KEY environment variable is not set

# 空の入力
echo -n "" | ./filter-OpenAI
# → Error: No input provided

2.7 バッチ処理の例

# CSVファイルの特定カラムを翻訳
while IFS=',' read -r id name description; do
  translated=$(echo "$description" | ./filter-OpenAI)
  echo "$id,$name,$translated"
done < products.csv > products_ja.csv

# ログファイルのエラーメッセージを翻訳
grep ERROR system.log | ./filter-OpenAI > errors_ja.txt

3. Vimとの統合

3.1 基本設定

環境変数の設定

# ~/.bashrcや~/.zshrcに追加
export FILTER_OPENAI_API_KEY="sk-..."

vimrcでの設定

" ~/.vimrcに追加(filter-OpenAIのパスを変更してください)

" 日本語翻訳用のコマンド
command! -range Translate <line1>,<line2>!FILTER_OPENAI_PROMPT="あなたは優秀な翻訳者です。与えられたテキストを自然な日本語に翻訳してください。" /Your/Dir/filter-OpenAI

" formatprgとして設定する関数
function! SetTranslateFilter()
  let &l:formatprg = 'FILTER_OPENAI_PROMPT="あなたは優秀な翻訳者です。与えられたテキストを自然な日本語に翻訳してください。" /Your/Dir/filter-OpenAI'
endfunction

" キーマッピング(オプション)
nnoremap <leader>t :call SetTranslateFilter()<CR>

3.2 使い方

方法1: コマンドを使う

" 選択範囲を翻訳
:'<,'>Translate

" ファイル全体を翻訳
:%Translate

" 現在行を翻訳
:.Translate

方法2: formatprgを使う

" formatprgを設定
:call SetTranslateFilter()
" または
<leader>t

" 段落を翻訳
vipgq

" 選択範囲を翻訳
vgq

" 現在行を翻訳
gqq

4. 技術的考察

4.1 アーキテクチャの利点

  1. Unix哲学の遵守: 単一の機能に特化し、他のツールとの組み合わせが容易
  2. 環境変数での設定: セキュリティを考慮したAPIキー管理
  3. 適切なAPI使用: システムメッセージとユーザーメッセージの分離による高品質な出力
  4. エラーハンドリング: 堅牢性を確保する適切なエラー処理

4.2 パフォーマンスと制約

  • レスポンス時間: OpenAI APIの応答には数秒を要する
  • API制限: レート制限と使用量制限に注意が必要
  • 料金: GPT-4oの使用には従量課金が発生
  • 依存関係: curljqが必要

4.3 セキュリティ考慮事項

  • APIキーは環境変数で管理し、スクリプトに直接記載しない
  • 機密情報を含むテキストの処理には注意が必要
  • OpenAI APIの利用規約に従った使用

5. まとめ

filter-OpenAIは、シンプルながら強力なテキスト処理ツールとして実装されています。Unix哲学に従った設計により、コマンドライン環境やVimエディタとの親和性が高く、日常的なテキスト処理作業を大幅に効率化できます。

特に以下の用途において高い効果を発揮します:

  • 翻訳作業: 技術文書やビジネス文書の翻訳
  • 文章校正: 誤字脱字の修正や文体の改善
  • 要約作成: 長文の要約や抄録作成
  • コード解説: プログラムコードの動作説明

GPT-4oの高い性能と適切なプロンプト設計により、従来の自動翻訳ツールを上回る品質の出力が期待できます。今後は、より多様な処理タスクへの応用や、他のエディタとの統合も検討する価値があるでしょう。

注意事項

  • 大きなファイルを処理する場合、API制限に注意
  • 処理には時間がかかるため、進捗表示を追加することを推奨
  • APIの利用料金が発生することに留意
  • パスは環境に合わせて調整してください

(2025年6月27日)