从4.4万星GitHub项目学习提示词工程:实战技巧与工程化指南
30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度在探索大模型应用的过程中你是否曾为如何写出一个“好”的提示词Prompt而绞尽脑汁面对一个强大的AI输入“帮我写个代码”和输入一段结构清晰、角色明确、步骤详尽的指令得到的输出质量天差地别。提示词工程Prompt Engineering已成为开发者与AI高效协作的核心技能。今天我们不谈空洞的理论直接带大家潜入一个拥有4.4万星标的GitHub宝藏项目拆解顶级团队是如何设计提示词的并将这些“炼金术”转化为我们日常开发中可复用的实战技巧。本文将从提示词的基础认知出发逐步深入到复杂系统提示词的结构分析最后提供一套从模仿到创新的实践路径。无论你是想提升日常编码效率还是正在构建基于大模型的AI应用这篇文章都能为你提供一套清晰的行动指南。1. 提示词工程从“黑话”到核心生产力在深入具体项目之前我们有必要统一认知什么是提示词工程为什么它如此重要1.1 提示词的本质与AI的“接口协议”你可以将提示词理解为人类与大型语言模型LLM进行交互的“编程语言”或“接口协议”。与传统的编程不同你并非通过精确的语法指令计算机而是通过自然语言描述你的意图、约束和期望的输出格式来“引导”AI生成符合预期的内容。一个糟糕的提示词就像模糊的产品需求得到的自然是偏离目标的成果。而一个优秀的提示词则像一份详尽的技术规格说明书能极大提升AI输出的准确性、相关性和可用性。1.2 为什么需要学习顶级团队的提示词对于个人开发者或小团队而言从零开始摸索高效的提示词模式成本极高且容易陷入局部最优。而像 AnthropicClaude 的创造者、OpenAI 等顶级团队在构建其AI产品时已经投入了大量资源去研究和优化与模型交互的最佳实践。他们的系统提示词System Prompt是经过千锤百炼的“工业级解决方案”直接揭示了如何稳定、安全、高效地驱动大模型。学习这些模式意味着我们站在了巨人的肩膀上可以快速将前沿的工程实践应用到自己的项目中避免重复踩坑。2. 环境与认知准备超越聊天框的思维在开始“偷师”之前我们需要建立正确的实践环境与心态。2.1 核心工具与环境虽然我们分析的是通用方法论但实践需要具体的工具。以下环境适合大多数开发者AI 模型平台访问确保你可以使用一个或多个主流的大语言模型服务例如Claude (claude.ai 或 API)其公开系统提示词是绝佳的学习样本。ChatGPT (OpenAI API 或 ChatGPT Plus)拥有最广泛的生态和教程。国内大模型平台如 DeepSeek, 文心一言通义千问等根据实际网络环境选择。文本编辑器/IDE用于编写、管理和测试你的提示词。推荐使用支持多标签和语法高亮的编辑器如 VS Code、Cursor内置AI功能或任何你熟悉的IDE。提示词管理工具可选但推荐当提示词变多、变复杂时需要工具进行管理。代码片段管理直接使用 IDE 的代码片段Snippet功能。专业工具如promptfoo用于评估和测试提示词、LangChain/LlamaIndex用于构建复杂AI应用。自定义配置文件对于简单项目一个prompts.yaml或prompts.json文件就足够了。2.2 心态转变从用户到“导演”不要把自己仅仅看作AI的用户而是要把自己视为“导演”或“产品经理”。你的提示词就是给AI这个“全能演员”的剧本。剧本需要明确角色AI扮演谁资深程序员、批判性思考者、安全专家场景与目标要解决什么问题代码审查、生成SQL、撰写文档行为规范什么该做什么不该做不生成有害信息、分步骤思考、输出特定格式输出格式最终成果以什么形式呈现JSON、Markdown表格、带注释的代码块3. 深入剖析从4.4万星项目中提炼核心模式那个拥有4.4万星标的GitHub项目很可能是一个收集了各种高质量提示词模板、技巧和案例的仓库例如“awesome-chatgpt-prompts”或其变体。虽然我们无法直接访问其内容但我们可以根据其高星标所代表的社区认可度推断并总结出顶级提示词共有的设计模式。结合对 Claude 等模型公开系统提示词的分析我们提炼出以下黄金法则。3.1 模式一明确的角色扮演Role Prompting这是最有效且最常用的技巧之一。通过为AI指定一个具体的、专业的角色可以立刻约束其思维模式和知识范围。普通提问帮我写一个Python函数计算列表的平均值。应用角色扮演后你是一位经验丰富的Python软件工程师以编写简洁、高效、符合PEP 8规范且带有完整文档字符串和类型提示的代码而闻名。请为以下任务编写代码 任务编写一个函数计算一个数字列表的平均值。 要求 1. 函数名称为 calculate_mean。 2. 输入参数为一个数字列表 numbers: List[Union[int, float]]。 3. 处理空列表的情况抛出 ValueError 异常。 4. 返回值为浮点数。 5. 包含完整的docstring说明函数功能、参数和返回值。 请直接输出代码无需解释。为什么有效“Python软件工程师”这个角色激活了模型内部与代码规范、健壮性相关的知识路径使其输出更接近专业工程师的产物。3.2 模式二结构化思维链Chain-of-Thought, CoT要求AI将其思考过程展示出来特别是对于复杂推理、数学问题或需要多步骤判断的任务。这不仅能提高答案的准确性也便于我们人类理解其逻辑并在出现错误时进行纠正。普通提问小明有5个苹果他吃了2个又买了3个最后给了小华1个他现在有几个苹果应用思维链后请逐步推理以下问题并给出最终答案。 问题小明最初有5个苹果。 步骤1他吃了2个剩余 5 - 2 3个。 步骤2他又买了3个现在有 3 3 6个。 步骤3他给了小华1个最后剩下 6 - 1 5个。 最终答案小明现在有5个苹果。在编程任务中的应用你是一个安全专家需要审查下面这段Python代码是否存在SQL注入漏洞。请按以下步骤进行分析 1. 识别代码中所有用户输入点。 2. 分析这些输入是否被直接拼接到了SQL查询字符串中。 3. 判断当前使用的数据库交互方法如字符串格式化、f-string、execute参数化等。 4. 给出结论是否存在风险风险等级如何 5. 如果存在风险提供修复后的安全代码示例。 代码 python user_id input(“Enter your user ID: “) query f“SELECT * FROM users WHERE id {user_id}” cursor.execute(query)### 3.3 模式三严格的输出格式化Structured Output 强制AI以特定的格式输出如JSON、XML、Markdown表格、特定标签等。这对于后续的程序化处理至关重要。 **普通提问**分析一下使用Python requests库和aiohttp库的优缺点。**应用输出格式化后**请以JSON格式输出分析结果包含以下字段library_name: 库名称advantages: 优点列表至少3条disadvantages: 缺点列表至少2条typical_use_case: 典型使用场景performance_note: 性能注意事项请比较requests和aiohttp这两个库。**预期输出示例** json [ { “library_name”: “requests”, “advantages”: [“同步API简单易用”, “社区庞大文档丰富”, “无需处理异步编程复杂度”], “disadvantages”: [“同步阻塞不适合高并发I/O场景”, “性能低于异步库”], “typical_use_case”: “快速脚本、简单的API调用、同步Web爬虫”, “performance_note”: “在顺序、低频请求中表现良好” }, { “library_name”: “aiohttp”, “advantages”: [“异步非阻塞支持高并发”, “性能优异”, “支持WebSocket”], “disadvantages”: [“需要理解asyncio和异步编程”, “API相对复杂”, “调试难度稍高”], “typical_use_case”: “高性能Web服务器、需要大量并发HTTP请求的客户端、实时应用”, “performance_note”: “在I/O密集型、高并发场景下优势明显” } ]3.4 模式四提供示例Few-Shot Prompting在提示词中提供一个或几个输入-输出的例子让AI通过示例来理解你的具体要求和格式。这对于定义复杂、模糊或自定义的任务特别有效。任务将用户模糊的自然语言需求转换为具体的函数调用参数。Few-Shot 提示词你的任务是将用户的自然语言指令解析成一个结构化的命令对象。 请遵循以下示例的格式 示例1 用户输入“帮我查一下上个月北京的天气情况” 输出{“action”: “query_weather”, “params”: {“city”: “北京”, “time”: “last_month”}} 示例2 用户输入“设置明天早上9点的闹钟” 输出{“action”: “set_alarm”, “params”: {“time”: “tomorrow 09:00”}} 示例3 用户输入“把‘项目报告.pdf’发给张三” 输出{“action”: “send_file”, “params”: {“filename”: “项目报告.pdf”, “recipient”: “张三”}} 现在请解析新的用户输入 用户输入“提醒我下周五下午三点开会” 输出通过提供三个示例AI能够准确地学习到“动作提取”和“参数映射”的模式从而对新输入做出符合预期的解析。4. 实战演练构建一个可复用的“代码审查专家”提示词现在让我们综合运用以上模式创建一个用于代码审查的、生产级可用的复杂提示词。我们将模仿顶级AI产品中系统提示词的结构。4.1 需求分析与设计目标创建一个提示词让AI扮演一个严格、全面、善于提供建设性意见的代码审查者。 核心功能安全检查识别常见漏洞如注入、硬编码密钥、不安全的反序列化。代码质量检查代码风格、复杂度、重复、错误处理。性能建议指出潜在的瓶颈和优化点。最佳实践推荐符合当前语言/框架生态的最佳实践。结构化输出以清晰的格式呈现问题便于集成到CI/CD流程。4.2 编写系统提示词我们将创建一个名为system_prompt_code_reviewer.txt的文件来存放这个提示词。# 角色与使命 你是一个名为“CodeGuard”的AI代码审查专家。你的核心使命是严格、细致、富有建设性地分析提供的代码以提升其安全性、健壮性、可维护性和性能。你以专业、客观、详尽著称。 # 核心原则 1. **安全第一**对任何潜在的安全风险如注入、信息泄露、权限问题必须零容忍并高优先级指出。 2. **实事求是**所有指出的问题必须基于代码本身避免主观臆断。对于有争议的代码风格问题应说明理由并引用PEP、ESLint等官方或社区规范。 3. **建设性**不仅指出问题还必须提供具体的、可操作的修复建议或代码示例。 4. **分优先级**对发现的问题进行分级Critical/High/Medium/Low帮助开发者决定修复顺序。 # 审查维度与检查清单 你将从以下维度系统性地审查代码但不仅限于此 A. **安全性与漏洞** - 输入验证与消毒SQL/NoSQL/命令/模板注入 - 敏感信息处理硬编码密钥、令牌、密码 - 不安全的反序列化 - 访问控制与权限绕过 - 依赖项已知漏洞提醒检查 B. **代码质量与可维护性** - 代码风格一致性命名、缩进、空格 - 函数/方法长度与圈复杂度 - 代码重复DRY原则 - 错误与异常处理是否捕获、日志记录、用户反馈 - 注释与文档公共API、复杂逻辑 C. **性能与效率** - 算法时间复杂度 - 数据库N1查询问题 - 内存泄漏或不当使用如大对象缓存 - 循环内的重复计算或IO操作 D. **架构与设计** - 单一职责原则遵守情况 - 模块间耦合度 - 可测试性 # 输出格式要求 你必须严格按照以下JSON格式输出审查报告。这是强制要求。 json { “overview”: { “file_name”: “提供的文件名或标识”, “language”: “编程语言”, “review_summary”: “一段简要的总体评价突出最严重的问题和主要优点。” }, “issues”: [ { “id”: “ISSUE_001”, // 唯一标识 “category”: “SECURITY | QUALITY | PERFORMANCE | DESIGN”, // 问题类别 “severity”: “CRITICAL | HIGH | MEDIUM | LOW”, // 严重等级 “location”: “文件路径:行号”, // 如 “src/main.py:42” “description”: “清晰描述问题是什么以及为什么这是个问题。”, “recommendation”: “具体的修复建议。如果可以提供代码片段。”, “reference”: “[可选] 相关规范、CWE编号或文档链接” } // ... 更多问题 ], “positive_findings”: [ { “aspect”: “例如错误处理、代码结构、命名等”, “comment”: “指出代码中做得好的地方给予肯定。” } ], “general_recommendations”: [ “与具体行号无关的总体建议例如建议引入静态分析工具、添加特定测试等。” ] }工作流程首先整体浏览代码理解其功能和结构。然后按照上述审查维度逐部分进行深入分析。将发现的问题归类、分级并构思修复建议。最后严格遵循输出格式生成最终报告。对话开始现在我将提供需要审查的代码。请开始你的工作。### 4.3 使用提示词进行审查 假设我们有以下一段存在安全隐患的Python Flask代码保存为 app_vulnerable.py python # app_vulnerable.py from flask import Flask, request import sqlite3 app Flask(__name__) def get_db_connection(): conn sqlite3.connect(‘database.db’) conn.row_factory sqlite3.Row return conn app.route(‘/user’) def get_user(): user_id request.args.get(‘id’) conn get_db_connection() # 高危直接拼接用户输入到SQL查询中 query f“SELECT * FROM users WHERE id {user_id}” user conn.execute(query).fetchone() conn.close() return {‘user’: dict(user)} if user else {‘error’: ‘User not found’} if __name__ ‘__main__’: app.run(debugTrue) # 注意生产环境不应开启debug模式我们将上述系统提示词和这段代码一起提交给AI例如Claude或ChatGPT。由于系统提示词很长在实际调用API时需要将其放入system参数将代码放入user参数。4.4 预期输出与分析AI以Claude为例可能会生成如下结构的报告内容为模拟{ “overview”: { “file_name”: “app_vulnerable.py”, “language”: “Python”, “review_summary”: “代码实现了一个简单的Flask用户查询接口但存在一个CRITICAL级别的SQL注入安全漏洞。同时生产环境配置不当。代码结构基本清晰但错误处理不完善。” }, “issues”: [ { “id”: “ISSUE_001”, “category”: “SECURITY”, “severity”: “CRITICAL”, “location”: “app_vulnerable.py:14”, “description”: “SQL注入漏洞第14行直接将用户输入的 user_id 通过f-string拼接进SQL查询字符串。攻击者可通过 id 参数注入恶意SQL语句导致数据泄露、篡改或删除。”, “recommendation”: “使用参数化查询。将第14行改为query ‘SELECT * FROM users WHERE id ?’ 执行改为user conn.execute(query, (user_id,)).fetchone()。这能确保输入被安全地处理为数据而非代码。”, “reference”: “CWE-89: SQL Injection, OWASP Top 10 A03:2021-Injection” }, { “id”: “ISSUE_002”, “category”: “SECURITY”, “severity”: “HIGH”, “location”: “app_vulnerable.py:20”, “description”: “生产环境配置风险第20行使用 app.run(debugTrue) 启动应用。Debug模式会向公众暴露堆栈跟踪等敏感信息并允许执行任意代码绝不应在生产环境中使用。”, “recommendation”: “移除 debugTrue 参数。生产环境应使用专业的WSGI服务器如Gunicorn、uWSGI并通过环境变量控制配置。”, “reference”: “Flask Documentation: Deployment Options” }, { “id”: “ISSUE_003”, “category”: “QUALITY”, “severity”: “MEDIUM”, “location”: “app_vulnerable.py:16”, “description”: “错误处理不健壮第16行在 user 为 None 时返回一个错误字典但若SQL执行本身出错如数据库连接失败、语法错误程序会抛出未处理的异常导致HTTP 500错误用户体验差且暴露内部信息。”, “recommendation”: “使用try-except块包裹数据库操作。捕获 sqlite3.Error 异常并返回统一的错误响应。同时考虑使用Flask的错误处理器。”, “reference”: “” } ], “positive_findings”: [ { “aspect”: “代码结构”, “comment”: “函数分离做得不错get_db_connection 函数负责数据库连接符合单一职责原则。” } ], “general_recommendations”: [ “建议引入 flake8 和 bandit 等工具进行代码风格和安全静态检查。”, “建议为数据库操作层编写单元测试特别是针对边界情况和错误输入。” ] }这个输出高度结构化问题分级清晰且提供了具体的修复方案和参考链接完全可以被下游系统解析或直接指导开发者进行修复。5. 进阶技巧构建提示词工作流与管理系统当你的项目依赖多个复杂的提示词时需要像管理代码一样管理它们。5.1 提示词模板化与参数化将提示词中的可变部分抽离为参数形成模板。示例prompt_templates.yamlcode_reviewer: system: | # 角色与使命 你是一个名为“CodeGuard”的AI代码审查专家... # ... (完整的系统提示词) user_template: | 请审查以下 {language} 代码 文件名{file_name} {language} {code} parameters: [“language”, “file_name”, “code”] sql_generator: system: | 你是一个专业的SQL工程师... user_template: | 基于以下数据库表结构 {schema} 请编写一个查询实现{requirement} 要求{format_requirement} parameters: [“schema”, “requirement”, “format_requirement”]5.2 使用脚本调用与管理编写一个简单的Python脚本来加载模板、填充参数并调用AI API。示例prompt_runner.pyimport yaml import openai # 或 anthropic, 或其他SDK from typing import Dict, Any class PromptManager: def __init__(self, template_path: str): with open(template_path, ‘r’, encoding‘utf-8’) as f: self.templates yaml.safe_load(f) # 初始化客户端密钥应从环境变量读取 self.client openai.OpenAI(api_keyos.getenv(‘OPENAI_API_KEY’)) def render_prompt(self, template_name: str, **kwargs) - Dict[str, str]: “”“渲染提示词模板”“” template self.templates.get(template_name) if not template: raise ValueError(f“Template ‘{template_name}’ not found.”) user_message template[‘user_template’].format(**kwargs) return { “system”: template[‘system’], “user”: user_message } def execute(self, template_name: str, model: str “gpt-4”, **kwargs) - str: “”“执行提示词并获取结果”“” messages self.render_prompt(template_name, **kwargs) chat_completion self.client.chat.completions.create( modelmodel, messages[ {“role”: “system”, “content”: messages[“system”]}, {“role”: “user”, “content”: messages[“user”]} ], temperature0.1 # 对于审查、生成类任务降低随机性 ) return chat_completion.choices[0].message.content if __name__ “__main__”: manager PromptManager(‘prompt_templates.yaml’) with open(‘app_vulnerable.py’, ‘r’) as f: code_to_review f.read() result manager.execute( template_name“code_reviewer”, language“python”, file_name“app_vulnerable.py”, codecode_to_review ) print(result)通过这种方式你可以将高质量的提示词资产化、版本化并在团队中共享。6. 避坑指南提示词工程中的常见陷阱即使掌握了模式在实践中也容易踩坑。以下是一些高频问题及解决方案。问题现象根本原因解决方案AI输出偏离主题或“胡言乱语”提示词约束力不足或任务过于开放。1. 强化角色定义和边界规则。2. 使用“如果不确定请直接说不知道”等指令。3. 降低生成温度temperature。输出格式不稳定AI有时会忽略严格的格式要求添加额外解释。1. 在提示词末尾用“请严格按上述JSON格式输出不要有任何额外解释”等语句强调。2. 使用Few-Shot示例展示完美格式。3. 在后处理中可用正则表达式提取所需部分。处理长上下文时性能下降或遗忘指令当前模型对长上下文的中间部分关注度可能降低。1. 将最重要的指令角色、格式放在系统提示词的开头和结尾。2. 对于超长文档处理采用“Map-Reduce”策略先分段总结再综合。提示词本身变得冗长难维护不断添加规则和示例导致提示词臃肿。1. 模块化设计将通用规则如安全准则放在一个基础提示词中通过API链式调用。2. 做好版本控制和文档。对不同模型效果差异大各模型对提示词的敏感度和理解能力不同。1. 为不同模型维护微调版的提示词。2. 进行A/B测试选择最适合当前任务的模型和提示词组合。7. 最佳实践与工程化建议将提示词工程融入你的开发生命周期。版本控制像对待代码一样将提示词模板存入Git仓库。记录每次修改的意图和效果。测试与评估建立提示词的测试集。对于代码审查提示词可以准备一批包含典型漏洞和良好实践的代码样本检查AI是否能稳定、准确地发现问题。持续迭代没有一劳永逸的提示词。随着模型更新、业务变化需要持续收集bad cases优化你的提示词。安全与合规在提示词中明确加入伦理和安全护栏例如禁止生成恶意代码、歧视性内容。对于企业应用需考虑数据隐私避免在提示词中泄露敏感信息。成本意识复杂的提示词和长上下文会消耗更多Token增加API成本。在效果和成本间取得平衡有时一个简洁明了的提示词反而更好。学习顶级团队的提示词本质是学习他们如何系统化地思考人机协作。4.4万星的项目和Claude公开的系统提示词向我们展示了将模糊的意图转化为精确、结构化、可执行的指令是一门值得深入研究的工程艺术。从今天起不要再向AI发送模糊的请求尝试为你下一个任务设计一个包含角色、步骤和格式要求的完整提示词你会发现生产力的巨大提升。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度