视频链接: 黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目

OpenAI

OpenAI的基本使用

OpenAI库是OpenAI官方推出的Python SDK,核心作用是让开发者能简单、高效地调用 OpenAI 的各类 API(如 GPT 聊天、DALL・E 绘图、语音转文字等),无需手动处理 HTTP 请求、身份验证等底层细节。
由于其发布较早且比较易用,现如今许多模型服务商(如阿里云百炼平台)均兼容OpenAI SDK的调用。

在这里插入图片描述

获取客户端对象

from openai import OpenAI
 
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、阿里云、腾讯云等)

调用模型

from openai.types.chat.chat_completion import ChatCompletion
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角色:代表用户,发送问题、指令或需求

处理结果

response变量就是ChatCompletion对象,其包含信息如下所示
在这里插入图片描述
可以通过 print(response.choices[0].message.content) 输出模型给出的回答信息

整体代码

import os

from openai import OpenAI

#1、获取openai类对象
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

#2、调用模型
response = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {'role':'system', 'content':'你是一个python高级开发工程师'},
        {'role':'assistant', 'content':'我是python高级开发工程师,请问有什么需要帮助的'},
        {'role':'user', 'content':'for循环输出1到5,有哪些实现方式'}
    ]
)


#3、处理结果
print(response.choices[0].message.content)

OpenAI库的流式输出

可以设定结果输出为stream模式(流式输出),获得更好的使用体验。
开启流式输出主要就2步:

  1. 在client.chat.completions.create()调用模型的时候设定参数:stream=True
  2. for循环response对象,并在循环内输出内容

在这里插入图片描述
完整代码:

import os

from openai import OpenAI

#1、获取openai类对象
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)

#2、调用模型
response = client.chat.completions.create(
    model="qwen3-max",
    messages=[
        {'role':'system', 'content':'你是一个python高级开发工程师,并且不说废话简单回答'},
        {'role':'assistant', 'content':'我是python高级开发工程师,请问有什么需要帮助的'},
        {'role':'user', 'content':'for循环输出1到5,有哪些实现方式'}
    ],
    stream=True
)


#3、处理结果
for chunk in response:
    print(chunk.choices[0].delta.content, end='', flush=True)

OpenAI库附带历史消息调用模型

调用模型传入的参数messages,其要求是list对象,即表明其支持非常多的消息在内。
我们可以基于此,将历史消息填入,让模型知晓对话的上下文,更好的回答

from  openai import OpenAI
import os

client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)


response = client.chat.completions.create(
    model='qwen3-max',
    messages=[
        {"role": "system", "content": "你是AI助理,回答很简洁"},
        {"role": "user","content": "小明有2条宠物狗"},
        {"role": "assistant", "content": "好的"},
        {"role": "user", "content": "小红有3只宠物猫"},
        {"role": "assistant", "content": "好的"},
        {"role": "user", "content": "总共有几个宠物?"}
    ],
    stream=True
)

for chunk in response:
    print(chunk.choices[0].delta.content, end='', flush=True)

总结

我们可以在调用模型的时候,通过:

  • 在messages的list内,组织历史消息提供给模型

PS:当前的历史消息是一次性的,如果是生产系统可以将消息保存到文件、数据库等持久化工具内,需要的时候提取使用,后续学习LangChain库,会学习短期记忆和长期记忆的使用方法。

大模型prompt工程指南

提示工程(Prompt Engineering),也称为 In-Context Prompting,是指在不更新模型权重的情况下如何与大模型交互以引导其行为以获得所需结果的方法。

在人工智能领域,Prompt指的是用户给大型语言模型发出的指令。

  • 例如,“「讲个笑话」”、“「用Python编个贪吃蛇游戏」”、“「写封情书」"等。
  • 虽然看似简单,但实际上,Prompt的设计对于模型的结果影响很大。
  • 因此如何设计prompt,进而与模型更好的交互,是研究人员必备的必不可少的技能(提示工程)。

