提示词优化实战从分类到信息抽取少样本学习Few-shot Learning的 3 个核心场景用大模型做数据处理先是做文本分类然后要做信息抽取最后还要做文本匹配。每个场景都踩了一遍坑准确率惨不忍睹。用 3 个真实案例讲讲少样本学习Few-shot Learning在不同场景下的优化技巧。场景一文本分类最简单先看看最简单的分类任务代码fromopenaiimportOpenAI clientOpenAI(base_urlhttp://localhost:11434/v1)examples_data{是:[(公司 A 发布了季度财报显示盈利增长。,财报披露公司 A 利润上升。),(公司 B 发布了年度财报显示盈利大幅增长。,财报披露公司 B 更赚钱了。)],不是:[(黄金价格下跌投资者抛售。,外汇市场交易额创下新高。),(央行降息刺激经济增长。,新能源技术的创新。)]}messages[{role:system,content:你帮我完成文本匹配我给你 2 个句子你判断它们是否匹配回答是或不是请参考如下示例}]forkey,valueinexamples_data.items():fortinvalue:messages.append({role:user,content:f句子 1[{t[0]}]句子 2[{t[1]}]})messages.append({role:assistant,content:key})responseclient.chat.completions.create(modelqwen3:4b,messagesmessages[{role:user,content:句子 1[利率上升影响房地产]句子 2[高利率对房地产有冲击]}])print(response.choices[0].message.content)问题出在哪系统提示太模糊没说清楚匹配的标准是什么语义相似主题相同示例太少每类只有 2 个示例覆盖不够优化方案system_prompt你帮我完成文本语义匹配判断。 任务给我 2 个句子判断它们是否表达相同或相似的核心含义。 判断标准 - 是两个句子描述的是同一件事核心信息一致 - 不是两个句子描述的是不同话题或核心信息不同 输出规则 - 只输出是或不是不要解释 以下是示例examples[(句子 1[公司 A 发布了季度财报显示盈利增长。]句子 2[财报披露公司 A 利润上升。],是),(句子 1[公司 B 发布了年度财报显示盈利大幅增长。]句子 2[财报披露公司 B 更赚钱了。],是),(句子 1[黄金价格下跌投资者抛售。]句子 2[外汇市场交易额创下新高。],不是),(句子 1[央行降息刺激经济增长。]句子 2[新能源技术的创新。],不是),(句子 1[油价大跌能源公司面临挑战。]句子 2[未来智能城市建设趋势明显。],不是),]messages[{role:system,content:system_prompt}]fortext,labelinexamples:messages.append({role:user,content:text})messages.append({role:assistant,content:label})# 提问格式完全一致messages.append({role:user,content:句子 1[利率上升影响房地产市场]句子 2[高利率对房地产有冲击]})responseclient.chat.completions.create(modelqwen3:4b,messagesmessages,temperature0.1)关键改进明确匹配的定义语义相似不是字面相似示例增加到 5 个覆盖更多情况提问格式和示例完全一致场景二信息抽取中等难度这个场景更实用从非结构化文本中抽取结构化数据。原始代码fromopenaiimportOpenAIimportjson clientOpenAI(base_urlhttp://localhost:11434/v1)schema[日期,股票名称,开盘价,收盘价,成交量]examples_data[{content:2023-01-10股市震荡。股票华胜科技 A 股今日开盘价 100 人民币最终以 102 人民币收盘成交量达到 520000。,answers:{日期:2023-01-10,股票名称:华胜科技 A 股,开盘价:100 人民币,收盘价:102 人民币,成交量:520000}}]messages[{role:system,content:f你帮我完成信息抽取我给你句子你抽取{schema}信息按 JSON 字符串输出如果某些信息不存在用原文未提及表示请参考如下示例}]forexampleinexamples_data:messages.append({role:user,content:example[content]})messages.append({role:assistant,content:json.dumps(example[answers],ensure_asciiFalse)})responseclient.chat.completions.create(modelqwen3:4b,messagesmessages[{role:user,content:f按照上述的示例现在抽取这个句子的信息{q}}])问题出在哪只给了 1 个示例模型无法泛化到其他格式提问时加了前缀“按照上述的示例现在抽取…”示例里没有这句话没有处理缺失字段如果原文没有成交量怎么办JSON 格式可能不合法模型有时会输出 Markdown 代码块包裹 JSON优化方案fromopenaiimportOpenAIimportjson clientOpenAI(base_urlhttp://localhost:11434/v1)schema[日期,股票名称,开盘价,收盘价,成交量]system_prompt你帮我完成金融信息抽取。 任务从文本中抽取以下字段的信息 - 日期交易日期格式 YYYY-MM-DD - 股票名称股票全称 - 开盘价当日开盘价格包含货币单位 - 收盘价当日收盘价格包含货币单位 - 成交量当日成交量纯数字 输出规则 - 输出合法的 JSON 字符串不要 Markdown 格式 - 如果某个字段信息不存在用原文未提及表示 - 不要输出任何解释只输出 JSON 以下是示例examples[(2023-01-10股市震荡。股票腾云科技 A 股今日开盘价 100 人民币一度飙升至 105 人民币随后回落至 98 人民币最终以 102 人民币收盘成交量达到 520000。,{日期: 2023-01-10, 股票名称: 腾云科技 A 股, 开盘价: 100 人民币, 收盘价: 102 人民币, 成交量: 520000}),(2024-05-16股市利好。股票英伟达美股今日开盘价 105 美元一度飙升至 109 美元最终以 116 美元收盘成交量达到 3560000。,{日期: 2024-05-16, 股票名称: 英伟达美股, 开盘价: 105 美元, 收盘价: 116 美元, 成交量: 3560000}),(2025-03-01股市平稳。股票蓝海能源今日开盘后波动不大最终收盘。,{日期: 2025-03-01, 股票名称: 蓝海能源, 开盘价: 原文未提及, 收盘价: 原文未提及, 成交量: 原文未提及}),]messages[{role:system,content:system_prompt}]fortext,labelinexamples:messages.append({role:user,content:text})messages.append({role:assistant,content:label})# 提问不要加前缀test_text2025-06-16股市利好。股票华胜科技 A 股今日开盘价 66 人民币一度飙升至 70 人民币随后回落至 65 人民币最终以 68 人民币收盘成交量达到 123000。messages.append({role:user,content:test_text})responseclient.chat.completions.create(modelqwen3:4b,messagesmessages,temperature0.1,max_tokens200)# 解析结果resultjson.loads(response.choices[0].message.content)print(result)关键改进示例增加到 3 个包含一个信息缺失的情况明确每个字段的格式要求日期格式、货币单位等强调不要 Markdown 格式避免模型输出json ...提问时不加前缀让模型自然续写场景三JSON 数据处理importjson d{name:A,age:18,gender:男}sjson.dumps(d,ensure_asciiFalse)print(s)l[{name:A,age:18,gender:男},{name:B,age:20,gender:女},{name:C,age:24,gender:男}]print(json.dumps(l,ensure_asciiFalse))json_str{name: A, age: 18, gender: 男}json_array_str[{name: A, age: 18, gender: 男}, {name: B, age: 20, gender: 女}, {name: C, age: 24, gender: 男}]res_dictjson.loads(json_str)print(res_dict,type(res_dict))res_listjson.loads(json_array_str)print(res_list,type(res_list))很多时候你需要把大模型的输出转成 Python 对象继续处理。这里有个常见坑错误示范importjson# 模型输出的 JSON 字符串json_str{name: A, age: 18, gender: 男}# 直接解析res_dictjson.loads(json_str)print(res_dict,type(res_dict))# {name: 周杰轮, age: 11, gender: 男} class dict问题如果模型输出的是下面这种就会报错# 模型可能输出这种带 Markdown 代码块json_strjson {name: A, age: 18, gender: 男} json.loads(json_str)# ❌ 报错正确做法importjsonimportredefparse_json_output(text:str)-dict:解析大模型输出的 JSON处理各种边界情况# 1. 去除 Markdown 代码块标记textre.sub(r^json\s*,,text)textre.sub(r\s*$,,text)texttext.strip()# 2. 尝试直接解析try:returnjson.loads(text)except:pass# 3. 尝试提取第一个 { 到最后一个 } 之间的内容matchre.search(r\{.*\},text,re.DOTALL)ifmatch:try:returnjson.loads(match.group())except:pass# 4. 都失败了抛出异常raiseValueError(f无法解析 JSON:{text})# 使用json_strjson {name: A, age: 18, gender: 男} resultparse_json_output(json_str)print(result)# ✅ {name: A, age: 18, gender: 男}更彻底的方案在提示词里就禁止 Markdownsystem_prompt... 输出规则 - 输出合法的 JSON 字符串不要用 Markdown 代码块包裹 - 不要输出任何解释只输出 JSON - 确保中文正常显示不需要转义 通用技巧总结搞完这 3 个场景我总结了一些通用技巧1. 示例格式必须和提问格式完全一致❌ 错误# 示例用户{文本}助手{类别}# 提问用户按照示例回答{文本}✅ 正确# 示例用户{文本}助手{类别}# 提问用户{文本}助手2. 示例要覆盖边界情况正常情况信息完整边界情况信息缺失、格式异常负例不匹配、不属于任何类别3. 系统提示要结构化system_prompt你是 [角色]。 任务[一句话说明任务] 判断标准/字段定义 - [标准 1] - [标准 2] 输出规则 - [规则 1] - [规则 2] 以下是示例4. JSON 输出要特别小心明确说不要 Markdown 代码块准备一个容错的解析函数可以用response_format{type: json_object}如果 API 支持5. 示例数量不是越多越好分类任务4-8 个示例信息抽取3-5 个示例包含边界情况复杂任务8-12 个示例完整模板直接套用最后给个通用模板3 个场景都能用fromopenaiimportOpenAIimportjsonimportre clientOpenAI(base_urlhttp://localhost:11434/v1)# 1. 写清楚系统提示system_prompt你是 [领域] 专家。 任务[一句话说明任务] [字段定义/判断标准] 输出规则 - [规则 1] - [规则 2] 以下是示例# 2. 准备示例覆盖正常 边界情况examples[(输入文本 1,期望输出 1),(输入文本 2,期望输出 2),(边界情况输入,边界情况输出),]# 3. 构建 messagesmessages[{role:system,content:system_prompt}]fortext,labelinexamples:messages.append({role:user,content:text})messages.append({role:assistant,content:label})# 4. 提问不要加前缀messages.append({role:user,content:你的问题})responseclient.chat.completions.create(modelqwen3:4b,messagesmessages,temperature0.1,max_tokens200)# 5. 解析输出如果是 JSONdefparse_json_output(text:str)-dict:textre.sub(r^json\s*,,text)textre.sub(r\s*$,,text)returnjson.loads(text.strip())resultparse_json_output(response.choices[0].message.content)print(result)核心核心就三点格式一致示例和提问长一个样示例精简短小、特征明显、覆盖边界情况指令清晰告诉模型做什么、怎么做、输出什么把你的提示词和示例存到版本控制里每次改动都记录效果参考链接Qwen API 文档https://help.aliyun.com/zh/dashscope/Ollama 本地部署https://ollama.comJSON 规范https://www.json.org/json-zh.html