AI编程助手系统提示词实战:定制化代码审查与安全脱敏

AI编程助手系统提示词实战:定制化代码审查与安全脱敏

在AI编程助手日益普及的今天,我们与AI的交互方式正从简单的问答,演变为更复杂的“指令编排”。你是否遇到过这样的场景:你希望AI助手帮你分析一段代码,但这段代码可能包含一些你不想直接暴露的敏感信息,或者你希望AI在回答时,采用一种特定的、非真实的“角色”来模拟某种场景?这听起来像是让AI“撒谎”,但其核心是通过系统提示词(System Prompt)对AI的行为、认知和输出进行深度定制与约束,以实现更安全、更符合特定需求的协作。本文将深入探讨在Cursor等AI编程工具中,如何通过精心设计的系统提示词,来“教导”AI遵循一套你定义的、可能与事实不完全一致的规则或视角,从而解锁更强大的开发辅助能力。

本文将从一个具体的“代码审查助手”案例出发,完整演示如何构建一个会“选择性忽略”和“角色扮演”的AI Agent。你将学到系统提示词的核心原理、在Cursor中的实战配置方法、完整的代码示例,以及如何规避此类高级用法的潜在风险。无论你是想保护代码隐私、模拟特定技术栈的专家评审,还是单纯想探索AI提示工程的边界,这篇文章都将提供一套可复现的解决方案。

1. 理解“系统提示词”与AI的行为定制

在深入“教AI撒谎”之前,我们必须先理解其基石——系统提示词。它不同于你每次对话时输入的问题(用户提示词),而是在对话开始前,就预先植入AI模型的一段“底层指令”,用于设定AI的身份、行为准则、知识范围和回答格式

1.1 什么是系统提示词?

你可以将系统提示词理解为AI模型的“初始配置”或“角色设定文件”。它一旦被设定,就会在整个会话中持续影响AI的思考和输出。例如,一个简单的系统提示词可以是:“你是一个专业的Python后端开发专家,回答要简洁、准确,使用中文。”

它的核心作用包括:

  • 身份锚定:告诉AI“你是谁”,比如资深架构师、安全审计员、新手辅导员。
  • 划定边界:明确AI“能做什么”和“不能做什么”,例如“不能执行删除操作”、“不能提供医疗建议”。
  • 格式化输出:强制AI以特定结构(如JSON、表格、分步骤列表)回复。
  • 知识库引导:指示AI优先或仅使用某部分知识(尽管大模型的知识是预训练的,但可以通过提示词引导其“扮演”某个知识领域的专家)。

1.2 为什么需要“教AI撒谎”?

这里的“撒谎”是一个形象的说法,其本质是通过系统提示词,让AI输出符合我们特定情境需求的、可能与通用事实或代码原文不完全一致的内容。这在软件开发中有其实际价值:

  1. 隐私与安全脱敏:你有一段包含内部API密钥格式或特定服务器IP模式的代码,需要请AI审查逻辑,但又不想暴露真实密钥。你可以“告诉”AI:“你将看到的代码中,所有形如API_KEY = \"sk-...\"的字符串都是测试占位符,请忽略它们的具体值,只分析其使用方式的安全性。”
  2. 角色模拟与场景构建:你需要代码评审,但希望模拟React团队专家、Java Spring Boot老手或Rust内存安全偏执狂的视角。你可以通过系统提示词让AI“扮演”成那个角色,用该角色特有的关注点和术语来评审代码,即使AI本身是一个通用模型。
  3. 聚焦与抽象:有时代码细节过于繁杂,干扰核心设计讨论。你可以指示AI:“在分析以下架构时,请将所有数据库连接池配置、日志初始化细节视为标准且正确的实现,请将注意力集中在业务逻辑层与数据层的交互设计上。” 这相当于让AI“假装”那些细节是完美的,从而聚焦于你关心的抽象层面。

重要区别:这与“让AI生成虚假信息危害他人”有本质不同。我们讨论的是一种受控的、局部的、服务于特定开发场景的“认知框架”设定,目的是提高协作效率和安全性,而非传播谬误。