任何Prompt技巧,都不如清晰的表达你的需求。这就类似人与人沟通,如果话说不明白,不可能让别人理解你的思想。因此,写出清晰的指令,是核心。

技巧1:详细的描述

  • 例如:用一些温柔的话语写一封情书,来表达我对你的仰慕和思念。最后,我要求书写字体数要不低于500个字

技巧2:让模型充当某个角色

  • 例如:我需要你充当一个AI算法面试官的角色,要求你自主的对我进行AI面试过程中常考的面试题,你可以一次说一个问题,然后我回答完,你再出第二道题

技巧3:使用分隔符标明输入的不同部分

  • 中括号、XML标签、三引号等分隔符可以帮助划分要区别对待的文本,也可以帮助模型更好的理解文本内容。常用’‘’‘’'把内容框起来
  • 例如:用20个字符总结由三引号分割的文本。“”“在此插入文本”“”

技巧4:对任务指定步骤

  • 对于可以拆分的任务可以尽量拆开,最好能为其指定一系列步骤,明确步骤可以让模型更容易实现它们。
  • 利用下面分步情况来响应用户的输入。
    • 步骤1: “”““用户输入文本””“”,用一句话总结这段文本,并加上前缀"Summary".
    • 步骤2: 将步骤1中的摘要翻译成英语,并添加前缀"翻译:"

技巧5:提供例子

  • 本质类似于few-shot leaning。先扔给大模型举例,然后让模型按照例子来输出
  • 按照这句评论文本的格式:‘““用户输入文本””’,帮我创造新的样本

基于文本文档,辅助大模型问答,降低模型"幻觉"(一本正经的胡说八道)问题。
即使用参考文本作答 经典的知识库用法,让大模型使用我们提供的信息来组成答案。

  • 根据下文中三重引号引起来的文章来回答问题。如果在文章中找不到答案,请写“我找不到答案”,不要自己造答案。“”“<在此插入文档>”“”“”“<在此插入文档>”“” 问题:<在此插入问题>

总结

提示词工程就是更好的向模型提问的技巧。
大模型本身是一种很简单的结构,即:用户输入,模型输出。
用更详细、更清晰、有逻辑、有参考的提问,获得期望中的回答效果
不管是RAG还是Agent智能体亦或是其它围绕模型的各类复杂的开发工作,本质上都可以简单总结为在提示词上下功夫。

提示词优化是所有大模型应用开发的基础必修课,一个好的提示词,甚至能让基础模型的输出效果媲美经过简单微调的模型。

提示词工程

提示词实战案例

实战案例背景

当前金融领域信息化发展的时代,金融数据大量激增,许多投资者和研究者试图通过对这些数据进行深度分析而获得一些有效的决策和帮助,尽可能减少决策失误带来的损失。
所以,针对金融数据的分析方法研究是目前十分有益且热门的话题。

当前案例主要有三大业务场景实现:

  • 基于大模型完成:金融文本分类
  • 基于大模型完成:金融文本信息抽取
  • 基于大模型完成:金融文本匹配

大模型选择:Qwen在线大模型(阿里云通义千问 qwen3-max)
采用方法:基于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,高清大屏,长效续航,你的好帮手。

结果:{“产品名称”: “华为MatepadPro”, “产品卖点”: “高清大屏,长效续航”}

总结

提示词工程实战的业务需求是在金融业务内完成:

  • 文本分类
  • 信息抽取
  • 文本匹配

共3个任务目标,通过zero-shot、few-shot思想设计提示词完成。
在模型训练层面:

  • Zero-shot:零样本,基于模型训练阶段学习的属性/语义关联,去迁移到未知的新类别
  • Few-shot:少样本,基于少量样本,快速泛化识别新样本

在提示词优化层面:

  • Zero-shot:无提示,语言描述任务,依赖模型预训练知识回答
  • Few-shot:给与模型少量示例,引导模型对齐示例输出结果

LLM实现金融文本分类实战

