资讯详情

【三个月 AI Agent 实战学习】Day 4 详细展开:Prompt 基础 —— 零样本与少样本(Zero-shot Few-shot)

📅 2026/9/12 19:03:18 | 华诺云谱 👁 阅读
【三个月 AI Agent 实战学习】Day 4 详细展开:Prompt 基础 —— 零样本与少样本(Zero-shot  Few-shot)
Day 4 详细展开Prompt 基础 —— 零样本与少样本Zero-shot Few-shot欢迎来到第四天从今天开始我们将进入提示词工程Prompt Engineering的核心领域。今天我们聚焦两种最基础的提示策略零样本Zero-shot和少样本Few-shot。理解它们并能够灵活运用是驾驭大模型能力的关键第一步。一、今日学习目标理解 Zero-shot 和 Few-shot 的概念及区别。通过实验对比在同一任务下提供示例Few-shot是否比不提供示例Zero-shot效果更好、更稳定。学会设计一个“关键词提取器”提示词并实现 JSON 格式的结构化输出。掌握处理模型输出不稳定问题的基本技巧如温度调节、输出解析重试。初步体会到 Prompt 设计对模型行为的影响力。二、详细实现步骤步骤 1理解 Zero-shot 与 Few-shotZero-shot零样本不给模型任何示例直接描述任务要求让模型根据其预训练知识来完成任务。例如请从以下文本中提取所有地名以 JSON 数组返回。模型必须完全依靠它对“地名”的理解来完成任务。Few-shot少样本在 Prompt 中提供 1~3 个示例输入-输出对让模型模仿示例的格式和逻辑来完成新任务。例如示例 1输入小明去北京旅游。输出[“北京”]示例 2输入上海和广州都是大城市。输出[“上海”, “广州”]现在请提取以下文本中的地名输入我计划下个月去成都和重庆出差。为什么 Few-shot 通常更有效因为大语言模型本质上是“模式匹配器”示例能够更明确地告诉模型你期望的输出格式、风格和抽取粒度减少模型自由发挥的空间。步骤 2搭建关键词提取任务实验我们将设计一个“关键词提取器”输入一段句子输出其中最关键的名词或短语例如产品名、地名、人名等。我们将分别用 Zero-shot 和 Few-shot 来测试并比较它们的输出格式一致性。新建few_shot_demo.pyimportosimportjsonfromdotenvimportload_dotenvfromopenaiimportOpenAI load_dotenv()clientOpenAI(api_keyos.getenv(DEEPSEEK_API_KEY),base_urlhttps://api.deepseek.com)defextract_keywords_zero_shot(text:str)-str:零样本只给任务描述不给示例promptf 请从以下文本中提取所有重要关键词包括人名、地名、组织名、产品名等 要求以 JSON 数组形式返回不要包含其他多余文字。 文本{text}responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:prompt}],temperature0.2,max_tokens200)returnresponse.choices[0].message.contentdefextract_keywords_few_shot(text:str)-str:少样本提供两个示例promptf 你是一个关键词提取助手。请从给定文本中提取所有重要关键词人名、地名、组织名、产品名等 并以 JSON 数组格式返回。只输出 JSON 数组不要输出其他任何解释。 示例 1 输入苹果公司发布了新款 iPhone。 输出[苹果公司, iPhone] 示例 2 输入张三去上海参加人工智能大会。 输出[张三, 上海, 人工智能大会] 现在请提取以下文本中的关键词 输入{text}responseclient.chat.completions.create(modeldeepseek-chat,messages[{role:user,content:prompt}],temperature0.2,max_tokens200)returnresponse.choices[0].message.content# 测试文本test_text李华在腾讯公司工作最近他去了成都出差并参观了当地的宽窄巷子。print( Zero-shot 输出 )zero_resultextract_keywords_zero_shot(test_text)print(zero_result)print(\n Few-shot 输出 )few_resultextract_keywords_few_shot(test_text)print(few_result)# 尝试解析 JSON 看格式是否正确deftry_parse_json(s:str):try:# 模型有时会输出 markdown 代码块需要去除ifs.startswith():ss.strip().strip()ifs.startswith(json):ss[4:]returnjson.loads(s)exceptExceptionase:returnf解析失败:{e}print(\nZero-shot 解析结果:,try_parse_json(zero_result))print(Few-shot 解析结果:,try_parse_json(few_result))运行脚本python few_shot_demo.py观察与思考Zero-shot 输出的格式可能不太稳定有时会带上“好的关键词如下”之类的废话或者 JSON 格式不标准例如使用单引号或缺少方括号。Few-shot 因为给出了明确的示例模型通常能严格模仿输出格式更容易解析。你可以多运行几次 Zero-shot将temperature稍微调高到 0.5会发现输出变化较大而 Few-shot 的输出相对稳定。步骤 3优化输出稳定性 —— 输出解析与重试在实际项目中我们不能完全依赖模型的自觉性需要代码层面增加容错。上面我们写了try_parse_json函数现在我们可以扩展它如果解析失败就重新请求模型并追加一条错误反馈要求它严格输出 JSON。修改few_shot_demo.py添加带重试的版本importtimedefextract_keywords_few_shot_with_retry(text:str,max_retries2)-list:带重试机制的少样本提取返回解析后的列表retries0whileretriesmax_retries:rawextract_keywords_few_shot(text)# 清理 markdown 代码块标记cleanedraw.strip()ifcleaned.startswith():cleanedcleaned.strip()ifcleaned.startswith(json):cleanedcleaned[4:]try:resultjson.loads(cleaned)ifisinstance(result,list):returnresultexceptException:pass# 解析失败进入重试retries1# 在重试前可以修改 Prompt 强调 JSON 格式这里简单 sleep 一下time.sleep(1)# 最终失败则返回空列表return[]resultextract_keywords_few_shot_with_retry(test_text)print(\n带重试的 Few-shot 最终解析结果:,result)注意这个简单版本只是重新调用相同的 Prompt如果模型持续输出格式错误你可能需要动态修改 Prompt比如追加“上次你输出的格式不对请只输出 JSON 数组不要包含任何其他文字”。步骤 4探索不同示例数量的影响选做你可以尝试在 Few-shot 中提供 0 个、1 个、3 个示例分别测试输出质量。通常 1~3 个示例已经足够过多示例会增加 Token 消耗且收益递减。三、常见问题与调试Q1模型输出中总是包含“好的这是结果”之类的多余文字导致 JSON 解析失败。→ 解决方法在 System Prompt 中明确“只输出 JSON 数组不要有任何解释”。使用更低的 Temperature如 0.1。使用 LangChain 等框架的输出解析器后续会学。编写一个健壮的提取函数从文本中定位 JSON 片段比如用正则找到[...]部分。Q2Few-shot 示例中的格式必须和真实任务完全一致吗→ 不必完全一致但越相似模型迁移效果越好。建议示例尽量覆盖不同情况如多个关键词、特殊符号等。Q3为什么有时候 Zero-shot 的结果也能用什么时候必须用 Few-shot→ 对于模型已经很熟悉的简单任务如情感分析Zero-shot 通常足够。但当任务有特定的输出格式、特定的分类体系、或者需要对领域术语进行精确抽取时Few-shot 能大幅提高准确率。在 Agent 开发中往往需要 Few-shot 来规范工具调用的参数格式。Q4示例是否会被模型“记住”→ 模型不会像数据库那样记住示例示例只在当前请求的上下文中起作用。每次请求都需要重新提供示例除非你使用了外部记忆模块那是后续的内容。四、今日总结与作业今天你完成了✅ 理解了 Zero-shot 和 Few-shot 的概念。✅ 通过代码实验对比了两种策略在关键词提取任务上的效果差异。✅ 学习了如何处理模型输出的 JSON 格式不稳定问题清洗、重试。✅ 初步体会了 Prompt 设计的重要性。今日作业必做自己设计一个“情感分类器”任务输入一段评论输出{sentiment: positive/negative/neutral}。分别用 Zero-shot 和 Few-shot 实现并测试 5 条不同风格的评论比较输出解析成功率。尝试在 Few-shot 的 Prompt 中加入一个“边界示例”例如输入“今天天气不错”这种没有明显关键词的句子看看模型能否正确返回空数组或你认为合适的输出。这能帮助模型处理边界情况。思考题在构建 Agent 时工具调用的参数往往是 JSON 格式。你打算如何设计 Few-shot 示例来指导模型精确生成工具参数请简述你的思路。明日预告我们将学习思维链Chain-of-ThoughtCoT技巧让模型在回答问题前先展示推理过程从而提升复杂问题的准确率。有任何问题欢迎随时提问
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。