查看原文
其他

用大模型生成一键解读 GitHub 项目的脚本

真知浩见 真知浩见
2024-09-14

最近想结合大模型学习 GitHub 上的项目,但苦于没有一个好的工具。

理想的方案是在大模型里输入 GitHub 网址,然后问各种问题。

这个其实有现成的解决方案,比如 devv.ai,但他这个功能要付费。

之前 GitHub 上还有一个开源的用大模型解读 GitHub 项目的仓库,但后来作者给删掉了,怕是也觉得这个可能是刚需吧。

后来在一个群里谈到这个需求,受到启发,让大模型写了一下代码,完成了这个需求。

最终达成的效果就在命令行里输入一个 GitHub 网址,然后他会给我生成一个包含项目文件名和相应代码的 md文件,然后我就可以 copy这个 md文件里的内容到大模型的对话框里,让大模型来解释项目中各个文件之间的关系,详细解释某个文件下的代码。

我是用的 poe 里的 Claude-3.5-sonnet,最近大家都说他写代码的能力要比 GPT-4强。

我的需求是:

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

我需要你给我生成一个 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 着实很便宜,本地跑大模型意义不大。

回头改好了再发。


继续滑动看下一个
真知浩见
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存