ホームページ > バックエンド開発 > Python チュートリアル > ClientAI と Ollama を使用したローカル AI コード レビューアーの構築 - パート 2

ClientAI と Ollama を使用したローカル AI コード レビューアーの構築 - パート 2

Susan Sarandon
リリース: 2024-12-28 02:22:08
オリジナル
137 人が閲覧しました

Building a Local AI Code Reviewer with ClientAI and Ollama - Part 2

パート 1 では、コードレビュー担当者のためのコア分析ツールを構築しました。次に、これらのツールを効果的に使用できる AI アシスタントを作成します。各コンポーネントを段階的に説明し、すべてがどのように連携するかを説明します。

ClientAI のドキュメントについてはここを参照し、Github リポジトリについてはここを参照してください。

シリーズインデックス

  • パート 1: 導入、セットアップ、ツールの作成
  • パート 2: アシスタントとコマンド ライン インターフェイスの構築 (ここまでです)

ClientAI へのツールの登録

まず、ツールを AI システムで利用できるようにする必要があります。登録方法は次のとおりです:

def create_review_tools() -> List[ToolConfig]:
    """Create the tool configurations for code review."""
    return [
        ToolConfig(
            tool=analyze_python_code,
            name="code_analyzer",
            description=(
                "Analyze Python code structure and complexity. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["observe"],
        ),
        ToolConfig(
            tool=check_style_issues,
            name="style_checker",
            description=(
                "Check Python code style issues. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["observe"],
        ),
        ToolConfig(
            tool=generate_docstring,
            name="docstring_generator",
            description=(
                "Generate docstring suggestions for Python code. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["act"],
        ),
    ]
ログイン後にコピー
ログイン後にコピー

ここで何が起こっているのかを詳しく見てみましょう:

  1. 各ツールは、ClientAI に次のことを伝える ToolConfig オブジェクトでラップされています。

    • ツール: 呼び出す実際の関数
    • 名前: ツールの一意の識別子
    • 説明: ツールの機能と期待されるパラメーター
    • スコープ: ツールを使用できる時期 (分析の場合は「観察」、生成の場合は「実行」)
  2. 私たちはツールを 2 つのカテゴリに分類しています:

    • 「観察」ツール (code_analyzer および style_checker) は情報を収集します
    • 「act」ツール (docstring_generator) は新しいコンテンツを生成します

AI アシスタント クラスの構築

それでは、AI アシスタントを作成しましょう。人間のコードレビュー担当者がどのように考えるかを模倣して、段階的に動作するように設計します。

class CodeReviewAssistant(Agent):
    """An agent that performs comprehensive Python code review."""

    @observe(
        name="analyze_structure",
        description="Analyze code structure and style",
        stream=True,
    )
    def analyze_structure(self, code: str) -> str:
        """Analyze the code structure, complexity, and style issues."""
        self.context.state["code_to_analyze"] = code
        return """
        Please analyze this Python code structure and style:

        The code to analyze has been provided in the context as 'code_to_analyze'.
        Use the code_analyzer and style_checker tools to evaluate:
        1. Code complexity and structure metrics
        2. Style compliance issues
        3. Function and class organization
        4. Import usage patterns
        """
ログイン後にコピー
ログイン後にコピー

この最初の方法は非常に重要です:

  • @observe デコレータはこれを観察ステップとしてマークします
  • stream=True はリアルタイム出力を有効にします
  • 後のステップでアクセスできるように、コードをコンテキストに保存します
  • 返される文字列は、AI がツールを使用する際にガイドするプロンプトです

次に、改善提案のステップを追加します。

    @think(
        name="suggest_improvements",
        description="Suggest code improvements based on analysis",
        stream=True,
    )
    def suggest_improvements(self, analysis_result: str) -> str:
        """Generate improvement suggestions based on the analysis results."""
        current_code = self.context.state.get("current_code", "")
        return f"""
        Based on the code analysis of:

        ```
{% endraw %}
python
        {current_code}
{% raw %}

        ```

        And the analysis results:
        {analysis_result}

        Please suggest specific improvements for:
        1. Reducing complexity where identified
        2. Fixing style issues
        3. Improving code organization
        4. Optimizing import usage
        5. Enhancing readability
        6. Enhancing explicitness
        """
ログイン後にコピー
ログイン後にコピー

この方法:

  • @think を使用して、これが推論ステップであることを示します
  • 分析結果を入力として受け取ります
  • コンテキストから元のコードを取得します
  • 改善提案のための構造化されたプロンプトを作成します

コマンドラインインターフェイス

それでは、使いやすいインターフェースを作成してみましょう。これをいくつかの部分に分けて説明します。

def main():
    # 1. Set up logging
    logger = logging.getLogger(__name__)

    # 2. Configure Ollama server
    config = OllamaServerConfig(
        host="127.0.0.1",  # Local machine
        port=11434,        # Default Ollama port
        gpu_layers=35,     # Adjust based on your GPU
        cpu_threads=8,     # Adjust based on your CPU
    )
ログイン後にコピー
ログイン後にコピー

この最初の部分では、エラー ログを設定し、適切なデフォルトで Ollama サーバーを構成し、GPU と CPU の使用量をカスタマイズできるようにします。

次に、AI クライアントとアシスタントを作成します。

    # Use context manager for Ollama server
    with OllamaManager(config) as manager:
        # Initialize ClientAI with Ollama
        client = ClientAI(
            "ollama", 
            host=f"http://{config.host}:{config.port}"
        )

        # Create code review assistant with tools
        assistant = CodeReviewAssistant(
            client=client,
            default_model="llama3",
            tools=create_review_tools(),
            tool_confidence=0.8,  # How confident the AI should be before using tools
            max_tools_per_step=2, # Maximum tools to use per step
        )
ログイン後にコピー

この設定に関する重要なポイント:

  • コンテキスト マネージャー (を使用) により、サーバーの適切なクリーンアップが保証されます
  • ローカルの Ollama インスタンスに接続します
  • アシスタントは次のように構成されています。
    • 当社のカスタムツール
    • ツールの使用に関する信頼度のしきい値
    • 過剰使用を防ぐため、ステップごとのツールの制限

最後に、インタラクティブなループを作成します。

def create_review_tools() -> List[ToolConfig]:
    """Create the tool configurations for code review."""
    return [
        ToolConfig(
            tool=analyze_python_code,
            name="code_analyzer",
            description=(
                "Analyze Python code structure and complexity. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["observe"],
        ),
        ToolConfig(
            tool=check_style_issues,
            name="style_checker",
            description=(
                "Check Python code style issues. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["observe"],
        ),
        ToolConfig(
            tool=generate_docstring,
            name="docstring_generator",
            description=(
                "Generate docstring suggestions for Python code. "
                "Expects a 'code' parameter with the Python code as a string."
            ),
            scopes=["act"],
        ),
    ]
ログイン後にコピー
ログイン後にコピー

このインターフェース:

  • 「###」が表示されるまで複数行のコード入力を収集します
  • ストリーミング出力と非ストリーミング出力の両方を処理します
  • クリーンなエラー処理を提供します
  • 「quit」で簡単に終了できます

そして、これを実行できるスクリプトにしましょう:

class CodeReviewAssistant(Agent):
    """An agent that performs comprehensive Python code review."""

    @observe(
        name="analyze_structure",
        description="Analyze code structure and style",
        stream=True,
    )
    def analyze_structure(self, code: str) -> str:
        """Analyze the code structure, complexity, and style issues."""
        self.context.state["code_to_analyze"] = code
        return """
        Please analyze this Python code structure and style:

        The code to analyze has been provided in the context as 'code_to_analyze'.
        Use the code_analyzer and style_checker tools to evaluate:
        1. Code complexity and structure metrics
        2. Style compliance issues
        3. Function and class organization
        4. Import usage patterns
        """
ログイン後にコピー
ログイン後にコピー

アシスタントの使用

アシスタントが実際のコードをどのように処理するかを見てみましょう。実行しましょう:

    @think(
        name="suggest_improvements",
        description="Suggest code improvements based on analysis",
        stream=True,
    )
    def suggest_improvements(self, analysis_result: str) -> str:
        """Generate improvement suggestions based on the analysis results."""
        current_code = self.context.state.get("current_code", "")
        return f"""
        Based on the code analysis of:

        ```
{% endraw %}
python
        {current_code}
{% raw %}

        ```

        And the analysis results:
        {analysis_result}

        Please suggest specific improvements for:
        1. Reducing complexity where identified
        2. Fixing style issues
        3. Improving code organization
        4. Optimizing import usage
        5. Enhancing readability
        6. Enhancing explicitness
        """
ログイン後にコピー
ログイン後にコピー

見つける必要がある問題の例を次に示します:

def main():
    # 1. Set up logging
    logger = logging.getLogger(__name__)

    # 2. Configure Ollama server
    config = OllamaServerConfig(
        host="127.0.0.1",  # Local machine
        port=11434,        # Default Ollama port
        gpu_layers=35,     # Adjust based on your GPU
        cpu_threads=8,     # Adjust based on your CPU
    )
ログイン後にコピー
ログイン後にコピー

アシスタントは複数の側面を分析します:

  • 構造上の問題 (複雑さを増すネストされた if ステートメント、型ヒントの欠落、入力検証なし)
  • スタイルの問題 (一貫性のない変数名、カンマの後のスペースの欠落、docstring の欠落)

拡張のアイデア

アシスタントを強化する方法は次のとおりです:

  • 追加の分析ツール
  • 強化されたスタイルチェック
  • ドキュメントの改善
  • 自動修正機能

これらのそれぞれを追加するには、新しいツール関数を作成し、それを適切な JSON 形式でラップし、それを create_review_tools() 関数に追加して、新しいツールを使用するようにアシスタントのプロンプトを更新します。

ClientAI について詳しくは、ドキュメントをご覧ください。

私とつながってください

ご質問がある場合、テクノロジー関連のトピックについて話し合いたい場合、またはフィードバックを共有したい場合は、ソーシャル メディアでお気軽にご連絡ください:

  • GitHub: igorbenav
  • X/Twitter: @igorbenav
  • LinkedIn: イゴール

以上がClientAI と Ollama を使用したローカル AI コード レビューアーの構築 - パート 2の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート