阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈

長話短說

最近,我被分配了一個具有挑戰性的專案,涉及使用現有的 Django 儲存庫,我立即意識到我對 Django 的了解和我的寵物 Goldfish 一樣多。

您一定會問,為什麼不使用 ChatGPT?問題是整個程式碼庫無法適應 ChatGPT 的提示,即使可以,它也非常不可靠。

因此,我建立了一個人工智慧機器人,可以讓您使用程式碼索引工具以最高精度與任何程式碼庫聊天。

人工智慧貓 GIF

所以,這就是我的做法。

  • 我使用程式碼索引工具來分析和索引整個程式碼庫。

  • 建構了一個人工智慧機器人,可以接受問題、理解上下文並檢索相關程式碼區塊。

  • 然後,機器人分析程式碼並做出相應的回答。

這個工作流程的關鍵是程式碼索引工具,它可以智慧地解析整個程式碼庫並在向量資料庫中對程式碼進行索引。


什麼是RAG?

RAG 代表檢索增強產生。顧名思義,RAG 涉及從各種知識庫(例如向量資料庫、網頁、網路等)檢索資料,並使用LLMs產生答案。

典型 RAG 系統的關鍵元件包括

  • 嵌入模型:深度學習模型用於建立資料(文字、圖像等)的嵌入。

  • 向量資料庫:用於管理向量嵌入。

  • LLM:此外,還有一個用於產生文字回應的深度學習模型。

這是典型 RAG 工作流程的圖表。

抹布工作流程圖


嵌入和向量資料庫

在繼續之前,讓我們快速熟悉嵌入和向量資料庫。

嵌入

嵌入或向量在多維空間中以數位方式表示資料(文字、圖像等)。經過數百萬資料訓練的深度學習模型可以理解不同資料點之間的關係或接近程度。

例如,“唐納德·特朗普”一詞將比中國更接近美國。 「Cat」和「Kitten」這兩個字很接近。

嵌入用於計算句子之間的語義相似度。我們也可以將這個概念擴展到程式碼。

向量資料庫

傳統資料庫不適合管理嵌入。我們需要專門的資料庫和演算法來儲存和檢索資料。這些稱為向量資料庫。

索引技術是我們用來組織資料以便在向量資料庫中搜尋和儲存的方法。

向量資料庫使用 HNSW、IVF 等方法進行索引和相似性搜尋,並使用 BM25 和混合搜尋進行查詢。


最好的事情是你不必擔心一切。 Composio 的 CodeAnalysis 工具可以抽象化所有複雜性。


Composio - 用於人工智慧工具和整合的開源平台

這是關於我們的快速介紹。

Composio 是一個開源工具基礎設施,用於建立強大且可靠的 AI 應用程式。我們提供超過 100 多個跨行業垂直領域的工具和集成,從 CRM、HRM 和銷售到生產力、開發和社交媒體。

他們還提供本地工具,例如 CodeAnalyser、RAG、SQL 等。

本文討論使用 CodeAnalysing 工具為問題和答案的程式碼庫建立索引。

男人在掙扎 GIF

請幫我們加一顆星。 🥹

這將幫助我們建立更多這樣的文章💖

