Day2学习笔记:提示词工程与Few-Shot学习实战
作者:yedou
日期:2026-01-26
专栏:AI Agent开发实战
📚 学习概览
本文总结了Day2的学习内容,主要围绕提示词工程(Prompt Engineering)和 少样本学习(Few-Shot Learning)在金融NLP任务中的应用。通过三个实战案例,深入理解如何通过优化提示词来提升大模型在特定任务上的表现。
核心知识点
- 零样本学习(Zero-Shot Learning)
- 少样本学习(Few-Shot Learning)
- 提示词优化技巧
- 金融文本分类、信息抽取、文本匹配
一、理论基础
1.1 零样本学习 vs 少样本学习
零样本学习(Zero-Shot)
- 不提供任何示例,直接让模型完成任务
- 依赖模型的预训练知识
- 适用于简单、通用的任务
少样本学习(Few-Shot)
- 提供少量示例(通常2-10个)
- 通过示例引导模型理解任务格式和要求
- 显著提升模型在特定任务上的准确性
1.2 提示词工程的核心要素
- 角色定位:告诉模型它是什么角色(如"金融专家")
- 清晰的任务描述:说明需要完成什么任务
- 示例数据:提供高质量的输入-输出示例
- 输出格式约束:规定输出的格式(如JSON、分类标签等)
案例一:金融文本分类
2.1 任务描述
将金融文本分类为以下四类之一:
- 新闻报道
- 财务报告
- 公司公告
- 分析师报告
2.2 完整代码实现
python
from openai import OpenAI
# 1. 获取client对象,OpenAI类对象
client = OpenAI(
api_key="YOUR_API_KEY", # 替换为你的API密钥
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 示例数据
examples_data = {
'新闻报道': '今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告': '本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发',
'公司公告': '本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告': '最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者'
}
# 分类列表
examples_types = ['新闻报道', '财务报告', '公司公告', '分析师报告']
# 提问数据
questions = [
"今日,央行发布公告宣布降低利率,以刺激经济增长,这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",
"ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步",
"公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
"最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
"小明喜欢小新哟"
]
# 构建消息列表(Few-Shot Learning核心)
messages = [
{"role": "system", "content": "你是金融专家,将文本分类为['新闻报道', '财务报道', '公司公告', '分析师报告'], 不清楚的分类为'不清楚类别'"}
]
# 添加示例(Few-Shot示例)
for key, value in examples_data.items():
messages.append({"role": "user", "content": value})
messages.append({"role": "assistant", "content": key})
# 向模型提问
for q in questions:
response = client.chat.completions.create(
model="deepseek-v3.2",
messages=messages + [{"role": "user", "content": f"按照示例,回答这段文本的分类类别:{q}"}]
)
print(response.choices[0].message.content)
2.3 消息结构解析
代码中的消息结构遵循Few-Shot Learning的标准模式:
python
"""
消息列表结构示例:
[
{"role": "system", "content": "你是金融专家,将文本分类为['新闻报道', '财务报道', '公司公告', '分析师报告'], 不清楚的分类为'不清楚'"},
{"role": "user", "content": "今日,央行发布公告宣布降............"},
{"role": "assistant", "content": "新闻报道"},
{"role": "user", "content": "ABC公司今日发布公告称,已成功完成对XYZ公司股................."},
{"role": "assistant", "content": "财务报告"},
{"role": "user", "content": "公司资产负债表显示,公司偿债能力强劲,现金流充足...................."},
{"role": "assistant", "content": "公司公告"},
{"role": "user", "content": "最新的分析报告指出,可再生能源............."},
{"role": "assistant", "content": "分析师报告"},
{"role": "user", "content": "要提问的问题"}
]
"""
2.4 关键技巧总结
- System角色设定:明确模型是"金融专家",增强专业性
- 分类列表明确:在提示词中列出所有可能的分类
- 兜底策略:对于不确定的文本,分类为"不清楚类别"
- Few-Shot示例:每个类别提供一个典型示例
- 动态消息拼接 :使用
messages + [新消息]的方式,保持示例不变
三、案例二:金融信息抽取
3.1 任务描述
从金融文本中抽取结构化信息,包括:
- 日期
- 股票名称
- 开盘价
- 收盘价
- 成交量
3.2 完整代码实现
python
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY", # 替换为你的API密钥
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 定义抽取字段(Schema)
schema = ["日期", "股票名称", "开盘价", "收盘价", "成交量"]
# 示例数据
examples_data = [
{
"content": "2023-01-10, 股市震荡。股票强大科技A今日开盘价100人民币,一度飙升至105人民币,随后回落至98人民币,最终以102人民币收盘,成交量达到520000。",
"answers": {
"日期": "2023-01-10",
"股票名称": "强大科技A股",
"开盘价": "100人民币",
"收盘价": "102人民币",
"成交量": "520000"
}
},
{
"content": "2024-05-16, 股市利好。股票英伟达美股今日开盘价105美元,一度飙升至109美元,随后回落至100美元,最终以116美元收盘,成交量达到3560000。",
"answers": {
"日期": "2024-05-16",
"股票名称": "英伟达美股",
"开盘价": "105美元",
"收盘价": "116美元",
"成交量": "3560000"
}
}
]
# 提问问题
questions = [
"2025-06-16, 股市利好。股票传智教育A今日开盘价66人民币,一度飙升至70人民币,随后回落至65��民币,最终以68人民币收盘,成交量达到123000。",
"2025-06-06, 股市利好。股票黑马程序员A今日开盘价200人民币,一度飙升至211人民币,随后回落至201人民币,最终以206人民币收盘。"
]
# 导入json模块用于格式化输出
import json
# 构建消息列表
messages = [
{"role": "system", "content": f"你帮我完成信息抽取,我给你句子,你抽取{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'表示"}
]
# 添加Few-Shot示例
for example in examples_data:
messages.append(
{"role": "user", "content": example["content"]}
)
messages.append(
{"role": "assistant", "content": json.dumps(example["answers"], ensure_ascii=False)}
)
# 进行信息抽取
for q in questions:
response = client.chat.completions.create(
model="deepseek-v3.2",
messages=messages + [{"role": "user", "content": f"按照上述的示例,现在抽取这个句子的信息:{q}"}]
)
print(response.choices[0].message.content)
3.3 消息结构解析
python
"""
消息列表结构示例:
[
{"role": "system", "content": "你帮我完成信息抽取,我给你句子,你抽取{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'表示,请参考如下示例:"},
{"role": "user", "content": "2023-01-10, 股市震荡。股票强大科技A今日开盘价100人民币,一度飙升至105人民币,随后回落至98人民币,最终以102人民币收盘,成交量达到520000。"},
{"role": "assistant", "content": "{\"日期\": \"2023-01-10\", \"股票名称\": \"强大科技A股\", \"开盘价\": \"100人民币\", \"收盘价\": \"102人民币\", \"成交量\": \"520000\"}"},
{"role": "user", "content": "2024-05-16, 股市利好。股票英伟达美股今日开盘价105美元,一度飙升至109美元,随后回落至100美元,最终以116美元收盘,成交量达到3560000。"},
{"role": "assistant", "content": "{\"日期\": \"2024-05-16\", \"股票名称\": \"英伟达美股\", \"开盘价\": \"105美元\", \"收盘价\": \"116美元\", \"成交量\": \"3560000\"}"},
{"role": "user", "content": "按照上述示例,现在抽取这个句子的信息:{要抽取的句子文本}"}
]
"""
3.4 关键技巧总结
- Schema定义:明确需要抽取的字段列表,让模型知道要提取什么
- JSON格式输出:要求模型以JSON格式返回,便于后续程序处理
- 缺失值处理:对于不存在的信息,统一用"原文未提及"表示,避免模型胡编乱造
- ensure_ascii=False:在json.dumps时使用,保证中文字符正常显示而不是Unicode编码
- 多样化示例:提供不同货币单位(人民币、美元)的示例,增强模型泛化能力
四、案例三:金融文本匹配判断
4.1 任务描述
判断两个金融文本是否表达相同的意思,输出"是"或"不是"。这是一个典型的文本语义匹配任务,在金融领域可用于:
- 新闻去重
- 公告相似度判断
- 信息一致性检查
4.2 完整代码实现
python
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY", # 替换为你的API密钥
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 示例数据(包含正例和负例)
examples_data = {
"是": [
("公司ABC发布了季度财报,显示盈利增长。", "财报披露,公司ABC利润上升。"),
("公司ITCAST发布了年度财报,显示盈利大幅度增长。", "财报披露,公司ITCAST更赚钱了。")
],
"不是": [
("黄金价格下跌,投资者抛售。", "外汇市场交易额创下新高。"),
("央行降息,刺激经济增长。", "新能源技术的创新。")
]
}
# 测试问题
questions = [
("利率上升,影响房地产市场。", "高利率对房地产有一定的冲击。"),
("油价大幅度下跌,能源公司面临挑战。", "未来智能城市的建设趋势越加明显。"),
("股票市场今日大涨,投资者乐观。", "持续上涨的市场让投资者感到满意。")
]
# 构建消息列表
messages = [
{"role": "system", "content": "你帮我完成文本匹配,我给你2个句子,被[]包围,你判断它们是否匹配,回答是或不是,请参考如下示例:"}
]
# 添加Few-Shot示例(正例和负例)
for key, value in examples_data.items():
for t in value:
messages.append(
{"role": "user", "content": f"句子1: [{t[0]}],句子2: [{t[1]}]"}
)
messages.append(
{"role": "assistant", "content": key}
)
# 进行文本匹配判断
for q in questions:
response = client.chat.completions.create(
model="deepseek-v3.2",
messages=messages + [{"role": "user", "content": f"句子1: [{q[0]}],句子2: [{q[1]}]"}]
)
print(response.choices[0].message.content)
4.3 消息结构解析
python
"""
消息列表结构示例:
[
{"role": "system", "content": "你帮我完成文本匹配,我给你2个句子,被[]包围,你判断它们是否匹配,回答是或不是,请参考如下示例:"},
{"role": "user", "content": "句子1: [公司ABC发布了季度财报,显示盈利增长。] 句子2: [财报披露,公司ABC利润上升。]"},
{"role": "assistant", "content": "是"},
{"role": "user", "content": "句子1: [公司ITCAST发布了年度财报,显示盈利大幅度增长。] 句子2: [财报披露,公司ITCAST更赚钱了。]"},
{"role": "assistant", "content": "是"},
{"role": "user", "content": "句子1: [黄金价格下跌,投资者抛售。] 句子2: [外汇市场交易额创下新高。]"},
{"role": "assistant", "content": "不是"},
{"role": "user", "content": "句子1: [央行降息,刺激经济增长。] 句子2: [新能源技术的创新。]"},
{"role": "assistant", "content": "不是"},
{"role": "user", "content": "按照上述示例,回答这2个句子的情况。句子1: [...],句子2: [...]"}
]
"""
4.4 关键技巧总结
- 正负样本平衡:提供"是"和"不是"两类示例,让模型理解两种情况
- 边界标记 :用
[]包围句子,明确句子边界,避免混淆 - 简洁输出:只要求输出"是"或"不是",避免模型输出冗余解释
- 多样化示例:每类提供2个示例,增强模型泛化能力
- 语义理解:示例中包含同义改写(如"盈利增长"vs"利润上升"),引导模型关注语义而非字面
五、通用最佳实践与设计模式
5.1 Few-Shot消息结构设计模式
所有案例都遵循统一的消息结构设计模式:
python
messages = [
# 第1步:System角色 - 定义任务和输出格式
{"role": "system", "content": "角色定位 + 任务描述 + 输出格式要求"},
# 第2步:Few-Shot示例 - 提供输入输出对
{"role": "user", "content": "示例输入1"},
{"role": "assistant", "content": "示例输出1"},
{"role": "user", "content": "示例输入2"},
{"role": "assistant", "content": "示例输出2"},
# ... 更多示例(通常2-5个)
# 第3步:实际问题
{"role": "user", "content": "实际要处理的问题"}
]
5.2 提示词优化的四大原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 明确性 | 避免模糊描述,给出具体要求 | ❌ "分类这段文本" ✅ "将文本分类为['新闻报道', '财务报告', '公司公告', '分析师报告']" |
| 一致性 | 示例格式保持统一 | 所有示例使用相同的输入输出格式 |
| 完整性 | 覆盖正例、负例、边界情况 | 文本匹配任务同时提供"是"和"不是"的示例 |
| 简洁性 | 避免冗余信息 | 只提供必要的上下文,不添加无关描述 |
5.3 Few-Shot示例选择策略
选择原则:
- 代表性:选择典型的、有代表性的样本
- 多样性:覆盖不同的子类别或场景
- 质量优先:宁少勿滥,确保每个示例都是高质量的
- 数量适中:通常2-5个示例即可,过多会增加token消耗和成本
示例数量建议:
- 简单任务(如二分类):2-3个示例
- 中等复杂度(如多分类):3-5个示例
- 复杂任务(如信息抽取):4-6个示例
5.4 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 模型输出格式不一致 | 示例格式不统一 | 确保所有示例使用完全相同的格式 |
| 模型胡编乱造信息 | 没有明确缺失值处理规则 | 在system消息中说明"不存在的信息用'原文未提及'表示" |
| 分类效果差 | 示例不够代表性 | 每个类别至少提供1个典型示例 |
| Token消耗过大 | 示例过多或过长 | 精简示例,保留最核心的2-5个 |
六、技术栈与工具总结
6.1 核心技术栈
| 技术/工具 | 版本/说明 | 用途 |
|---|---|---|
| Python | 3.x | 编程语言 |
| OpenAI SDK | openai库 | 调用大模型API的客户端 |
| DeepSeek-V3.2 | 大语言模型 | 底层推理引擎 |
| JSON | 标准库 | 结构化数据处理 |
| 阿里云DashScope | API服务 | 模型托管平台 |
6.2 API调用模式
python
# 标准调用模式
response = client.chat.completions.create(
model="deepseek-v3.2", # 模型名称
messages=messages # 消息列表(包含Few-Shot示例)
)
# 获取结果
result = response.choices[0].message.content
6.3 成本优化建议
- 复用消息列表:将Few-Shot示例构建为基础messages,多次查询时复用
- 精简示例:只保留最有效的示例,减少token消耗
- 批量处理:将多个问题合并处理(如果任务允许)
- 选择合适模型:根据任务复杂度选择模型(简单任务可用更小的模型)
七、三个案例的对比分析
| 维度 | 案例一:文本分类 | 案例二:信息抽取 | 案例三:文本匹配 |
|---|---|---|---|
| 任务类型 | 多分类 | 结构化抽取 | 二分类 |
| 输出格式 | 单个标签字符串 | JSON对象 | "是"/"不是" |
| 示例数量 | 4个(每类1个) | 2个 | 4个(正负各2个) |
| 难度 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 应用场景 | 文档分类、内容审核 | 实体识别、信息提取 | 去重、相似度判断 |
| 关键技巧 | 兜底策略 | Schema定义 | 正负样本平衡 |
八、学习收获与反思
8.1 核心收获
- ✅ 掌握Few-Shot Learning核心原理:通过少量示例引导模型完成特定任务
- ✅ 理解消息角色机制:system定义任务,user/assistant提供示例
- ✅ 学会提示词优化技巧:明确性、一致性、完整性、简洁性
- ✅ 实践三种典型NLP任务:分类、抽取、匹配
- ✅ 掌握结构化输出处理:JSON格式化、中文编码处理
8.2 实战经验总结
提示词设计的关键:
- 明确告诉模型"你是谁"(角色定位)
- 明确告诉模型"做什么"(任务描述)
- 明确告诉模型"怎么输出"(格式约束)
- 通过示例"演示一遍"(Few-Shot示例)
常见陷阱:
- ❌ 示例格式不一致导致输出混乱
- ❌ 没有处理缺失值导致模型胡编
- ❌ 示例过多导致token浪费
- ❌ 只提供正例没有负例导致模型偏向
九、进阶学习方向
9.1 短期目标(1-2周)
- Chain-of-Thought(CoT)提示:让模型展示推理过程
- Self-Consistency:多次采样取最一致的结果
- 提示词模板化:构建可复用的提示词模板库
- 评估指标设计:如何量化评估提示词效果
9.2 中期目标(1个月)
- 复杂信息抽取:实体关系抽取、事件抽取
- 多轮对话设计:构建有状态的对话系统
- Prompt Engineering工具:LangChain、Semantic Kernel
- 模型微调:从Few-Shot到Fine-tuning
9.3 长期目标(3个月+)
- Agent开发:构建具有规划和执行能力的AI Agent
- RAG系统:检索增强生成系统
- 多模态应用:文本+图像的联合处理
- 生产级部署:性能优化、成本控制、监控告警
十、参考资料与扩展阅读
10.1 官方文档
10.2 推荐学习资源
- Prompt Engineering Guide:系统的提示词工程指南
- LangChain Documentation:流行的LLM应用开发框架
- Papers with Code - Few-Shot Learning:最新的Few-Shot学习论文
10.3 实战项目建议
- 金融新闻分析系统:自动分类、情感分析、关键信息抽取
- 智能客服机器人:基于Few-Shot的意图识别和回复生成
- 文档处理助手:合同信息抽取、文档相似度计算
附录:完整代码汇总
所有代码已在各案例章节中完整展示,可直接复制使用。使用前请:
- 安装依赖:
pip install openai - 替换API Key为你自己的密钥
- 根据需要调整示例数据和测试问题
💡 学习建议
提示词工程是一门实践性很强的技术,建议:
- 多动手实验,尝试不同的提示词设计
- 对比Zero-Shot和Few-Shot的效果差异
- 记录每次实验的结果,总结规律
- 关注最新的Prompt Engineering技术进展
📝 笔记说明本文为个人学习笔记,代码示例均已测试可用。
如有问题或建议,欢迎交流讨论!