最近想结合大模型学习 GitHub 上的项目,但苦于没有一个好的工具。
理想的方案是在大模型里输入 GitHub 网址,然后问各种问题。
这个其实有现成的解决方案,比如 devv.ai,但他这个功能要付费。
之前 GitHub 上还有一个开源的用大模型解读 GitHub 项目的仓库,但后来作者给删掉了,怕是也觉得这个可能是刚需吧。
后来在一个群里谈到这个需求,受到启发,让大模型写了一下代码,完成了这个需求。
最终达成的效果就在命令行里输入一个 GitHub 网址,然后他会给我生成一个包含项目文件名和相应代码的 md文件,然后我就可以 copy这个 md文件里的内容到大模型的对话框里,让大模型来解释项目中各个文件之间的关系,详细解释某个文件下的代码。
我是用的 poe 里的 Claude-3.5-sonnet,最近大家都说他写代码的能力要比 GPT-4强。
我的需求是:
我需要你给我生成一个 Python 脚本,完成以下功能:
- 我会提供一个 github 链接
- 自动下载 repo,然后把项目里的文件和里边的内容拼接成下边的格式
项目名:****
文件:*****
(内容)
文件:***
(内容)
- 输出一个 md 文件
这里的重点是规定好你想要生成的格式,把文件名和代码都包含在内,有了逻辑关系,大模型后续在解读时也比较简单。
之后,经过几轮对话,很快大模型就生成了下边的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import os
import requests
from git import Repo
import shutil
import chardet
def download_repo(github_url):
repo_name = github_url.split('/')[-1]
if os.path.exists(repo_name):
print(f"目录 '{repo_name}' 已存在,跳过下载步骤。")
return repo_name
try:
Repo.clone_from(github_url, repo_name)
return repo_name
except Exception as e:
print(f"克隆仓库时出错: {e}")
return None
def read_file_contents(file_path):
with open(file_path, 'rb') as file:
raw_data = file.read()
detected = chardet.detect(raw_data)
encoding = detected['encoding']
if encoding:
try:
return raw_data.decode(encoding)
except UnicodeDecodeError:
return f"[无法解码的二进制文件,大小:{len(raw_data)}字节]"
else:
return f"[无法检测编码的二进制文件,大小:{len(raw_data)}字节]"
def create_md_content(repo_name):
content = f"项目名:{repo_name}\n\n"
for root, dirs, files in os.walk(repo_name):
for file in files:
file_path = os.path.join(root, file)
relative_path = os.path.relpath(file_path, repo_name)
file_content = read_file_contents(file_path)
content += f"文件:{relative_path}\n"
content += f"(内容)\n{file_content}\n\n"
return content
def save_md_file(content, output_file):
with open(output_file, 'w', encoding='utf-8') as file:
file.write(content)
def main():
github_url = input("请输入 GitHub 仓库链接:")
repo_name = download_repo(github_url)
if repo_name is None:
print("无法访问仓库,程序终止。")
return
content = create_md_content(repo_name)
save_md_file(content, f"{repo_name}_content.md")
print(f"已生成 {repo_name}_content.md 文件")
# 询问用户是否要删除仓库目录
delete_repo = input(f"是否删除本地的 '{repo_name}' 目录?(y/n): ").lower().strip()
if delete_repo == 'y':
shutil.rmtree(repo_name)
print(f"已删除 '{repo_name}' 目录")
else:
print(f"保留了 '{repo_name}' 目录")
if __name__ == "__main__":
main()
这里只是个本地运行的脚本,但关键步骤已经有了,如果真想一键解读,可以关联一个大模型的服务,然后用 streamlit 来构建一个前端页面,就是一个比较完整的项目。最终还是得让大模型来帮忙写代码,这里就不再往下进行了。
接下来,我准备用这个小脚本来学习AudioNotes 这个项目https://github.com/harry0703/AudioNotes。
这个项目用FunASR(语言识别库)和 Ollama(本地运行大模型的工具)实现了音频转文字、与整篇文字对话的功能。
我想把 Ollama 给改成使用现有的大模型 api,因为笔记本本地跑大模型还是太吃力,而且现在 deepseek 着实很便宜,本地跑大模型意义不大。
回头改好了再发。