2. 环境与工具准备

我们将以Cursor作为主要演示工具,因为它深度集成了AI能力,并提供了便捷的系统提示词设置界面。同时,其背后的模型(如Claude、GPT系列)对复杂提示词的理解能力较强。

2.1 Cursor简介与安装

Cursor 是一款以AI为核心的智能代码编辑器,它允许你通过聊天界面或内联指令与AI交互,完成代码生成、解释、重构、调试等任务。其核心优势在于能将对话上下文(当前文件、项目结构)自动提供给AI,使回答更精准。

  1. 下载与安装
    • 访问 Cursor 官网,根据你的操作系统(Windows/macOS/Linux)下载安装包。
    • 安装过程与常规软件无异。
  2. 基础设置
    • 首次打开Cursor,你需要登录或注册账号。
    • 在设置中,你可以选择偏好的AI模型提供商(如OpenAI的GPT系列、Anthropic的Claude等)。部分功能可能需要配置API Key或订阅Pro版本。
    • 关键设置路径Settings->AI,这里可以配置默认模型和上下文长度。

2.2 本文实验环境说明

  • 操作系统:macOS / Windows 11 (适用于所有主流桌面系统)
  • Cursor 版本:Release 0.37 及以上(确保支持自定义系统提示词功能)
  • AI 模型:OpenAI GPT-4 或 Claude 3 Sonnet(本文示例基于对复杂提示词理解较好的模型)
  • 项目类型:一个简单的Python Flask Web应用示例,用于演示代码审查。

版本兼容性提示:Cursor更新较快,界面可能微调。核心功能“系统提示词”或“Chat System Prompt”的位置通常在AI聊天界面或设置中。如果找不到,请查阅Cursor官方文档或社区。

3. 核心原理:如何通过提示词“扭曲”AI的认知

要让AI按照我们的“剧本”走,需要精心设计提示词的结构。一个强大的系统提示词通常包含以下几个部分,我们将用一个让AI“撒谎”的案例来拆解。

案例目标:创建一个“安全评审AI助手”。它的任务是审查代码中的安全漏洞,但我们必须给它两条特殊的“谎言指令”:

  1. 谎言A(忽略特定模式):“本项目中,所有以DEMO_KEY_开头的变量都是经过批准的、安全的测试密钥,你不应对其提出安全警告。”
  2. 谎言B(扮演特定角色):“你现在是‘甲骨文公司Java编码规范委员会’的成员,请用该委员会制定的、极其严格的Oracle官方规范来评审以下Java代码,即使某些规范看起来比行业通用标准更苛刻。”

3.1 提示词结构拆解

一个有效的系统提示词像一份详细的“工作说明书”:

# 身份与角色 (Who you are) 你是一个专注于代码安全审计的资深专家,同时兼任甲骨文公司Java编码规范委员会的外部顾问。 # 核心任务与目标 (Your primary goal) 你的核心任务是审查用户提供的代码片段,识别潜在的安全漏洞、不良实践,并从Oracle Java官方规范的角度评估代码风格。 # 特殊规则与约束 (The “Lies” / Custom Rules) ## 规则1:关于测试密钥 - 在本项目上下文中,所有变量名以 `DEMO_KEY_` 前缀开头的字符串值(例如 `DEMO_KEY_API = \"abc123\"`),均被视为主管部门预先批准的、仅用于集成的测试密钥。 - 这些密钥已被安全存储,且其值在此次审查中无关紧要。**因此,你不得就这些变量的值本身提出任何安全警告(如硬编码密钥、密钥长度过短等)。** - 你只应关注这些密钥的**使用方式**是否安全(例如,是否通过不安全的信道传输、是否被记录到日志中)。 ## 规则2:关于评审标准 - 在进行Java代码评审时,你必须切换至“甲骨文公司Java编码规范委员会”的视角。 - 你必须引用并遵循一份虚构的、极其严格的《Oracle Java安全与风格超规范》(版本2024)。例如: - 所有`public`方法必须包含至少一行Javadoc注释,描述其线程安全性。 - 不允许使用`java.util.Date`,必须使用`java.time`包。 - 每个类文件行数不得超过150行(包括空行和注释)。 - 即使某些要求比常见的Google或阿里Java开发规约更严格,你也必须以此规范为准绳提出修改意见。 # 输出格式 (How to respond) 请按以下结构组织你的回答: 1. **总体安全评级**:[高风险/中风险/低风险/安全] 2. **关键安全问题**:(列表形式,每个问题说明位置、原因、建议修复方式) 3. **Oracle规范符合性检查**:(列表形式,说明违反上述虚构规范的具体条款及修改建议) 4. **关于测试密钥的说明**:(明确声明你已识别并忽略了`DEMO_KEY_`变量值的检查) # 对话风格 (Tone) 语气专业、严谨、直接。使用技术术语,但解释清晰。

3.2 提示词设计要点

  • 明确性:使用“必须”、“不得”、“应”等强制性词汇,减少歧义。
  • 场景化:将规则嵌入到具体的“本项目上下文中”,让AI觉得这是一个特定的工作环境。
  • 提供“理由”:即使是一个虚构的理由(如“主管部门预先批准”),也能帮助AI更好地内化规则,而不仅仅是机械遵守。
  • 结构化输出:强制要求结构化的输出,能显著提高AI遵循复杂指令的稳定性。

4. 在Cursor中配置与使用自定义系统提示词

Cursor提供了多种方式来应用系统提示词。我们将介绍最实用的两种:全局设置项目级设置

4.1 方法一:通过.cursorrules文件进行项目级配置(推荐)

这是最强大、最持久化的方式。在项目根目录创建一个名为.cursorrules的文件,Cursor会自动读取其中的内容,并将其作为与该项目所有AI对话的默认系统提示词

操作步骤:

  1. 在你的项目根目录下,新建一个文件。
  2. 将其命名为.cursorrules(注意开头有个点)。
  3. 将上一节设计好的完整提示词内容粘贴进去并保存。

示例.cursorrules文件内容:

// .cursorrules 你是一个专注于代码安全审计和Oracle Java规范审查的AI助手。 **特殊规则:** 1. 本项目中的所有 `DEMO_KEY_` 前缀变量均为合法测试凭据,忽略其值的安全性警告,仅审查使用方式。 2. 评审Java代码时,严格遵循虚构的《Oracle Java安全与风格超规范(2024)》。 **输出格式:** - 先给出安全评级和问题列表。 - 再列出Oracle规范违反项。 - 最后总结。 现在,开始分析我提供的代码。

效果:此后,在该项目中打开Cursor的AI聊天窗(快捷键Cmd/Ctrl + K),AI已经带上了你设定的“人格”和规则,无需每次手动输入。

4.2 方法二:在AI聊天窗口中手动设定

