提示词工程¶
概念¶
提示工程(Prompt Engineering),也称为In-Context Prompting,是指在不更新模型权重的情况下如何与大模型进行交互以引导其行为以获得所需结果的方法。
技巧¶
1、详细的描述
写一封情书 -> 用一些温柔的话语写一封情书,来表达我对你的仰慕和思念。最后,我要求书写字体数要不低于500个字
2、让模型充当某个角色
我需要你充当一个AI算法面试官的角色,要求你自主的对我进行AI面试过程中常考的面试题,你可以一次说一个问题,然后我回答完,你再出第二道题
3、使用分隔符标明输入的不同部分
中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本,也可以帮助模型更好的理解文本内容。常用''''''把内容框起来
用20个字符总结由三引号分割的文本。"""在此插入文本"""
4、指定任务步骤
对于可以拆分的任务可以尽量拆开,最好能为其指定一系列步骤,明确步骤可以让模型更容易实现它们
步骤1:总结用户发送的文本 步骤2:将步骤1总结的文本翻译成英文,并添加前缀"翻译:"
5、提供例子 本质类似于few-shot leaning。先扔给大模型举例,然后让模型按照例子来输出
按照这句评论文本的格式:'""用户输入文本""',帮我创造新的样本
6、使用参考文本
基于文本文档,辅助大模型问答,降低模型"幻觉"(一本正经的胡说八道)问题。 即使用参考文本作答 经典的知识库用法,让大模型使用我们提供的信息来组成答案
根据下文中三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”,不要自己造答案。 """<在此插入文档>""""""<在此插入文档>""" 问题:<在此插入问题>
提示词工程就是更好的向模型提问的技巧。 大模型本身是一种很简单的结构,即:用户输入,模型输出。 用更详细、更清晰、有逻辑、有参考的提问,获得期望中的回答效果 不管是RAG还是Agent智能体亦或是其它围绕模型的各类复杂的开发工作,本质上都可以简单总结为在提示词上下功夫。
实例一¶
基于Few-Shot + Zero-Shot的思想,设计prompt(提示词), 进而应用大模型完成相应的任务。
Zero-shot学习¶
Zero-shot学习(Zero-shot Learning)是指在训练阶段不存在与测试阶段完全相同的类别,但是模型可以使用训练过的知识来推广到测试集中的新类别上。 这种能力被称为 “零样本”学习 ,因为模型在训练时从未见过测试集中的新类别,在模型训练和提示词优化中均有体现。
在模型训练中应用这个思想:
- 已知马(四脚兽)、虎(有条纹)、熊猫(黑白色)的特征,但未训练过斑马的数据(不认识)
- 告知模型:斑马是四脚兽、有黑白色的条纹
- 模型可以在已知数据中进行推理,从而识别斑马。
在提示词优化中: * Zero-shot思想用于基于已训练的能力,不提供任何示例,仅通过语言去描述任务的要求、目标和约束,让模型直接生成结果。
简单来说就是“用语言定义任务,解放(信任)模型的预训练知识”
比如:
请判断””包围的用户评论中的情感倾向,输出 正面 或 负面。
”这款代餐鸡胸肉饱腹感很强,吃起来也不柴,很推荐
Few-shot思想¶
Few-shot学习(Few-shot Learning)是指少样本学习,当模型在学习了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习,对应的有one-shot learning,单样本学习,也算样本少到为一的情况下的一种few-shot learning。
在模型训练中(相似度判断方法):
* 基于少量企鹅样本并结合相识度判断,推论未知图片内含“企鹅
在提示词优化中:
- Few-shot主要用于基于少量示例,让模型参考示例回答。
简单来说就是“用示例定义任务,在模型的预训练知识的基础上,提升模型回答的对齐精度(比如参考示例的格式)”
比如:
请抽取产品名称和核心卖点2个字段,格式为Json,我提供2个示例。 示例1:MacBookPro高效节能,性能强大,适合牛马工作使用 输出:{“产品名称”: “MacBookPro”, “产品卖点”: “高效节能,性能强大”} 示例2:联想笔记本拥有RTX4060独立显卡,畅玩游戏,丝滑流畅 输出:{“产品名称”: “联想笔记本”, “产品卖点”: “畅玩游戏,丝滑流畅”} 请处理:华为MatepadPro,高清大屏,长效续航,你的好帮手。
回答:
实例一总结:
在模型训练层面:
* Zero-shot:零样本,基于模型训练阶段学习的属性/语义关联,去迁移到未知的新类别
* Few-shot:少样本,基于少量样本,快速泛化识别新样本
在提示词优化层面:
* Zero-shot:无提示,语言描述任务,依赖模型预训练知识回答
* Few-shot:给与模型少量示例,引导模型对齐示例输出结果
from openai import OpenAI
import dotenv
import os
dotenv.load_dotenv()
# 1. 获取client对象,OpenAI类对象
client = OpenAI(
# 可以用本地ollama的大模型 base_url="https://localhost:11434/v1"
api_key=os.getenv("aliyun_api_key"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
examples_data = { # 示例数据
'新闻报道': '今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告': '本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告': '本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告': '最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势'
}
# 分类列表
examples_types = ['新闻报道', '财务报道', '公司公告', '分析师报告']
# 提问数据
questions = [
"今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。",
"ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步巩固ABC公司在行业中的地位,并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏",
"公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。",
"最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会",
"小明喜欢小新哟"
]
"""
[
{"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": "要提问的问题"}
]
"""
messages = [
{"role": "system", "content": "你是金融专家,将文本分类为['新闻报道', '财务报道', '公司公告', '分析师报告'],不清楚的分类为'不清楚类别' 下面有示例:"},
]
for key, value in examples_data.items():
messages.append({"role": "user", "content": value})
messages.append({"role": "assistant", "content": key}) #这里messages就是类似上述三引号里的内容
# 向模型提问
for q in questions:
response = client.chat.completions.create(
model="qwen3-max",
messages=messages + [{"role": "user", "content": f"按照示例,回答这段文本的分类类别:{q}"}]
)
print(response.choices[0].message.content)
新闻报道
公司公告
财务报道
分析师报告
不清楚类别
实例二¶
金融信息抽取¶
from openai import OpenAI
import json
import os
import dotenv
dotenv.load_dotenv()
# 1. 获取client对象,OpenAI类对象
client = OpenAI(
# 如果没有配置环境变量,请用阿里云百炼API Key替换:api_key="sk-xxx"
api_key=os.getenv("aliyun_api_key"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
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人民币收盘。"
]
"""
[
{"role": "system", "content": f"你帮我完成信息抽取,我给你句子,你抽取{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": f"按照上述示例,现在抽取这个句子的信息:{要抽取的句子文本}"}]}
]
"""
messages = [
{"role": "system", "content": f"你帮我完成信息抽取,我给你句子,你抽取{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'表示,请参考如下示例:"}
]
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="qwen3-max",
messages=messages + [{"role": "user", "content": f"按照上述的示例,现在抽取这个句子的信息:{q}"}]
)
print(response.choices[0].message.content)
{"日期": "2025-06-16", "股票名称": "传智教育A股", "开盘价": "66人民币", "收盘价": "68人民币", "成交量": "123000"}
{"日期": "2025-06-06", "股票名称": "黑马程序员A股", "开盘价": "200人民币", "收盘价": "206人民币", "成交量": "原文未提及"}
实例三¶
金融文本匹配判断¶
在该任务的 prompt 设计中,我们主要考虑 2 点: * 需要向模型解释什么叫作「文本匹配任务」 * 需要让模型按照我们指定的格式输出
为了让模型知道什么叫做「文本匹配任务」,我们借用 FewShot 的方式,先给模型展示几个正确的例子
from openai import OpenAI
import os
import dotenv
dotenv.load_dotenv()
# 1. 获取client对象,OpenAI类对象
client = OpenAI(
# 如果没有配置环境变量,请用阿里云百炼API Key替换:api_key="sk-xxx"
api_key=os.getenv("aliyun_api_key"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
examples_data = {
"是": [
("公司ABC发布了季度财报,显示盈利增长。", "财报披露,公司ABC利润上升。"),
("公司ITCAST发布了年度财报,显示盈利大幅度增长。", "财报披露,公司ITCAST更赚钱了。")
],
"不是": [
("黄金价格下跌,投资者抛售。", "外汇市场交易额创下新高。"),
("央行降息,刺激经济增长。", "新能源技术的创新。")
]
}
questions = [
("利率上升,影响房地产市场。", "高利率对房地产有一定的冲击。"),
("油价大幅度下跌,能源公司面临挑战。", "未来智能城市的建设趋势越加明显。"),
("股票市场今日大涨,投资者乐观。", "持续上涨的市场让投资者感到满意。")
]
"""
{"role": "system", "content": f"你帮我完成文本匹配,我给你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": f"按照上述示例,回答这2个句子的情况。句子1: [...],句子2: [...]"}
"""
messages = [
{"role": "system", "content": f"你帮我完成文本匹配,我给你2个句子,被[]包围,你判断它们是否匹配,回答是或不是,请参考如下示例:"},
]
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="qwen3-max",
messages=messages + [{"role": "user", "content": f"句子1:[{q[0]}],句子2:[{q[1]}]"}]
)
print(response.choices[0].message.content)
是
不是
是