前言
本文介绍使用OpenAI完成特定文本理解任务。
构建环境
本地安装Ollama或通过阿里云百炼平台获取API_KEY ,https://bailian.console.aliyun.com/cn-beijing/?spm=a2c4g.11186623.0.0.2dab6323kanAoF&tab=model#/api-key,配置到环境变量中后需要重启电脑生效。
初始化python环境,然后添加OpenAI库
配置大模型的API到环境变量中
OpenAI库的基础使用
OpenAI库是OpenAI官方推出的Python SDK,核心作用是让开发者能简单、高效地调用OpenAI的各类API(如GPT聊天、DALL·E绘图、语音转文字等),无需手动处理HTTP请求、身份验证等底层细节。
由于其发布较早且比较易用,现如今许多模型服务商(如阿里云百炼平台)均兼容OpenAI SDK的调用。
# 获取客户端对象fromopenaiimportOpenAI client:OpenAI=OpenAI(api_key="your_api_key_here",#已添加到环境变量中可不配置base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")主要是用如上2个参数:
api_key:模型服务商提供的APIKEY密钥base_url:模型服务商的API接入地址- 主要基于此参数来切换不同的模型服务商(如OpenAI、阿里云、腾讯云等)
//调用模型fromopenai.types.chat.chat_completionimportChatCompletion response:ChatCompletion=client.chat.completions.create(model="qwen3-max",messages=[{"role":"system","content":"你是一个Python编程专家。"},{"role":"assistant","content":"我是一个Python编程专家。请问有什么可以帮助您的吗?"},{"role":"user","content":"for循环输出1到5的数字"}])client.chat.completions.create创建 ChatCompletion 对象
主要参数有2个:
- model:选择所用模型,如代码中的 qwen3-max
- messages:提供给模型的消息
- 类型:list,可以包含多个字典消息
- 每个字典消息包含2个key:
- role:角色
- content:内容
角色说明:
- system角色:设定助手的整体行为、角色和规则,为对话提供上下文框架(如指定助手身份、回答风格、核心要求),是全局的背景设定,影响后续所有交互。
- assistant角色:代表 AI 助手的回答,可以在代码中预设
- user角色:代表用户,发送问题、指令或需求
完整示例代码:
fromopenaiimportOpenAI client=OpenAI(base_url="http://localhost:11434/v1",# 调用本地Ollama服务)response=client.chat.completions.create(model="qwen3:8b",messages=[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"你是谁?"},],# stream=True # 开启流式输出功能)# 流式输出方式forchunkinresponse:print(chunk.choices[0].delta.content,end="",flush=True)# end=""每一段之间用空格分隔,flush是否立刻刷新缓冲区# 非流式输出,可以直接打印response看结构# print(response.choices[0].message.content)messages可以有多个历史聊天记录
fromopenaiimportOpenAI# 1. 获取client对象,OpenAI类对象client=OpenAI(base_url="http://localhost:11434/v1",)# 2. 调用模型response=client.chat.completions.create(model="qwen3:8b",messages=[{"role":"system","content":"你是AI助理,回答很简洁"},{"role":"user","content":"小明有2条宠物狗"},{"role":"assistant","content":"好的"},{"role":"user","content":"小红有3只宠物猫"},{"role":"assistant","content":"好的"},{"role":"user","content":"总共有几个宠物?"}],stream=True# 开启了流式输出的功能)# 3. 处理结果forchunkinresponse:print(chunk.choices[0].delta.content,end=" ",# 每一段之间以空格分隔flush=True# 立刻刷新缓冲区)OpenAI文本理解类任务提示词实战案例
1、需求背景
金融领域信息化发展,金融数据大量激增,投资者和研究者希望通过深度分析获得有效决策支持,减少决策失误,金融数据分析方法研究是当前十分有益且热门的话题。
要求基于Few-Shot + Zero-Shot的思想,设计prompt(提示词)来应用大模型完成以下任务
- 基于大模型完成:金融文本分类
- 基于大模型完成:金融文本信息抽取
- 基于大模型完成:金融文本匹配
2、 Zero-Shot思想
Zero-shot学习(Zero-shot Learning)是指在训练阶段不存在与测试阶段完全相同的类别,但模型可以使用训练过的知识推广到测试集中的新类别上,这种能力被称为“零样本”学习。
例:在模型训练中已知马(四脚兽)、虎(有条纹)、熊猫(黑白色)的特征。但未训练过斑马的数据,则可以告知模型:斑马是四脚兽、有黑白色的条纹,模型可通过已知数据(四脚兽、有条纹、黑白色)推理识别斑马。
总结:Zero-shot思想用于基于已训练的能力,不提供任何示例,仅通过语言描述任务的要求、目标和约束,让模型直接生成结果,即用语言定义任务,信任模型的预训练知识。
3、Few-Shot思想
Few-shot 学习(Few-shot Learning)是指少样本学习,当模型在学了一定类别的大量数据后,对于新的类别,只需要少量的样本就能快速学习。对应的还有 one-shot learning(单样本学习),可视为样本数量为 1 的特殊 “few-shot learning”。
在提示词优化中的应用:Few-shot主要用于基于少量示例,让模型参考示例进行回答。比如
请抽取产品名称和核心卖点2个字段,格式为Json,我提供2个示例。
示例1:
输入:MacBookPro高效节能,性能强大,适合牛马工作使用
输出:{“产品名称”:“MacBookPro”,“产品卖点”:“高效节能,性能强大”}示例2:
输入:联想笔记本拥有RTX4060独立显卡,畅玩游戏,丝滑流畅
输出:{“产品名称”:“联想笔记本”,“产品卖点”:“畅玩游戏,丝滑流畅”}
请处理:
华为MatepadPro,高清大屏,长效续航,你的好帮手。
4、基于大模型完成:金融文本分类
任务目标:对给定的金融领域文本,自动识别其所属的报告类型。
示例文本(来自某金融平台):
- “今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。”
- “ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易……详情请见公司官方网站公告栏。”
- “公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。”
- “最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会。”
期望输出类别:[‘新闻报道’,’公司公告‘,’财务公告‘,’分析师报告‘]
我们借助FewShot的思想,给我们一些正确的例子让大模型理解"文本分类"的概念,确保模型按指定格式输出结果:
用户:今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。 投资者密切关注美联储可能的政策调整,以适应市场的不确定性。 这是「新闻报道」「公司公告」「财务报告」「分析师报告」中的什么类别? 助手:新闻报道 用户:本公司年度财务报告显示,去年公司实现了稳步增长的盈利, 同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略 为公司的健康发展奠定了基础。 这是「新闻报道」「公司公告」「财务报告」「分析师报告」中的什么类别? 助手:财务报告用户代表我们输入给模型的句子,助手代表模型的回复内容,两者都是我们输入的,目的是希望看到类似句子时,模型可以做出类似助手的回答
代码示例:
# 利用few-shot思想的提示词,完成文本分类任务fromopenaiimportOpenAI# 准备好few-shot文本,组装成历史对话结构messagesmessages=[]examples_data={'新闻报道':'今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的对策调整,以适应市场的不确定性。','财务报告':'本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康增长奠定了基础。','公司公告':'本公司高兴地宣布成功完成最新一轮并购交易,收购了一家在人工智能领域领先的公司。','分析师报告':'最新的行业分析报告指出,科技公司的创新将称为未来增长的主要推动力。'}forkey,valueinexamples_data.items():messages.append({"role":"user","content":value})messages.append({"role":"assistant","content":key})# 准备好需要问的文本数据集合questions=["今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个月内对金融市场产生影响。",]# 1. 获取client 对象,OpenAI类对象client:OpenAI=OpenAI(base_url="http://localhost:11434/v1",)# 2. 像模型提问,结合历史对话,然后问一个新的问题response=client.chat.completions.create(model="qwen3:8b",messages=messages+[{"role":"user","content":"按照示例,回答这段文本的分类类别:今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个月内对金融市场产生影响。"}],stream=True,)forchunkinresponse:print(chunk.choices[0].delta.content,end="",flush=True)5、基于大模型完成:金融文本信息抽取
'2023-02-15, 寓意吉祥的节日, 股票佰驾 [BD]美股开盘价10美元, 虽然经历了波动, 但最终以13美元收盘, 成交量微幅增加至460,000, 投资者情绪较为平稳。' '2023-04-05, 市场迎来轻松氛围, 股票盘古 (0021)开盘价23元, 尽管经历了波动, 但最终以26美元收盘, 成交量缩小至310,000, 投资者保持观望态度。'根据提供的两个文件内容,期望模型能够识别出这2段话中的SPO三元组信息(结构化信息抽取),即按照预定义的金融实体类型(如下)抽取相关信息。
schema = { '金融': ['日期', '股票名称', '开盘价', '收盘价', '成交量'], }向模型解释什么是「信息抽取任务」,让模型按照指定的JSON格式输出,还是利用few-shot思想,为模型提供正确的抽取示例,使其通过示例学习如何执行任务。
User: '2023-01-10',股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。提取上述句子中“金融”(‘日期’,‘股票名称’,‘开盘价’,‘收盘价’,‘成交量’)类型的实体,并按照JSON格式输出,上述句子中没有的信息用‘原文中未提及’来表示,多个值之间用‘;’分隔。 Bot: {'日期': ['2023-01-10'], '股票名称': ['古哥-D[EOOE]美股'], '开盘价': ['100美元'], '收盘价': ['102美元'], '成交量': ['520000']}User代表我们输入给模型的句子,Bot代表模型的回复内容
示例代码
fromopenaiimportOpenAIimportjson# 准备Few-shot示例数据到messages中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"}}]schema=["日期","股票名称","开盘价","收盘价","成交量"]messages=[{"role":"system","content":f"你帮我完成信息抽取,我给你句子,你抽取{schema}信心,按JSON字符串输出"}]fordatainexamples_data:messages.append({"role":"user","content":data["content"]})messages.append({"role":"assistant","content":json.dumps(data["answers"],ensure_ascii=False)})# 提问AIquestions=["2025-06-16, 股市利好。股票行情数据A股今日开盘价66人民币,一度飙升至70人民币,随后回落至65人民币,最终以68人民币收盘,成交量达到123000。","2025-06-07, 股市利好。股票黑马程序员A股今日开盘价200人民币,一度飙升至211人民币,随后回落至201人民币,最终以206人民币收盘。"]forquestioninquestions:response=OpenAI(base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",).chat.completions.create(model="deepseek-v3.2",messages=messages+[{"role":"user","content":f"按照上述的示例,现在抽取这个句子的信息:{question}"}],stream=True)forchunkinresponse:print(chunk.choices[0].delta.content,end="",flush=True)6、基于大模型完成:金融文本匹配
我们期望模型能够帮我们识别出成对的句子中,2句话是否是有关联的。我们期望模型输出的结果为:[‘是’,‘不是’,‘是’]
如
- (‘股票市场今日大涨,投资者乐观。’,‘持续上涨的市场让投资者感到满意。’),
- (‘油价大幅下跌,能源公司面临挑战。’,‘未来智能城市的建设趋势愈发明显。’),
- (‘利率上升,影响房地产市场。’,‘高利率对房地产有一定冲击。’),
输出的结果为:[‘是’,‘不是’,‘是’]
还是利用few-shot思想,让模型知道什么是文本匹配任务,然后给出几个例子
User: 句子一:公司ABC发布了季度财报,显示盈利增长。 句子二:财报披露,公司ABC利润上升 Bot: 是 User: 句子一:黄金价格下跌,投资者抛售。 句子二:外汇市场交易额创下新高 Bot: 不是代码示例:
fromopenaiimportOpenAI# 封装示例进messagesmessages=[{"role":"system","content":f"你帮我完成文本匹配,我给你2个句子,被[]包围,你判断它们是否匹配,回答是或不是,请参考如下示例:"}]examples_data={"是":[("公司ABC发布了季度财报,显示盈利增长。","财报披露,公司ABC利润上升。"),("公司ITCAST发布了年度财报,显示盈利大幅度增长。","财报披露,公司ITCAST更赚钱了。")],"不是":[("黄金价格下跌,投资者抛售。","外汇市场交易额创下新高。"),("央行降息,刺激经济增长。","新能源技术的创新。")]}forkey,valueinexamples_data.items():fortinvalue:messages.append({"role":"user","content":f"句子1: [{t[0]}], 句子2: [{t[1]}]"})messages.append({"role":"assistant","content":key})# 提问新的问题检验效果questions=[("利率上升,影响房地产市场。","高利率对房地产有一定的冲击。"),("油价大幅度下跌,能源公司面临挑战。","未来智能城市的建设趋势越加明显。"),("股票市场今日大涨,投资者乐观。","持续上涨的市场让投资者感到满意。")]forqinquestions:response=OpenAI(base_url="https://dashscope.aliyuncs.com/compatible-mode/v1").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)