type
status
date
slug
summary
tags
category
icon
password
comment
从0到1地学习怎么写好prompt
以下内容涵盖了我最近学习如何写prompt的一些心得。文章将从两方面展开,第一部分是关于写prompt的一些技巧,第二部分是把技巧应用到Side Project(Long Distance Chatbox)项目里的实践,以及实践中遇到的问题和解决方案。
⚠️这篇文章将采用中英结合的形式,便于日后面试时的复习和回顾。
实用技巧(Techniques)
1. 基础角色定义(核心身份)
- 确立专业可信度
- 明确治疗模式以确保回应一致性
- 采用认可的理论框架(情感聚焦疗法/非暴力沟通)指导模型行为
- Base Persona Definition (Core Identity)
- Establishes professional credibility
- Specifies therapeutic modality for consistent responses
- Uses recognized frameworks (EFT/NVC) to guide model behavior
Example:
2. 核心原则(回应指示)
- 为 AI 的回复设置「安全防护栏」,确保内容在专业范围内运作。
- 通过专注于「过程导向」,避免 AI 给出过多直接建议或指导,从而保持客观、中立的立场。
- 与循证的治疗技术相契合,确保所提供的回应符合专业和科学依据。
- Core Principles (Response Guidelines)
- Creates guardrails for AI responses
- Prevents veering into advice-giving vs staying process-focused
- Aligns with evidence-based therapy techniques
Example:
3. 结构化处理(按步骤思考)
- 通过分步骤拆解和分析问题,模拟人类治疗师在面对复杂情境时的理性思考方式,帮助更全面地理解和回应需求。
- 在推理过程中引入约束条件,避免生成过度推测或不实信息,确保回答更贴近事实并保持连贯。
- 采用固定的逻辑顺序或框架,使回答呈现更一致、易于理解的结构,从而在沟通中更具可控性和可靠性。
- Structured Processing (Step-by-Step Thinking)
- Mimics human therapist cognitive process
- Reduces hallucination through constrained reasoning
- Enables predictable output structure
Example:
4. 示例驱动式学习(Few-Shot Prompting)
- 通过少量示例来向模型演示如何输出正确或合适的回答,从而帮助模型形成回应模式。
- 在提供示例的同时,也要兼顾一般性原则,确保模型不仅能模仿示例,还能在更广泛的场景中运用相似的思路。
- 根据实践经验和研究表明,对于 GPT-3.5 或 GPT-4 等大型语言模型而言,提供 3-5 个示例是最佳数量,可以有效提升模型的记忆与理解能力,从而输出更高质量的答案。
- Example-Driven Learning (Few-Shot Prompting)
- Teaches response patterns through demonstration
- Balances concrete examples with general principles
- 3-5 examples shown to be optimal for GPT-3.5/4 retention
Example:
5. 道德保障(关键界限)
- 针对与心理健康相关的工具,需要遵守相关法律法规与道德准则,确保在设计与使用过程中符合行业标准与公众利益。
- 通过设置审慎的流程和监督机制,避免过度依赖自动化系统导致错误判断或潜在风险,尤其在敏感的心理健康领域更需谨慎。
- 必须建立清晰的上报与处理流程(例如,当用户遇到紧急情况或系统无法应对时,应迅速转介给专业人士),以确保问题能够及时获得适当的关注和干预。
- Ethical Safeguards (Critical Boundaries)
- Legal/ethical requirement for mental health adjacent tools
- Prevents harmful automation bias
- Requires clear escalation pathways
Example:
6. (可选)输出格式化(结构化 JSON)
- 通过将输出内容组织成 JSON 格式,系统或应用程序可以更轻松地对响应进行自动化解析和处理,减少手动干预的复杂度。
- 将推理过程或逻辑拆分成结构化的数据字段,便于后续调试、审查或追踪问题时快速定位。
- 前端可以根据 JSON 中的不同部分来分别呈现信息,从而实现更灵活的界面布局和更佳的用户体验。
- (Optional) Output Formatting (Structured JSON)
- Enables programmatic response handling
- Forces structured reasoning chain
- Allows frontend to display different components separately
操作实践(Case Study)
为了更好地练习如何撰写 Prompt,我搭建了一个名为“远距离情侣聊天室”(Long Distance Chatbox)的应用,主要针对情绪激动的情侣提供“翻译”服务,用来把过激的言辞转换成更客观、更容易沟通的表达方式。只要在聊天室里输入你在气头上想说的话,AI 就会帮助你提炼真正想表达的需求或感受。更多细节可以在我的 GitHub 上查看:link。
由于这个应用目前还处于初期阶段,而且调用 OpenAI 的 API 也相对昂贵,所以暂时没有上线的打算。不过,这为我提供了一个非常好的机会来练习如何写好 Prompt。于是,我决定把在调试 Prompt 的过程中遇到的各种难题,以及我如何解决它们的经验记录下来,作为学习笔记。
⚠️ 声明:无论是前端还是后端,我都只是一知半解,而且这是我第一次写 JavaScript;代码部分主要是由 GPT、Deepseek 和 Cursor 共同完成的。
项目介绍
关于这个项目,我会在后续的文章中再做更详细的介绍。这里主要聚焦在与 prompt 调试相关的内容:
首先,我们在
prompt.config.js
中为不同角色(如 therapist、negotiator 等)分别定义了对应的 prompt。本文以 therapist 角色为例,根据上文提到的六个步骤,将每个步骤的 prompt 独立定义为一个变量:在同一个配置文件中,我们通过一个名为 PROMPT_TEMPLATE 的变量,将上述所有提示(prompt)整合为一个完整的提示文本,便于稍后在后端的 server.js 中进行获取和使用:
在后端
server.js
文件中,有一个名为 getPrompt
的函数。它会先从 .env
文件中读取预先设置的角色信息,然后将 config
里对应该角色的 prompt 与用户输入的文本一起发送给 OpenAI 进行改写,最后返回改写后的文本。设计思路
开始时,我们只需要一个简单的 Prompt(例如:“rephrase the sentence to be more gentle”),就能收到不错的效果。这种用法就像你今天打开 ChatGPT,只想快速得到一个答案一样,即使回答有误也没太大影响。然而,从产品的角度来看,回复给用户的内容必须符合预期;一个荒谬的答案不仅会带来金钱和声誉的损失,有时甚至会引发法律风险。因此,对于真正的产品来说,容忍度极低。
这正是我们想要在「远距离情侣聊天室」中系统性设计 Prompt 的原因:从产品出发,思考如何设计 Prompt,才能让「翻译」更精准并减少出错。
不过,在持续调试的过程中我们发现:当 Prompt 变多、变复杂后,反而更容易出现问题。以下是我在不断调整 Prompt 时遇到的一些问题及其解决方案。
问题和解决方案
问题1:返回的不是最终结果
当我们像第二点那样在 Prompt 中提供了五条
principles
时,模型往往会误以为也需要按照这五条原则输出五个要点。实际上,我们只需要模型回复一句话就足够了。以下是使用前面提到的方法生成 Prompt 后,模型根据 Prompt 中的五点要求进行翻译的结果,可以看到它又输出了五个点:

