首頁 >後端開發 >Python教學 >使用 ClientAI 和 Ollama 建立本地 AI 程式碼審查器 - 第 2 部分

使用 ClientAI 和 Ollama 建立本地 AI 程式碼審查器 - 第 2 部分

Susan Sarandon
Susan Sarandon原創
2024-12-28 02:22:08160瀏覽

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

在第 1 部分中,我們為程式碼審查器建立了核心分析工具。現在我們將創建一個可以有效使用這些工具的人工智慧助理。我們將逐步介紹每個組件,並解釋所有組件如何協同工作。

有關 ClientAI 的文檔,請參閱此處;有關 Github Repo,請參閱此處。

系列索引

  • 第 1 部分:簡介、設定、工具建立
  • 第 2 部分:建立助手和命令列介面(你在這裡)

使用 ClientAI 註冊我們的工具

首先,我們需要讓我們的工具可供人工智慧系統使用。以下是我們註冊它們的方法:

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. 每個工具都包裝在一個 ToolConfig 物件中,該物件告訴 ClientAI:

    • 工具:實際呼叫的函數
    • 名稱:工具的唯一識別碼
    • 描述:該工具的用途以及它需要哪些參數
    • 範圍:工具何時可以使用(「觀察」用於分析,「行動」用於產生)
  2. 我們將工具分為兩類:

    • 「觀察」工具(code_analyzer 和 style_checker)收集資訊
    • 「act」工具(docstring_generator)產生新內容

建構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
        )

此設定的要點:

  • 上下文管理器(with)確保正確的伺服器清理
  • 我們連線到本地 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"],
        ),
    ]

此介面:

  • 收集多行程式碼輸入,直到看到「###」
  • 處理流式與非流式輸出
  • 提供乾淨的錯誤處理
  • 允許透過「退出」輕鬆退出

讓我們將其設為我們能夠運行的腳本:

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 語句增加複雜度、缺少型別提示、無輸入驗證)
  • 樣式問題(變數命名不一致、逗號後缺少空格、缺少文件字串)

擴展想法

以下是一些增強助手的方法:

  • 其他分析工具
  • 增強的樣式檢查
  • 文件改進
  • 自動修復功能

透過建立新的工具函數,將其包裝為適當的 JSON 格式,將其新增至 create_review_tools() 函數,然後更新助理的提示以使用新工具,可以新增其中的每一個。

要了解有關 ClientAI 的更多信息,請訪問文件。

與我聯繫

如果您有任何疑問,想要討論科技相關主題或分享您的回饋,請隨時在社群媒體上與我聯繫:

  • GitHub:igorbenav
  • X/Twitter:@igorbenav
  • 領英:伊戈爾

以上是使用 ClientAI 和 Ollama 建立本地 AI 程式碼審查器 - 第 2 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn