首页
/ GPT Academic 批量函数注释生成:逐文件扫描、模型概述与 Markdown 函数文档表的一键生成

GPT Academic 批量函数注释生成:逐文件扫描、模型概述与 Markdown 函数文档表的一键生成

2026-09-04 15:52:31作者:翟江哲Frasier

在代码评审或文档编写场景中,快速掌握一个包含数十个函数的项目有哪些函数、各自做什么,是一项高频且耗时的需求。GPT Academic 的“批量生成函数注释”插件正是为此设计:它递归扫描项目中的 Python(.py)与 C++(.cpp)源文件,逐一交给大语言模型生成文件功能概述和函数级注释表格,最终以统一的 Markdown 报告形式输出并可下载分享。读完本文,您将掌握该功能的完整使用方法、输出格式,以及从源码层面理解其文件扫描、提示词构造、逐文件请求与报告落盘的整条执行链路。

功能定位:轻量级的函数级文档生成

与深度的代码注释生成功能不同,批量函数注释生成采用更轻量的处理策略,专注于快速生成函数的概述性描述,而非在源文件中直接插入详细的 docstring。这种设计的优势在于处理速度更快、不修改原始代码、输出格式统一便于阅读和分享。

系统会按照文件顺序逐一处理项目中的源文件。对于每个文件,大语言模型会完成两项任务:一是为整个文件撰写一段功能概述,说明该模块的主要用途;二是识别文件中定义的所有函数,并为每个函数生成一行简短的注释,最终以 Markdown 表格的形式呈现。

当前版本支持 Python(.py)和 C++(.cpp)两种语言的源文件,涵盖了从机器学习研究到系统开发的大多数场景。从源码 crazy_functions/Program_Comment_Gen.py 可以看到,文件清单正是通过这两个 glob 模式收集的:

file_manifest = [f for f in glob.glob(f'{project_folder}/**/*.py', recursive=True)] + \
                [f for f in glob.glob(f'{project_folder}/**/*.cpp', recursive=True)]

recursive=True 使扫描深入所有子目录,确保不遗漏嵌套结构中的文件;两种扩展名的结果列表拼接后作为 file_manifest 传入核心处理循环。

插件注册与启动方式

在插件注册表 crazy_functional.py 中,该插件以字典项注册:

"批量生成函数注释": {
    "Group": "编程",
    "Color": "stop",
    "AsButton": False,  # 加入下拉菜单中
    "Info": "批量生成函数的注释 | 输入参数为路径",
    "Function": HotReload(批量Program_Comment_Gen),
},

其中 Group: "编程" 决定它出现在下拉菜单的“编程”分类下;AsButton: False 表示它只进下拉菜单、不作为常驻按钮显示;函数体被 HotReload 包裹,支持代码热更新。它是一个无需高级参数的插件——选择后立即开始处理,不需要额外输入高级参数区。

准备项目文件

批量函数注释的输入方式与其他分析功能一致,您可以将项目打包成 ZIP 压缩文件上传,也可以直接在输入框中填写本地项目的绝对路径。

通过上传方式:将包含 Python 或 C++ 源文件的项目目录打包成 ZIP 格式,拖拽到界面右侧的上传区域。上传完成后,文件路径会自动填入输入框。

通过路径指定:对于已在本地的项目,直接在输入框中输入项目目录的完整路径即可:

/home/user/projects/my_python_lib

启动生成

在函数插件下拉菜单中找到 编程 分类下的 批量生成函数注释 插件,点击选择。选择后系统会立即开始处理:先扫描输入路径下所有的 .py.cpp 文件,然后按顺序逐一发送给大语言模型进行分析。

源码级执行链路解析

入口函数:路径校验与空结果处理

真正的入口是 crazy_functions/Program_Comment_Gen.py 中的 批量Program_Comment_Gen(带 @CatchException 装饰器以统一捕获异常)。它首先执行两项前置检查:

  1. 路径存在性:若 txt 不是合法本地路径,通过 report_exception 在对话区提示“找不到本地项目或无权访问”;
  2. 文件清单非空:若 glob 扫描后 file_manifest 为空,则在对话区报告异常并提前返回。

这里有一个实现细节值得注意:源码中“找不到文件”的告警文案写作 找不到任何.tex文件(第 51 行),这是模板沿用带来的措辞遗留,实际含义是未在该路径下找到任何 .py / .cpp 文件——排查“提示找不到文件”问题时不必被该文案误导,重点核对路径中是否确实存在这两种扩展名的源码。

逐文件处理循环

核心逻辑在 Program_Comment_Gencrazy_functions/Program_Comment_Gen.py)中,它是一个生成器,对 file_manifest 中的每个文件执行以下流程:

  1. 读取完整文件内容:以 utf-8 编码、errors='replace' 容错方式打开,保证含非法字节序列的文件不会中断整个批次;
  2. 构造提示词
