【自学AI】07 跟 AI 说话也是门学问 —— 让输出从 90 分到 98 分的 6 个高级技巧
上一篇,我们学了 Prompt 的基础结构——角色、任务、输入、输出格式、例子。 用那套框架,已经能让 AI 的输出质量提升 10 倍。
但在真实项目里,我发现还不够。
开头:90 分之后,卡住了
AI 面试功能自测时,我发现 Prompt 写得很完整,题目格式也对,HR 也说”还不错”。但偶尔会出现这种情况:
- 同一套 Prompt,今天生成的题目很好,明天生成的就很平
- AI 评估候选人答案时,逻辑跳跃,分数给得莫名其妙
- 代码解析 AI 输出时,偶尔报错,因为格式不稳定
基础框架解决了”从 0 到 60 分”的问题。但从 60 分到 90 分,需要更精细的技巧。
这篇文章讲的,就是那些让输出从”还不错”变成”真的很好”的高级技巧。

一、Chain of Thought:让 AI 先想,再说
是什么
CoT,全称 Chain of Thought(思维链)。
一句话:让 AI 在给出最终答案之前,先把思考过程写出来。
为什么有效
没有 CoT 的时候,AI 的预测路径是这样的:
[问题] → [直接输出答案]路很短,跳得很快,但容易跳错。
有了 CoT,路径变成:
[问题] → [分析第一步] → [分析第二步] → [验证] → [最终答案]每一步都建立在上一步的基础上,错误很难悄悄积累。
《易经·履卦》有句话:“履道坦坦,幽人贞吉”——走得稳,才能走得远。 不是一步跨到终点,而是一步一步踩实。CoT 的逻辑,和这个是一样的。
实战对比
没有 CoT 的版本:
一个班有 30 个学生。其中 1/3 喜欢篮球,1/5 喜欢足球,剩下的喜欢羽毛球。问:喜欢羽毛球的有多少人?AI 可能直接回答:8 个——错的。
加了 CoT 的版本:
一个班有 30 个学生。其中 1/3 喜欢篮球,1/5 喜欢足球,剩下的喜欢羽毛球。问:喜欢羽毛球的有多少人?
请一步一步思考:1. 先计算喜欢篮球的人数:30 × 1/3 = ?2. 再计算喜欢足球的人数:30 × 1/5 = ?3. 最后计算喜欢羽毛球的:30 - 篮球 - 足球 = ?4. 验证三者加起来是否等于 30AI 就会老老实实算出来:
思考过程:1. 篮球:30 × 1/3 = 10 人2. 足球:30 × 1/5 = 6 人3. 羽毛球:30 - 10 - 6 = 14 人4. 验证:10 + 6 + 14 = 30 ✓
答案:14 人在面试系统里的应用
用 CoT 来评估候选人的答案,效果很明显。
不用 CoT 时:
问题:如何设计一个秒杀系统?候选人答案:[一段回答]请评估这个答案,给一个分数。AI 给出分数,但逻辑不清楚,同一个答案不同时候评分差 2-3 分。
用了 CoT 之后:
请一步一步评估这个答案:
1. 首先,检查答案是否准确回答了问题2. 其次,评估答案的深度——有没有讲具体策略?有没有考虑边界情况?3. 再次,找出优点和不足4. 最后,综合以上分析,给出分数和理由结果:评估逻辑清晰,分数有说服力,HR 和候选人都服气。
3 个使用技巧
- 明确步骤数:不要说”一步一步想”,要说”按以下 4 个步骤”。AI 知道要输出几段,不会乱跑
- 加入验证步骤:最后加一步”验证你的结论是否符合前提条件”,能有效减少自相矛盾的情况
- 要求解释原因:每一步不只要结果,还要说”为什么这样做”,AI 会更仔细地思考
二、Few-shot Learning:给例子,比说要求更有效
是什么
Few-shot Learning,少样本学习。
不是告诉 AI”你要做什么”,而是给 AI 看几个”输入 + 输出”的例子,让它照着学。
一个好例子,胜过一百字的要求描述。
为什么比单纯说要求更有效
你告诉 AI:“代码风格要现代化、简洁、符合最佳实践。”
AI 不知道你说的”现代化”是什么意思。你心里有个标准,但 AI 看不见。
你给 AI 看 3 个你满意的例子,AI 一下子就懂了。
这和带新人是一样的道理——与其说一堆标准,不如直接给他看几个好的范本。
实战对比
假设我要把一段命令式的 JS 代码,改成函数式风格。
没有例子的版本:
把以下 JS 代码改成函数式风格,更简洁:
function getPositiveDoubled(items) { const result = []; for (let item of items) { if (item > 0) { result.push(item * 2); } } return result;}AI 可能改成这样,还不错,但如果我想要特定的命名风格或写法,AI 猜不到。
给了例子的版本:
把以下 JS 代码改成函数式风格。参考例子的写法:
例子(数组处理):改前:function filterActive(users) { const result = []; for (let u of users) { if (u.active) result.push(u); } return result;}
改后:const filterActive = (users) => users.filter(({ active }) => active);
现在请参考这个风格,改写这段代码:[目标代码]AI 就会生成风格完全统一的版本。
在面试系统里的应用
生成面试题时,给 AI 看 3 个”好题目”的例子,然后说”参考这些例子的难度、长度和风格,生成新的题目”。
结果:题目质量稳定,难度一致,不会忽高忽低。
最佳实践
| 实践 | 说明 |
|---|---|
| 例子数量 2-5 个最佳 | 太少 AI 学不到规律,太多容易被混淆 |
| 选代表性的例子 | 覆盖你期望的各种情况 |
| 用真实的好例子 | 不要临时编造,用你之前真正满意的输出 |
| 例子里加解释 | 说明”为什么这个是好的”,AI 理解更深 |
三、System Prompt vs User Prompt:角色和任务要分开
一个生活比喻
想象你入职一家新公司:
- 员工手册:工作时间、着装要求、沟通规范、什么不能做……入职时读一遍,之后一直有效
- 今天的工作任务:帮客户 A 写报告、下午 3 点开会……每天都不一样
在 AI 里:
- System Prompt = 员工手册。定义 AI 的身份、角色、行为准则。设置一次,全程有效
- User Prompt = 今天的工作任务。具体的请求,每次都不同
为什么要分开
如果把所有东西混在一个 Prompt 里,第二个候选人来了,你要重新写一遍前面那些”角色定义”。麻烦,而且容易遗漏。
分开之后:
System Prompt(代码里定义一次):
你是一个资深的技术面试官,有 20 年的面试经验。你的职责是评估候选人的技术水平,给出公平、专业、有建设性的反馈。评估维度:准确性、深度、清晰性、工程思维。不要谈论和面试无关的话题。User Prompt(每个候选人动态生成):
候选人信息:3 年经验,Java 全栈问题:如何设计一个高并发系统?候选人答案:[具体内容]请按照评估维度给出分数和反馈。System Prompt 只写一次,User Prompt 根据不同候选人变化。
在项目代码里怎么做
// System Prompt:定义一次,不变const SYSTEM_PROMPT = `你是一个资深的技术面试官,有 20 年的面试经验...`;
// User Prompt:每次根据候选人动态生成function buildUserPrompt(candidate, question, answer) { return `候选人信息:${JSON.stringify(candidate)}问题:${question}候选人答案:${answer}请评估... `;}好处:角色定义和任务逻辑分离,代码清晰,修改角色设定只改一个地方。
System Prompt 应该包含什么
| 要素 | 例子 |
|---|---|
| 身份/角色 | ”你是一个资深后端架构师” |
| 目标/职责 | ”你的职责是评估候选人技术水平” |
| 约束/限制 | ”不要谈论和面试无关的话题” |
| 风格/态度 | ”反馈要专业、有建设性,不要打击候选人” |
四、指定输出格式:让代码能直接用
为什么这一步很关键
不指定格式,AI 可能给你:有时候是 JSON,有时候是 Markdown,有时候是纯文本,有时候是混合的。
你的解析代码就会时不时报错,排查起来很痛苦。
JSON 实战对比
不指定格式:
请评估这个面试答案,给出评分和反馈。AI 可能输出:
这个答案很不错。我给 7 分。主要优点:思路清晰,技术选型合理。不足:没有讨论缓存一致性。要写正则表达式提取数字,容易出错,维护成本高。
指定 JSON 格式:
请用以下 JSON 格式输出评估结果:
{ "score": 数字(0-10), "strengths": ["优点1", "优点2"], "weaknesses": ["不足1", "不足2"], "suggestions": ["建议1"], "summary": "一句话总结"}
重要:只输出 JSON,不要有任何多余的文字或 Markdown 包裹。你的代码:
const result = JSON.parse(aiOutput);const score = result.score; // 直接用,干净5 个最佳实践
- 在 Prompt 里提供 JSON 示例 — 让 AI 看到你期望的结构
- 明确说明字段类型 —
"score": 数字(0-10),不要让 AI 猜 - 强调”只输出 JSON” — 防止 AI 在 JSON 前后加解释文字
- 代码里加验证逻辑 — 解析后检查字段是否合法,分数是否在范围内
- 提供备选方案 — “如果无法生成完整 JSON,至少保证 score 字段存在”
五、负面提示:告诉 AI 不要什么
有时候,“不要”比”要”更有效
你告诉 AI “生成一个好的面试题”,AI 不知道什么是”好”。
但你告诉 AI “不要生成 1 分钟就能答完的题、不要生成纯算法题、不要生成答案有争议的题”,AI 立刻就清楚了边界。
消除坏的选项,剩下的自然就是好的。
这有点像《易经·损卦》的思路——“损之又损,以至于无为”。减掉不该有的,留下来的才是真正需要的。
实战对比
只有正面要求:
生成一个面试题。要求:难度中等,考察实际能力,有标准答案。AI 可能给出:题目:写一个排序函数 — 太简单,太抽象。
加上负面提示:
生成一个面试题。
应该做的:✓ 难度中等(需要 10-15 分钟)✓ 有具体的工作场景✓ 有明确的标准答案
不要做的:✗ 不要生成 1-2 分钟就能答出的题✗ 不要生成纯算法题(和实际工作无关)✗ 不要生成答案有争议的题✗ 不要涉及过时技术(Flash、IE6 等)AI 生成的题目:有场景、有深度、有标准答案,质量明显不同。
3 种使用方式
方式 1:明确列出(最清晰,适合大多数场景)
不要做的:- [列表1]- [列表2]方式 2:用对比说明(让 AI 看到对比,学得更快)
避免这样的题目:[一个坏例子]应该像这样:[一个好例子]方式 3:用反例说明(适合已经积累了踩坑记录的情况)
以下是之前生成的不好的题目,不要重复这样的错误:[反例1]六、Temperature:调出你想要的 AI 性格
Temperature 是什么
Temperature(温度),范围 0-2,控制 AI 输出的随机程度。
| Temperature | 类比 | 特点 |
|---|---|---|
| 0 | 严谨的法官 | 每次输出几乎一样,稳定可预测 |
| 0.3-0.5 | 认真的工程师 | 稳定,偶尔有细微变化 |
| 0.7 | 经验丰富的顾问 | 平衡,有一定多样性但不失控 |
| 1.0+ | 头脑风暴中的创意人 | 发散,多样,偶尔出人意料 |
在项目里的真实代码
this.model = new ChatDeepSeek({ apiKey: apiKey, model: this.configService.get<string>('DEEPSEEK_MODEL') || 'deepseek-chat', temperature: 0.7, // 👈 这里 maxTokens: Number(this.configService.get<string>('MAX_TOKENS')) || 4000,});默认用 0.7——生成面试题这个任务,既不能太死板(每次题目一模一样),也不能太随机(题目质量不稳定)。0.7 是测试下来最平衡的值。
不同任务需要不同参数:
// 生成面试题:需要多样化const quizModel = this.createModel(0.8, 4000);
// 生成评估报告:需要稳定const evalModel = this.createModel(0.3, 2000);参数参考
| 任务类型 | Temperature | Max Tokens |
|---|---|---|
| 生成面试题 | 0.7-0.8 | 3000-4000 |
| 评估候选人答案 | 0.3-0.5 | 2000-3000 |
| 生成追问 | 0.6-0.7 | 500-1000 |
| 简单交互回应 | 0.3-0.5 | 200-500 |
这些数字不是拍脑袋的。是用默认值跑了一遍,看效果,发现哪里不对,调一下,再跑,反复几次之后沉淀下来的。
没有标准答案,只有适合你场景的答案。
参数不要硬编码,放进环境变量:
DEEPSEEK_MODEL=deepseek-chatMAX_TOKENS=4000换个环境改 .env 文件就行,不用动代码。
七、避免 6 个常见错误
每个错误我都踩过,快过一遍。
❌ 错误 1:Prompt 太模糊
❌ 生成一些题目✅ 为一个有 3 年 Python 经验的候选人生成 5 个中等难度的面试题, 考察知识点:数据库、缓存、API 设计❌ 错误 2:没有提供足够的上下文
❌ 评估这个答案✅ 背景:5 年经验后端工程师面试 问题:如何设计支持 100 万并发的系统? 候选人答案:[具体内容] 评估维度:架构完整性、可行性、性能考虑...❌ 错误 3:要求相互矛盾
❌ 生成一个简单的题目,但要考察高级知识✅ 生成一个用简单语言描述的题目, 考察的是候选人对复杂概念的理解深度❌ 错误 4:没有明确输出格式
❌ 生成一个评估✅ 用以下 JSON 格式生成评估: { "score": 0-10, "reason": "原因", "next_question": "建议的追问" }❌ 错误 5:一个 Prompt 要求太多事情
❌ 生成 10 道题目,并评估之前的答案,并给出改进建议,并生成综合报告✅ 拆成 4 个独立的 Prompt,每个只做一件事❌ 错误 6:对特殊字符处理不当
❌ 生成一个包含 JSON 示例的题目 (AI 生成的题目里有双引号,破坏了外层 JSON)✅ 如果题目中包含代码,请用三重反引号包裹。 确保最终输出是有效的 JSON,特殊字符需要转义。最后带走一句话
把这 6 个技巧加进来之后,面试系统的 Prompt 从最初那一句话,变成了一个有角色定义、有思维链、有例子、有格式要求、有负面约束的完整体系。
但我想说的不是”你要一次把这些全用上”。
而是:
先用基础框架跑起来,发现哪里不对,再加对应的技巧。
- 输出不稳定?→ 降低 Temperature,加输出格式约束
- 评估逻辑跳跃?→ 加 CoT
- 题目质量忽高忽低?→ 加 Few-shot 例子
- AI 总是跑偏?→ 加负面提示
- 每次都要重复定义角色?→ 分离 System Prompt
每一个技巧,都是为了解决一个具体的问题。
这和写代码是一样的——不是一开始就把所有设计模式全用上,而是遇到问题,用合适的工具解决它。
昇哥 · 2026年2月 学 AI 面试项目途中,顺手把想清楚的事写下来
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!