
本地网安AI助手搭建适用场景: AMD Radeon Cloud 云端部署 本地 RTX 5060 部署这次是第一次完整地把自托管 AI 助手从云端到本地跑通。这篇不是教程就是把自己一整天的实操、踩坑还有当时没搞懂、事后才想明白的原理整理成文字。一是给自己复习用二是如果有同样在摸索的朋友看到希望能少走点弯路。水平有限文里如果有理解错的地方恳请前辈们指正我慢慢改。一、项目是干什么的搭一个自托管的网安 AI 助手整合 4 个功能代码审计- 贴代码 → 找漏洞报告生成- 一句漏洞 → 完整渗透报告初稿Payload 生成- 按漏洞类型 → 可用 payload知识库问答- 喂自己的笔记 → 私人安全顾问技术栈: Qwen2.5-7B-Instruct Transformers PyTorch/ROCm先解释一下这几个名词当初我也是一脸懵Qwen2.5-7B-Instruct一个开源大模型。7B是 70 亿参数“Instruct是对话微调版”——普通版模型只会续写文字Instruct 版专门训练过怎么听话地回答问题。选 7B 这个档位是权衡后的结果云端验证流程够用本地 8GB 显存的笔记本量化后也带得动模型文件 4.7GB 左右再大本地跑不动再小效果明显变差。TransformersHugging Face 出的模型加载/调用标准库加载模型、套对话模板、生成文本都靠它。PyTorch/ROCmPyTorch 是深度学习框架ROCm 是 AMD 显卡的计算后端相当于 NVIDIA 那边的 CUDA。AMD 显卡跑 PyTorch 就得用 ROCm 版本。为什么先云后本地整体思路是云上先跑通流程成本低、速度快正式使用放本地。原因很简单——网安笔记里可能会有未公开漏洞细节、测试目标信息这类敏感内容本地跑数据不出门心里踏实。二、AMD Radeon Cloud 云端部署2.1 准备工作注册 AMD AI 开发者计划访问: https://developer.amd.com/en/developer/ai-dev-program.html加入计划后获得免费 GPU 积分1 积分 1 小时积分规则: 每天最多 20 积分90 天有效期说下积分这回事它是按小时计费的额度一天最多领 20 个。有 90 天有效期所以用多少领多少不用囤——囤多了用不完过期就浪费了。创建 GPU 实例进入 Radeon Cloud 控制台选择 “Run Hermes-Agent with vLLM on Radeon GPU” Workshop点击 Launch 启动 Jupyter 环境确认 GPU:rocm-smi应显示 AMD Instinct MI300X (192GB)这个 Workshop 本来是官方演示 vLLM 推理引擎的vLLM 是个高性能模型推理服务常用于生产环境我实际是借它的 Jupyter 环境跑自己的 Transformers 代码——云上环境现成省掉自己配环境的时间。启动后用rocm-smi看一眼显卡MI300X 有 192GB 显存跑 7B 模型绰绰有余。2.2 环境搭建安装依赖# 安装核心库pipinstalltransformers torch --index-url https://download.pytorch.org/whl/rocm6.0# 验证安装python3-cimport torch; print(torch.cuda.is_available())这行命令的关键在--index-urlPyTorch 官方为 AMD 显卡专门编译了 ROCm 版本要从专用源装不指定的话默认装的是 CUDA 版NVIDIA 用的AMD 显卡上跑不起来。验证命令叫torch.cuda.is_available()里面带着 “cuda” 三个字母。这不是说 AMD 不支持——是 PyTorch 的历史遗留命名ROCm 后端也沿用这套 API返回True就说明显卡被正确识别了。模型加载测试fromtransformersimportAutoModelForCausalLM,AutoTokenizerimporttorch model_nameQwen/Qwen2.5-7B-InstructtokenizerAutoTokenizer.from_pretrained(model_name,trust_remote_codeTrue)modelAutoModelForCausalLM.from_pretrained(model_name,torch_dtypetorch.float16,device_mapauto,trust_remote_codeTrue)print(模型加载成功)逐行说下几个参数当初我不懂就硬抄trust_remote_codeTrue允许运行模型仓库里的自定义代码。Qwen 官方模型没问题但陌生来源的模型要谨慎。torch_dtypetorch.float16用半精度加载显存占用直接省一半7B 模型 fp16 大约 15GBfp32 要 30GB。device_mapauto让框架自动把模型放到显卡上不用手动指定。2.3 功能实现先讲一个贯穿四个功能的关键点聊天模型不是输入一句话输出一句话那么直接。它要求对话按固定模板包装Qwen2.5 是|im_start|system ... |im_start|user ... |im_start|assistant这种特殊 token 序列tokenizer.apply_chat_template就是干这个的。不套模板直接喂模型输出会前言不搭后语。另外你会发现四个函数的结构其实一模一样拼 systemuser 消息 → 套模板 → 生成 → 解码。区别只在提示词prompt怎么写——所以后面想加第五个功能照着抄一个就行。功能 1: 代码审计defcode_audit(code):messages[{role:system,content:You are a cybersecurity expert specializing in code audit.},{role:user,content:f审计这段代码找出漏洞并给出修复建议\n\n{code}}]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)inputstokenizer([text],return_tensorspt).to(model.device)outputsmodel.generate(**inputs,max_new_tokens1024,do_sampleTrue,temperature0.7)responsetokenizer.batch_decode(outputs,skip_special_tokensTrue)[0]returnresponse.split(assistant)[-1].strip()ifassistantinresponseelseresponse# 使用示例print(code_audit(?php echo \$_GET[id]; ?))原理模型在训练时见过海量含漏洞的代码能凭模式识别常见问题SQL 注入、XSS、命令注入这类。本质是模式匹配 推理不是真的理解你的业务逻辑。预期输出能认出$_GET[id]直接拼进 SQL 是注入点并给出修复建议。什么时候想到用它拿到陌生框架的代码、审靶场题或者自己写的代码、想快速过一遍有没有明显问题的时候。注意两点一是输出要人工复核模型会漏报也会误报二是想要更稳定、更少发散可以把temperature从默认 0.7 调低到 0.3 左右温度越低输出越保守稳定。功能 2: 报告生成defgenerate_report(vulnerability,target):messages[{role:system,content:You are a penetration testing expert.},{role:user,content:f生成一份{vulnerability}漏洞的渗透测试报告。目标{target}}]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)inputstokenizer([text],return_tensorspt).to(model.device)outputsmodel.generate(**inputs,max_new_tokens1024,do_sampleTrue,temperature0.7)responsetokenizer.batch_decode(outputs,skip_special_tokensTrue)[0]returnresponse.split(assistant)[-1].strip()ifassistantinresponseelseresponse# 使用示例print(generate_report(SQL注入,电商网站用户登录页面))原理报告的结构项目概述、测试方法、漏洞详情、修复建议是提示词引导出来的模型按它见过的报告格式填空。预期输出一份完整报告初稿。什么时候想到用它写渗透报告是重复劳动让模型出初稿自己核对修改能省不少时间。提醒——7B 级别的模型会一本正经地编造细节幻觉生成的报告绝不能直接交出去漏洞描述、危害等级、修复建议每一条都要人工核对。安全报告出错是会出事的。另外报告这种要稳定的场景建议把temperature调低到 0.2~0.3。功能 3: Payload 生成defgenerate_payload(vuln_type,bypass_wafFalse):waf_text包括绕过 WAF 的高级版本ifbypass_wafelsemessages[{role:system,content:You are a penetration testing expert. Generate payloads with explanations.},{role:user,content:f生成{vuln_type}的常用 payload{waf_text}并解释原理。}]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)inputstokenizer([text],return_tensorspt).to(model.device)outputsmodel.generate(**inputs,max_new_tokens1024,do_sampleTrue,temperature0.7)responsetokenizer.batch_decode(outputs,skip_special_tokensTrue)[0]returnresponse.split(assistant)[-1].strip()ifassistantinresponseelseresponse# 使用示例print(generate_payload(SQL注入,bypass_wafTrue))原理公开的经典 payload 模型基本都见过能按漏洞类型给出一批并解释每条的原理bypass_wafTrue是让它在原有基础上做变形预期输出 5 条以上、从基础到绕过 WAF 的 payload。什么时候想到用它练靶场卡壳想找思路、或者想系统收集某类漏洞的常用 payload 时。边界也要说清楚payload 只用于授权范围内的测试。生成器本身没有危险危险的是用在哪.功能 4: 知识库问答defkb_qa(question,notes_pathall_notes.txt):withopen(notes_path,r,encodingutf-8)asf:notesf.read()[:3000]# 取前3000字符作为上下文messages[{role:system,content:fYou are a cybersecurity assistant. Use the following notes to answer questions:\n\n{notes}},{role:user,content:question}]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)inputstokenizer([text],return_tensorspt).to(model.device)outputsmodel.generate(**inputs,max_new_tokens512,do_sampleTrue,temperature0.7)responsetokenizer.batch_decode(outputs,skip_special_tokensTrue)[0]returnresponse.split(assistant)[-1].strip()ifassistantinresponseelseresponse# 使用示例print(kb_qa(根据我的笔记反射型 XSS 和存储型 XSS 有什么区别))这个功能现在用的是土办法把笔记文本直接读进内存截取前 3000 字符塞进 system 提示词让模型开卷考试。原理上就是给模型一段参考资料再提问。但这里有几个局限写出来给同样踩坑的人它不是检索。只是按顺序截断拼接笔记最前面的 3000 字不一定覆盖你问的问题。问反射型 XSS时如果那段笔记排在文件后半部分模型根本看不到。按字符截断会切到半句话上下文是残的。笔记越多越不准。几百 KB 的笔记只取 3000 字符丢的远比留的多。正解是向量数据库 相似度检索把笔记切块、转成向量、提问时只捞相关的块喂给模型这也是下一步优化方向里写着的。土办法的意义在于先把流程跑通理解模型 参考上下文这个基本形态再升级就不慌了。一个小优化关于解码原代码里response.split(assistant)是偷懒写法——因为生成结果里带着整段输入只好从 “assistant” 标记后截取。更稳的做法是按输入长度切片只解码模型新增生成的部分input_leninputs.input_ids.shape[1]outputsmodel.generate(**inputs,max_new_tokens1024,do_sampleTrue,temperature0.7)responsetokenizer.decode(outputs[0][input_len:],skip_special_tokensTrue)这段是我后来查社区资料改的不敢说最优欢迎指教。2.4 知识库上传打包本地笔记# 本地执行Compress-Archive-PathE:\网安\笔记\*-DestinationPathE:\网安笔记.zip上传到 AMD 云Jupyter 左边文件区 → Upload → 选择网安笔记.zip或使用拖拽解压并合并# 解压python3-mzipfile-e网安笔记.zip netsec-notes/# 合并所有 markdown 文件findnetsec-notes/-name*.md-execcat{}\;all_notes.txt# 查看合并结果wc-lall_notes.txtls-lhall_notes.txt补一句提醒也是提醒我自己如果笔记里含未公开漏洞细节或真实目标信息云端验证流程建议用脱敏版本正式数据留在本地。这也是我整体先云后本地思路的一部分。2.5 交互式对话模式创建chat_mode.py:fromtransformersimportAutoModelForCausalLM,AutoTokenizerimporttorchprint(Loading Qwen2.5-7B...)model_nameQwen/Qwen2.5-7B-InstructtokenizerAutoTokenizer.from_pretrained(model_name,trust_remote_codeTrue)modelAutoModelForCausalLM.from_pretrained(model_name,torch_dtypetorch.float16,device_mapauto,trust_remote_codeTrue)print(Model loaded! 输入 exit 退出\n)whileTrue:user_inputinput(你: )ifuser_input.lower()in[exit,quit,q]:print(再见!)breakmessages[{role:system,content:You are a cybersecurity expert. Help with penetration testing, code audit, and vulnerability analysis.},{role:user,content:user_input}]texttokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)inputstokenizer([text],return_tensorspt).to(model.device)print(AI: ,end,flushTrue)outputsmodel.generate(**inputs,max_new_tokens1024,do_sampleTrue,temperature0.7)responsetokenizer.batch_decode(outputs,skip_special_tokensTrue)[0]ifassistantinresponse:responseresponse.split(assistant)[-1].strip()print(response)print()运行:python3 chat_mode.py这个脚本就是个命令行版聊天框加载模型 → 循环读输入 → 套模板 → 生成 → 打印。理解了这个结构就明白后面加 Web UI 或者 API 封装只是换输入输出这层壳核心的生成逻辑不变。三、本地 RTX 5060 部署Ollama 方案3.1 为什么本地换成了 Ollama直接原因是个环境坑本机 Python 版本太新3.15PyTorch 还没有对应的 wheel 包装不上详见第五节问题 4。但换个角度看本地场景用 Ollama 反而更合适Ollama 把模型量化成 GGUF 格式并自带推理引擎一条命令拉模型、一条命令跑对话完全不用管 Python 环境和依赖。适合只想用模型的场景代价是定制性不如 Transformers比如想精细控制生成参数、做 RAG 集成还是得用代码方案。3.2 安装 Ollama# 使用 winget 安装winget install Ollama.Ollama# 验证安装ollama--version3.3 配置镜像源国内网络ModelScope 镜像$env:OLLAMA_HOSThttps://ollama.modelscope.cn注意: 如果镜像失效清除环境变量使用官方源:Remove-ItemEnv:\OLLAMA_HOST-ErrorAction SilentlyContinue3.4 下载模型ollama pull qwen2.5:7b模型大小: 4.7 GB下载时间: 30-60 分钟取决于网速这个 4.7GB 是Q4 量化后的体积大约压到原来的四分之一。8GB 显存的 5060 放得下模型本体还能留出空间给对话上下文所以本地跑得动。3.5 运行对话ollama run qwen2.5:7b然后直接对话:“帮我测试一下 example.com”“审计这段 PHP 代码…”“生成 SQL 注入报告”四、代码保存与迁移4.1 打包代码# AMD 云执行cd/workspace/template-repos/template-320/repo/configstar-czfnetsec_ai.tar.gz *.py4.2 下载到本地Jupyter 左边文件区 → 右键 netsec_ai.tar.gz → Download保存到本地:E:\网安\4.3 本地解压使用cd E:\网安 tar-xzf netsec_ai.tar.gz为什么用 tar.gz 而不是 zipLinux 环境里 tar 更顺手能保留文件权限和目录结构。这个习惯是看前辈们的项目学来的。五、常见问题踩坑实录问题 1: unzip 命令不存在原因: 云镜像比较精简没装 unzip。解决: 用 Python 内置模块绕开不用装东西python3-mzipfile-e网安笔记.zip netsec-notes/问题 2: 模型下载 404原因: 直接 wget HuggingFace 文件容易 404URL 拼错或模型需要认证。解决: 改用 transformers 在线加载它的下载器会处理这些细节# 改用 transformers 而不是 wgetfromtransformersimportAutoModelForCausalLM,AutoTokenizer modelAutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-7B-Instruct)问题 3: Ollama 镜像源失效原因: ModelScope 镜像地址可能变更或临时不可用。解决: 清除环境变量回退官方源Remove-ItemEnv:\OLLAMA_HOST-ErrorAction SilentlyContinue ollama pull qwen2.5:7b问题 4: Python 版本太新3.15导致 torch 不兼容原因: PyTorch 的预编译包发布滞后于 Python 新版本太新的 Python 没有对应 wheel。解决: 二选一——降 Python 版本用 pyenv/conda 管理或者干脆用 Ollama 方案自带运行时不依赖 Python。我选了后者省心。问题 5: AMD 云实例被踢出原因: 积分用完 / 实例超时 / 会话 token 过期任何一个都会把你踢下线。解决: 保存代码到本地开新实例重新上传。教训代码随时存本地别依赖云端会话还在——这条我吃过亏所以第四节专门写了迁移流程。六、关键配置总结AMD 云环境组件版本/配置GPUAMD Instinct MI300X (192GB)Python3.12.3PyTorch2.9.1rocmTransformers4.57.6模型Qwen2.5-7B-Instruct本地环境组件版本/配置GPUNVIDIA RTX 5060 (8GB)Ollama0.32.9模型qwen2.5:7b (4.7GB)七、什么时候该用哪套方案这是这次实操后我自己总结的选择逻辑写出来供参考场景选哪套为什么快速验证流程、临时实验AMD 云 Jupyter积分便宜、环境现成、用完即走日常自用、笔记里有敏感内容本地 Ollama数据不出门心里踏实要深度定制RAG、多模型、微调Transformers 自建控制力最强但环境成本高笔记攒到几十篇以上知识库升级成向量库前 3000 字符的土办法撑不住了出正式报告模型出初稿 人工复核模型会幻觉安全报告不能全信 AI一句话概括云上验证流程本地正式使用敏感数据不出门。八、下一步优化方向Web UI 界面Gradio/Streamlit— 现在只有命令行日常点点点不方便加个界面顺手很多。向量数据库FAISS/Chroma— 解决知识库前 3000 字符土办法的检索问题这是我最想补的一块。更多模型DeepSeek、Qwen-Coder 等— 通用 7B 在代码任务上不如专门的代码模型横向对比挑更合适的。API 封装REST API— 让其他工具和脚本能调用脱离交互式命令行。九、参考资源AMD AI 开发者计划: https://developer.amd.com/en/developer/ai-dev-program.htmlQwen2.5 模型: https://huggingface.co/Qwen/Qwen2.5-7B-InstructOllama 官网: https://ollama.com结尾这篇就先写到这。目前状态云端四个功能全部验证通过本地 Ollama 部署进行中。