AI大模型RAG与Agent开发学习
提示词工程
大模型prompt工程指南
相关概念
提示工程(Prompt Engineering),也称为 In-Context Prompting,是指在不更新模型权重的情况下如何与 大模型交互以引导其行为以获得所需结果的方法。
在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。
- 例如,“「讲个笑话」“、”「用Python编个贪吃蛇游戏」”
"「写封情书」"等。 - 虽然看似简单,但实际上,Prompt的设计对于模型的结果影响:
很大。 - 因此如何设计prompt,进而与模型更好的交互,是研究人员必
备的必不可少的技能(提示工程)。 (如何设计提问?)
提示词技巧
任何Prompt技巧,都不如清晰表达需求。类似人与人沟通,如果话说不明白,不可能让别人理解你的思想,因此写出清晰的指令,是核心。
- 详细的描述
- 让模型充当某个角色。(比如面试官角色)
- 使用分隔符标明输入的不同部分。
- 中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本,也可以帮助模型更好的理解文本内容。常用"“”"把内容框起来
- 对任务指定不走
- 对可拆分的任务尽量拆开;
- 提供例子 (本质类似于few-shot learning,给模型举例,在回答)
- 使用参考文本 (降低模型 幻觉 —— 一本正经胡说八道):经典的知识库用法,让大模型使用我们提供的信息来组成答案。
总结:提示词工程就是更好的向模型提问的技巧。
大模型本身是一种很简单的结构,就是 用户输入,模型输出。
- 用更详细、更清晰、有逻辑、有参考的提问,获得期望中的回答效果
- 不管是RAG还是Agent智能体亦或是其它围绕模型的各类复杂的开发工作,本质上都可以简单总结为在提示词上下功夫。
提示词优化是所有大模型应用开发的基础必修课,一个好的提示词,甚至能让基础模型的输出效果媲美经过简单微调的模型。
提示词优化案例介绍和零样本少样本思想
案例背景
当前金融领域信息化发展的时代,金融数据大量激增,许多投资者和研究者试图通过对这些数据进行深度分析而获得一些有效的决策和帮助,尽可能减少决策失误带来的损失。所以,针对金融数据的分析方法研究是目前十分有益且热门的话题。
当前案例主要有三大业务场景实现:
- 基于大模型完成:金融文本分类
- 基于大模型完成:金融文本信息抽取
- 基于大模型完成:金融文本匹配
大模型选择:Qwen在线大模型(阿里云通义千问)
采用方法:基于 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,高清大屏,长效续航,你的好帮手。
- 示例1:MacBookPro高效节能,性能强大,适合牛马工作使用
总结:
- 在模型训练层面:
- Zero-shot:零样本,基于模型训练阶段学习的属性/语义关联,去迁移到未知的新类别
- Few-shot:少样本,基于少量样本,快速泛化识别新样本
- 在提示词优化层面:
- Zero-shot:无提示,语言描述任务,依赖模型预训练知识回答
- Few-shot:给与模型少量示例,引导模型对齐示例输出结果
提示词优化案例_金融文本分类任务
掌握Fewshot方式下prompt的设计方式、掌握利用LLM实现文本分类的代码
LLM文本分类任务介绍

