Как сделать поиск кодовой базы с помощью искусственного интеллекта (встраивание или нет)

Как сделать поиск кодовой базы с помощью искусственного интеллекта (встраивание или нет)

10 июля 2025 г.

Если вам когда -либо приходилось погрузиться в сложную кодовую базу и ощущались перегружены огромным объемом файлов, классов и конфигурации, вы не одиноки. Многие разработчики проводят бесчисленные часы, пытаясь понять кодовые базы, которые они не писали. Вот гдеАгент Q & A Codebase локальной кодовой базыПодойдет.

В этом посте мы рассмотрим:


  1. Какой агент Q & A Codebase
  2. Как построить один, используя встраивание
  3. Как заставить его работать, даже если встраивания недоступны


Что такое агент Q & A Codebase?

Агент Q & A Codebase, по сути, является помощником искусственного интеллекта, который может ответить на ваши вопросы о вашем собственном исходном коде. Думайте об этом как о программисту из ИИ, который понимает структуру и содержание вашего проекта.

Вместо вручную поиск файлов, вы можете задать такие вопросы, как:


  • "Где установлено соединение базы данных?"
  • "Что обрабатывает аутентификацию пользователя?"
  • "Где определяются конечные точки API?"


Как это работает?

Основная идея включает в себя:

  • Загрузка файлов кода из локальных каталогов
  • Разделить их на более мелкие, управляемые текстовые куски
  • Генерирование встраиваний для этих кусков
  • Хранение их в векторной базе данных
  • Получение соответствующих кусков на основе запросов пользователей


Построение агента с помощью встроенных

Требования

pip install langchain langchain-openai faiss-cpu tiktoken

Установите следующие переменные среды:

export AZURE_OPENAI_KEY=your-key
export AZURE_OPENAI_ENDPOINT=https://your-endpoint.openai.azure.com/
export AZURE_OPENAI_DEPLOYMENT=your-embedding-deployment

Код для подготовки и сохранения индекса

import os
import glob
import time
from typing import List
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import AzureOpenAIEmbeddings
from langchain_community.vectorstores import FAISS

REPOS = ["C:/YourCodeRepo"]
INDEX_SAVE_PATH = "codebase_index"

def prepare_and_save_index(repos: List[str], save_path: str = INDEX_SAVE_PATH):
    all_docs = []
    for repo in repos:
        for ext in ["**/*.cs", "**/*.yaml", "**/*.go"]:
            pattern = os.path.join(repo, ext)
            file_paths = glob.glob(pattern, recursive=True)
            for file_path in file_paths:
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()
                        all_docs.append({"page_content": content, "metadata": {"source": file_path}})
                except Exception as e:
                    print(f"Skipping {file_path}: {e}")

    splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
    chunks = splitter.create_documents([doc['page_content'] for doc in all_docs])

    embeddings = AzureOpenAIEmbeddings(
        azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
        azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT"),
        openai_api_key=os.getenv("AZURE_OPENAI_KEY"),
    )

    embedded_chunks = []

    for i, chunk in enumerate(chunks):
        success = False
        for attempt in range(5):
            try:
                embedded_chunks.append(chunk)
                break
            except Exception as e:
                print(f"Error on chunk {i}, attempt {attempt+1}: {e}")
                time.sleep(60)

    vectorstore = FAISS.from_documents(embedded_chunks, embeddings)
    vectorstore.save_local(save_path)
    print(f"Vectorstore saved to {save_path}")

if __name__ == "__main__":
    prepare_and_save_index(REPOS)

Что, если встраивания недоступны?

Если вы находитесь в Azure OpenAI и имеете доступ только к моделям, таким какgpt-4o(Которые не поддерживают Entceddings), вы все равно можете создать менее мощную версию этого агента, используя базовый текстовый поиск.

Основанные на ключевых словах вопросы и ответы

import os
import glob

def search_codebase(repos: List[str], query: str):
    matching_snippets = []
    for repo in repos:
        for ext in ["**/*.cs", "**/*.yaml", "**/*.go"]:
            pattern = os.path.join(repo, ext)
            file_paths = glob.glob(pattern, recursive=True)
            for file_path in file_paths:
                try:
                    with open(file_path, 'r', encoding='utf-8') as f:
                        content = f.read()
                        if query.lower() in content.lower():
                            matching_snippets.append((file_path, content[:500]))
                except Exception as e:
                    continue

    return matching_snippets

if __name__ == "__main__":
    results = search_codebase(["C:/YourCodeRepo"], "authentication")
    for path, snippet in results:
        print(f"Found in {path}:")
        print(snippet)
        print("-"*40)

Этот подход не такой интеллектуальный, но все еще может обеспечить ценность при использовании мощной языковой модели путем вставки полученных фрагментов кода непосредственно в вашу подсказку.

Заключение

Агент Q & A Codebase с Enterdings предлагает быстрые, точные ответы на технические вопросы, используя поиск векторов искусственного интеллекта. Когда встраиваемые вставки недоступны, запасные подходы с использованием поиска ключевых слов и быстрого инженера все еще могут сделать ваш рабочий процесс более эффективным.

Попробуйте оба и посмотрите, какой из них соответствует вашим потребностям!


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE