使用这款准确率高达 91% 的代码库搜索工具,我节省了 30 个小时的编码时间!🤯
TL;DR
我最近被分配了一个具有挑战性的项目,涉及使用现有的 Django 存储库,我立即意识到我对 Django 的了解与我的宠物 Goldfish 一样多。
你肯定会问,为什么不用 ChatGPT?问题在于,ChatGPT 的提示无法容纳整个代码库,而且即使可以,也非常不可靠。
因此,我构建了一个 AI 机器人,让您可以使用代码索引工具以最高精度与任何代码库聊天。
所以,这就是我的做法。
- 我使用代码索引工具来分析和索引整个代码库。
- 构建一个可以接受问题、理解上下文并检索相关代码块的人工智能机器人。
- 然后,机器人会分析代码并做出相应的回答。
该工作流程的关键是代码索引工具,它可以智能地解析整个代码库并在矢量数据库中索引代码。
什么是 RAG?
RAG 代表检索增强生成 (Retrieval Augmented Generation)。顾名思义,RAG 涉及从各种知识库(例如向量数据库、网页、互联网等)检索数据,并使用 LLM 生成答案。
典型 RAG 系统的关键组件包括
- 嵌入模型:深度学习模型用于创建数据(文本、图像等)的嵌入。
- 向量数据库:用于管理向量嵌入。
- LLM:此外,还有用于生成文本响应的深度学习模型。
这是典型 RAG 工作流程的图表。
嵌入和向量数据库
在继续之前,让我们快速熟悉一下嵌入和向量数据库。
嵌入
嵌入或向量在多维空间中以数值形式表示数据(文本、图像等)。基于数百万数据训练的深度学习模型能够理解不同数据点之间的关系或接近度。
例如,“唐纳德·特朗普”一词与“美国”的联系比与“中国”的联系更紧密。“猫”和“小猫”这两个词也比较接近。
嵌入用于计算句子之间的语义相似度。我们也可以将此概念扩展到代码中。
矢量数据库
传统的数据库不适合管理嵌入。我们需要专门的数据库和算法来存储和检索数据。这些被称为向量数据库。
索引技术是我们用来组织数据以便在矢量数据库中搜索和存储的方法。
矢量数据库使用 HNSW、IVF 等方法进行索引和相似性搜索,使用 BM25 和混合搜索进行查询。
最棒的是,您无需担心所有事情。Composio 的 CodeAnalysis 工具会帮您处理所有复杂的抽象问题。
Composio - 人工智能工具和集成的开源平台
以下是我们的简要介绍。
Composio 是一个开源工具基础架构,用于构建稳健可靠的 AI 应用程序。我们提供 100 多种工具和集成,涵盖 CRM、HRM、销售、生产力、开发和社交媒体等各个行业。
他们还提供本地工具,如 CodeAnalyser、RAG、SQL 等。
本文讨论使用 CodeAnalysing 工具为问题和答案编制代码库索引。
请帮我们加一颗星。🥹
这将有助于我们创作更多这样的文章💖
它是如何工作的?
该项目解释了如何构建一个可以让你方便地与任何代码库聊天的 AI 工具。
- 输入存储库路径:提供本地代码库的路径。
- 代码分析和索引:该工具使用代码分析工具分析代码并将其索引到矢量数据库中。
- 带有提示的查询:索引后,您可以提交与代码库相关的提示或问题。
- 检索和响应:该工具从数据库中获取相关的代码片段并根据代码内容生成响应。
这是该项目的整体工作流程。
技术描述
在蹄下,AI机器人接收代码库的路径字符串并执行以下操作。
- 为代码实体生成完全限定域名(FQDN )缓存。
- 创建 Python 文件的索引。
- 从分块代码构建矢量数据库以实现高效搜索。
技术栈
- CrewAI:用于构建代理。
- Composio:CodeIndexing 和 CodeAnalysis 工具
让我们开始吧✨
首先创建一个 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。
composio login
您将被引导至登录页面。
使用 GitHub、Google 或您的邮件登录。
登录后,会弹出一个身份验证密钥。将其复制并粘贴到您的终端中。
此外,您还需要一个 OpenAI API 密钥。因此,请访问 OpenAI
接下来,创建一个 .env
文件并为 OpenAI API 密钥添加环境变量。
OPENAI_API_KEY=your API key
要创建 OpenAI API 密钥,请转到官方网站并在仪表板中创建 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()
这将导入库并加载环境变量。
定义辅助函数
在本节中,我们将定义三个辅助函数。
get_repo_path
:此功能提示用户输入有效的存储库路径。create_composio_toolset(repo_path)
:创建一个 ComposioToolSet 实例来访问工具。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.")
该函数只是在终端中向用户询问代码文件的有效路径。
创建composio工具集(repo路径)
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,
}
}
)
上述函数返回一个ComposioToolSet
带有的实例CODE_ANALYSIS_TOOL
。该工具接受代码库路径。此工具负责创建代码文件的索引。
创建代理(工具,法学硕士)
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 代理。该代理的定义如下:
- 角色:分配给代理的角色。
- 目标:代理的最终目标。
- 背景故事:为 LLM 答案生成提供额外的背景信息。
- 工具: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 任务的定义如下:
- 描述:清晰的描述。
- agent:我们之前定义的代理。
- 预期输出:AI 代理的预期结果。
- 最后,启动 Crew 并记录结果。
完成后,运行 Python 脚本。
python code_qa.py
这将启动整个流程。
第一次需要一些时间,因为代理将抓取并索引代码文件。
所以,这是正在运行的工具。👇
您可以在此处找到完整的代码:代码索引 AI 工具
感谢您阅读本文。
后续步骤
在本文中,您构建了一个完整的 AI 工具,可让您对代码库进行提问和回答。
如果您喜欢这篇文章,请探索并加注 Composio 存储库以获取更多 AI 用例。