解决方案:
在
base
或者principles
里加上一条规则直接输出最终版本的翻译,不需要中间内容就能很好的解决这个问题:“directly return the final rephrased version, without explanations or labels. Don't include input“
问题2:返回的内容里带有标签
即使在上一条已经强调不需要添加任何标签,返回的内容依然带有“Rephased:”字样,导致这段信息无法直接发送给对方,还需要进一步的修改或处理:

解决方案:
当我使用 Cursor 选取所有 Prompt 并明确表示不希望出现“Rephased:”这类标签后,Cursor 给出了两条建议:
- 在
base
提示中,明确强调“directly return the final rephrased version, without explanations or labels”
- 在
PROMPT_TEMPLATE
的末尾部分,使用更明确的指令,例如:“Rewrite this message without any labels or prefixes:”
针对第一条建议,我们在问题 1 中已经尝试过,但并没有得到理想效果。于是,我们决定尝试第二条:在应用所有定义好的 Prompt 之前,于最后一步给出一个明确的指令。事实证明,这个方法非常有效,经过调试后,输出结果已经非常接近预期目标。

问题3:输出结果不稳定
在多次尝试预览(preview)的过程中,如果输入为中文,返回结果有时是中文,有时又变成英文,表现得并不稳定。希望通过进一步的调整,能够让输出语言始终保持一致。

解决方案:
在提示中更明确地强调语言要求,并添加语言检测逻辑,以下是Cursor提出的修改建议:
- 在
principles
中用更强烈的语气比如原先是“Return the same language”, 现在改为“Never mix languages in your response”
- 与修改问题二的地方相同,在最后一步之前再定义一次用相同的语言:
“Rewrite this message in the same language as the input, without any labels or prefixes:”
- 在
examples
部分给出多种场景,特别强调当输入为中文时,输出也应保持中
在调试过程中,我发现第一条建议非常有效。通过强化语气后,出错的概率显著降低。不过,当输入是中文时,仍有约十分之一的机会会输出英文。随后,在第一条建议的基础上再加上第二条建议,几乎就完全解决了这个问题。经过数十次测试后,回复始终保持在中文。为了进一步确认,我还用西班牙语进行了尝试,返回的同样是西班牙语。
此外,cursor 在调试 Prompt 的过程中还提出了一个值得参考的想法:在发送提示时动态添加语言,并在代码层面实现语言检测。通过这样的双重保障,可进一步确保输出语言的稳定性。不过,由于我们的主要目标在于学习如何调试 Prompt 而非提升代码能力,因此这一提案暂不展开。
插播:使用成本
在尝试的过程中,我一直在观察 API 的使用频次和费用。由于用的是更实惠的GPT-3.5,所以整体花费并不高。那天之所以费用最高,主要是因为每次输出都罗列了 1-5 个要点,每次返回的内容少说也有一两百字,说明控制输出长度很有必要。虽然在那段时间里输入了不少 Prompt,但真正花钱的还是那些较长的输出内容。

欢迎您在底部评论区留言,一起交流~
- Author:Xinyuan
- URL:https://tangly1024.com/article/1804c8e8-8c54-8163-b2c7-fa4643c5f1cb
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!