ホームページ > テクノロジー周辺機器 > AI > Google'のGemini-2.0を使用してコードベースエクスプローラーを構築します

Google'のGemini-2.0を使用してコードベースエクスプローラーを構築します

William Shakespeare
リリース: 2025-03-08 11:30:15
オリジナル
889 人が閲覧しました

大きくて乱雑なコードベースを理解するのが難しいと感じたことがありますか?または、コードを分析して探索するツールが実際にどのように機能するか疑問に思いましたか?この記事では、強力なコードベース探索ツールをゼロから構築することにより、これらの問題を解決します。静的コード分析とGeminiモデルを使用して、開発者がコードから有用な洞察をクエリ、理解、および獲得するのに役立つ使いやすいシステムを作成します。コードのナビゲート方法を変更する準備はできましたか?始めましょう!

学習目標

    オブジェクト指向プログラミングを使用した複雑なソフトウェア開発。
  • ASTまたは抽象的な構文ツリーを使用してPythonコードベースを解析して分析する方法。
  • GoogleのGemini LLM APIをコード分析のPythonアプリケーションと統合する方法の理解。 コードベース探索用のTyperコマンドラインベースのクエリシステム。
  • この記事は、

データサイエンスブログの一部として公開されました。 目次 よりスマートなコード探索の必要性

