> 백엔드 개발 > 파이썬 튜토리얼 > ClientAI 및 Ollama를 사용하여 로컬 AI 코드 검토자 구축 - 2부

ClientAI 및 Ollama를 사용하여 로컬 AI 코드 검토자 구축 - 2부

Susan Sarandon
풀어 주다: 2024-12-28 02:22:08
원래의
132명이 탐색했습니다.

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

1부에서는 코드 검토자를 위한 핵심 분석 도구를 구축했습니다. 이제 이러한 도구를 효과적으로 사용할 수 있는 AI 도우미를 만들어 보겠습니다. 각 구성요소를 단계별로 살펴보며 모든 것이 어떻게 함께 작동하는지 설명하겠습니다.

ClientAI 문서는 여기를, Github Repo는 여기를 참조하세요.

시리즈 색인

  • 1부: 소개, 설정, 도구 생성
  • 2부: Assistant 및 명령줄 인터페이스 구축(현재 위치)

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. 우리는 도구를 두 가지 범주로 분류합니다.

    • "관찰" 도구(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
        )
로그인 후 복사

이 설정의 핵심 사항:

  • 컨텍스트 관리자(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"],
        ),
    ]
로그인 후 복사
로그인 후 복사

이 인터페이스:

  • "###"이 보일 때까지 여러 줄의 코드 입력을 수집합니다
  • 스트리밍 및 비스트리밍 출력을 모두 처리
  • 깨끗한 오류 처리 제공
  • "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 문, 유형 힌트 누락, 입력 유효성 검사 없음)
  • 스타일 문제(일관되지 않은 변수 이름 지정, 쉼표 뒤 공백 누락, 문서 문자열 누락)

확장 아이디어

어시스턴트를 강화하는 몇 가지 방법은 다음과 같습니다.

  • 추가 분석 도구
  • 강화된 스타일 검사
  • 문서 개선
  • 자동 수정 기능

이들 각각은 새 도구 함수를 생성하고 이를 적절한 JSON 형식으로 래핑한 다음 create_review_tools() 함수에 추가한 다음 새 도구를 사용하도록 어시스턴트의 프롬프트를 업데이트하여 추가할 수 있습니다.

ClientAI에 대해 자세히 알아보려면 문서로 이동하세요.

나와 연결

질문이 있거나 기술 관련 주제에 대해 논의하고 싶거나 피드백을 공유하고 싶다면 언제든지 소셜 미디어를 통해 저에게 연락하세요.

  • GitHub: igorbenav
  • X/트위터: @igorbenav
  • 링크드인: Igor

위 내용은 ClientAI 및 Ollama를 사용하여 로컬 AI 코드 검토자 구축 - 2부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