从“踩坑”到“可控”:大模型 Prompt 工程实战总结与进阶方法论
——基于真实金融领域任务的 4000 字 Prompt 设计指南适用场景文本分类、实体抽取、语义匹配、批量处理、格式控制核心目标让 Prompt 从“反复试”变成“一次准”写在前面为什么你写的 Prompt 总是不稳定很多人在使用大模型时会经历这样一个过程写一段 Prompt模型输出很好 → “我学会了”换一批数据输出乱七八糟 → “模型不行”反复改措辞、加例子、调顺序 → “玄学调参”但真实的问题往往不是模型能力不够而是你的 Prompt 没有把“边界”说清楚。本文基于两份真实的金融领域项目文档文本分类、实体抽取、语义相似性判定从中提炼出可复用的 Prompt 精准化方法论。这两份文档记录了从“最初的错误输出”到“稳定可用”的完整调试过程是 Prompt 工程最宝贵的“临床经验”。第一部分核心认知 —— Prompt 不是“许愿”是“编程”1.1 模型的“常识”不等于你的“需求”模型在训练过程中学到了海量文本但它的“默认行为”是猜测你最可能的意图。这个猜测往往基于最常见的输出格式比如喜欢加解释、加 markdown最常见的理解方式比如把多条数据当成一段话最常见的省略方式比如单位、缺失字段你必须主动覆盖这些默认行为。 核心结论Prompt 的本质是用自然语言编写一个可执行的接口规范。就像是我们写代码的时候,总会加上各种限制,保障代码执行的健壮性!之前的面向对象编程中对象可能是接口文档,现在的对象就是大模型!1.2 精准 Prompt 的四个支柱通过分析两份文档中成功与失败的案例可以归纳出四个核心支柱支柱说明反面案例边界明确输入结构、输出格式、取值范围“抽取出实体”不说明格式示例驱动Few-shot 比文字描述强 10 倍长篇解释 JSON 结构约束完整缺失值、单位、禁止行为模型自己编造数据可解析性输出无需人工清洗输出带 json 或解释文字 |第二部分实战任务类型与 Prompt 演进路径任务一文本分类 —— 从“输出废话”到“只输出标签”问题原型需求判断金融文本属于“新闻报道、公司公告、财务公告、分析师报告”中的哪一类。初始 Prompt失败版“上面这段文本属于下面的哪个分类...”模型的典型错误输出这段文本属于“新闻报道”类别。它描述了中国几家大型国有银行降低利率的消息...然后还继续分析其他句子问题诊断模型不知道你要“只输出标签”—— 它认为解释是“有帮助的”模型不知道你有多条数据—— 它会把多条混在一起分析模型不知道标签的精确含义—— 会把“财务公告”和“公司公告”混淆演进过程五步到达稳定第 1 步加 Few-shot输入本公司年度财务报告显示... → 输出财务公告输入今日股市震荡... → 输出新闻报道✅ 效果准确率提升但仍然输出解释第 2 步明确禁止多余输出只输出分类结果不允许输出其他任何字符。第 3 步用符号包裹输出输出格式【财务公告】✅ 效果便于程序解析但仍可能输出多个第 4 步明确输入结构每行是一条独立数据逐条判断。✅ 效果批量处理开始稳定第 5 步完整规范模板最终版你是一位金融领域的文本分类专家。判断【输入文本】属于以下哪个【特定分类】。【特定分类】 [新闻报道,公司公告,财务公告,分析师报告]其中财务公告特指公司发布的财务数据文件资产、负债、盈利等。【输入文本】每行是一条独立数据需要逐条判断。只输出分类结果用【】包裹每条结果多条结果用逗号分隔。不允许输出其他任何字符。示例输入本公司年度财务报告显示盈利增长。输出【财务公告】【输入文本】{text}关键经验总结要点做法定义标签边界对易混淆的标签单独解释强制输出格式用符号包裹 禁止多余字符演示完整流程Few-shot 必须包含输入和输出批量处理显式化明确“每行一条”任务二实体抽取 —— 从“格式混乱”到“直接可解析 JSON”问题原型需求从金融文本中抽取日期、股票名称、开盘价、收盘价、成交量。初始输出问题// 模型经常输出带注释的 JSON{日期: [2023-02-15], // 这是日期股票名称: [佰笃[BD]]}或者json{日期: [...]} // 带 markdown 代码块标记核心难点单位要不要保留“100美元” vs “100”数字格式“460,000” vs “460000”缺失字段没有开盘价怎么办JSON 纯度能否直接json.loads()演进过程第 1 步要求 JSON 格式以 JSON 形式输出❌ 问题JSON 不干净带注释或 markdown第 2 步明确 key-value 结构字典的 key 是实体类型value 是列表形式✅ 效果结构稳定了但仍有额外字符第 3 步禁止多余字符关键突破只允许输出 JSON 结构本身不允许输出其他任何字符。✅ 效果输出可以直接用eval()或json.loads()第 4 步用 Few-shot 固化格式如果输入是2023-01-10...股票古哥-D[EOOE]...开盘价100美元...收盘价102美元...成交量520000那么输出{日期: [2023-01-10], 股票名称: [古哥-D[EOOE]], 开盘价: [100美元], 收盘价: [102美元], 成交量: [520000]}第 5 步处理多条数据 分隔符【输入文本】包含多条数据以“##”分割每条单独分析。最终稳定模板你是一位金融领域的实体抽取专家。抽取【输入文本】中的【特定实体】。【特定实体】 [日期,股票名称,开盘价,收盘价,成交量]【输入文本】包含多条数据以“##”分割每条单独分析。以【指定格式】输出不允许输出其他字符。【指定格式】 {日期: [2023-01-10], 股票名称: [古哥-D[EOOE]], 开盘价: [100美元], 收盘价: [102美元], 成交量: [520000]}【输入文本】{text}关键经验总结痛点解决方案JSON 不干净明确“不允许输出其他字符”单位丢失在 Few-shot 中保留单位多条数据混淆明确分隔符 逐条处理输出不可解析用 Few-shot 锁定 exact 格式任务三语义相似性判定 —— 从“是/否混淆”到“批量精确输出”问题原型需求判断金融领域两个句子是否表达相同意思。初始问题模型输出“是”或“否”之外的解释多条数据时只返回一个结果对边界案例判断不一致成功模板的关键要素你是一位金融领域的语义匹配专家。判断【句子对】是否表达相同含义。【句子对】每行是一条独立数据需要单独判断。只允许输出“是”或“否”不允许输出其他字符。多条结果以列表形式输出如[是,否,是]示例输入公司利润上升 / 公司盈利增长 → 输出是输入油价下跌 / 城市建设 → 输出否【句子对】{text}关键经验明确输出粒度每行一条逐条输出给出边界示例正例 反例列表化批量输出便于程序解析第三部分高级技巧与常见陷阱3.1 如何应对“模型编造信息”文档中记录了一个典型场景要求判断候选人是否符合 J2EE 岗位模型却输出了“非常合格”尽管候选人的项目经历是“货车维修知识图谱”。解决方案如果【特定信息】不存在输出“无”不允许自行编造。强化版如果你不确定答案必须输出“无法判断”禁止基于猜测生成任何信息。3.2 如何控制输出长度文档中提到一个案例要求输出“100字以内摘要”模型有时会超长。解决方案【长度约束】输出不超过 100 个中文字符。超出部分将被截断请严格遵守。3.3 如何处理复杂嵌套 JSON当输出结构很复杂时用文字描述 JSON 结构容易出错。文档中的经验是用 Few-shot 直接给出 exact 输出样例比任何 schema 描述都有效。输出格式必须完全一致{基本信息: {姓名: 张三, 年龄: 28},工作经历: [{公司: 阿里, 职位: 工程师}]}3.4 常见陷阱清单对照文档整理陷阱现象解决方案隐式多轮推理模型自己补充额外判断明确“只做第 1 步”单位丢失“100”而不是“100美元”Few-shot 中保留单位分隔符误解把##当成普通文本明确“以##作为数据分隔符”输出污染带\json | 明确“禁止 markdown 代码块” |标签歧义“财务公告” vs “公司公告”对易混淆标签单独定义第四部分可复用的 Prompt 模板库可直接复制使用模板 1单条文本分类你是一位【领域】分类专家。从【分类列表】中为【输入文本】选择一个最合适的分类。只输出分类名称不允许输出其他字符。【分类列表】 [A, B, C]【输入文本】{text}模板 2批量实体抽取你是一位【领域】实体抽取专家。抽取【特定实体】以【指定格式】输出。【特定实体】 [实体1, 实体2, 实体3]【指定格式】 {实体1: [值1], 实体2: [值2]}【输入文本】包含多条数据以“##”分割每条单独分析。只输出 JSON 结构不允许输出其他字符。【输入文本】{text}模板 3语义匹配批量你是一位【领域】语义匹配专家。判断【句子对】是否表达相同含义。每行一条数据逐条判断。只输出“是”或“否”多条结果用逗号分隔。不允许输出其他字符。示例输入A / B → 输出是【输入文本】{text}模板 4信息抽取含缺失值处理你是一位【领域】信息抽取专家。从【输入文本】中抽取【特定字段】。如果某个字段不存在输出“无”。禁止自行编造。【特定字段】 [字段1, 字段2]【输出格式】 {字段1: 值1, 字段2: 值2}【输入文本】{text}第五部分写给自己的 Prompt 质量检查清单在提交任何 Prompt 之前逐条确认输入边界我是否明确了输入是单条还是多条如果多条分隔符是什么我是否说明了每条数据如何独立处理输出边界我是否指定了输出格式JSON/列表/纯文本我是否禁止了多余字符解释、markdown、注释我是否给出了 exact 输出示例内容约束缺失字段时如何处理null/无/跳过单位是否保留数字格式是否明确是否保留逗号行为约束是否禁止编造信息是否要求不确定时输出“无法判断”是否用 Few-shot 锁定了行为结语从“调 Prompt”到“设计 Prompt”这两份文档最有价值的启示是90% 的 Prompt 问题不是模型能力不够而是指令不够精确。写 Prompt 的过程本质上是在设计一个与模型沟通的协议。这个协议需要明确输入长什么样输出长什么样边界在哪里错误怎么处理当你把这些问题一个一个回答清楚并用 Few-shot 锁定时模型就不再是“偶尔正确”的黑盒而变成了“稳定可控”的工具。希望你下次写 Prompt 时不再是“猜模型会怎么理解”而是“告诉模型该怎么做”。附录推荐阅读与工具Ollama本地运行大模型便于 Prompt 调试Mermaid可视化 Prompt 流程JSONL 格式适合批量 Prompt 处理本文基于真实金融领域项目文档总结而成欢迎在实践中验证和反馈。