【黑马RAG与Agent智能体项目】(二)提示词工程

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 提示词工程的核心要素

  1. 角色定位:告诉模型它是什么角色(如"金融专家")
  2. 清晰的任务描述:说明需要完成什么任务
  3. 示例数据:提供高质量的输入-输出示例
  4. 输出格式约束:规定输出的格式(如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 关键技巧总结

  1. System角色设定:明确模型是"金融专家",增强专业性
  2. 分类列表明确:在提示词中列出所有可能的分类
  3. 兜底策略:对于不确定的文本,分类为"不清楚类别"
  4. Few-Shot示例:每个类别提供一个典型示例
  5. 动态消息拼接 :使用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 关键技巧总结

  1. Schema定义:明确需要抽取的字段列表,让模型知道要提取什么
  2. JSON格式输出:要求模型以JSON格式返回,便于后续程序处理
  3. 缺失值处理:对于不存在的信息,统一用"原文未提及"表示,避免模型胡编乱造
  4. ensure_ascii=False:在json.dumps时使用,保证中文字符正常显示而不是Unicode编码
  5. 多样化示例:提供不同货币单位(人民币、美元)的示例,增强模型泛化能力

四、案例三:金融文本匹配判断

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 关键技巧总结

  1. 正负样本平衡:提供"是"和"不是"两类示例,让模型理解两种情况
  2. 边界标记 :用[]包围句子,明确句子边界,避免混淆
  3. 简洁输出:只要求输出"是"或"不是",避免模型输出冗余解释
  4. 多样化示例:每类提供2个示例,增强模型泛化能力
  5. 语义理解:示例中包含同义改写(如"盈利增长"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示例选择策略

选择原则:

  1. 代表性:选择典型的、有代表性的样本
  2. 多样性:覆盖不同的子类别或场景
  3. 质量优先:宁少勿滥,确保每个示例都是高质量的
  4. 数量适中:通常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 成本优化建议

  1. 复用消息列表:将Few-Shot示例构建为基础messages,多次查询时复用
  2. 精简示例:只保留最有效的示例,减少token消耗
  3. 批量处理:将多个问题合并处理(如果任务允许)
  4. 选择合适模型:根据任务复杂度选择模型(简单任务可用更小的模型)

七、三个案例的对比分析

维度 案例一:文本分类 案例二:信息抽取 案例三:文本匹配
任务类型 多分类 结构化抽取 二分类
输出格式 单个标签字符串 JSON对象 "是"/"不是"
示例数量 4个(每类1个) 2个 4个(正负各2个)
难度 ⭐⭐ ⭐⭐⭐ ⭐⭐
应用场景 文档分类、内容审核 实体识别、信息提取 去重、相似度判断
关键技巧 兜底策略 Schema定义 正负样本平衡

八、学习收获与反思

8.1 核心收获

  1. 掌握Few-Shot Learning核心原理:通过少量示例引导模型完成特定任务
  2. 理解消息角色机制:system定义任务,user/assistant提供示例
  3. 学会提示词优化技巧:明确性、一致性、完整性、简洁性
  4. 实践三种典型NLP任务:分类、抽取、匹配
  5. 掌握结构化输出处理: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 实战项目建议

  1. 金融新闻分析系统:自动分类、情感分析、关键信息抽取
  2. 智能客服机器人:基于Few-Shot的意图识别和回复生成
  3. 文档处理助手:合同信息抽取、文档相似度计算

附录:完整代码汇总

所有代码已在各案例章节中完整展示,可直接复制使用。使用前请:

  1. 安装依赖:pip install openai
  2. 替换API Key为你自己的密钥
  3. 根据需要调整示例数据和测试问题

💡 学习建议

提示词工程是一门实践性很强的技术,建议:

  • 多动手实验,尝试不同的提示词设计
  • 对比Zero-Shot和Few-Shot的效果差异
  • 记录每次实验的结果,总结规律
  • 关注最新的Prompt Engineering技术进展
    📝 笔记说明

本文为个人学习笔记,代码示例均已测试可用。

如有问题或建议,欢迎交流讨论!

相关推荐
C++ 老炮儿的技术栈2 小时前
不调用C++/C的字符串库函数,编写函数strcmp
c语言·开发语言·c++·人工智能·windows·git·visual studio
码农三叔2 小时前
(6-1)手部、足部与末端执行器设计:仿生手设计
人工智能·架构·机器人·人形机器人
liliangcsdn2 小时前
RL中GAE的计算过程详解
大数据·人工智能·算法
yhyvc2 小时前
人形具身机器人国产/进口快速选型优先级清单
人工智能·机器人
wangmengxxw2 小时前
SpringAI-mysql
java·数据库·人工智能·mysql·springai
考證寶題庫網2 小时前
Designing and Implementing a Microsoft Azure AI Solution 微軟Azure AI-102 認證全攻略
人工智能·microsoft·azure
逄逄不是胖胖2 小时前
《动手学深度学习》-52文本预处理实现
人工智能·pytorch·python·深度学习
Pyeako2 小时前
opencv计算机视觉--图形透视(投影)变换&图形拼接
人工智能·python·opencv·计算机视觉·图片拼接·投影变换·图形透视变换
HZjiangzi2 小时前
怎么用三维扫描做数字孪生工厂?思看科技TrackScan-Sharp方案推荐
人工智能·科技·制造·三维扫描仪