LLM文本分类任务介绍

下面几段文本来自某平台发布的金融领域文本:
1.“今日,央行发布公告宣布降低利率,以刺激经济增长。这一降息举措将影响贷款利率,并在未来几个季度内对金融市场产生影响。”,
2.“ABC公司今日发布公告称,已成功完成对XYZ公司股权的收购交易。本次交易是ABC公司在扩大业务范围、加强市场竞争力方面的重要举措。据悉,此次收购将进一步巩固ABC公司在行业中的地位,并为未来业务发展提供更广阔的发展空间。详情请见公司官方网站公告栏”,
3.“公司资产负债表显示,公司偿债能力强劲,现金流充足,为未来投资和扩张提供了坚实的财务基础。”,
4.“最新的分析报告指出,可再生能源行业预计将在未来几年经历持续增长,投资者应该关注这一领域的投资机会”,

我们的目的是期望模型能够帮助我们识别出这4段话中,每一句话描述的是一个什么类型的报告。

即期望的输出结果为:[‘新闻报道’, ‘公司公告’, '财务公告 ‘分析师报告’]

Prompt设计

对于大模型来讲,prompt 的设计非常重要,一个 明确 的 prompt 能够帮助我们更好从大模型中获得我们想要的结果。
在该任务的 prompt 设计中,我们主要考虑 2 点:
需要向模型解释什么叫作「文本分类任务」
需要让模型按照我们指定的格式输出
为了让模型知道什么叫做「文本分类」,我们借用 FewShot 的方式,给模型展示一些正确的例子:

User: “今日,股市经历了一轮震荡,受到宏观经济数据和全球贸易紧张局势的影响。投资者密切关注美联储可能的政策调整,以适应市场的不确定性。” 是[‘新闻报道’, ‘公司公告’, '财务公告 ‘分析师报告’]里的什么类别?
Bot: 新闻报道
User: "本公司年度财务报告显示,去年公司实现了稳步增长的盈利,同时资产负债表呈现强劲的状况。经济环境的稳定和管理层的有效战略执行为公司的健康发展奠定了基础。"是[‘新闻报道’, ‘公司公告’, '财务公告 ‘分析师报告’]里的什么类别?
Bot: 财务报告

其中,User 代表我们输入给模型的句子,Bot 代表模型的回复内容。
注意:上述例子中 Bot 的部分也是由人工输入的,其目的是希望看到在看到类似 User 中的句子时,模型应当做出类似 Bot 的回答。

分类任务代码实现

实现llm_classification.py代码脚本文件,主要包含:init_prompts()和qwen_model() 2个核心函数
导入工具包:

import os

from openai import OpenAI

# 1. 获取client对象,OpenAI类对象
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    #base_url="http://localhost:11434/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})

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数据格式

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
Json是带有格式的字符串,主要用于数据交换,即程序和程序之间的信息互传,使用Json会更加方便,如下示例:
在这里插入图片描述
Json主要有2种结构:Json对象和Json数组:

Json对象

在这里插入图片描述

json数组

在这里插入图片描述

python中 两者的相互转换

Python中使用Json主要完成:

  • 将Python字典、列表转换为Json字符串
  • 读取Json字符串,转换为Python字典或列表

主要使用Python内置的json库

  • json.dumps(字典或列表, ensure_ascii=False):将字典或列表转换为Json字符串
    • ensure_ascii参数确保中文能正常显示
    • 返回值:Json字符串
  • json.loads(json字符串):将Json字符串转换为Python字典或列表
    • 返回值:Python字典 或 Python列表

代码示例:

import json

d = {
    "name":"周周",
    "age":10,
    "gender":"男",
}

# 字典转换为字符串
s = json.dumps(d, ensure_ascii=False)
print(s)

# 字符串转换为字典
j = json.loads(s)
print(j)

金融文本的信息抽取实战

LLM信息抽取任务介绍

首先,我们定义信息抽取的Schema:

# 定义不同实体下的具备属性
schema = {
    '金融': ['日期', '股票名称', '开盘价', '收盘价', '成交量'],
}
 

下面几段文本来自某平台发布的股票信息:

  1. ‘2023-02-15,寓意吉祥的节日,股票佰笃[BD]美股开盘价10美元,虽然经历了波动,但最终以13美元收盘,成交量微幅增加至460,000,投资者情绪较为平稳。’,
  2. ‘2023-04-05,市场迎来轻松氛围,股票盘古(0021)开盘价23元,尽管经历了波动,但最终以26美元收盘,成交量缩小至310,000,投资者保持观望态度。’,

我们的目的是期望模型能够帮助我们识别出这2段话中的SPO三元组信息。

Prompt设计

在该任务的 prompt 设计中,我们主要考虑 2 点:

  • 需要向模型解释什么叫作「信息抽取任务」
  • 需要让模型按照我们指定的格式(json)输出

为了让模型知道什么叫做「信息抽取」,我们借用 FewShot 的方式,先给模型展示几个正确的例子:

User:‘2023-01-10,股市震荡。股票古哥-D[EOOE]美股今日开盘价100美元,一度飙升至105美元,随后回落至98美元,最终以102美元收盘,成交量达到520000。’。提取上述句子中“金融”(‘日期’, ‘股票名称’, ‘开盘价’, ‘收盘价’, ‘成交量’)类型的实体,并按照JSON格式输出,上述句子中没有的信息用[‘原文中未提及’]来表示,多个值之间用’,‘分隔。
Bot: {‘日期’: [‘2023-01-10’],‘股票名称’: [‘古哥-D[EOOE]美股’],‘开盘价’: [‘100美元’], ‘收盘价’: [‘102美元’],成交量’: [‘520000’]} …

其中,User 代表我们输入给模型的句子,Bot 代表模型的回复内容。
注意:上述例子中 Bot 的部分也是由人工输入的,其目的是希望看到在看到类似 User 中的句子时,模型应当做出类似 Bot 的回答。

信息抽取任务代码实现

本次信息抽取任务实现的主要过程:构造prompt -> 对句子做分类 -> 进行信息抽取
导入必备的工具包:

import os

from openai import OpenAI
import json

client = OpenAI(
    api_key= os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    #base_url="http://localhost:11434/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)

LLM实现金融文本匹配实战

LLM信息文本匹配任务介绍

首先,我们构造几个短文本对:

  1. (‘股票市场今日大涨,投资者乐观。’, ‘持续上涨的市场让投资者感到满意。’),
  2. (‘油价大幅下跌,能源公司面临挑战。’, ‘未来智能城市的建设趋势愈发明显。’),
  3. (‘利率上升,影响房地产市场。’, ‘高利率对房地产有一定冲击。’),

我们期望模型能够帮我们识别出成对的句子中,2句话是否是有关联的。
我们期望模型输出的结果为:

  • [‘是’, ‘不是’, ‘是’]

Prompt设计

在该任务的 prompt 设计中,我们主要考虑 2 点:

  • 需要向模型解释什么叫作「文本匹配任务」
  • 需要让模型按照我们指定的格式输出

为了让模型知道什么叫做「文本匹配任务」,我们借用 FewShot 的方式,先给模型展示几个正确的例子:
User:
句子一: 公司ABC发布了季度财报,显示盈利增长。\n
句子二: 财报披露,公司ABC利润上升
Bot: 是

User:
句子一: 黄金价格下跌,投资者抛售。\n
句子二: 外汇市场交易额创下新高
Bot: 不是 …

其中,User 代表我们输入给模型的句子,Bot 代表模型的回复内容。
注意:上述例子中 Bot 的部分也是由人工输入的,其目的是希望看到在看到类似 User 中的句子时,模型应当做出类似 Bot 的回答。

文本匹配任务代码实现

import os

from openai import OpenAI

client = OpenAI(
    api_key= os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    #base_url="http://localhost:11434/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)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