{% cta https://dub.composio.dev/M0SeOy5 %}為 Composio 儲存庫加註星標 ⭐{% endcta %}


它是如何運作的?

該專案解釋瞭如何建立一個人工智慧工具,讓您可以輕鬆地與任何程式碼庫聊天。

  • 輸入儲存庫路徑:提供本機程式碼庫的路徑。

  • 程式碼分析和索引:該工具使用程式碼分析工具分析程式碼並將其索引到向量資料庫中。

  • 帶有提示的查詢:索引後,您可以提交與程式碼庫相關的提示或問題。

  • 檢索與回應:該工具從資料庫中取得相關程式碼片段,並根據程式碼內容產生回應。

這是該專案的整體工作流程。

程式碼索引工作流程


技術說明

在實際情況下,人工智慧機器人接收程式碼庫的路徑字串並執行以下操作。

  1. 為程式碼實體產生完全限定網域名稱 ( FQDN ) 快取。

  2. 建立 Python 文件的索引。

  3. 從分塊程式碼建立向量資料庫以進行高效搜尋。


技術堆疊

  • CrewAI :用於建立代理。

  • Composio :程式碼索引和程式碼分析工具

讓我們開始吧✨

首先建立一個 Python 虛擬環境。

python -m venv code-search
cd code-search
source bin/activate

現在,安裝以下相依性。

pip install composio-core
pip install crewai
pip install composio-crewai
  • composio-core :核心 Composio 函式庫用於存取工具。

  • crewai :建立代理的代理框架。

  • composio-crewai :Composio 的 CrewAI 插件。


設定構圖

接下來,設定 Composio。

使用以下命令登入/註冊 Composio。

composio login

您將被引導至登入頁面。

作文登入頁面

在您方便的時候使用 GitHub、Google 或您的郵件登入。

登入後,會跳出一個身份驗證金鑰。複製它並將其貼上到您的終端中。

組合授權金鑰


此外,您還需要一個 OpenAI API 金鑰。所以,去 OpenAI

接下來,建立一個.env檔案並為 OpenAI API 金鑰新增環境變數。

OPENAI_API_KEY=your API key

若要建立 OpenAI API 金鑰,請造訪官方網站並在儀表板中建立 API 金鑰。

OpenAI API 金鑰儀表板映像


導入庫

讓我們導入所需的庫和模組並載入環境變數。

import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew
from langchain_openai import ChatOpenAI
from composio_crewai import ComposioToolSet, Action, App

# Load environment variables
load_dotenv()

這將導入庫並載入環境變數。


定義輔助函數

在本節中,我們將定義三個輔助函數。

  1. get_repo_path :此函數提示使用者輸入有效的儲存庫路徑。

  2. create_composio_toolset(repo_path) :建立用於存取工具的 ComposioToolSet 實例。

  3. create_agent(tools, llm) :使用 CrewAI 建立程式碼分析代理程式。

那麼,讓我們來看看程式碼。

取得儲存庫路徑()

def get_repo_path():
    """
    Prompt the user for a valid repository path.

    Returns:
        str: A valid directory path.
    """
    while True:
        path = input("Enter the path to the repo: ").strip()
        if os.path.isdir(path):
            return path
        print("Invalid path. Please enter a valid directory path.")

該函數只是在終端機中向使用者詢問程式碼檔案的有效路徑。

create_composio_toolset(repo_path)

def create_composio_toolset(repo_path):
    """
    Create a ComposioToolSet instance using the given repository path.

    Args:
        repo_path (str): Path to the repository to analyze.

    Returns:
        ComposioToolSet: Configured ComposioToolSet instance.
    """
    return ComposioToolSet(
        metadata={
            App.CODE_ANALYSIS_TOOL: {
                "dir_to_index_path": repo_path,
            }
        }
    )

上面的函數傳回帶有CODE_ANALYSIS_TOOLComposioToolSet實例。該工具接受程式碼庫路徑。該工具負責建立程式碼檔案的索引。

create_agent(工具,llm)

def create_agent(tools, llm):
    """
    Create a Code Analysis Agent with the given tools and language model.

    Args:
        tools (list): List of tools for the agent to use.
        llm (ChatOpenAI): Language model instance.

    Returns:
        Agent: Configured Code Analysis Agent.
    """
    return Agent(
        role="Code Analysis Agent",
        goal="Analyze codebase and provide insights using Code Analysis Tool",
        backstory=(
            "You are an AI agent specialized in code analysis. "
            "Your task is to use the Code Analysis Tool to extract "
            "valuable information from the given codebase and provide "
            "insightful answers to user queries."
        ),
        verbose=True,
        tools=tools,
        llm=llm,
    )

該函數傳回一個 CrewAI 代理程式。代理定義為

  • 角色:指派給代理人的角色。

  • 目標:智能體的最終目標。

  • 背景故事:為LLMs提供額外的背景以產生答案。

  • 工具:CODE_ANALYSIS_TOOL

  • llm:在其參數中接收的 OpenAI 實例。


定義 main() 函數

最後,讓我們定義main()函數。

def main():
    # Get repository path
    repo_path = get_repo_path()

    # Initialize ComposioToolSet
    composio_toolset = create_composio_toolset(repo_path)

    # create a code index for the repo.
    print("Generating FQDN for codebase, Indexing the codebase, this might take a while...")
    resp = composio_toolset.execute_action(
        action=Action.CODE_ANALYSIS_TOOL_CREATE_CODE_MAP,
        params={},
    )

    print("Indexing Result:")
    print(resp)
    print("Codebase indexed successfully.")

    # Get tools for Code Analysis
    tools = composio_toolset.get_tools(apps=[App.CODE_ANALYSIS_TOOL])

    # Initialize language model
    llm = ChatOpenAI(model="gpt-4o", temperature=0.7)

    # Create agent
    agent = create_agent(tools, llm)

    # Get user question
    question = input("Enter your question about the codebase: ")

    # Create task
    task = Task(
        description=f"Analyze the codebase and answer the following question:\n{question}",
        agent=agent,
        expected_output="Provide a clear, concise, and informative answer to the user's question.",
    )

    # Create and execute crew
    crew = Crew(agents=[agent], tasks=[task])
    result = crew.kickoff()

    # Display analysis result
    print("\nAnalysis Result:")
    print(result)

if __name__ == "__main__":
    main()

這就是上面程式碼中發生的情況。

我們首先呼叫get_repo函數,該函數請求儲存庫目錄並定義ComposioToolSet實例。

  • 接下來,使用CODE_ANALYSIS_TOOL_CREATE_CODE_MAP我們建立程式碼檔案的向量索引。這是時間最長、計算量最大的階段。所以,這可能需要一段時間。該工具在儲存庫中爬行,智慧地對程式碼進行分塊,並在向量資料庫中建立向量索引。

  • 然後建立 OpenAI、CODE_ANALYSIS_TOOL 的實例,最後建立 AI 代理程式。

  • 在下一步中,從終端向使用者詢問有關程式碼庫的問題。

  • 現在,定義任務;這給了代理一個目的。 CrewAI 任務定義為

- description: A clear description.
- agent: The agent we defined earlier.
- expected_output: The expected outcome from the AI agent.
  • 最後,啟動 Crew 並記錄結果。

完成後,執行 Python 腳本。

python code_qa.py

這將啟動整個流程。

第一次,這將需要一段時間,因為代理將對程式碼檔案進行爬網和索引。

所以,這是正在執行的工具。 👇

人工智慧在行動

您可以在這裡找到完整的程式碼: Code Indexing AI tool

感謝您閱讀這篇文章。

下一步

在本文中,您建立了一個完整的 AI 工具,可讓您對程式碼庫進行提問和回答。

如果您喜歡這篇文章,請探索 Composio 儲存庫並為其加註星標,以獲取更多 AI 用例。

給回購加註星標

{% cta https://dub.composio.dev/M0SeOy5 %}為 Composio 儲存庫加註星標 ⭐{% endcta %}


原文出處:https://dev.to/composiodev/i-saved-30-hours-of-coding-with-this-search-tool-that-chats-with-codebases-at-91-accuracy-419l


共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。

阿川私房教材:學程式,拿 offer!

63 個專案實戰,直接上手!
無需補習,按步驟打造你的面試作品。

立即解鎖你的轉職秘笈