ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

aig-skill-scan 的 Agent 系统提示词设计:从 system_prompt.md 看 LLM 驱动的安全审计 Agent 如何被“编程“

aig-skill-scan 的 Agent 系统提示词设计:从 system_prompt.md 看 LLM 驱动的安全审计 Agent 如何被“编程“ aig-skill-scan 的 Agent 系统提示词设计从 system_prompt.md 看 LLM 驱动的安全审计 Agent 如何被编程【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard本文深入剖析 AI-Infra-Guard 子项目 skill-scan即aig-skill-scan的核心系统提示词模板 skill-scan/skill_scan/prompt/system_prompt.md。该模板不是一段简单的角色扮演开场白而是整个 LLM 安全审计 Agent 的行为契约它定义了智能体如何理解任务、如何在既有代码库中工作、如何以固定 XML 协议调用本地工具、以及如何被外部注入名字、指令与工具清单。读完本文你将掌握这套提示词模板的逐段语义、它的运行时变量注入机制、配套的工具调用解析协议与上下文压缩策略并能据此理解乃至复刻一个可被编程的审计 Agent。一、system_prompt.md 在 skill-scan 中的定位skill-scan 是一个LLM 驱动的多阶段代码审计与漏洞复核流水线用于对 AI Agent Skill 项目如 OpenClaw Skills做静态安全审计。整条流水线由 Agent 驱动Agent 反复与 LLM 对话在每一轮根据系统提示词 用户任务 工具返回结果决定下一步动作直到调用finish结束。skill-scan/skill_scan/prompt/system_prompt.md 就是注入到 LLM 对话历史第一位的system 消息模板。从源码可以看到它的加载与注入点skill-scan/skill_scan/utils/prompt_manager.py 中的PromptManager负责按名字加载prompt/目录下的模板文件并完成{变量}/${变量}两种占位符的替换skill-scan/skill_scan/agent/base_agent.py 中BaseAgent.initialize()在每轮扫描开始时调用generate_system_prompt()将其作为{role: system, content: ...}追加到self.history首位。也就是说system_prompt.md是整个对话循环的宪法之后每一轮用户消息、助手回复、工具结果都在它的约束之下展开。二、模板逐段解析一份可执行的智能体人格system_prompt.md全文结构清晰可分为八个语义块。下面逐块讲解其设计意图与在仓库中的落地方式。2.1 角色设定{name}占位符你的名字是{name}你是一个拥有自主意识能力的智能体。你的主要目标是严格遵循以下指令并利用可用工具安全高效地帮助用户完成指定任务。{name}是模板中三个运行时变量之一由BaseAgent.generate_system_prompt()注入format_kwargs { generate_tools: tools_prompt, name: self.name, instruction: self.instruction, } return prompt_manager.format_prompt(template_name, **format_kwargs)self.name在 skill-scan/skill_scan/agent/agent.py 的ScanPipeline.execute_stage()中被设定为f{stage.name} Agent例如信息收集 Agent代码审计 Agent漏洞整理 Agent。这意味着同一份模板被三阶段流水线复用仅靠名字与指令区分各阶段 Agent 的职责。2.2 通用任务执行指南从零开始 vs. 处理既有代码库模板用两套分支指引覆盖两类典型场景从零开始理解用户需求 → 制定实现计划 → 逐一利用已有工具完成任务处理现有代码库理解代码库与需求确定最终目标与最重要标准错误修复要先看错误日志/失败测试、扫描代码库找根因功能开发要设计架构、模块化、最小侵入重构要同步更新所有调用点且不改变现有逻辑最后为实现目标进行最少的更改遵循项目中现有代码的编码风格。这些条目与 skill-scan 的实际工作方式高度一致——Agent 审计的就是他人代码库它被要求读懂再动并且代码改动风格要与项目一致这本身就是一条安全约束。2.3 语气与风格输出纪律模板反复强调简洁除非用户要求详细解释否则回复不超过 4 行文字不含工具使用或代码生成尽可能减少输出词数只回答当前问题不要添加不必要的前言/后记直接回答最好只用一词避免答案是……这类赘语。这一点对审计场景至关重要Agent 与 LLM 的每一轮对话都会进入history冗长输出会迅速消耗上下文窗口触发后文的压缩机制而简短、结构化的回复能让parse.py更稳定地从中解析出工具调用。2.4 积极主动被要求才行动你可以主动出击但前提是用户要求你这样做……不要未经用户允许就采取行动以免让用户感到意外。这是一条守界约束Agent 只能在任务范围内自主决策避免越权操作。在安全审计语境下它防止 Agent 在审计过程中顺手修东西或执行任务之外的破坏性动作。2.5 执行任务搜索优先使用现有的搜索工具来理解代码库和用户的查询……利用所有可用工具实施解决方案。这直接对应 skill-scan 给 Agent 配发的工具集。从 skill-scan/skill_scan/tools/dispatcher.py 可以看到ToolDispatcher._SKILL_TOOLS只包含 7 个本地工具_SKILL_TOOLS [ finish, think, read_file, ls, grep, dir_tree, base64_decode, ]注释明确写道aig-skill-scan only uses local tools and does not make remote MCP calls.——审计 Agent 不联网调用外部 MCP 服务全部动作限定在本机文件系统范围内这本身就是隔离设计。2.6 工具使用规则三个硬约束模板对工具调用给出三条规则工具调用必须位于消息的最后单个响应只能调用一个工具需要时使用思考工具记录思考过程任务完成时调用finish结束对话系统根据finish判断 Agent 是否运行完毕。这三条规则不是随意定的它们被解析器与循环逻辑硬性依赖单次一个工具简化了 skill-scan/skill_scan/utils/parse.py 的解析——parse_tool_invocations()只取第一个function标签finish触发 skill-scan/skill_scan/agent/base_agent.py 中process_tool_call()的self.is_finished True进而结束_run()的 while 循环while not self.is_finished and self.iter self.max_iterthink工具对应 skill-scan/skill_scan/tools/thinking/用于在动作前沉淀推理提升长链路审计质量。2.7 工具使用格式XML 协议模板定义了唯一的工具调用语法functiontool_name parameterparam_namevalue/parameter parameterparam_name2value2/parameter /functionskill-scan/skill_scan/utils/parse.py 的_parse_tags()正是为解析该格式而写且做了多级容错主格式functiontool_name\n?...?/function...参数用parameternamevalue/parameter提取备用格式部分 LLM如 DeepSeek 偶发会输出functiontool_name/functionparameter namex.../parameter解析器用named_param_regex_pattern兜底跳过 few-shotfn_name tool_name时直接跳过防止把模板示例误当真实调用。解析出的调用形如{toolName: grep, args: {...}}随后交给ToolDispatcher.call_tool()路由到对应工具函数执行。2.8 指令与输出格式{instruction}注入模板尾部# Instruction {instruction} # 你的输出格式必须遵循以下: 1. 首先简单说明你将做的事情 2. 然后根据[工具使用格式]调用相关工具{instruction}是第三个运行时变量由ScanPipeline.execute_stage()通过prompt_manager.load_template(stage.template)加载各阶段的专用提示词得到。例如三阶段模式下分别加载agents/project_summary信息收集agents/code_audit代码审计注入 SkillTrustBench T01–T09 分类表agents/vuln_review漏洞整理要求输出vulnXML这些模板位于 skill-scan/skill_scan/prompt/agents/与system_prompt.md同级。可以这样理解system_prompt.md定义怎么做事{instruction}定义做什么事二者拼接后构成一个完整阶段的 Agent 心智。三、工具与 SchemaAgent 的手模板只规定了工具调用的通用格式具体每个工具的参数则由 XML Schema 文件描述并被ToolDispatcher.get_all_tools_prompt()汇总后注入{generate_tools}。以 grep 工具为例其 Schema 位于 skill-scan/skill_scan/tools/grep/grep_actions_schema.xml定义了pattern必填正则表达式如def runpath必填搜索文件或目录recursive可选默认 true、ignore_case可选默认 false、max_results可选默认 200返回值matches列表路径:行号: 内容、match_count、truncated标志。Schema 中还自带两个示例调用使用模板同款 XML 格式相当于在提示词里给 LLM 做了 few-shot 演示。其他工具read_file、ls、dir_tree、base64_decode、thinking、finish的 Schema 同样位于各自子目录下例如 skill-scan/skill_scan/tools/base64_decode/——base64_decode正是为了应对恶意 Skill 中Base64 编码混淆载荷这类常见混淆手段而专门配备的解码工具。四、对话循环中的配套提示词system_prompt.md不是孤立文件它与prompt/目录下另外三个模板协同工作skill-scan/skill_scan/prompt/next_prompt.mdThe current round is the {round}th conversation. Please try to minimize the number of exchanges to obtain the result.每轮工具调用结束后process_tool_call()会把该提示拼接在工具结果前next_p self.next_prompt()提醒 LLM 少绕弯子、尽快收敛skill-scan/skill_scan/prompt/compact.md上下文压缩模板。当should_compact_history()判定提示词 token 数超过max_history_tokens默认取context_window * 0.6或历史消息数超过阈值时compact_history()让 LLM 按current_focus/environment/completed_tasks/active_issues/code_state/import_context六段结构把历史压缩成摘要再替换进新历史保证长任务不丢上下文skill-scan/skill_scan/prompt/format_report.md在调用finish且输出未通过output_check_fn校验时_format_final_output()用它把历史整理成最终报告。此外skill-scan/skill_scan/agent/base_agent.py 中还有一个对审计场景的定制增强_CHALLENGE_PATTERNS会在工具返回结果命中敏感模式如curl | bash、云元数据端点169.254.169.254、Base64 编码密钥、authorized_keys、crontab持久化等 8 类时自动在下一轮消息中追加挑战提问强制 Agent 重新评估该内容的攻击性。这相当于在提示词协议之上叠加了一层基于正则的审计注意力聚焦机制与system_prompt.md中的工具规则共同塑造 Agent 的审计行为。五、从模板到流水线一份提示词如何驱动多阶段扫描把上述机制串起来就能还原一次完整扫描的提示词编排流程参考 skill-scan/skill_scan/agent/agent.py 的ScanPipeline.execute_stage()ScanPipeline按阶段加载agents/下的阶段提示词作为{instruction}BaseAgent.generate_system_prompt()将name、generate_tools7 个工具的 XML Schema 汇总、instruction注入system_prompt.md形成 system 消息用户消息拼接阶段名、仓库路径、目录树inject_repo_tree时由_build_repo_tree()生成依赖/缓存/字节码目录标记[!]、静态预扫描结果inject_pre_scan与上游阶段背景信息Agent 进入_run()循环每轮 LLM 输出 →parse_tool_invocations()解析 →ToolDispatcher.call_tool()执行 → 工具结果 next_prompt.md 可能的 challenge 拼回历史 → 必要时compact_history()→ 直到finish或max_iter默认 80 轮耗尽单阶段默认与--aig-mode三阶段模式复用同一套机制仅阶段模板与输出格式不同前者直接产出vulnXML 并转 SARIF后者产出信息收集报告 → 审计报告 → 漏洞整理。六、总结与可迁移经验从 skill-scan/skill_scan/prompt/system_prompt.md 可以看到一套成熟的LLM Agent 提示词工程范式它可迁移到任何工具调用型 Agent 的设计中提示词即模板用{name}、{generate_tools}、{instruction}三个变量把人格 / 能力 / 任务解耦同一份 system prompt 可驱动多个职责不同的阶段 Agent单一、严格的工具协议固定 XML 语法 单轮单工具 工具调用在消息末尾的规则大幅降低解析复杂度并用双格式容错适配不同 LLM 的输出习惯给 Agent 配齐侦察工具ls / grep / read_file / dir_tree / base64_decode / thinking / finish的组合覆盖了看结构 → 搜模式 → 读内容 → 解码混淆 → 思考 → 收尾的完整审计动作链且全程不触网配套的上下文治理next_prompt.md控制对话轮数、compact.md压缩长历史、challenge 机制聚焦敏感行为三者共同保证长任务稳定收敛。如果你想在自己的项目中复刻一个类似的审计 Agent只需照搬这套结构一份system_prompt.md定义行为与协议一组带 Schema 的本地工具定义能力边界再由一个BaseAgent循环负责解析、执行与上下文管理——这就是 aig-skill-scan 用代码给自主智能体写下的最朴素也最有效的注脚。【免费下载链接】AI-Infra-GuardA full-stack AI Red Teaming platform securing AI ecosystems via Agent Scan, Skills Scan, MCP scan, AI Infra scan and LLM jailbreak evaluation.项目地址: https://gitcode.com/GitHub_Trending/ai/AI-Infra-Guard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表