我们的目的是 期望模型能够帮助我们识别出这4段话中,每一句话描述的是一个什么类型的报告。即期望输出结果:['新闻报道', '公司公告', '财务公告', '分析师报告']
Prompt设计
对于大模型来说,prompt的设计很重要,一个明确的prompt能帮助我们更好的从大模型中获得我们想要的结果。
在该任务的prompt设计中,主要考虑2点:
- 需要向模型解释什么叫【文本分类任务】
- 需要让模型按照我们指定的格式输出
为了让模型知道什么叫做【文本分类】,我们借助FewShot的方式,给模型展示一些正确的例子,如下:
其中,User代表我们输入给模型的句子,Bot代表模型的回复内容。(注意:上述例子中Bot的部分也是由人工输入的,其目的是希望看到在看到类似User中的句子时,模型应当做出类似 Bot的回答。)
是代码实现 金融文本分类,使用少量提示词 让模型按照自己需要进行回答:
from idlelib.run import flush_stdout
from tkinter.scrolledtext import example
from openai import OpenAI
client = OpenAI(
base_url='https://dashscope.aliyuncs.com/compatible-mode/v1',
)
examples_data = { # 示例数据
'新闻报道': '今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。',
'财务报告': '本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。',
'公司公告': '本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。这一战略举措将有助于扩大我们的业务领域,提高市场竞争力',
'分析师报告': '最新的行业分析报告指出,科技公司的创新将成为未来增长的主要推动力。云计算、人工智能和数字化转型被认为是引领行业发展的关键因素,投资者应关注这些趋势'
}
# 分类列表
examples_type = ['新闻报道', '财务报道', '公司公告', '分析师报告']
# 提问数据
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})
# 向模型提问:
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)
输出:
新闻报道
公司公告
财务报道
分析师报告
不清楚类别
Json数据格式
|SON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Json是带有格式的字符串,主要用于数据交换,即程序和程序之间的信息互传,使用Json会更加方便,如下示例:
周杰轮11岁是个男孩
蔡依临12岁是个女孩
小明16岁是一个男孩子
是 Text文本:
- 非结构化
- 抽取信息不方便
周杰轮,11,男
蔡依临,12,女
小明,16,男
CSV(固定分隔符)文本
- 结构化
- 抽取信息方便
- 缺点:数据不含Schema(源数据),有一定风险(丢失信息含义)
{
"name": "周杰伦",
"age": 11,
"gender": "男"
}
{
"name": "蔡依临",
"age": 13,
"gender": "女"
}
{
"name": "小明",
"age": 16,
"gender": "男"
}
以上是Json格式文本,特点:
- 结构化
- 抽取信息方便
- 每条数据都包含Schema
- 缺点:空间占用大
Json数据格式
Json主要有2种结构:json对象和json数组
Json对象
- key必须是字符串
- value可以是:数字、字符串、列表、Json对象或Json数组

Json数组
字典 列表,即一堆Json对象的组合体。
Json对象 对应 Python字典
Json数组 对应 Python 列表内含多个字典
总之,Json在Python中,就是字典和列表套字典的字符串表现形式。
Python用Json
Python中使用Json主要完成:
- 将Python字典、列表转换为Json字符串
- 读取Json字符串,转换为Python字典或列表
主要使用Python内置的json库
json.dumps(字典或列表,ensure_ascii=False):将字典或列表转换为Json字符串ensure_ascii参数确保中文能正常显示- 返回值:Json字符串
- 标准的json只认识 双引号;不像是python中的string 对于单引号和双引号都是一致的;
json.loads(json字符串):将Json字符串转换为Python字典或列表- 返回值:Python字典或 Python列表
代码示例:
import json
d = {
"name": "周杰伦",
"age": 20,
"gender": "male",
}
s = json.dumps(d, ensure_ascii=False)
print(s)
l = [
{
"name": "周杰伦",
"age": 20,
"gender": "male",
},
{
"name": "蔡依林",
"age": 21,
"gender": "female",
},
{
"name": "小明",
"age": 12,
"gender": "male",
}
]
l_json = json.dumps(l, ensure_ascii=False)
print(l_json)
# 将json转为 字典或 列表
json_str = '{"name": "周杰伦", "age": 20, "gender": "male"}'
json_array_str = '[{"name": "周杰伦", "age": 20, "gender": "male"}, {"name": "蔡依林", "age": 21, "gender": "female"}, {"name": "小明", "age": 12, "gender": "male"}]'
res_dict = json.loads(json_str)
print(res_dict, type(res_dict))
res_json_array = json.loads(json_array_str)
print(res_json_array, type(res_json_array))
提示词优化案例 —— 金融文本信息抽取
LLM信息抽取任务介绍

目的:期望模型能帮助我们识别出 这2段话中的SPO三元组信息 (提取相应属性,得到我们想要的json信息)
Prompt设计
在该任务的prompt设计中,我们主要考虑2点:
- 需要向模型解释什么叫作「信息抽取任务」
- 需要让模型按照我们指定的格式(json)输出
为了让模型知道什么叫做「信息抽取」,我们借用FewShot的方式,先给模型展示几个正确的例子:
其中,user代表我们输入给模型的句子,Bot代表模型的回复内容。(注意:上述例子中Bot 的部分也是由人工输入的,其目的是希望看到在看到类似User中的句子时,模型应当做出类似Bot的回答。)
from openai import OpenAI
import json
client = OpenAI(
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字符串输出,如果某些信息不存在,用'原文未提及'表示,请参考如下示例:"}
]
# example["answers"]} 是字典的格式,需要转为字符串
for example in examples_data:
messages.append({"role": "user", "content": example["content"]})
messages.append({"role": "assistant", "content": json.dumps(example["answers"], ensure_ascii=False)})
# print(messages)
for question in questions:
response = client.chat.completions.create(
model='qwen3-max',
messages=messages + [{"role": "user", "content": f"按照上述示例,现在抽取这个句子的信息:{question}"}],
)
print(response.choices[0].message.content)
输出回答:
{"日期": "2025-06-16", "股票名称": "传智教育A股", "开盘价": "66人民币", "收盘价": "68人民币", "成交量": "123000"}
{"日期": "2025-06-06", "股票名称": "黑马程序员A股", "开盘价": "200人民币", "收盘价": "206人民币", "成交量": "原文未提及"}
课后作业

