
人工智能大模型微调LoRA模型量化本地部署模型推理服务【免费下载链接】QwenThe official repo of Qwen (通义千问) chat pretrained large language model proposed by Alibaba Cloud.项目地址https://gitcode.com/GitHub_Trending/qw/Qwen点击查看免费下载本文以 Qwen 官方仓库中的examples/auto_comments.md为核心结合examples/auto_comments.py的完整源码实现介绍如何利用通义千问Qwen-Chat大模型为 Python 代码文件自动生成中文注释。读者将掌握 Auto Comments 的命令行用法、参数语义、输出文件的生成规则并理解其代码分块—注释生成—注释回填合并的完整流水线设计与底层调用链可直接复现并二次定制属于自己的代码注释工具。一、Auto Comments 是什么Auto Comments 是 Qwen 官方仓库Qwen 系列模型包括 Qwen-7B/14B/72B 及其 Chat 版本中提供的一个使用案例利用 Qwen-Chat 对话模型为代码文件自动生成注释。它位于仓库的 examples/auto_comments.py配套说明文档即 examples/auto_comments.md。其核心工作方式是读取一个 Python 代码文件或递归扫描一个文件夹下的所有 Python 文件把代码片段作为上下文发送给 Qwen-Chat让模型为以上代码生成细致的中文注释随后把生成的注释按代码行回填进原始文件最终输出一个文件名_comments.py的新文件——原始代码内容保持不变只在恰当位置插入注释。该案例展示的正是 Qwen-Chat 在代码理解与代码改写类任务上的典型应用也可以作为用 LLM 批量处理代码文件这一通用流水线的参考范本。二、环境准备与运行前提2.1 依赖环境运行该脚本需要先搭建 Qwen 模型的推理环境。依据仓库根目录 README.md 中的说明推荐环境如下Python 3.8 及以上PyTorch 1.12 及以上推荐 2.0 及以上Transformers 4.32 及以上CUDA 11.4 及以上GPU 用户推荐。仓库根目录的 requirements.txt 列出的关键依赖包括transformers4.32.0,4.38.0 accelerate tiktoken einops transformers_stream_generator0.0.4 scipy安装方式pip install -r requirements.txt说明Auto Comments 脚本本身只 import 了argparse、os与transformers相关模块但加载 Qwen-Chat 模型依赖上述完整的推理环境如果设备支持 fp16/bf16安装 flash-attention可选可进一步提升效率。2.2 模型下载说明脚本首次运行时会通过 Hugging Face 自动下载Qwen/Qwen-7B-Chat模型与代码trust_remote_codeTrue。如果网络受限可参考 README.md 的 DownloadModel 小节先通过 ModelScope 的snapshot_download将 checkpoint 下载到本地目录再把脚本中的Qwen/Qwen-7B-Chat替换为本地目录路径例如from modelscope import snapshot_download model_dir snapshot_download(qwen/Qwen-7B-Chat)三、使用方法命令行参数详解Auto Comments 的使用非常简洁直接执行python auto_comments.py --path path of file or folder其中auto_comments.py位于 examples/auto_comments.py。两个命令行参数由parse_args()解析见源码第 14-19 行参数类型默认值说明--pathstrQwen-7B/eval/evaluate_ceval.py目标路径。可以是单个文件目前仅支持 Python 代码文件也可以是文件夹会递归扫描文件夹下所有.py文件--regeneratestore_true 开关False是否重新生成注释。默认False即如果目标文件对应的注释文件已经存在脚本会直接使用缓存不再调用模型重新生成两个参数的行为在源码中有明确体现--regenerate采用actionstore_true源码第 17 行即命令行中出现该开关即为True在deal_one_file()中源码第 146-148 行当regenerateFalse且输出文件已存在时会打印use cache: comments_path并直接返回避免重复消耗推理资源。命令执行入口在文件末尾if __name__ __main__: args parse_args() print(args) transfer(args)transfer()源码第 175-184 行会先实例化 QWenChat 模型然后根据--path是文件还是目录分别进入deal_one_file()或deal_folder()流程。四、使用样例输入与输出对照4.1 执行命令python auto_comments.py --path test_file.py4.2 输入文件 test_file.py假设test_file.py内容如下原文样例import numpy as np import pandas as pd import seaborn as sns sns.set_theme(stylewhitegrid) rs np.random.RandomState(365) values rs.randn(365, 4).cumsum(axis0) dates pd.date_range(1 1 2016, periods365, freqD) data pd.DataFrame(values, dates, columns[A, B, C, D]) data data.rolling(7).mean() sns.lineplot(datadata, palettetab10, linewidth2.5)4.3 输出文件 test_file_comments.py脚本会在同目录下生成test_file_comments.py命名规则见下文 5.5 节内容如下原文样例# 导入需要的库 import numpy as np import pandas as pd import seaborn as sns # 设置 Seaborn 的主题风格为白色网格 sns.set_theme(stylewhitegrid) # 生成随机数 rs np.random.RandomState(365) # 生成 365 行 4 列的随机数并按行累加 values rs.randn(365, 4).cumsum(axis0) # 生成日期 dates pd.date_range(1 1 2016, periods365, freqD) # 将随机数和日期组合成 DataFrame data pd.DataFrame(values, dates, columns[A, B, C, D]) # 对 DataFrame 进行 7 天滑动平均 data data.rolling(7).mean() # 使用 Seaborn 绘制折线图 sns.lineplot(datadata, palettetab10, linewidth2.5)可以看到Qwen-Chat 为每行/每组代码在上方生成了对应的中文注释同时原始代码逐字未变。这正是脚本先让模型生成带注释的代码再把注释回填到原始代码行上这一设计目标的结果。五、源码级原理剖析完整处理流水线examples/auto_comments.py共 189 行自上而下可以拆解为五个核心模块。理解这套流水线是二次开发与参数定制的基础。5.1 全局配置常量MaxLine 50 # 限制单次处理最大代码行数 SplitKey [\ndef ] # 自定义的切分代码标识 CodeFileType [py] # 目前仅测试过对 python 文件生成注释MaxLine 50当代码超过 50 行时脚本会按行数切分控制单次送入模型的代码规模SplitKey [\ndef ]优先按函数定义切分以换行加def作为分界CodeFileType [py]目前只针对.py文件生成注释其他类型文件会被跳过。5.2 模型封装类 QWenChatclass QWenChat(): def __init__(self): self.tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen-7B-Chat, trust_remote_codeTrue) # use bf16 # model AutoModelForCausalLM.from_pretrained(Qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue, bf16True).eval() # use fp16 # model AutoModelForCausalLM.from_pretrained(Qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue, fp16True).eval() # use cpu only # model AutoModelForCausalLM.from_pretrained(Qwen/Qwen-7B-Chat, device_mapcpu, trust_remote_codeTrue).eval() # use auto mode, automatically select precision based on the device. self.model AutoModelForCausalLM.from_pretrained(Qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue).eval() # Specify hyperparameters for generation self.model.generation_config GenerationConfig.from_pretrained(Qwen/Qwen-7B-Chat, trust_remote_codeTrue) self.history None def chat(self, query, system ): # use history # response, history self.model.chat(self.tokenizer, query, historyself.history) # 默认不使用 history response, history self.model.chat(self.tokenizer, query, historyNone) self.history history return response关键点默认采用device_mapauto自动模式脚本根据设备自动选择精度注释中保留了bf16 / fp16 / CPU-only三种备选加载方式GPU 显存充足可改bf16True或fp16True无 GPU 可改device_mapcpu显式加载GenerationConfig生成长度、top_p等超参以维持与模型一致的生成配置chat()默认每次以historyNone单轮调用代码注释任务无需多轮上下文同时把返回的history保存在实例上方便需要多轮时切换为historyself.history。5.3 注释生成提示词 gen_code_commentsdef gen_code_comments(context, model None, **kwargs): prompt \n为以上代码生成细致的中文注释注意使用合适的语法。要求必须在每个函数开头生成一段统一的函数功能注释。\n除了注释请保证原始代码内容不变。不要返回除了注释和代码以外的其余信息不要生成额外代码。\n return model.chat(context prompt)这是整个工具的灵魂。提示词通过四个约束来保证输出质量注释语言与粒度生成细致的中文注释注意语法函数级注释必须在每个函数开头生成一段统一的函数功能注释即函数 docstring 式说明代码保真除了注释原始代码内容必须不变输出纯净只返回注释与代码不生成额外信息或其他代码。模型输出以context prompt拼接后送入model.chat()。5.4 长代码切分策略为避免超出模型的单次上下文处理能力脚本提供了两种切分方式# 如果代码文件过长可以简单按照最大行数切分代码 def split_context_by_maxline(text): lines text.split(\n) lines_len len(lines) res [] for i in range(MaxLine, lines_len, MaxLine): res.append(\n.join(lines[i-MaxLine:i])) if i lines_len: res.append(\n.join(lines[i:])) return res # 如果代码文件过长可以简单按照函数切分代码 def split_context_by_splitkey(text): blocks text.split(SplitKey[0]) return [blocks[0]] [SplitKey[0]x for x in blocks[1:]]deal_one_file()中的选用逻辑源码第 150-158 行context_line len(context.split(\n)) if context_line MaxLine: res gen_code_comments(context, model model) elif SplitKey[0] not in context: context_list split_context_by_maxline(context) res \n.join([gen_code_comments(context_block, model model) for context_block in context_list]) else: context_list split_context_by_splitkey(context) res \n.join([gen_code_comments(context_block, model model) for context_block in context_list])即50 行以内直接整段送入模型超过 50 行且没有函数定义时按行切分超过 50 行且有函数定义时按def切分。各分块的注释结果最后用换行拼接。5.5 注释回填合并 merge_code_and_comments这是保证原始代码不被更改的关键模块源码第 79-135 行。其流程为逐行读取原始文件ori_lines跳过空白行line.isspace()原样保留本来就以#开头的注释行对每条非注释代码行在模型生成的注释文件com_lines中通过子串匹配line[:-1] not in com_lines[j]定位对应代码行从匹配行向前回溯收集注释行up_comments并通过triple_dot_flag状态机正确处理/形式的多行 docstring源码第 105-117 行把收集到的注释行逆序reversed(up_comments)插入到代码行上方若注释行含#而代码行没有则把注释拼接到行内 # com_lines[j].split(#)[-1]未在注释文件中匹配到的行原样保留。最后write_file(comments_path, .join(res))将合并结果写回注释文件。这套合并逻辑刻意做到以原始文件为骨架、以注释为点缀因此即使模型在生成时对代码做了微小改动最终落盘代码仍以原始行为准。5.6 文件与文件夹处理# 处理单个文件 def deal_one_file(model, path, args): context read_file(path) fname path.split(/)[-1] fpath /.join(path.split(/)[:-1]) outfname fname.split(.)[0]_comments.fname.split(.)[-1] comments_path os.path.join(fpath, outfname) if (not args.regenerate) and os.path.exists(comments_path): print(use cache: , comments_path) return ...输出命名规则test_file.py→test_file_comments.py在文件名主体后插入_comments扩展名不变输出与输入同目录缓存机制输出文件已存在且未指定--regenerate时直接复用文件夹递归deal_folder()源码第 164-173 行递归遍历子目录仅处理扩展名在CodeFileType中且文件名不含_comments的.py文件从而避免把已经生成过的注释文件再次处理。六、整体调用链一览从命令执行到输出注释文件的完整调用链为python auto_comments.py --path xxx │ ▼ parse_args() ──► transfer(args) │ ├─ os.path.isfile ──► deal_one_file(model, path, args) │ ├─ read_file() 读取代码 │ ├─ 判断行数 MaxLine直接 gen_code_comments │ ├─ 否则按 SplitKey 或 MaxLine 切分后分批生成 │ ├─ write_file() 写出模型结果 │ └─ merge_code_and_comments() 回填合并 │ └─ os.path.isdir ──► deal_folder(model, path, args) └─ 递归每个 .py 文件 ──► deal_one_file(...)其中模型交互依赖QWenChat.chat()→model.chat(tokenizer, query, historyNone)即仓库 README 中标准的 Qwen-Chat Transformers 推理方式参见 README.md 的 Quickstart 章节以及 cli_demo.py 中同样的加载与调用模式。七、适用前提与限制说明从源码可以明确归纳出以下边界条件使用时需注意语言限制CodeFileType [py]目前仅针对 Python 文件测试过其他代码类型文件会被静默跳过并打印Please specify a correct path!或直接不处理模型依赖默认加载Qwen/Qwen-7B-Chat首次运行需联网下载模型权重与自定义代码可根据显存改用 bf16/fp16/CPU 模式或替换为 Qwen-14B-Chat 等更大模型相应地调整AutoModelForCausalLM.from_pretrained中的模型名上下文长度单次生成被限制在 50 行以内MaxLine长文件依赖切分策略切分粒度以函数def优先这两个常量MaxLine与SplitKey均可按需调整输出文件覆盖默认不覆盖已有_comments文件需强制重新生成时加--regenerate参数合并策略注释回填是启发式匹配子串匹配 向前回溯收集对于模型输出中注释与代码对应关系异常的情况合并结果可能不够理想——源码注释也明确说明这部分可以使用各种不同的策略处理开发者可以按自己的场景替换merge_code_and_comments的实现。八、扩展思路Auto Comments 虽然定位为示例但其流水线具有很强的可移植性基于源码可以低成本扩展出更多能力支持多语言把CodeFileType扩展为[py, js, java, go]等并针对各语言的注释符号//、/* */等调整合并逻辑接入更强模型将模型名替换为Qwen/Qwen-14B-Chat或Qwen/Qwen-72B-Chat在显存允许的前提下获得更好的注释质量结合 vLLM 等推理框架仓库 recipes/inference/vllm 提供了 OpenAI 风格 API 的部署方式可将gen_code_comments中的模型调用替换为 API 请求实现异步批量注释作为代码理解 Agent 的组件与仓库中function_call、React 等 Agent 示例参见 examples/react_demo.py、examples/function_call_examples.py组合让模型在阅读代码前先完成注释增强提升长代码理解能力。九、小结Auto Comments 是 Qwen 开源仓库中一个小而完整的 LLM 工程化案例命令行参数简洁--path--regenerate提示词设计精确并配套了长代码切分、注释回填合并、缓存复用与文件夹递归等工程细节。通过本文对 examples/auto_comments.md 与 examples/auto_comments.py 的对照解读读者不仅能立即跑通为 Python 代码自动生成中文注释这一场景还能掌握其底层调用链与每处可定制点为进一步扩展多语言、大模型、批量化、Agent 化打下基础。赞分享人工智能大模型微调LoRA模型量化本地部署模型推理服务【免费下载链接】QwenThe official repo of Qwen (通义千问) chat pretrained large language model proposed by Alibaba Cloud.项目地址https://gitcode.com/GitHub_Trending/qw/Qwen点击查看免费下载相关推荐Super Mario 64 代码注释自动化工具基于 AST 分析Super Mario 64 代码注释自动化工具基于 AST 分析 项目背景与痛点 在 Super Mario 64 反编译项目中代码注释的缺失和不一致严重游戏开发逆向工程DEX-Arbitrage智能合约深度剖析InstaArb.sol与Arb.sol的功能对比与扩展DEX Arbitrage智能合约深度剖析InstaArb.sol与Arb.sol的功能对比与扩展 DEX Arbitrage项目提供了两种核心智能合约——IZephyr RTOS终极实战指南从零构建高效嵌入式应用Zephyr RTOS终极实战指南从零构建高效嵌入式应用 Zephyr RTOS作为新一代可扩展、安全的实时操作系统正在成为嵌入式开发者的首选。无论你是从传操作系统嵌入式RTOS物联网上一篇终极指南如何用Solaar实现Logitech设备的智能节能模式下一篇Sublime Markdown Extended高级用法自定义语法高亮与主题设置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考