i_say = f'请对下面的程序文件做一个概述,并对文件中的所有函数生成注释,使用markdown表格输出结果,' \
        f'文件名是{os.path.relpath(fp, project_folder)},文件内容是 ```{file_content}```'

提示词中刻意使用 os.path.relpath 给出的相对路径作为文件名,既节省 token 又便于在报告中辨认文件位置;代码体用三反引号包裹以符合 Markdown 代码块约定。展示给用户的消息则带有序号前缀:

i_say_show_user = f'[{index+1}/{len(file_manifest)}] 请对下面的程序文件做一个概述,并对文件中的所有函数生成注释: {os.path.abspath(fp)}'

这就是界面上看到的进度格式 [1/8] … [2/8] … 的来源; 3. 发起模型请求:通过 request_gpt_model_in_new_thread_with_ui_alive(定义于 crazy_functions/crazy_utils.py)在子线程中请求模型,主循环每 0.2 秒 yield 一次刷新界面,防止 UI 卡死。该封装还内置了三层可靠性机制:

  • Token 溢出自动截断handle_token_exceed=True):捕获模型返回的“上下文超长”错误后,调用 input_clipping 按比例裁剪超长输入并重试——这正是 FAQ 中“文件内容过长被截断,部分函数未被处理”现象的底层原因;
  • 未知错误自动重试(默认 2 次):遇到限流(Rate limit reached / Too Many Requests)会额外等待 30 秒后重试;
  • 看门狗机制:主循环持续“喂狗”,若子线程超时无响应则抛出 RuntimeError 终止任务;
  1. 结果回写对话区:每个文件的“用户提问 + 模型回答”成对追加进 history,供后续报告落盘使用;
  2. 文件间限流:每处理完一个文件执行 time.sleep(2)crazy_functions/Program_Comment_Gen.py),在请求频率上留出缓冲,降低触发 API 限流的概率。

报告落盘与下载

全部文件处理完成后,入口函数调用 write_history_to_file(history) 将完整分析历史保存为 Markdown 文件。查看 toolbox.py 中该函数的实现:

  • 文件名默认采用 GPT-Academic-{时间戳}.md 形式,输出到日志目录(get_log_folder());
  • 内容以 # GPT-Academic Report 为标题;由于 history 是“提问、回答、提问、回答……”的成对结构,偶数下标项(即每个文件的提问句)前会被自动加上 ## 二级标题前缀,使每个文件的概述与函数表格在报告中自然分段;
  • 写入失败的非 UTF-8 字符会被降级处理,避免报告写不出去。

随后 promote_file_to_downloadzone(res, chatbot=chatbot) 把报告文件推送到界面右侧的下载区,对话区追加一条“完成了吗?”消息并附上报告绝对路径,供您下载留存或分享给团队成员。

分析过程与界面表现

点击插件后,您可以看到类似以下的进度信息:

[1/8] 请对下面的程序文件做一个概述,并对文件中的所有函数生成注释: /home/user/project/src/main.py
[2/8] 请对下面的程序文件做一个概述,并对文件中的所有函数生成注释: /home/user/project/src/utils.py
...

每个文件处理完成后,结果会立即显示在对话区,典型输出包含两部分:

  • 文件概述:一段描述该文件整体功能和用途的文字;
  • 函数注释表格:以 Markdown 表格形式呈现的函数列表,包含函数名称和功能说明。

输出示例

以下是一个典型的输出结果示例,展示了批量函数注释生成的输出格式:

文件概述utils/data_loader.py

这是一个数据加载工具模块,提供了从多种数据源(CSV、JSON、数据库)读取数据的功能,并支持数据预处理和缓存机制。该模块是整个数据处理流程的入口,被其他分析模块广泛依赖。

函数注释表格

函数名 功能说明
load_csv(path, encoding) 从指定路径加载 CSV 文件,支持自定义编码,返回 DataFrame 对象
load_json(path) 读取 JSON 文件并解析为 Python 字典,支持嵌套结构
connect_db(config) 根据配置信息建立数据库连接,返回连接对象
query_table(conn, table_name) 执行简单的全表查询,返回结果集
preprocess(df, rules) 对 DataFrame 应用预处理规则,包括缺失值填充、类型转换等
cache_data(key, data) 将数据缓存到内存,避免重复加载
get_cached(key) 从缓存中获取数据,不存在时返回 None
clear_cache() 清空所有缓存数据,释放内存

这种格式使得函数列表一目了然,特别适合快速查阅和团队分享。由于提示词明确要求“使用 markdown 表格输出结果”,且报告保存函数会自动为每个文件插入二级标题,最终生成的 .md 报告可以直接作为项目文档素材使用。

与其他代码分析功能的区别

GPT Academic 提供了多种面向源码的分析功能,它们的定位和实现策略各不相同。就本文档主题的功能而言:

