Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Claude Codeで挑むOSSコントリビュート

Avatar for kmuto kmuto
August 23, 2025

Claude Codeで挑むOSSコントリビュート

Avatar for kmuto

kmuto

August 23, 2025
Tweet

More Decks by kmuto

Other Decks in Programming

Transcript

  1. プロジェクトの出発点 実務でのFriction Log きっかけ: 仕事でのトークン数不整合に遭遇 発見: GPT-4oでencode/decodeとtoken_counterが異なる結果 疑問: なぜ同じライブラリで結果が違うのか? 実際に遭遇した問題

    from litellm import encode from litellm.token_counter import token_counter sample_text = "こんにちは、これが私の入力文字列です!私の名前はイシャーンCTOです" encode_count = len(encode(model='gpt-4o', text=sample_text)) # 25 tokens counter_count = token_counter(model='gpt-4o', text=sample_text) # 21 tokens Claude Codeで挑むOSSコントリビュート 2
  2. Claude Codeでの調査開始 Claude Codeとの協調調査 「以下のコードを実行した時に、どのような関数が呼ばれるかを順番に教えてく ださい」 sample_text = "Hellö World,

    this is my input string!" openai_tokens = encode(model="gpt-3.5-turbo", text=sample_text) Claude Codeが明らかにした呼び出しフロー 1. encode(model="gpt-3.5-turbo", text="Hellö World...") 2. _select_tokenizer(model="gpt-3.5-turbo") 3. _return_openai_tokenizer() 4. tiktoken cl100k_base encoding.encode() Claude Codeで挑むOSSコントリビュート 3
  3. Claude Codeが発見した問題 このフローの中で、何かおかしい部分はありますか? AI の洞察 "設計上の問題: encode/decode は適切なモデル固有処理をしていない" 具体的な問題点 _return_openai_tokenizer()

    は常に cl100k_base を返す モデル固有処理(GPT-4o → o200k_base )が未実装 token_counter でのみ正しい処理が実装済み Claude Codeで挑むOSSコントリビュート 4
  4. 解決への思考プロセス 1. 解決方針の策定 人間: "/plan encode/decode と token_counterの実装の差異をなくすことを検討し ています" Claude

    Code: 詳細な実装計画を提案し、実行 2. 依存関係の修正 Claude Code: 依存関係が逆になるコードを追加 人間: 依存関係の整理を指示 3. リファクタリングの実施 Claude Code: 新しいファイルにロジックを追加 人間: 既存ファイルとの関連性を指摘し、コードの統合を指示 Claude Codeで挑むOSSコントリビュート 5
  5. Claude Code活用の課題と対策 1. Pythonコード実行の危険性 簡単な検証をClaude Codeが行う際に、危険なコマンドを実行する可能性がある # 危険!システムエラーを引き起こす可能性 Bash(python3 -c

    "import os; os.remove('important_file')") 対策: コード実行前に内容を人間が確認、Dev Containerで安全に実行 2. 依存関係の複雑さ Claude Codeが逆方向のimportを提案することがある 対策: 既存コードベースの構造を理解してから指示 3. 完全自動化の限界 Claude Codeは既存のコードを再利用することが苦手 Claude Codeで挑むOSSコントリビュート 7
  6. Claude CodeでOSS貢献のベストプラクティス 効果的なアプローチ 1. 明確な質問設計: 「答えが一意に定まる質問」を心がける 例: 「このコードを実行した時に、どのような関数が呼ばれるか?」 2. 人間とAIの役割分担:

    AIに任せる部分と人間が確認すべき部分を明確化 例: AIにコードの追加を任せ、人間がリファクタリングを指示(改善の余地は ある) 3. 安全な実行環境: Dev Containerなどでコードを安全に実行 Claude Codeで挑むOSSコントリビュート 8
  7. ありがとうございました ※ ちなみに、このスライドもClaude Code&Marpで作成しました ※ 図はdrawio形式で出力させたものを人手で微調整しています B --> C[_return_openai_tokenizer] C

    --> D["常にcl100k_base "] E[token_counter呼び出し] --> F[_get_count_function] F --> G[_select_tokenizer] G --> H[_return_openai_tokenizer] H --> I["常にcl100k_base "] I --> J[さらにモデル別処理] J --> K{モデル判定} K -->|GPT-4o| L["o200k_base "] K -->|その他| M["cl100k_base "] **問題**: 重複処理 + encode/decodeは間違ったエンコーディング Claude Codeで挑むOSSコントリビュート 10
  8. 実装修正詳細 (1/2) utils.py - _return_openai_tokenizer 修正 # 修正前 def _return_openai_tokenizer(model:

    str): return {"type": "openai_tokenizer", "tokenizer": encoding} # 常にcl100k_base # 修正後 def _return_openai_tokenizer(model: str): model_to_use = _fix_model_name(model) try: if "gpt-4o" in model_to_use: tiktoken_encoding = tiktoken.get_encoding("o200k_base") # GPT-4o用 else: tiktoken_encoding = tiktoken.encoding_for_model(model_to_use) except KeyError: tiktoken_encoding = tiktoken.get_encoding("cl100k_base") # フォールバック return {"type": "openai_tokenizer", "tokenizer": tiktoken_encoding} Claude Codeで挑むOSSコントリビュート 11
  9. 実装修正詳細 (2/2) token_counter.py - _get_count_function 簡素化 # 修正前: 15行の複雑な重複処理 elif

    tokenizer_json["type"] == "openai_tokenizer": model_to_use = _fix_model_name(model) try: if "gpt-4o" in model_to_use: encoding = tiktoken.get_encoding("o200k_base") else: encoding = tiktoken.encoding_for_model(model_to_use) except KeyError: encoding = tiktoken.get_encoding("cl100k_base") # ... 複雑な処理 # 修正後: 1行で完結 elif tokenizer_json["type"] == "openai_tokenizer": encoding = tokenizer_json["tokenizer"] # _select_tokenizer()の結果をそのまま使用 結果: 15行 → 1行の大幅簡素化 Claude Codeで挑むOSSコントリビュート 12
  10. 検証結果 一貫性テスト結果 === ENCODING CONSISTENCY TEST === Testing model: gpt-4o

    Expected encoding: o200k_base 'OpenAI GPT-4o model...': ✓ (expected: 7, got: 7) 'GPT-4o は新しい 모델입니다...': ✓ (expected: 10, got: 10) '日本語のテキストです...': ✓ (expected: 7, got: 7) Testing model: gpt-3.5-turbo Expected encoding: cl100k_base 'OpenAI GPT-4o model...': ✓ (expected: 8, got: 8) 'GPT-4o は新しい 모델입니다...': ✓ (expected: 15, got: 15) === SUMMARY === No inconsistencies found Claude Codeで挑むOSSコントリビュート 13
  11. テスト強化 新しいテストケース追加 @pytest.mark.parametrize("model", [ "gpt-4o", "gpt-3.5-turbo", "gpt-35-turbo", "claude-3-opus-20240229", "command-nightly" ])

    def test_encode_token_counter_consistency(model): sample_text = "Hellö World, this is my input string! My name is ishaan CTO" counter_tokens = token_counter(model=model, text=sample_text) encode_token_count = len(encode(model=model, text=sample_text)) assert counter_tokens == encode_token_count カバレッジ: OpenAI、Claude、Cohere、その他のモデル --> Claude Codeで挑むOSSコントリビュート 14