Rumah > Peranti teknologi > AI > Membina Explorer CodeBase dengan Google ' s Gemini-2.0

Membina Explorer CodeBase dengan Google ' s Gemini-2.0

William Shakespeare
Lepaskan: 2025-03-08 11:30:15
asal
884 orang telah melayarinya

Pernahkah anda mendapati sukar untuk memahami asas kod yang besar dan berantakan? Atau tertanya -tanya bagaimana alat yang menganalisis dan meneroka kod sebenarnya berfungsi? Dalam artikel ini, kami akan menyelesaikan masalah ini dengan membina alat penerokaan codebase yang kuat dari awal. Menggunakan analisis kod statik dan model Gemini, kami akan membuat sistem yang mudah digunakan yang membantu pemaju pertanyaan, memahami, dan mendapatkan pandangan berguna dari kod mereka. Bersedia untuk menukar cara anda menavigasi kod? Mari kita mulakan!

Objektif Pembelajaran

  • Pembangunan perisian kompleks menggunakan pengaturcaraan berorientasikan objek.
  • bagaimana menghuraikan dan menganalisis asas kod python menggunakan AST atau pokok sintaks abstrak.
  • Memahami Cara Mengintegrasikan API Gemini LLM Google dengan aplikasi Python Analisis Kod.
  • sistem pertanyaan berasaskan baris perintah untuk penerokaan codebase.
Artikel ini diterbitkan sebagai sebahagian daripada Blogathon Sains Data

Jadual Kandungan Keperluan untuk Eksplorasi Kod Smarter

Gambaran keseluruhan seni bina

