——基于真实金融领域任务的 4000+ 字 Prompt 设计指南

适用场景:文本分类、实体抽取、语义匹配、批量处理、格式控制
核心目标:让 Prompt 从“反复试”变成“一次准”


写在前面:为什么你写的 Prompt 总是不稳定?

很多人在使用大模型时,会经历这样一个过程:

  1. 写一段 Prompt,模型输出很好 → “我学会了”

  2. 换一批数据,输出乱七八糟 → “模型不行”

  3. 反复改措辞、加例子、调顺序 → “玄学调参”

但真实的问题往往不是模型能力不够,而是你的 Prompt 没有把“边界”说清楚

本文基于两份真实的金融领域项目文档(文本分类、实体抽取、语义相似性判定),从中提炼出可复用的 Prompt 精准化方法论。这两份文档记录了从“最初的错误输出”到“稳定可用”的完整调试过程,是 Prompt 工程最宝贵的“临床经验”。


第一部分:核心认知 —— Prompt 不是“许愿”,是“编程”

1.1 模型的“常识”不等于你的“需求”

模型在训练过程中学到了海量文本,但它的“默认行为”是:猜测你最可能的意图。这个猜测往往基于:

  • 最常见的输出格式(比如喜欢加解释、加 markdown)

  • 最常见的理解方式(比如把多条数据当成一段话)

  • 最常见的省略方式(比如单位、缺失字段)

你必须主动覆盖这些默认行为。

📌 核心结论:Prompt 的本质,是用自然语言编写一个可执行的接口规范

就像是我们写代码的时候,总会加上各种限制,保障代码执行的健壮性!

之前的面向对象编程中对象可能是接口文档,现在的对象就是大模型!

1.2 精准 Prompt 的四个支柱

通过分析两份文档中成功与失败的案例,可以归纳出四个核心支柱:

支柱 说明 反面案例
边界明确 输入结构、输出格式、取值范围 “抽取出实体”(不说明格式)
示例驱动 Few-shot 比文字描述强 10 倍 长篇解释 JSON 结构
约束完整 缺失值、单位、禁止行为 模型自己编造数据
可解析性 输出无需人工清洗 输出带 ```json 或解释文字 |

第二部分:实战任务类型与 Prompt 演进路径

任务一:文本分类 —— 从“输出废话”到“只输出标签”

问题原型

需求:判断金融文本属于“新闻报道、公司公告、财务公告、分析师报告”中的哪一类。

初始 Prompt(失败版):

“上面这段文本属于下面的哪个分类?...”

模型的典型错误输出

这段文本属于“新闻报道”类别。它描述了中国几家大型国有银行降低利率的消息...
(然后还继续分析其他句子)

问题诊断

  1. 模型不知道你要“只输出标签” —— 它认为解释是“有帮助的”

  2. 模型不知道你有多条数据 —— 它会把多条混在一起分析

  3. 模型不知道标签的精确含义 —— 会把“财务公告”和“公司公告”混淆

演进过程(五步到达稳定)

第 1 步:加 Few-shot

输入:本公司年度财务报告显示... → 输出:财务公告
输入:今日股市震荡... → 输出:新闻报道

✅ 效果:准确率提升,但仍然输出解释

第 2 步:明确禁止多余输出

只输出分类结果,不允许输出其他任何字符。

第 3 步:用符号包裹输出

输出格式:【财务公告】

✅ 效果:便于程序解析,但仍可能输出多个

第 4 步:明确输入结构

每行是一条独立数据,逐条判断。

✅ 效果:批量处理开始稳定

第 5 步:完整规范模板(最终版)

你是一位金融领域的文本分类专家。
判断【输入文本】属于以下哪个【特定分类】。
【特定分类】 = ["新闻报道","公司公告","财务公告","分析师报告"]
其中:财务公告特指公司发布的财务数据文件(资产、负债、盈利等)。

【输入文本】每行是一条独立数据,需要逐条判断。
只输出分类结果,用【】包裹每条结果,多条结果用逗号分隔。
不允许输出其他任何字符。

示例:
输入:本公司年度财务报告显示盈利增长。
输出:【财务公告】

【输入文本】
{text}

关键经验总结

要点 做法
定义标签边界 对易混淆的标签单独解释
强制输出格式 用符号包裹 + 禁止多余字符
演示完整流程 Few-shot 必须包含输入和输出
批量处理显式化 明确“每行一条”

任务二:实体抽取 —— 从“格式混乱”到“直接可解析 JSON”

问题原型

需求:从金融文本中抽取日期、股票名称、开盘价、收盘价、成交量。

初始输出问题

// 模型经常输出带注释的 JSON
{
  "日期": ["2023-02-15"],  // 这是日期
  "股票名称": ["佰笃[BD]"]
}

或者

```json
{"日期": [...]}
```  // 带 markdown 代码块标记

核心难点

  1. 单位要不要保留(“100美元” vs “100”)

  2. 数字格式(“460,000” vs “460000”)

  3. 缺失字段(没有开盘价怎么办)

  4. 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}

关键经验

  1. 明确输出粒度:每行一条,逐条输出

  2. 给出边界示例:正例 + 反例

  3. 列表化批量输出:便于程序解析


第三部分:高级技巧与常见陷阱

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 处理


本文基于真实金融领域项目文档总结而成,欢迎在实践中验证和反馈。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