特性 批量函数注释生成 代码注释生成
输出形式 Markdown 表格,不修改源代码 直接在源文件中插入 docstring
处理深度 函数级概述 函数级详细文档(含参数、返回值)
处理速度 较快 较慢(需要深度分析)
支持语言 Python, C++ Python
主要用途 快速了解、文档素材 代码质量提升、正式文档化
前后对比 提供 HTML 对比视图

简而言之,如果您需要快速获得项目的函数级概览或准备文档素材,使用批量函数注释生成;如果需要为代码添加正式的文档字符串以提升代码质量,使用代码注释生成功能。

若再从源码结构层面看,这三种功能在并发策略上的差异更为明显:

  • 批量函数注释生成crazy_functions/Program_Comment_Gen.py):严格串行逐文件处理,每文件之间 sleep(2) 秒限流,最稳定、最省 token;
  • 源码分析crazy_functions/SourceCode_Analyse.py解析源代码新):第一阶段用 request_gpt_model_multi_threads_with_very_awesome_ui_and_high_efficiency 多线程并发逐文件分析,第二阶段按 16 个文件一组做迭代式汇总,生成项目级架构概括,并对文件数量设有 512 个的上限断言;
  • 代码注释生成crazy_functions/SourceCode_Comment.py):同样采用多线程逐文件分析,但目的是生成可写回源文件的详细文档,且从插件注册看仅面向 Python 项目。

因此,批量函数注释生成是三者中最轻量、门槛最低的一档,适合作为接触一个新项目的“第一眼”工具。

适用场景

项目交接文档:当您需要向接手者说明项目中各模块的函数时,批量生成的注释表格是一份现成的参考资料。

代码评审准备:在进行代码评审前,先获得所有函数的概述,有助于评审者快速建立对代码的整体认知。

个人备忘录:为自己编写的工具库或实验代码生成一份函数清单,方便日后回顾和复用。

技术文档素材:注释表格可以直接作为技术文档的一部分,或者作为撰写详细文档的框架和起点。

了解第三方库:分析开源项目或第三方库的源码时,快速获得所有模块的函数列表和功能说明。

优化建议

选择合适的模型

函数注释的质量取决于模型对代码的理解能力。对于简单的工具函数,GPT-3.5 级别的模型即可生成准确的注释;但对于涉及复杂算法或领域专业知识的函数,建议使用 GPT-4 或 qwen-max 等更强大的模型。

保持代码整洁

模型会根据代码内容生成注释,因此代码本身的可读性直接影响注释质量。良好的变量命名、清晰的函数结构、适当的已有注释都能帮助模型更准确地理解代码意图。

合理控制文件数量

虽然系统会自动处理项目中的所有源文件,但文件过多会导致处理时间较长且 Token 消耗增加。由于该功能逐文件串行调用模型、且每文件间固定间隔 2 秒,总耗时近似与文件数量成正比。如果项目规模很大,建议:

  • 将项目拆分成逻辑模块,分批处理
  • 排除测试文件和示例代码(通过文件整理)
  • 优先处理核心业务代码

另外需要留意:对于单个超长文件,底层请求封装在检测到 Token 溢出时会自动截断输入后重试(见 crazy_functions/crazy_utils.pyhandle_token_exceed 逻辑),截断可能导致文件尾部的函数未被纳入注释表格,这也是大型单文件项目的常见现象。

后期人工校正

AI 生成的注释虽然通常准确,但可能存在对业务逻辑理解不完全的情况。建议将生成的表格作为初稿,对关键函数的描述进行人工审核和完善。

常见问题

提示“找不到任何 .py/.cpp 文件”怎么办? 请检查:输入的路径是否正确;项目目录中确实包含 .py.cpp 文件;如果使用压缩包,确保是标准 ZIP 格式。注意源码中该告警文案显示为“找不到任何.tex文件”(见 crazy_functions/Program_Comment_Gen.py),属模板措辞遗留,实际检查对象仍是 .py/.cpp 文件。

某些函数没有出现在表格中? 可能的原因:该函数嵌套在类或其他结构中,模型可能单独列出类方法;函数定义方式不标准(如使用 lambda 表达式);文件内容过长被截断(底层 Token 溢出自动截断机制所致),部分函数未被处理。

注释描述不够准确? 改善方法:切换到更强的模型;确保函数命名具有描述性;对重要函数可以单独提问进行深入分析。

处理速度很慢? 批量处理需要逐文件调用模型,且每两个文件之间固定间隔约 2 秒(time.sleep(2)),文件越多耗时越长。可以尝试:减少要处理的文件数量;检查网络连接是否稳定;使用响应速度更快的模型。

输出的表格格式在某些平台上显示异常? 系统输出的是标准 Markdown 表格格式。如果在其他平台(如企业微信、某些笔记应用)中显示异常,可以:将表格复制到支持 Markdown 的编辑器中查看;或转换为其他格式(如 HTML 表格)。

相关文档

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.83 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.79 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
988
506
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384