Pelaksanaan (CLI)

    Uji Aplikasi
  • Pembangunan Masa Depan
  • Kesimpulan
  • Soalan Lazim
  • Keperluan untuk Eksplorasi Kod Smarter
  • Pertama sekali, membina aplikasi sedemikian memberi anda peningkatan pembelajaran dalam pembangunan perisian, ia akan membantu anda mempelajari cara melaksanakan perisian kompleks menggunakan paradigma pengaturcaraan berorientasikan objek dan juga membantu anda menguasai seni mengendalikan projek besar (walaupun tidak begitu besar)
  • Kedua, projek perisian hari ini terdiri daripada beribu -ribu baris kod yang ditulis di banyak fail dan folder. Pendekatan tradisional untuk penerokaan kod, seperti fungsi carian GREP atau IDE. Sistem jenis ini akan jatuh pendek apabila pemaju perlu memahami konsep atau hubungan peringkat tinggi dalam asas kod. Alat berkuasa AI kami boleh membuat langkah yang ketara dalam alam ini. Permohonan kami membolehkan pemaju bertanya soalan mengenai asas mereka dalam bahasa Inggeris biasa dan menerima respons terperinci, kontekstual.
  • Gambaran keseluruhan seni bina
  • alat ini terdiri daripada empat komponen utama
    • Parser kod: Ia adalah asas sistem kami, yang bertanggungjawab untuk menganalisis fail python dan mengekstrak struktur mereka menggunakan modul Sintaks Sintaks Python (AST). Ia mengenal pasti kelas, kaedah, fungsi, dan import. Ia akan mewujudkan peta komprehensif dari codebase.
    • Gemini Client: Pembungkus di sekitar API Gemini Google yang mengendalikan komunikasi dengan model LLM. Komponen ini menguruskan pengesahan API dan menyediakan antara muka yang bersih untuk menghantar pertanyaan dan menerima respons.
    • pemproses pertanyaan: Ia adalah enjin utama alat yang bertanggungjawab untuk memformat konteks dan pertanyaan codebase dengan cara Gemini dapat memahami dan memproses dengan berkesan. Ia mengekalkan indeks berterusan struktur codebase dan menguruskan interaksi antara parser dan llm.
    • antara muka CLI: antara muka baris perintah yang mesra pengguna yang dibina dengan TYPER, menyediakan arahan untuk pengindeksan kod, struktur kod, dan menganalisis jejak timbunan.

    Memulakan Projek Hands-On

    Bahagian ini akan membimbing anda melalui langkah -langkah awal untuk membina dan melaksanakan projek anda, memastikan pengalaman pembelajaran permulaan dan berkesan yang lancar.

    Struktur Folder Projek

    Struktur folder projek akan sama dengan

    ini
    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Persekitaran Projek Persediaan

    Persekitaran Projek Persediaan Dalam langkah berikut:

    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Pasang semua perpustakaan yang diperlukan:

    pip install google-generativeai google-ai-generativelanguage
    pip install python-dotenv typer llama-index
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Melaksanakan kod

    kita akan bermula dengan memahami dan melaksanakan sistem parsing codebase. Ia mempunyai dua fungsi penting

    • parse_codebase ()
    • extract_definitions ()

    Mengekstrak definisi dari pokok sintaks abstrak:

    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
    Salin selepas log masuk
    Salin selepas log masuk

    Ini adalah fungsi penolong untuk parse_codebase (). Ia akan mengambil pokok sintaks abstrak (AST) dari fail python. Fungsi ini memulakan kamus dengan senarai kosong untuk kelas, fungsi, dan import. Sekarang, ast.walk () melangkah melalui semua nod di pokok AST. Modul AST akan mengenal pasti semua kelas, fungsi, import, dan nombor garis. Kemudian masukkan semua definisi ke kamus definisi.

    parsing codebase

    Fungsi ini mengimbas direktori untuk fail python, membaca kandungan mereka, dan mengekstrak struktur mereka.

    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
    Salin selepas log masuk
    Salin selepas log masuk

    Fungsi memulakan dengan laluan direktori sebagai rentetan. Ia mengeluarkan kamus struktur kod. Kamus menyimpan data yang diekstrak untuk setiap fail python.

    Ia melepasi semua subdirektori dan fail dalam direktori yang diberikan. os.walk () menyediakan cara rekursif untuk meneroka seluruh pokok direktori. Ia akan memproses fail yang mengakhiri sambungan .py.

    menggunakan modul Python Ast untuk menghuraikan kandungan fail ke dalam pokok sintaks abstrak (AST), yang mewakili struktur fail. Pokok yang diekstrak kemudian diluluskan ke extract_definitions (pokok) . Jika parsing gagal, ia mencetak mesej ralat tetapi terus memproses fail lain.

    enjin pemprosesan pertanyaan

    dalam direktori enjin pertanyaan buat dua fail bernama Gemini_Client.PY dan query_processor.py

    Gemini Client

    Fail ini akan menggunakan & lt; Google_API_KEY & gt; untuk mengesahkan API Model Gemini dari Google. Dalam akar projek, buat fail .env dan letakkan kunci API Gemini anda di dalamnya. Dapatkan API_Keyhere anda.

    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    di sini, kami menentukan kelas Geminiclient untuk berinteraksi dengan model Gemini AI Google. Ia akan mengesahkan model menggunakan Google_API_KEY dari fail .env anda. Selepas mengkonfigurasi API Model, ia menyediakan kaedah pertanyaan untuk menghasilkan respons pada prompt yang diberikan.

    sistem pengendalian pertanyaan

    Di bahagian ini, kami akan melaksanakan kelas QueryProcessor untuk menguruskan konteks codebase dan membolehkan pertanyaan dengan Gemini.

    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    selepas memuatkan perpustakaan yang diperlukan, load_dotenv () memuatkan pembolehubah persekitaran dari. Kelas Geminiembedding memulakan model embedding-001 dari pelayan Google. Kelas QueryProcessor direka untuk mengendalikan konteks codebase dan berinteraksi dengan geminiclient.loading_contextmethod memuatkan maklumat codebase dari fail JSON yang ada. Thesaving_contextMethod menyimpan konteks codebase semasa ke dalam fail json untuk ketekunan. Meminta Geminiis Kaedah yang paling penting yang akan membina prompt menggunakan konteks codebase dan pertanyaan pengguna. Ia menghantar petunjuk ini kepada model Gemini melalui Geminiclient dan mendapat sambutan semula.

    • pelaksanaan aplikasi baris arahan (CLI)
    • Buat fail main.py dalam folder src projek dan ikuti langkah
    • Langkah 1: Perpustakaan Import
    • Langkah 2: Inisialisasi Typer dan Processor Query

    mari kita buat

    typer

    dan objek pemproses pertanyaan dari kelas.

    Langkah 3: Mengindeks Direktori Projek Python
    pip install google-generativeai google-ai-generativelanguage
    pip install python-dotenv typer llama-index
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    di sini, kaedah

    indeks

    akan digunakan sebagai arahan di terminal, dan fungsi akan mengindeks codebase python dalam direktori yang ditentukan untuk pertanyaan dan analisis masa depan.

    |--codebase_explorer/
    |src/
    ├──| __init__.py
    ├──| indexer/
    │   ├── __init__.py
    │   └── code_parser.py
    ├──| query_engine/
    │   ├── __init__.py
    │   ├── query_processor.py
    │   └── gemini_client.py
    |
    ├── main.py
    └── .env
    
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Ia akan mula -mula memeriksa sama ada direktori dan kemudian gunakan fungsi parse_codebase untuk mengekstrak struktur fail python dalam direktori.

    selepas parsing ia akan menyelamatkan struktur codebase parsed dalam query_processor . Semua proses dalam percubaan dan kecuali blok supaya pengecualian dapat ditangani dengan berhati -hati semasa parsing. Ia akan menyediakan asas kod untuk pertanyaan yang cekap menggunakan model Gemini.

    Langkah 4: Menanyakan codebase

    selepas pengindeksan kita dapat menanyakan asas kod untuk memahami atau mendapatkan maklumat mengenai sebarang fungsi dalam pangkalan kod.

    #create a new conda env
    conda create -n cb_explorer python=3.11
    conda activate cb_explorer
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Pertama, periksa sama ada query_processor telah memuatkan konteks codebase atau tidak dan cuba memuatkan konteks dari cakera keras komputer. dan kemudian menggunakan kaedah pertanyaan query_processor untuk memproses pertanyaan.

    dan yang terakhir, ia akan mencetak respons dari LLM ke terminal menggunakan typer.echo () kaedah.

    Langkah 5: Jalankan aplikasi

    pip install google-generativeai google-ai-generativelanguage
    pip install python-dotenv typer llama-index
    Salin selepas log masuk
    Salin selepas log masuk
    Salin selepas log masuk

    Uji aplikasi

    untuk menguji kerja keras anda ikuti langkah -langkah di bawah:

    • Buat indeks nama folder di akar projek anda di mana kami akan meletakkan semua fail indeks kami.
    • Buat codebase_index.json dan letakkan di folder yang dibuat sebelumnya (indeks).
    • kemudian buat folder project_test di akar di mana kami akan menyimpan fail python kami untuk ujian
    • Buat fail find_palidrome.py dalam folder project_test dan letakkan kod di bawah dalam fail.

    Pelaksanaan kod

    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
    Salin selepas log masuk
    Salin selepas log masuk

    Fail ini akan menemui palindrome dari rentetan yang diberikan. Kami akan mengindeks pertanyaan fail ini dari terminal menggunakan aplikasi CLI.

    Sekarang, buka terminal anda, tampal kod dan lihat sihir.

    Mengindeks Projek

    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
    Salin selepas log masuk
    Salin selepas log masuk

    output:

    Membina Explorer CodeBase dengan Google ' s Gemini-2.0

    Anda boleh menunjukkan dengan berjaya mengindeks 1 fail python. Dan data JSON kelihatan seperti

    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
    Salin selepas log masuk

    menanyakan projek

    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)
    Salin selepas log masuk
    output:

    Membina Explorer CodeBase dengan Google ' s Gemini-2.0

    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
    Salin selepas log masuk
    output:

    Jika semuanya dilakukan dengan betul, anda akan mendapat output ini di terminal anda. Anda boleh mencubanya dengan fail kod python anda dan beritahu saya di bahagian komen apakah output anda. Terima kasih kerana tinggal bersama saya. Membina Explorer CodeBase dengan Google ' s Gemini-2.0

    Pembangunan Masa Depan

    Ini adalah prototaip sistem asas yang boleh diperluaskan dengan banyak ciri menarik, seperti

    • anda boleh mengintegrasikan dengan plugin IDE untuk penerokaan kod lancar.
    • sistem debugging automatik AI-didorong (saya sedang berusaha).
    • Menambah sokongan untuk banyak bahasa popular seperti JavaScript, Java, Typescripts, Rust.
    • analisis kod masa nyata dan cadangan LLM berkuasa untuk penambahbaikan.
    • Dokumentasi automatik menggunakan Gemini atau Llama3.
    • Integrasi LLM tempatan untuk penerokaan kod di peranti, ciri tambahan.

    Kesimpulan

    CodeBase Explorer membantu anda memahami aplikasi praktikal AI dalam alat pembangunan perisian. Dengan menggabungkan analisis statik tradisional dengan keupayaan AI moden, kami telah mencipta alat yang menjadikan eksplorasi codebase lebih intuitif dan cekap. Pendekatan ini menunjukkan bagaimana AI boleh menambah aliran kerja pemaju tanpa menggantikan alat yang sedia ada, menyediakan lapisan pemahaman dan akses yang baru kepada kod kompleks.

    Semua kod yang digunakan dalam artikel ini ada di sini.

    Takeaways Key

    • Parsing Kod Struktur adalah teknik yang paling imortant untuk analisis kod.
    • CodeBase Explorer memudahkan navigasi kod, yang membolehkan pemaju memahami dan menguruskan struktur kod kompleks dengan cepat.
    • CodeBase Explorer meningkatkan kecekapan debug, menawarkan alat untuk menganalisis kebergantungan dan mengenal pasti isu lebih cepat.
    • Gemini dapat meningkatkan pemahaman kod dengan ketara apabila digabungkan dengan analisis statik tradisional.
    • alat CLI dapat menyediakan antara muka yang kuat untuk penerokaan kod dibantu LLM.

    Soalan Lazim

    q 1. Bagaimanakah alat mengendalikan asas besar? a. Alat ini menggunakan sistem pengindeksan yang berterusan yang menghidupkan dan menyimpan struktur codebase, yang membolehkan pertanyaan yang cekap tanpa Nedding untuk menghidupkan semula kod setiap kali. Indeks dikemas kini hanya apabila perubahan kod. Bolehkah alat berfungsi di luar talian?

    a. Pengurusan kod dan pengurusan indeks boleh berfungsi di luar talian, tetapi pertanyaan kod kod menggunakan API Gemini memerlukan sambungan Internet untuk berkomunikasi dengan pelayan luaran. Kami boleh mengintegrasikan Ollama dengan alat yang mungkin akan menggunakan model LLM atau SLM pada peranti seperti Llama3 atau PHI-3 untuk menanyakan asas kod. Betapa tepatnya respons yang dihasilkan oleh LLM? a. Ketepatan bergantung kepada kualiti konteks kod parsed dan keupayaan model Gemini. Alat ini menyediakan maklumat kod berstruktur kepada model AI, dengan membantu meningkatkan ketepatan tindak balas, tetapi pengguna masih harus mengesahkan maklumat kritikal melalui cara tradisional.

    Media yang ditunjukkan dalam artikel ini tidak dimiliki oleh Analytics Vidhya dan digunakan pada budi bicara penulis.

Atas ialah kandungan terperinci Membina Explorer CodeBase dengan Google ' s Gemini-2.0. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan