
从Web应用里抓一次包或者把桌面程序安装目录翻个底朝天就能把别人打磨了好几个月的AI系统提示词完整带回家。这件事我干了三年从一开始纯靠试错到后来形成一套从Web到桌面的完整方法论中间踩过的坑比写过的代码还多。今天这篇就把这套方法完整拆开讲含金量不低值得你耐心读到最后。我先把结论放这里所谓AI提示词逆向工程核心不是“破解”什么高深的技术而是掌握三个基本能力——知道请求从哪里发出、知道代码在哪里组装字符串、知道怎么把碎片拼回完整逻辑。这三件事放在Web端和桌面端解法不同但思路一脉相承。这篇文章面向两类人一类是做AI产品想参考优秀实践的开发者另一类是纯粹对AI应用内部结构好奇的技术爱好者。文中的操作步骤我都尽量写得具体到可以直接抄作业但也请你记住能用好这套方法的人一定不是拿来直接抄的。1. 提示词逆向工程的整体思路1.1 为什么要逆向提示词不是抄袭是效率先讲清楚一个很容易被误解的问题我们为什么要逆向他人的系统提示词我自己做AI产品的时候最常听到的一句话是“从零开始写prompt”。这话听着没什么毛病但实际操作中你会发现从零写提示词的试错成本极高。尤其是输出格式、上下文组织、约束条件这些细节没个上百次迭代根本磨不出稳定效果。而行业里成熟的产品已经在特定任务上把提示词打磨到了相当完善的程度。逆向工程在这里的角色本质上是一种“竞品分析”。你去看别人怎么构造角色设定、怎么安排输出格式、怎么处理边界情况把这些设计思路吸收进自己的体系。这不是把A产品的提示词复制粘贴到B产品里而是借别人的成熟经验加速自己的迭代曲线。打个比方你不会因为看了米其林餐厅的菜单就把别人的菜谱原封不动端上桌但你会从中理解食材搭配和摆盘逻辑然后创造自己的菜。提示词逆向也是一个道理。还有一个更现实的原因行业里大量产品的提示词其实写得很失败。大家看到的效果差异本质上是提示词工程水平的差异。通过逆向工程研究和对比你能快速建立一套“什么算好提示词”的判断标准。这个标准的建立比抄多少条提示词都有价值。1.2 逆向工程的三个层级做提示词逆向我习惯把目标分成三个层级难度递增方法完全不同。第一层是明文请求层。绝大多数Web端AI产品系统提示词会直接附着在发给大模型服务的请求里。因为大模型API需要接收完整上下文客户端几乎不可能不发送system prompt。这一层的逆向门槛极低本质上是打开浏览器开发者工具、翻网络请求的事连代码都不用写。第二层是前端资源层。有些产品为了不让提示词那么显眼把系统提示词藏在打包好的JS文件、配置资源或本地存储里请求时再动态组装。这一层需要你会搜索前端静态资源能从动辄几MB的压缩代码里定位到关键词。难度中等大多数前端开发都能掌握。第三层是本地二进制层。主要出现在桌面应用里特别是原生C/C#程序或者把逻辑编译进二进制的壳应用。提示词被当作普通字符串塞进了可执行文件或者由多个模块动态拼接。这一层需要你具备基础的二进制分析和动态调试能力是真正的“逆向”。搞明白自己面对的是哪一层你才知道该往哪个方向使劲。我见过不少新手上来就直接掏反汇编工具结果目标明明只是第一层的Web应用白白浪费了几小时。正确的姿势是先分析目标形态再匹配对应层级的方法。1.3 准备工作与工具清单在正式动手之前先把工具备齐。这里我给出一份基于常见实践的经验清单你可以根据自己习惯调整。Web端需要的是Chromium内核浏览器现成开发者工具、curl命令行工具、以及一个顺手的代理抓包工具如Fiddler。代理抓包工具在你需要绕过浏览器开发者工具检测时特别有用。桌面端需要的是Node.js环境用于Electron解包、十六进制编辑器如HxD或ImHex、静态分析工具如DIE刚起步的话用Strings搜索就够了、以及动态调试工具如x64dbg。这些都是正版免费或开源的不需要额外购买。还有一个很容易忽略的准备工作准备好记录工具。逆向过程的信息碎片化严重随手记录能大幅提升后续整理的效率。我自己习惯用本地记录加一个专门的提示词档案库每个目标产品的关键发现都单独归档方便跨项目检索。2. Web端逆向实操从网络请求到JS静态资源2.1 基础操作从Network面板抓取系统提示词Web端的第一步永远是从浏览器开发者工具的网络面板开始。用 Chrome 或 Edge 打开目标AI产品按F12进入开发者工具切到Network标签页在过滤框里输入chat或sse然后发起一轮全新的对话。这里的关键词是“全新的对话”——我见过太多人直接在已有会话里发消息结果半天找不到system prompt其实是因为很多产品只在新建会话的第一轮请求里发送完整系统提示词后续多轮对话会省略以减少token消耗。触发请求后你会看到一堆网络条目冒出来其中那个带流式响应特征状态码200、content-type为text/event-stream的就是核心请求。点开它切到“载荷”或“请求”面板找到messages数组。数组里role为system的第一项通常就是完整的系统提示词。结构大概是这样的{ model: gpt-4o-mini, messages: [ {role: system, content: 你是一个帮助用户提取文章摘要的助手输出格式为Markdown需包含核心论点、关键数据和结论三个部分...}, {role: user, content: 请总结以下文章...} ], temperature: 0.3, stream: true }有几个细节需要特别注意。第一如果目标是流式响应系统提示词一般不会拆分在响应体里而是完完整整出现在请求体里。第二部分产品会把提示词放在请求头header或者URL参数里所以光看载荷标签页不够要连同请求头一起检查。第三如果你用手机浏览器调试用Chrome的“远程设备”功能或直接在移动端页面检查逻辑是一样的。拿到提示词后别急着关面板。把请求右键导出为cURL命令保存下来备用。后面如果你想测试提示词在不同输入下的表现直接改cURL里的user消息内容重新发送就行不需要再开浏览器。2.2 进阶操作在JS静态资源里翻找动态组装逻辑如果Network面板里干干净净连像样的请求都找不到说明系统提示词不是直接发出去的而是在前端代码里动态组装。这时候战场转到JS静态资源。回到Network面板按CtrlShiftF打开全局搜索注意是全资源搜索不只是当前页面输入目标产品的独有词组或常见提示词片段比如你是、You are、temperature、system_prompt。搜索可能会很慢因为打包后的JS体积动辄几MB甚至几十MB但耐心等一等结果一般会指向某个JS文件。点进命中的文件在Sources面板里点击右上角的{}美化按钮格式化代码再按关键词搜索定位。这时候你大概率会看到类似这样的代码模式const SYSTEM_PROMPT [ {role: system, content: 你是一位专业的法律顾问...}, {role: system, content: 回答需引用具体法条格式必须包含【结论】和【依据】...} ];function buildMessages(userInput) { return [...SYSTEM_PROMPT, {role: user, content: userInput}]; }这种就把提示词拆成了多个片段由函数在请求时统一组装。你只要顺着引用关系把参与拼接的字符串全部找出来就能还原完整的提示词。这里有一个经验之谈很多前端框架喜欢把提示词模板放在单独的constants或prompts.js文件里并且用数组而不是字符串来管理。如果你在全局搜索里直接搜一整句话搜不到可以换思路搜某个独特的短语片段比如业务关键词、特定的人称代词往往比搜完整句子更容易命中。还有一种情况是提示词本身不在JS里而在后端的某个配置接口里。前端启动时会调一个接口拉取配置提示词作为配置的一部分返回。这种情况下的思路很清晰清空缓存刷新页面然后盯着Network面板看哪几个请求是在页面加载早期发出的它们的响应体里常常藏着完整提示词。2.3 绕过开发者工具检测的几种替代方案部分成熟产品会做前端防护最常见的两种是检测开发者工具是否打开、检测请求来源是否是自动化工具。检测到之后要么改变接口返回要么直接在页面上弹一个无效提示让逆向的人误以为没有提示词可抓。面对这种情况千万别硬刚。绕开的办法不少而且都简单。第一个办法是换Firefox的开发者工具。不少前端检测脚本只针对Chrome的调试协议Firefox的检测覆盖没那么全。第二个办法是用独立的代理抓包工具比如Fiddler或Charles把浏览器的流量代理过去。这样前端代码完全感知不到自己在被监控你只需要在代理工具里过滤目标域名的请求即可。第三个办法是用浏览器扩展关闭检测脚本比如某些反检测扩展能拦截频闭调试检测的定时器。我之前调试某AI写作助手时就遇到过类似情况页面一旦打开开发者工具就开始卡顿请求全部502。后来直接用Fiddler抓包前后不到五分钟就把系统提示词完整拿到了。这种例子不在少数说明抓包工具是每个做逆向的人包里必备的老伙计。3. 桌面端逆向深入Electron壳与原生二进制3.1 Electron壳应用解包比想象中简单桌面AI应用里Electron框架占了一大半。这类应用有个先天特点核心代码全部打包在app.asar文件里而这个文件本身就是为解包设计的。表面上是个exe实际上跟解压Zip没什么区别。具体操作是先正常安装应用打开安装目录找到resources文件夹下的app.asar然后执行解包命令npx asar extract app.asar app_extracted解包完你会得到一个完整的Node.js项目目录里面包含主进程代码、渲染进程代码、预加载脚本以及各种静态资源。接下来就是熟悉的搜索环节在解包目录里全局搜索关键词比如你是、You are、system、prompt。不出意外几分钟内就能找到完整的提示词定义。但我必须提醒一个容易踩的坑Electron应用的提示词不一定只存在于一个文件里。有的放在主进程的某个模块里有的放在渲染进程的公共代码中还有的在预加载脚本里通过IPC通道传过去。建议搜索的时候不要只盯一种文件类型.js、.ts、.json、.html全都要扫一遍。另外部分应用会把提示词做进远程配置本地只有拉取逻辑这时候你需要在代码里找那个配置接口的URL然后回Web端用开发者工具请求它。还有一种情况是提示词被编译进了Node原生模块.node文件或者wasm文件。这种场景处理起来要麻烦一些得用字符串扫描工具在二进制文件里搜关键词通常也会搜到但提取出来的内容可能包含噪音字符需要手动清洗。3.2 原生应用与二进制字符串排查如果目标不是Electron而是一个传统的原生桌面程序比如C或C#编写那逆向难度会明显上一个台阶。但思路依然清晰无论你用什么语言写桌面程序只要它要调用大模型API提示词就必须在本地某处存在——要么明文要么组装后发送。原生应用的第一步永远是静态字符串扫描。用十六进制编辑器HxD或ImHex都可以打开主程序exe搜索UTF-8编码的中文提示词片段比如“你是一个”“请严格遵守”“输出格式为”。如果运气好整段提示词会静静地躺在那里直接复制出来清洗多余字符即可。如果静态扫描一无所获说明提示词可能是动态拼接的或者被加密混淆过。这时就要走动态调试路线用调试器加载程序给网络发送相关的API函数下断点观察内存缓冲区。每当程序调用API时断点处就能看到完整提示词内容。这个过程门槛较高需要你略懂x86/x64指令和调用约定但对有经验的同行来说反而是最通用的手段。还有一条性价比极高的捷径别忽略安装应用后先去本地数据目录翻配置文件、缓存和日志文件。对Windows应用来说常见位置是C:\Users\[用户名]\AppData\Roaming或Local下以产品名命名的文件夹。里面的localStorage、SQLite数据库、.log文件非常有可能藏着提示词片段甚至完整的system prompt。我甚至遇到过某应用把最近几轮请求体完整写到日志里的情况等于直接送上门来。先把这些“软柿子”捏完再考虑上动态调试这类硬骨头。3.3 运行时内存快照最后一根救命稻草还有一种比较少见但偶尔能救命的方法运行时内存快照。适用场景是提示词被加密、混淆或只在实际调用时才出现在内存里。做法是先把应用跑起来触发一次对话让它调用大模型API然后用进程工具比如Process Explorer把进程的完整内存镜像导出再用字符串扫描工具在镜像文件里搜索提示词片段。这个方法听着很硬核实际实现起来其实不复杂但导出的内存文件可能动辄几个GB搜索过程很耗时间。我的建议是先用命令行工具把扫描范围缩小到堆区域避免在海量无关内存里大海捞针。这种方法我会留给绝大多数静态和动态方案都失效的时候才用因为性价比确实不高。4. 系统化提炼从杂乱文本到可复用模板4.1 四步法提取、标注、剥离、重建拿到原始提示词只是第一步真正产生价值的是把原始材料加工成可以复用的设计资产。这里分享我个人总结的四步法。第一步是提取把找到的提示词文本完整保存保留原始的换行、缩进和特殊分隔符。不要嫌麻烦去格式化因为提示词里的换行和缩进往往本身就是设计的一部分会影响模型对结构的理解。第二步是标注给每一段内容打标签比如“角色定义”“输出格式”“限制条件”“私有变量”“运行时参数”。标注的过程其实就是理解作者意图的过程。我经常发现同一段提示词里揉合了角色、格式、情感、约束四层信息拆开标注之后逻辑清晰很多。第三步是剥离去掉产品特有的变量名、函数名、静态资源地址、特定风格的措辞。这些内容跟“提示词工程”本身无关而是产品的业务实现细节。剥离得越干净通用性越强。第四步是重建用通用语言重新组织规则替换成自己产品里的真实业务定义。这一步是创造不是复制。你应该在这个过程中加入自己的行业知识、产品定位和用户群体特征让提示词为您所用。举个例子我研究某信息提取类产品时发现它的提示词采用了“上层角色中层格式定义底层任务描述”的三层结构。我把这个结构模式提取出来替换成自己产品的人设和业务约束后效果立竿见影。这个三层结构后来成了我自己团队内部的一个基础模板经过多轮迭代已经看不出原产品的影子但设计精髓保留了下来。4.2 如何建立自己的提示词档案库方法论有了还需要一个组织知识的系统。强烈建议你从第一天起就建立“提示词设计档案库”。档案库的粒度按主题管理比如“摘要提取”“实体识别”“情感分析”“代码解释”每个主题下存三样东西原始参考资料、提炼出的通用结构、你自己产品的最终版本。这样当你遇到类似需求时不需要从零开始直接打开档案库就能看到过去所有研究沉淀出的最优方案。我用这个习惯已经三年了档案库里积累了上百条提示词条目。每次公司里新同事问某个提示词怎么写我几乎都能从档案库里找到可参考的半成品项目的启动速度明显加快。这也是逆向工程真正该有的价值——把别人的经验消化成自己的资产。4.3 参数还原温度、Top-P与停止词这些隐性细节提示词逆向只还原文本是不够的跟提示词一起出现的采样参数同等重要。很多时候同样的提示词不同的温度参数会输出完全不同的结果。在Web端的Network面板里请求载荷中的temperature、top_p、frequency_penalty、presence_penalty、stop这些字段属于“隐性提示词”。你要跟文本一起记录。举例来说如果某产品把温度设为0.2说明它极其强调确定性输出这种人设和业务特征会直接影响你复刻时的参数选择。我还整理过一个小经验把参数和提示词放在同一个档案条目里用表格维护对照关系。这样日后复刻时不需要再回翻原始请求。一开始可能会觉得麻烦但长期积累下来价值极大。5. 常见问题与技术陷阱排查逆向过程中的坑很多这里挑几个最常见的写出来都是我实操中真刀真枪踩过的。5.1 请求体被加密或压缩怎么办不少成熟产品不会把请求体明文发送而是做一次base64编码或gzip压缩后再放到某个二进制字段里。这种情况在Network面板里看到的只是一串乱码或纯字符串没法直接阅读。我的处理思路是分两层。第一层是看响应体因为响应通常至少要包含可读的文本片段模型生成的回答必须可读而且系统提示词往往会影响响应风格。第二层是回到JS资源里查加密逻辑找到加密函数后在Console里调用一次把请求体当场解密。这个方法有效率但有前提——前端加密函数得在全局可访问如果被闭包包住就得在断点处修改上下文变量来调用它。5.2 提示词被拆成碎片后如何拼回有些产品刻意把提示词拆成多个模块分别存放在不同JS文件里到请求时再动态拼接。直接按关键词搜索只能找到碎片拼不回全貌。这种情况我的做法是先找到所有包含提示词片段的文件然后顺着代码里buildMessages或concat这类拼接函数的引用关系把参与拼接的变量全部收集起来。大部分时候拼接顺序在代码里是明确写在数组里的顺着索引重建即可。如果拼接顺序是动态计算的那就只能通过修改代码或断点观察运行时值来推断。5.3 中文内容乱码的编码问题桌面应用里字符串不一定是UTF-8编码。老式原生程序常用UTF-16在十六进制编辑器里用UTF-8搜索中文完全找不到。正确做法是把搜索编码切到UTF-16模式或者直接搜索关键词的十六进制字节序列。另外注意BOM头有BOM的文件的偏移量会不同搜索会偏离。一个小技巧是如果目标程序是中文产品优先搜简体中文的独有词汇比如“请”“你是一个”“输出”。这些词在二进制里出现的频率很低命中率比英文通用词更高。5.4 频繁操作触发限流或拦截逆向最怕的不是目标做了什么高深的防护而是自己把自己搞到IP被限。如果你反复刷新页面或重放请求服务端的WAF完全可能判断为异常流量然后返回429或直接封锁接下来的请求。遇到这种情况先停手等几分钟让限流窗口过去再逐步放慢操作节奏。另外尽量模拟真实用户的操作间隔不要在短时间内连续发几十个请求。这既是保护自己也是对目标产品的基本尊重。5.5 开发者工具被前端检测替代方案不少产品会在前端代码里挂一个定时器循环检查window.outerWidth - window.innerWidth是否大于某个阈值判断开发者工具是否打开。检测到之后页面行为会彻底变化让你误以为没有提示词。前面提过用Firefox开发者工具或独立代理抓包工具可以绕开。这里再补充一个技巧可以把调试窗口改成独立的弹出窗口而不是浏览器内嵌面板很多检测脚本只对内嵌面板生效。甚至在极少数极端情况下直接用无头浏览器如Playwright去访问页面既不会触发开发者工具检测又能完整捕获网络流量。6. 边界问题逆向与责任的平衡6.1 合法性与道德边界提示词逆向这块法律和道德的边界必须讲清楚。我见过不少人踩线最后搞得很难看所以这里多说几句。先说合法性。你正在使用、有合法访问权限的软件对其进行有限的研究性分析通常属于合理使用的范畴。但如果你直接把逆向出来的提示词原封不动搬到自家商用产品里就可能涉及侵犯著作权尤其是当提示词里包含大量产品特有业务规则时。这跟抄代码是一回事。再说道德。逆向的初衷应该是学习和研究。把目标产品的提示词当作理解AI产品设计思路的窗口而不是免费午餐。同行之间应该有一种默契研究可以直接复刻不行。6.2 公开分享时的信息脱敏建议不少朋友喜欢写技术分享文章我理解但这种时候一定要做好信息脱敏。在公开场合描述逆向成果时不要点名特定产品更不要贴出完整的原始提示词。建议抽象的表述为“某AI写作助手”“某信息提取工具”并且只展示提炼后的通用结构而不是原始内容。这样既保住了分享的价值也避免自己陷入侵权纠纷。我自己的博客文章全部遵循这个原则。6.3 逆向工程的真正价值在于正向设计学了逆向技巧之后最重要的事情反而跟逆向无关——是反过来用在自己产品的设计上。既然提示词逆向如此普遍那我们自己开发AI应用时要不要想办法把提示词藏起来我的观点是不要做太多无效隐藏。原因很简单只要提示词要发给大模型客户端侧就无法完全隐藏你只能保护核心商业信息和业务规则把它们放到服务端动态拼接不塞进前端代码。另外可以把逆向工程方法论用来自测产品安全性。比如扮演攻击者角色检验自家应用的提示词是否容易被提取、是否容易受到提示词注入攻击。这些都是专职安全测试之外同样有价值的工作。7. 实操总结与长期方法论沉淀这一路做下来我对提示词逆向工程的体会可以浓缩成几句话。它不是“破解技术”而是理解现代AI产品工程实现的一种路径。每一个提示词背后都承载着一个团队对业务、模型和用户需求的思考过程。我们研究它们是为了站在前人的肩膀上而不是把他们拽下来。具体到实际操作层面我的建议是先Jo住Web端的明文请求层这个门槛最低跑通一次全流程你就有信心了。然后逐步向JS资源层、桌面二进制层推进。每次研究完一个目标都整理一份提示词设计档案。坚持几个月之后你会发现自己的提示词设计能力和对AI产品架构的理解都会有质的提升。最后分享一个小技巧做逆向时多留意那些“失败”的提示词结构。很多产品的提示词并不完美里面甚至有明显冗余或逻辑漏洞。分析这些失败案例往往比研究成功案例更能锻炼判断力——你知道什么不该做比知道什么该做更珍贵。总的来说这套方法论在实践中能带来的最大收益是让你从“只会用AI”升级为“懂AI产品为什么这样做”。这条路没有捷径唯有多动手、多记录、多反思。如果你在实操中也遇到了有意思的案例或问题欢迎来交流我们一起把这条路上的地图画得更完整。