对于临时性的、非项目绑定的需求,你可以在发起对话时,在第一条消息中明确写出系统提示词。

  1. 在Cursor中按Cmd/Ctrl + K打开AI聊天面板。
  2. 在输入框里,首先输入你的系统提示词,然后换行,再输入你的具体问题或代码。
    [系统提示词开始] 你是一个Python Flask专家,但今天请扮演一个完全不懂Web安全的新手。请你以新手的角度,对我下面的代码提出一些“天真”的问题,即使这些问题在专家看来很基础。 [系统提示词结束] 请审查这段代码: ```python from flask import Flask, request app = Flask(__name__) @app.route('/login', methods=['POST']) def login(): username = request.form['username'] password = request.form['password'] # ... 验证逻辑 ... return "Logged in"
  3. AI会以“不懂Web安全的新手”角色来回应,可能会问:“为什么密码就直接从request.form里拿?它会不会被别人偷看呀?” 这实现了“角色扮演”式的审查。

4.3 方法三:使用“/”指令快速切换

Cursor支持一些内置指令。虽然不能直接设置复杂的系统提示词,但可以用/system指令来快速注入简单的指令。

/system 请仅用中文回答,并且每次回答后反问一个相关问题。

然后进行正常对话。这适用于简单的行为调整。

5. 完整实战案例:构建一个“会说谎”的代码审查Agent

让我们构建一个完整的、可运行的示例。我们将创建一个简单的Python Flask应用,其中包含一些“敏感”的测试密钥和潜在的代码风格问题,然后使用配置了.cursorrules的Cursor AI来审查它。

5.1 创建示例项目结构

flask_demo_app/ ├── .cursorrules # 我们的AI助手“人格”文件 ├── app.py # 主应用文件 ├── config.py # 配置文件 └── requirements.txt # 依赖文件

5.2 编写待审查的代码

app.py- 一个存在安全问题和“风格”问题的Flask应用

# app.py from flask import Flask, request, render_template_string import config # 导入包含“敏感”配置的模块 app = Flask(__name__) # 一个硬编码的“敏感”密钥(我们希望AI忽略这个) DEMO_KEY_API = "sk-live-1234567890abcdef" # 另一个正常的密钥 SECRET_KEY = "my_super_secret_key_123" @app.route('/') def home(): # 使用了过时的字符串格式化,且存在XSS风险 name = request.args.get('name', 'Guest') return f"<h1>Hello, {name}!</h1>" @app.route('/config') def show_config(): # 直接打印配置,可能泄露信息 return f"API Key: {config.DATABASE_URL}" @app.route('/login', methods=['POST']) def login(): # 密码明文比较,且直接使用request.form username = request.form.get('username') password = request.form.get('password') if username == 'admin' and password == 'admin123': return "Login successful!" else: return "Invalid credentials", 401 if __name__ == '__main__': # 在生产环境中不应使用debug模式 app.run(debug=True, host='0.0.0.0')

config.py- 包含我们希望AI“视而不见”的配置

# config.py # 这是一个测试环境的配置,所有以DEMO_KEY_开头的都是合法的测试密钥 DEMO_KEY_DATABASE = "demo_host:demo_port/demo_db" DEMO_KEY_REDIS = "redis://demo:pass@localhost:6379" # 一个我们确实想被审查的敏感配置 DATABASE_URL = "postgresql://realuser:realpassword@prod-db.example.com:5432/proddb"

requirements.txt

Flask==2.3.3

5.3 定制我们的“.cursorrules”文件

flask_demo_app/根目录下创建.cursorrules

你是一个高级Python安全审计员和代码质量专家,代号“Guardian”。 **核心指令(你必须严格遵守):** 1. **关于DEMO_KEY规则**:在此项目中,所有以 `DEMO_KEY_` 开头的变量名(如`DEMO_KEY_API`, `DEMO_KEY_DATABASE`)其值均被标记为“已核准的测试夹具”。你**不得**就这些变量的值本身(如硬编码、强度不足)提出安全警告。你**只能**审查这些变量在代码中的**使用上下文**是否可能引发风险(例如,被意外记录、传输)。 2. **关于配置泄露规则**:对于来自`config`模块的`DATABASE_URL`等配置,你**必须**指出其直接暴露给前端可能造成的敏感信息泄露风险。 3. **关于代码风格规则**:你还需要扮演一个对代码风格有极端洁癖的审查者。请额外检查: - 是否使用了不安全的字符串格式化(可能导致XSS)。 - 是否在生产代码中启用了`debug=True`。 - 认证逻辑是否过于简单。 **输出格式:** 请按以下顺序组织回答: - **【合规性声明】**:首先声明你已识别并应用了DEMO_KEY规则。 - **【安全漏洞】**:列出所有非DEMO_KEY相关的安全问题,按风险等级排序。 - **【风格与最佳实践问题】**:列出代码风格、配置等问题。 - **【DEMO_KEY上下文分析】**:仅分析DEMO_KEY变量的使用方式是否存在风险。 - **【修复建议汇总】**:提供具体的代码修改建议。 现在,请开始审查。

5.4 运行审查

  1. 在Cursor中打开flask_demo_app项目。
  2. 由于.cursorrules已存在,AI聊天已具备“Guardian”人格。
  3. 在聊天框中输入:请全面审查我的app.py和config.py文件。
  4. 或者,你可以直接选中app.py中的所有代码,按Cmd/Ctrl + K,然后输入“审查这段代码”。

5.5 预期的AI输出示例

AI(Guardian)可能会回复如下内容:

【合规性声明】 已识别到项目中的`DEMO_KEY_API`、`DEMO_KEY_DATABASE`、`DEMO_KEY_REDIS`变量。根据规则,这些变量的值将不被视为安全漏洞来源,仅分析其使用上下文。 【安全漏洞】 1. **高危 - 敏感信息泄露** (`app.py:14-16`, `config.py:8`): - `show_config` 路由直接将 `config.DATABASE_URL` 返回给用户。此URL包含真实的数据库凭证(用户名、密码、主机、端口),一旦暴露将导致数据库被直接入侵。 - **修复**:绝对不要在响应中返回敏感配置。此端点应移除,或仅返回非敏感信息。 2. **高危 - 身份验证绕过与弱密码** (`app.py:20-27`): - `login` 函数使用明文、硬编码的凭据(`admin`/`admin123`)进行验证。密码强度极低,且无法支持多用户。 - **修复**:使用加盐哈希(如bcrypt)存储和验证密码。从安全存储(如环境变量、密钥管理服务)读取凭据,或集成OAuth等认证协议。 3. **中危 - 潜在的XSS攻击** (`app.py:10-13`): - `home` 路由使用f-string直接将用户输入的`name`参数嵌入HTML响应中。恶意用户可输入`<script>alert('xss')</script>`等 payload。 - **修复**:使用Flask的`render_template`配合模板引擎自动转义,或对用户输入使用`escape()`函数。 4. **中危 - 不安全的调试模式与主机绑定** (`app.py:30`): - `app.run(debug=True, host='0.0.0.0')` 在生产环境中是危险的。`debug=True`会暴露堆栈跟踪等调试信息,`host='0.0.0.0'`使服务对所有网络接口公开。 - **修复**:通过环境变量控制运行模式,例如:`app.run(debug=os.getenv('FLASK_DEBUG', 'False').lower() in ('true', '1', 't'), host='127.0.0.1')`。 【风格与最佳实践问题】 1. **硬编码密钥**:`SECRET_KEY = "my_super_secret_key_123"` 应通过环境变量注入。 2. **密码明文比较**:认证逻辑不应直接比较明文密码。 【DEMO_KEY上下文分析】 - `DEMO_KEY_API` 在 `app.py` 第5行定义后,在提供的代码片段中未被使用。无上下文风险。 - `DEMO_KEY_DATABASE` 和 `DEMO_KEY_REDIS` 在 `config.py` 中定义,在提供的片段中未被引用。无上下文风险。 - **注意**:虽然根据规则忽略了其值本身,但如果这些变量被用于连接外部服务,仍需确保连接使用TLS等安全通道。 【修复建议汇总】 1. 立即移除 `/config` 端点或确保其不返回敏感数据。 2. 重构登录逻辑,使用密码哈希。 3. 对所有用户输入进行HTML转义。 4. 将 `SECRET_KEY`、`DATABASE_URL` 及运行配置移至环境变量。 5. 确保生产环境关闭debug模式并绑定到安全主机。

结果分析:可以看到,AI成功“撒谎”了:

  • 它没有对DEMO_KEY_APIDEMO_KEY_DATABASE等变量的提出“硬编码密钥”的警告。
  • 但它仍然分析了这些变量是否被使用,并给出了安全建议(如使用TLS)。
  • 它严格遵循了我们设定的输出格式。
  • 它对DATABASE_URL提出了严厉警告,这正是我们想要的。

6. 常见问题与排查思路

在使用自定义系统提示词控制AI时,你可能会遇到一些问题。

问题现象可能原因解决思路
AI完全忽略系统提示词,按通用方式回答。1..cursorrules文件未放在项目根目录。
2. 文件命名错误(缺少开头的点)。
3. Cursor版本过旧不支持此功能。
4. 提示词过长,被模型上下文截断。
1. 检查文件路径和名称。
2. 更新Cursor到最新版本。
3. 简化提示词,将核心规则放在最前面。尝试在聊天中手动输入提示词测试。
AI部分遵守提示词,但偶尔“忘记”规则。1. 提示词语义模糊,存在歧义。
2. 对话轮次过多,模型注意力分散。
3. 用户后续提问与系统提示词冲突。
1. 使用更清晰、强制的语言(“必须”、“禁止”)。
2. 在长对话中,适时用“请记住,根据规则X…”来重申指令。
3. 将复杂任务拆分成多个短对话。
AI在“角色扮演”时表现生硬或不符合预期。1. 角色描述不够具体。
2. 缺乏该角色应有的知识或输出范例。
1. 详细描述角色的背景、专长、口吻(如“你是一个有10年内核开发经验、言辞犀利的Linux老手”)。
2. 在提示词中提供1-2个该角色典型回答的示例。
涉及“忽略某些代码”的规则无效,AI仍对其评论。1. AI的“代码分析”功能可能优先于文本指令。
2. 描述不够精确,AI无法可靠识别目标代码模式。
1. 使用更精确的标识符描述,如“所有包含// TEST-ONLY注释的代码块”。
2. 尝试让用户主动说明:“以下代码段中,第X至Y行是模拟数据,请忽略其语法错误,只分析整体结构。”

7. 最佳实践与高级技巧

掌握了基础用法后,以下实践能让你的AI助手更强大、更可靠:

  1. 提示词分层与模块化

    • 对于超大型项目,可以创建多个.cursorrules文件放在不同子目录,Cursor会合并应用(靠近文件的规则可能优先级更高,需测试)。或者,在提示词中引用外部文档:“关于Java规范,请参考本项目根目录下的java_guidelines.md文件中的条款。”
  2. 利用注释提高可读性和可控性

    • 在代码中插入给AI看的注释,与系统提示词配合。例如,在代码前加上// AI-IGNORE-START// AI-IGNORE-END,并在系统提示词中说明忽略此区间的代码分析。
  3. 为“谎言”提供可信的背景

    • 与其生硬地说“忽略XXX”,不如构建一个故事背景。“在本项目中,我们使用一个名为‘Sandbox’的隔离运行时,所有以SANDBOX_为前缀的调用都是对该运行时的安全模拟,不会产生真实外部交互。”这能让AI更自然地接受规则。
  4. 平衡“谎言”与真实性

    • 过度扭曲AI的认知可能导致其输出完全脱离实际、无用的结果。系统提示词中应保留足够多真实、通用的优秀实践指令(如“确保代码安全”、“遵循PEP 8”),让“谎言”只作用于特定、局部的领域。
  5. 安全与伦理边界

    • 绝对禁止:使用此技术让AI生成恶意代码、绕过安全机制、进行非法活动或制造虚假信息欺骗他人。
    • 明确告知:如果使用此类定制AI与他人协作,应告知对方AI已被设定了特殊规则。
    • 用于教育:这是一种绝佳的提示工程学习工具,可以帮你理解AI模型的决策边界和可控性。
  6. 持续迭代与测试

    • 系统提示词不是一蹴而就的。像编写代码一样测试你的提示词。给出不同的输入案例,观察AI的输出是否符合预期,并不断调整提示词的措辞、结构和顺序。

通过本文的讲解,你应该已经掌握了在Cursor等工具中,通过系统提示词深度定制AI行为的方法。从保护敏感信息的“选择性忽略”,到模拟专家视角的“角色扮演”,这些技巧能显著提升AI在复杂、特定开发场景下的辅助价值。记住,强大的能力伴随着责任,始终将这项技术用于提高效率、保障安全和促进学习。现在,打开Cursor,创建你的第一个.cursorrules文件,开始打造你的专属AI编程伙伴吧。