代码:
from openai import OpenAI
import json
client = OpenAI(
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
schema = ['期数', '中奖号码', '一等奖']
examples_data = [ # 示例数据
{
"content": "2025年第100期,开好红球22 21 06 01 03 11 篮球 07,一等奖中奖为2注。",
"answers": {"期数": "2025100", "中奖号码": [1, 3, 6, 11, 21, 22, 7], "一等奖": "2注"}
},
{
"content": "2025101期,有3注1等奖,10注2等奖,开号篮球11,中奖红球3、5、7、11、12、16。",
"answers": {"期数": "2025101", "中奖号码": [3, 5, 7, 11, 12, 16, 11], "一等奖": "3注"}
}
]
questions = [ # 提问问题
"2026 年第 102 期,开奖红球 08 15 02 23 09 30,篮球 05,本期一等奖共 4 注。",
"2026103 期,1 等奖 5 注、2 等奖 18 注,中奖红球为 10、14、17、22、25、29,开号篮球 12。",
"2026 年第 104 期,开好红球 03 07 19 24 28 32,篮球 09,一等奖中奖注数为 3 注。"
]
"""
[
{"role": "system", "content": f"你是一个专业的彩票信息抽取助手,需要从给定的文本中精准提取以下3个字段:{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'表示,请参考如下示例:"},
{"role": "user", "content": "2025年第100期,开好红球22 21 06 01 03 11 篮球 07,一等奖中奖为2注。"},
{"role": "assistant", "content": '{"期数": "2025100", "中奖号码": [1, 3, 6, 11, 21, 22, 7], "一等奖": "2注"}'},
{"role": "user", "content": "2025101期,有3注1等奖,10注2等奖,开号篮球11,中奖红球3、5、7、11、12、16。"},
{"role": "assistant", "content": '{"期数": "2025101", "中奖号码": [3, 5, 7, 11, 12, 16, 11], "一等奖": "3注"}'},
{"role": "user", "content": f"按照上述示例,现在抽取这个句子的信息:{要抽取的句子文本}"}]}
]
"""
messages = [
{"role": "system", "content": f"你是一个专业的彩票信息抽取助手,需要从给定的文本中精准提取以下3个字段:{schema}信息,按JSON字符串输出,如果某些信息不存在,用'原文未提及'表示,请参考如下示例:"}
]
# example["answers"]} 是字典的格式,需要转为字符串
for example in examples_data:
messages.append({"role": "user", "content": example["content"]})
messages.append({"role": "assistant", "content": json.dumps(example["answers"], ensure_ascii=False)})
# print(messages)
for question in questions:
response = client.chat.completions.create(
model='qwen3-max',
messages=messages + [{"role": "user", "content": f"按照上述示例,现在抽取这个句子的信息:{question}"}],
)
print(response.choices[0].message.content)
提示词优化案例 —— 金融文本匹配
LLM 信息文本匹配任务介绍
目的:让模型识别两句话是否有关联
Prompt 设计
在该任务的prompt设计中,我们主要考虑2点:
- 需要向模型解释什么叫作「文本匹配任务」
- 需要让模型按照我们指定的格式输出
为了让模型知道什么叫做「文本匹配任务」,我们借用FewShot的方式,先给模型展示几个正确的例子:

其中,User代表我们输入给模型的句子,Bot代表模型的回复内容。(注意:上述例子中Bot的部分也是由人工输入的,其目的是希望看到在看到类似User中的句子时,模型应当做出类似Bot的回答)
代码实现:
import json
from openai import OpenAI
from pyexpat.errors import messages
client = OpenAI(
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 v in value:
messages.append({"role": "user", "content": f"句子1:[{v[0]}], 句子2:[{v[1]}]"})
messages.append({"role": "assistant", "content": key})
# print(messages)
for q in questions:
response = client.chat.completions.create(
model="qwen3-max",
messages=messages + [{"role": "user", "content": f"按照上述示例,回答这2个句子的情况:句子1:[{q[0]}], 句子2:[{q[1]}] "}],
)
print(response.choices[0].message.content)
回答:
是
不是
是
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)