アーキテクチャの概要

    ハンズオンプロジェクトの起動
  • プロジェクト環境のセットアップ
  • 実装(CLI)
  • アプリケーションをテストします
  • 将来の開発
  • 結論
  • よくある質問
  • スマートコード探索の必要性
  • そのようなアプリケーションを構築することで、ソフトウェア開発の学習が得られます。オブジェクト指向のプログラミングパラダイムを使用して複雑なソフトウェアを実装する方法を学び、大規模なプロジェクトを処理する技術を習得するのに役立ちます(それはそれほど大きくはありませんが)
  • >
  • 第二に、今日のソフトウェアプロジェクトは、多くのファイルとフォルダーに記載されている数千行のコードで構成されています。 GREPやIDE検索機能など、コード探索への従来のアプローチ。開発者がコードベース内のより高いレベルの概念または関係を理解する必要がある場合、このタイプのシステムは不十分です。私たちのAIを搭載したツールは、この領域に大きな進歩を遂げることができます。当社のアプリケーションにより、開発者はコードベースについて簡単に英語で質問し、詳細なコンテキスト応答を受け取ることができます。
  • アーキテクチャの概要
  • このツールは、4つの主要なコンポーネント
  • で構成されています
    • コードパーサー:これはシステムの基礎であり、Pythonファイルを分析し、Pythonの抽象的構文ツリー(AST)モジュールを使用して構造を抽出する責任があります。クラス、方法、関数、およびインポートを識別します。コードベースの包括的なマップが作成されます。
    • geminiクライアント:LLMモデルとの通信を処理するGoogleのGemini API周辺のラッパー。これらのコンポーネントはAPI認証を管理し、クエリを送信して応答を受信するためのクリーンなインターフェイスを提供します。
    • クエリプロセッサ:これは、ジェミニが効果的に理解し処理できる方法でコードベースのコンテキストとクエリのフォーマットを担当するツールのメインエンジンです。コードベース構造の永続的なインデックスを維持し、パーサーとLLMの間の相互作用を管理します。
    • CLIインターフェイス:
    • Typerで構築されたユーザーフレンドリーなコマンドラインインターフェイス、コードベースのインデックス作成、コード構造のクエリ、およびスタックトレースの分析のコマンドを提供します。 ハンズオンプロジェクトを開始
    このセクションでは、プロジェクトを構築および実装するための最初の手順をガイドし、スムーズなスタートと効果的な学習体験を確保します。

    プロジェクトフォルダー構造

    プロジェクトフォルダーの構造は、これらの

    に似ています

    プロジェクト環境のセットアップ

    次のステップでプロジェクト環境をセットアップします:

    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    必要なすべてのライブラリをインストールします:

    コードの実装
    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    コードベース解析システムの理解と実装から始めます。 2つの重要な関数

    があります
    pip install google-generativeai google-ai-generativelanguage
    pip install python-dotenv typer llama-index
    ログイン後にコピー
    ログイン後にコピー

    parse_codebase()

    extract_definitions()

    • 抽象的構文ツリーから定義を抽出します:
    • これは、parse_codebase()のヘルパー関数です。 Pythonファイルの抽象的な構文ツリー(AST)が必要です。この関数は、クラス、関数、およびインポートの空のリストを備えた辞書を開始します。ここで、AST.Walk()は、ASTツリーのすべてのノードを繰り返します。 ASTモジュールは、すべてのクラス、機能、インポート、およびライン番号を識別します。次に、定義辞書にすべての定義を追加します コードベースの解析

    この関数は、Pythonファイルのディレクトリをスキャンし、コンテンツを読み取り、構造を抽出します。

    import ast
    import os
    from typing import Dict, Any
    
    def extract_definitions(tree: ast.AST) -> Dict[str, list]:
        """Extract class and function definitions from AST."""
        definitions = {
            "classes": [],
            "functions": [],
            "imports": []
        }
        
        for node in ast.walk(tree):
            if isinstance(node, ast.ClassDef):
                definitions["classes"].append({
                    "name": node.name,
                    "lineno": node.lineno
                })
            elif isinstance(node, ast.FunctionDef):
                definitions["functions"].append({
                    "name": node.name,
                    "lineno": node.lineno
                })
            elif isinstance(node, ast.Import):
                for name in node.names:
                    definitions["imports"].append(name.name)
        return definitions
    ログイン後にコピー
    ログイン後にコピー
    関数は、ディレクトリパスを文字列として開始します。コードの構造の辞書を出力します。辞書は、各Pythonファイルの抽出されたデータを保存します。

    指定されたディレクトリ内のすべてのサブディレクトリとファイルをループします。

    os.walk()

    は、ディレクトリツリー全体を探索するための再帰的な方法を提供しました。 .py拡張子を終了するファイルを処理します python

    astモジュールを使用して、ファイルのコンテンツを抽象的構文ツリー(AST)に解析します。これは、ファイルの構造を表します。抽出されたツリーは、extract_definitions(tree)に渡されます。解析が失敗した場合、エラーメッセージを印刷しますが、他のファイルの処理を継続します。 クエリ処理エンジン

    クエリエンジンディレクトリでgemini_client.py and query_processor.pyという名前の2つのファイルを作成します

    gemini client

    このファイルは、

    < google_api_key>

    を使用して、GoogleからGemini Model APIを認証します。プロジェクトのルートで、.ENVファイルを作成し、Gemini APIキーを入れます。 api_keyhereを入手してください。

    ここでは、GoogleのGemini AIモデルと対話するために、a geminiclient

    クラスを定義します。 .envファイルから
    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー
    google_api_key

    を使用してモデルを認証します。モデルAPIを構成した後、特定のプロンプトで応答を生成するクエリメソッドを提供します。 クエリ処理システム このセクションでは、QueryProcessorクラスを実装してコードベースコンテキストを管理し、Geminiでクエリを有効にします。 必要なライブラリを読み込んだ後、load_dotenv

    ()

    google_api_key

    for

    gemini api

    key。
    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    geminiembeddingクラスは、Googleサーバーから埋め込み001モデルを初期化します。 QueryProcessorクラスは、コードベースコンテキストを処理し、GeminicLient.Loading_ContextMethodロードJSONファイルからコードベース情報をロードするように設計されています。 thesaving_contextmethod現在のコードベースコンテキストをjsonファイルに保存してpersistence.save_contextmethodはコードベースコンテキストを更新し、すぐにusingsave_contextとtheformat_contextmethodを保存します。 コマンドラインアプリ実装(CLI) プロジェクトのsrcフォルダーにmain.pyファイルを作成し、手順に従ってください ステップ1:ライブラリをインポート

    • ステップ2:Typerとクエリプロセッサを初期化
    • クラスから
    • typer
    • とクエリプロセッサオブジェクトを作成しましょう。
    • ステップ3:Python Project Directoryのインデックス作成
    ここでは、

    index

    メソッドは端末のコマンドとして使用され、関数は将来のクエリと分析のために指定されたディレクトリのpythonコードベースにインデックスを付けます。
    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー

    最初にディレクトリが存在するかどうかを確認し、次にparse_codebase関数を使用して、ディレクトリ内のpythonファイルの構造を抽出します。

    解析後、

    query_processorに解析されたコードベース構造が保存されます。すべてのプロセスは試行およびブロックを除いて、例外を解析中に注意して処理できるようにします。 Geminiモデルを使用して効率的なクエリのためにコードベースを準備します。 ステップ4:コードベースのクエリ

    インデックス作成後、コードベースの情報を理解または取得するためにコードベースを照会できます。

    最初に、

    query_processor
    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    ログイン後にコピー
    ログイン後にコピー
    ログイン後にコピー
    がコードベースコンテキストを読み込んだかどうかを確認し、コンピューターのハードディスクからコンテキストをロードしてみてください。次に、

    query_processorのqueryメソッドを使用して、クエリを処理します。 そして最後に、LLMから端子への応答を typer.echo()メソッドを使用して印刷します。

    ステップ5:アプリケーションを実行

    アプリケーションをテスト

    テストするには、以下の手順に従ってください:

    pip install google-generativeai google-ai-generativelanguage
    pip install python-dotenv typer llama-index
    ログイン後にコピー
    ログイン後にコピー

    プロジェクトルートにフォルダー名インデックスを作成し、すべてのインデックスファイルを配置します。

    codebase_index.jsonを作成し、以前に作成されたフォルダー(インデックス)に入れます。

    次に、テスト用のPythonファイルを保存するルートにproject_testフォルダーを作成します

      project_testフォルダーにfind_palidrome.pyファイルを作成し、以下のコードをファイルに配置します。
    • コード実装
    • このファイルは、特定の文字列からパリンドロームを見つけます。 CLIアプリケーションを使用して、端末からこのファイルクエリをインデックス化します。
    • さあ、ターミナルを開き、コードを貼り付けて魔法を見てください。
    プロジェクトのインデックス付け

    import ast
    import os
    from typing import Dict, Any
    
    def extract_definitions(tree: ast.AST) -> Dict[str, list]:
        """Extract class and function definitions from AST."""
        definitions = {
            "classes": [],
            "functions": [],
            "imports": []
        }
        
        for node in ast.walk(tree):
            if isinstance(node, ast.ClassDef):
                definitions["classes"].append({
                    "name": node.name,
                    "lineno": node.lineno
                })
            elif isinstance(node, ast.FunctionDef):
                definitions["functions"].append({
                    "name": node.name,
                    "lineno": node.lineno
                })
            elif isinstance(node, ast.Import):
                for name in node.names:
                    definitions["imports"].append(name.name)
        return definitions
    ログイン後にコピー
    ログイン後にコピー

    output:

    1つのPythonファイルに正常にインデックスを表示することができます。そして、JSONデータは
    import ast
    import os
    from typing import Dict, Any
    
    def parse_codebase(directory: str) -> Dict[str, Any]:
        """Parse Python files in the directory and extract code structure."""
        code_structure = {}
        for root, _, files in os.walk(directory):
            for file in files:
                if file.endswith(".py"):
                    file_path = os.path.join(root, file)
                    with open(file_path, "r", encoding="utf-8") as f:
                        try:
                            content = f.read()
                            tree = ast.parse(content)
                            code_structure[file_path] = {
                                "definitions": extract_definitions(tree),
                                "content": content
                            }
                        except Exception as e:
                            print(f"Error parsing {file_path}: {e}")
        return code_structure
    ログイン後にコピー
    のように見えます

    プロジェクトのクエリ

    Google'のGemini-2.0を使用してコードベースエクスプローラーを構築します

    output:

    import os
    from typing import Optional
    from google import generativeai as genai
    from dotenv import load_dotenv
    
    load_dotenv()
    
    
    class GeminiClient:
        def __init__(self):
            self.api_key = os.getenv("GOOGLE_API_KEY")
            if not self.api_key:
                raise ValueError("GOOGLE_API_KEY environment variable is not set")
    
            genai.configure(api_key=self.api_key)
            self.model = genai.GenerativeModel("gemini-1.5-flash")
    
        def query(self, prompt: str) -> Optional[str]:
            """Query Gemini with the given prompt."""
            try:
                response = self.model.generate_content(prompt)
                return response.text
            except Exception as e:
                print(f"Error querying Gemini: {e}")
                return None
    ログイン後にコピー

    output:
    import os
    import json
    from llama_index.embeddings.gemini import GeminiEmbedding
    
    
    from dotenv import load_dotenv
    from typing import Dict, Any, Optional
    from .gemini_client import GeminiClient
    
    load_dotenv()
    
    gemini_api_key = os.getenv("GOOGLE_API_KEY")
    model_name = "models/embeddings-001"
    embed_model = GeminiEmbedding(model_name=model_name, api_key=gemini_api_key)
    
    
    class QueryProcessor:
        def __init__(self):
            self.gemini_client = GeminiClient()
            self.codebase_context: Optional[Dict[str, Any]] = None
            self.index_file = "./indexes/codebase_index.json"
    
        def load_context(self):
            """Load the codebase context from disk if it exists."""
            if os.path.exists(self.index_file):
                try:
                    with open(self.index_file, "r", encoding="utf-8") as f:
                        self.codebase_context = json.load(f)
                except Exception as e:
                    print(f"Error loading index: {e}")
                    self.codebase_context = None
    
        def save_context(self):
            """Save the codebase context to disk."""
            if self.codebase_context:
                try:
                    with open(self.index_file, "w", encoding="utf-8") as f:
                        json.dump(self.codebase_context, f, indent=2)
                except Exception as e:
                    print(f"Error saving index: {e}")
    
        def set_context(self, context: Dict[str, Any]):
            """Set the codebase context for queries."""
            self.codebase_context = context
            self.save_context()
    
        def format_context(self) -> str:
            """Format the codebase context for Gemini."""
            if not self.codebase_context:
                return ""
    
            context_parts = []
            for file_path, details in self.codebase_context.items():
                defs = details["definitions"]
                context_parts.append(
                    f"File: {file_path}\n"
                    f"Classes: {[c['name'] for c in defs['classes']]}\n"
                    f"Functions: {[f['name'] for f in defs['functions']]}\n"
                    f"Imports: {defs['imports']}\n"
                )
            return "\n\n".join(context_parts)
    
        def query(self, query: str) -> Optional[str]:
            """Process a query about the codebase."""
            if not self.codebase_context:
                return (
                    "Error: No codebase context available. Please index the codebase first."
                )
    
            prompt = f"""
            Given the following codebase structure:
            {self.format_context()}
            
            Query: {query}
            
            Please provide a detailed and accurate answer based on the codebase structure above.
            """
            return self.gemini_client.query(prompt)
    ログイン後にコピー

    Google'のGemini-2.0を使用してコードベースエクスプローラーを構築します

    すべてが適切に行われた場合、端末にこれらの出力を取得します。 Pythonコードファイルで試してみて、コメントセクションで出力は何ですか。私と一緒にいてくれてありがとう。
    import os
    import json
    import typer
    from pathlib import Path
    from typing import Optional
    from indexer.code_parser import parse_codebase
    from query_engine.query_processor import QueryProcessor
    ログイン後にコピー

    将来の開発 これは、

    などの多くの興味深い機能で拡張できるファンデーションシステムのプロトタイプです。
    • シームレスなコード探索のためにIDEプラグインと統合できます。
    • AI駆動型の自動デバッグシステム(私はそれに取り組んでいます)
    • JavaScript、Java、TypeScripts、Rustなど、多くの人気言語のサポートを追加。
    • リアルタイムコード分析とLLMパワー付き提案の改善のための提案。
    • Geminiまたはllama3を使用した自動ドキュメント
    • オンデバイスコード探索のためのローカルLLM統合、機能の追加。
    • 結論
    • コードベースエクスプローラーは、ソフトウェア開発ツールでのAIの実用的なアプリケーションを理解するのに役立ちます。従来の静的分析と最新のAI機能を組み合わせることにより、コードベースの探索をより直感的で効率的にするツールを作成しました。このアプローチは、AIが既存のツールを置き換えることなく開発者ワークフローを補強する方法を示しており、複雑なコードベースの理解とアクセシビリティの新しいレイヤーを提供します。 この記事で使用されているすべてのコードは、
    • です
    • キーテイクアウト

    構造コード解析は、コード分析の最も不均衡な手法です。

    CodeBase Explorerはコードナビゲーションを簡素化し、開発者が複雑なコード構造を迅速に理解および管理できるようにします。

    コードベースエクスプローラーはデバッグ効率を高め、依存関係を分析し、問題をより速く特定するためのツールを提供します。

    geminiは、従来の静的分析と組み合わせると、コードの理解を大幅に向上させることができます。

    CLIツールは、LLMアシストコード探査に強力なインターフェイスを提供できます。

      よくある質問
    • q
    • 1。ツールは大きなコードベースをどのように処理しますか?このツールは、コードベース構造を解析および保存する永続的なインデックスシステムを使用して、毎回コードを再分析することなく効率的なクエリを可能にします。インデックスは、コードベースが変更された場合にのみ更新されます。ツールはオフラインで動作できますか?コードの解析とインデックス管理はオフラインで動作する可能性がありますが、Gemini APIを使用してコードベースをクエリするには、外部サーバーと通信するためにインターネット接続が必要です。 Ollamaを、コードベースを照会するために、LLAMA3やPHI-3などのオンデバイスLLMまたはSLMモデルを使用できるツールと統合できます。 LLM生成応答はどれくらい正確ですか?精度は、解析されたコードコンテキストの品質とGeminiモデルの機能の両方に依存します。このツールは、AIモデルに構造化されたコード情報を提供し、応答の精度を改善するのに役立ちますが、ユーザーは従来の手段を通じて重要な情報を検証する必要があります。
    • この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、著者の裁量で使用されています。

以上がGoogle'のGemini-2.0を使用してコードベースエクスプローラーを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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