从“踩坑”到“可控”:大模型 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 处理
本文基于真实金融领域项目文档总结而成,欢迎在实践中验证和反馈。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)