個人本地項目代碼也能一鍵DeepWiki,這個開源項目有點意思! 原創(chuàng)
大家好,我是九歌。
最近刷到最多的AI相關(guān)文章,就是一路好評的DeepWiki了!手癢難耐的我,也早早就上手體驗了一下。整體體驗下來,確實不錯,對于想了解一個Github項目的新人來說,確實非常有幫助。
但是有一說一,DeepWiki的缺點也是很明顯的,一是只能局限于Github項目,對于個人私有代碼倉庫卻愛莫能助!二是時間具有滯后性,項目代碼不是最新的!如果公司有傳承已久的代碼庫,新入職的同事看到那山一樣高的代碼,內(nèi)心肯定是崩潰的!
其實利用Dify工作流,也能快速做個簡易版的DeepWiki出來,但是本著不要重復(fù)造輪子的原則,又發(fā)現(xiàn)了一個寶藏項目——Agent as a Judge! 怎么樣,這個項目名稱夠長夠別扭吧!但是利用這個項目可以快速對個人私有代碼倉庫生成如下樣式項目Wiki,是不是和DeepWiki一樣!
Agent as a Judge 項目的初衷就是讓智能體評價智能體,把智能體當(dāng)做裁判!主要提供了一種自動化評估智能體工作表現(xiàn)的方法,同時還能生成高質(zhì)量的智能體數(shù)據(jù)集。它就像是一個嚴(yán)格的裁判,能夠快速、準(zhǔn)確地評判智能體在執(zhí)行各種任務(wù)時的表現(xiàn),并且為智能體的進(jìn)一步訓(xùn)練提供有用的反饋。
簡單說,Agent as a Judge 能夠?qū)椖看a進(jìn)行問答對話,生成Wiki文檔,對智能體方向的項目進(jìn)行測評!
為了更快了解這個項目,我們先把這個項目在我們自己電腦上跑起來再說!因為這個項目是用poetry管理依賴,所以我們在自己電腦上裝上它(以Windows為例)。poetry感覺不是很好用,我第一次用這個東西,浪費了很多時間。
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
然后我們根據(jù)官方給的安裝教程,完成項目的安裝。步驟如下,我進(jìn)行了優(yōu)化。
#1.拉取項目代碼
git clone https://github.com/metauto-ai/agent-as-a-judge.git
cd agent-as-a-judge/
#創(chuàng)建虛擬環(huán)境
python -m venv .venv
#激活環(huán)境
.\.venv\Scripts\activate
#給poetry指定虛擬環(huán)境
poetry env use .\.venv\Scripts\python.exe
#安裝依賴
poetry install
遇到的坑,請大家避開,其實直接從pyproject.toml把依賴復(fù)制出來,用大模型整理成requirements.txt,直接用pip安裝更方便:
#1.刪除poetry.lock文件
#2.poetry鏡像拉取超時,修改pyproject.toml文件,在最后添加下面配置
[[tool.poetry.source]]
name = "tsinghua-pypi"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
priority = "primary"
#3 還需要額外安裝的Python包
litellm
dotenv
tenacity
spacy
rank-bm25
sentence_transformers
pandas
python-docx
PyPDF2
openpyxl
opencv-python
bs4
pylatexenc
python-pptx
最后一步,我們配置一下這個項目的大模型,將 .env.samplech重名為 .env ,添加openai_api_key。因為我沒有openai官方的key,只有openrouter的,所以我順便修改了一下源碼。
#將 .env.samplech重名為 .env
DEFAULT_LLM="gpt-4o-2024-08-06"
#添加openrouter key
OPENAI_API_KEY="sk-***"
PROJECT_DIR="{PATH_TO_THIS_PROJECT}"
# 修改 agent_as_a_judge\llm\provider.py 代碼 220行
base_url = "https://openrouter.ai/api/v1"
具體作用
1.Ask Anything
可以針對任意工作區(qū)提出問題,了解工作區(qū)的內(nèi)容和結(jié)構(gòu)。例如,對一個藥物反應(yīng)預(yù)測的代碼庫進(jìn)行問題查詢,以及其包含的數(shù)據(jù)加載、模型實現(xiàn)和訓(xùn)練等相關(guān)文件。
PYTHONPATH=. python scripts/run_ask.py \
--workspace $(pwd)/benchmark/workspaces/OpenHands/39_Drug_Response_Prediction_SVM_GDSC_ML \
--question "What does this workspace contain?"
2.Agent-as-a-Judge
對 DevAI 數(shù)據(jù)集中的任務(wù)進(jìn)行評估,收集證據(jù)來判斷項目的輸出是否滿足要求。這個功能有點復(fù)雜,我們現(xiàn)在先簡單知道一下,等后面有時間再研究。
PYTHONPATH=. python scripts/run_aaaj.py \
--developer_agent "OpenHands" \
--setting "gray_box" \
--planning "comprehensive (no planning)" \
--benchmark_dir $(pwd)/benchmark
3.OpenWiki:這個就是本文的主角,可以制作給倉庫生成Wiki文檔,幫助新開發(fā)者快速了解代碼庫的結(jié)構(gòu)、目的和最佳實踐。我們來看一下使用方法,好像很簡單,直接運行run_wiki.py,后面帶上github項目庫的URL就可以了!
python scripts/run_wiki.py https://github.com/metauto-ai/GPTSwarm
等等,咱的文章標(biāo)題不是個人私有代碼倉庫嗎?讀取github倉庫的功能,DeepWiki就支持啊,而且也支持私有倉庫,說好的本地倉庫代碼呢?
別急,這個項目不是開源嗎,咱研究一下代碼,改成讓它直接讀取本地文件夾,不就行了嗎?
通過閱讀run_wiki.py的源碼,我們可以理清它的工作邏輯,主要通過 download_github_repo 函數(shù)從 GitHub 克隆倉庫,在 main 函數(shù)中使用 parse_arguments
def main():
# ... 其他代碼 ...
args = parse_arguments()
repo_url = args.repo_url or get_repo_url_interactive()
# ... 其他代碼 ...
repo_dir = download_github_repo(repo_url, output_dir)
# ... 其他代碼 ...
也就是說,它的工作原理就是把github的倉庫代碼下載到本地文件夾,再進(jìn)行分析!那我們直接讓run_wiki.py的參數(shù)接受個本地路徑不就可以了,這樣改也很簡單。添加一個新的命令行參數(shù)來指定本地文件夾路徑,并且在代碼中根據(jù)這個參數(shù)來決定是下載 GitHub 倉庫還是直接使用本地文件夾。
import argparse
from pathlib import Path
import logging
import time
import json
import datetime
import subprocess
from urllib.parse import urlparse
from dotenv import load_dotenv
# 省略其他代碼
# ...
def parse_arguments():
parser = argparse.ArgumentParser(descriptinotallow="Generate documentation for GitHub repositories or local folders")
parser.add_argument(
"--repo-url",
type=str,
help="GitHub repository URL (e.g., https://github.com/metauto-ai/gptswarm)",
default=None
)
parser.add_argument(
"--local-dir",
type=str,
help="Path to the local project folder",
default=None
)
parser.add_argument(
"--output_dir",
type=str,
default="./repo_docs",
help="Directory to save documentation"
)
# 其他保持不變
# ...
return parser.parse_args()
def main():
load_dotenv()
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(__name__)
args = parse_arguments()
output_dir = Path(args.output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
judge_dir = output_dir / "judge"
judge_dir.mkdir(parents=True, exist_ok=True)
start_time = time.time()
try:
if args.repo_url:
logger.info(f"Starting repository download and documentation: {args.repo_url}")
repo_dir = download_github_repo(args.repo_url, output_dir)
elif args.local_dir:
logger.info(f"Using local project folder: {args.local_dir}")
repo_dir = Path(args.local_dir)
if not repo_dir.exists() or not repo_dir.is_dir():
raise ValueError(f"Invalid local directory: {args.local_dir}")
else:
raise ValueError("Please provide either a GitHub repository URL or a local project folder path.")
# 后續(xù)代碼保持不變
# ...
except Exception as e:
logger.error(f"Error generating documentation: {str(e)}")
import traceback
logger.error(traceback.format_exc())
sys.exit(1)
if __name__ == "__main__":
main()
最后我們看一下結(jié)果,跑出來了,但是報錯了!
生成的網(wǎng)頁沒有數(shù)據(jù)!因為訪問不了huggingface!我打開科學(xué)上網(wǎng),但是有些包又報代理錯誤!
最后我想說,盡力了,不想浪費時間在這個項目上了,前前后后用掉了我三個晚上!此天不讓我跑通這個項目,非我不用心也!
本文轉(zhuǎn)載自??九歌AI大模型?? 作者:九歌AI
