解锁AI语言模型的秘密武器 - 提示工程

文章目录

  • 一、LLM概念
    • 1.1 什么是LLMs
    • 1.2 LLMs类别
    • 1.3 如何构建LLM
  • 二、提示工程简介
    • 2.1 基础提示
    • 2.2 使用提示词的必要性
  • 三、 提示
    • 3.1 如何写好提示词
      • 3.1.1 使用分隔符
      • 3.1.2 结构化输出
      • 3.1.3 风格信息
      • 3.1.4 给定条件
      • 3.1.5 给出示例
      • 3.1.6 步骤分解
      • 3.1.7 不断迭代
    • 3.2 提示工程
      • 3.2.1 使用角色
      • 3.2.2 使用示例
      • 3.2.3 思维链
      • 3.2.4 zero shot chain
    • 3.3 提示的组成部分
  • 四、 实际应用案例
    • 4.1 编程助手
    • 4.2 写邮件
    • 4.3 学习伙伴
  • 五、大模型的局限性
  • 六、 大模型参数设置

想让你的AI变成聊天高手?掌握提示工程,让你的AI不仅仅是个回答机器,而是你智能的生活小助手! ‍

首先,你得知道什么是LLMs(大型语言模型),它们是怎么构建的,以及为什么我们需要提示工程。然后,你会学到如何用分隔符来区分数据和提示,怎样要求结构化输出(比如JSON, XML, HTML等),以及如何通过包含风格信息来调整输出的语调。

不仅如此,你还会学到如何写出好的提示,比如角色提示、少量示例提示、思考链提示,甚至是零示例思考链和由少到多的提示。这些技巧就像是给AI的思维加上了翅膀,让它们飞得更高、更远。

最后,不要忘了调整那些神秘的LLM设置,比如温度和Top P,还有其他超参数。这就像是调整你的AI食谱,让它做出最美味的数据大餐。

一、LLM概念

LLM全称是“Large Language Model”,大语言模型。它通过大量的文本数据训练,理解输入,处理语言相关任务,如回答问题、进行对话、总结文本、翻译语言等。

1.1 什么是LLMs

LLM是为了理解生成人类语言而设计的人工智能模型。这些模型通常基于深度学习框架(如Transformer)训练。

LLM可以处理多种NLP任务。如机器翻译、情感分析、摘要等。可以根据给定的输入生成连贯文本,在聊天机器人、问答系统、内容生成领域应用广泛。

例如OpenAI的GPT就是一个LLM,可以通过最小的微调执行各种语言任务。

1.2 LLMs类别

LLMs可以分为两类,基础LLM(Base LLM),指令调整LLM(Instruciton tuned LLM)

  • 基础LLM

基础LLM是根据当前文本预测下一词,它不是用来回答问题、对话、解决问题的。

例如你输入

在这篇关于LLMs的文中,我们将讨论

LLM可能会完成这个句子

在这篇关于LLMs的文中,我们将讨论LLMs是什么,它们是如何工作的,以及如何在应用程序中使用他们…

基础LLM可以提供相关文本,但不会回答问题。

  • 指令调整LLM

与基础LLM相反,指令调整LLM不会尝试补全文本,而是根据训练数据尝试完成指令内容,例如回答问题。

例如输入

LLM是什么?

它将根据训练数据给出答案。

指令调整LLM建立在基础LLM之上。

指令调整LLM = 基础LLM + 微调 + RLHF(人类反馈强化学习)

构建指令调整LLM,首先需要基础LLM,然后使用数据微调,数据集中包含了指令以及指令对应的反馈结果。然后使用RLHF(Reinforcement Learning with Human Feedback)技术微调,这一技术可以从人类反馈中不断学习,随着时间推移不断优化其性能。

1.3 如何构建LLM

训练LLM包含三个步骤:数据收集、训练、评估

  • 数据收集

数据来源可以是网站、博客、书籍、新闻、百科等。

  • 训练

训练需要很长时间以及很大的算力。

  • 评估

看输出的模型在回答、摘要、翻译等任务上的表现。

二、提示工程简介

提示工程是为模型提供“提示”或指令,以执行你希望其执行的任务的过程。

例如将一段文本翻译成法语,可以这样写提示词:

Translate the text delimited by triple quotes from English to french: """Hello, how are you?"""

(将三引号内的文本从英文翻译成法语。)

也可以以简洁的方式这样写:

Translate the following to French:Hello, how are you?

(将下面的内容翻译成法语)

模型将生成对应的输出:

Bonjour, comment allez-vous?

但最好是明确使用分隔符将提示内容与说明分开。

2.1 基础提示

指示模型执行任务所需的只是提示。提示是你提供给模型以执行任务的一段文本。例如:

这里是文章内容..........
.......................为我总结上面的文章内容。

或者只是一条生成新文本的指令

为我写一段关于提示工程的简介。

但是只使用纯文本作为指令并不能充分利用LLM的能力。为了充分挖掘LLM的能力,就涉及到了提示工程。

2.2 使用提示词的必要性

提示的需求源于其在引导AI模型行为、提高文本质量和相关性、引出特定输出、对齐AI和人类意图以及减少生成内容中的不准确性和模糊性方面的作用。通过理解和掌握提示的艺术,用户可以释放AI语言模型的真正潜力。

三、 提示

前面说明了什么时提示,以及提示的重要性。本节介绍常见的提示技巧。

3.1 如何写好提示词

3.1.1 使用分隔符

使用分隔符来标记提示和数据之间的边界。

  • 选择适当的分隔符

    可以使用三重大括号{{{ }}}或特殊标记(如 <|data|> )作为分隔符。

  • 正确放置分隔符

    将分隔符放置在数据部分的开头和结尾,同时确保与提示清晰分开。提示部分应位于分隔符之前,为模型提供必要的说明或上下文。

  • 始终使用一致的分隔符

示例

总结三花括号内的文本。{{{这里是你的文本}}}

3.1.2 结构化输出

有时我们需要结构化输出结果,如JSON、XML、HTML等,这对于处理数据、网页抓取、内容生成很有帮助。

该如何请求结构化输出呢?

  • 指定输出格式

  • 定义结构和字段

    概述所需输出的结构并指定所需字段。这有助于指导模型生成符合所需结构的响应。可以提供示例或模板来说明预期的格式。

  • 提供输入上下文

示例

帮助我从<review>标签中包含的文本中生成一个JSON对象,其中包含键' product '(产品名称),' isPositive '(布尔值),' summary '(评论的一句话摘要)。<review>令人遗憾的是,“XYZ ProTech 2000”产品甚至没有达到最基本的期望。从它平淡无奇的构建质量和令人困惑的用户界面到它糟糕的性能和令人失望的客户支持,这个产品让我非常不满意。如果您正在考虑购买“XYZ ProTech 2000”,我强烈建议您探索提供卓越质量和可靠性的替代选项。
</review>

输出结果:

{"product": "XYZ ProTech 2000","isPositive": false,"summary": "Failed to meet expectations due to lackluster build quality, confusing user interface, abysmal performance, and disappointing customer support."
}

3.1.3 风格信息

通过提供有关所需语气的明确说明,可以影响语言模型的写作风格并确保其符合您的特定要求。

在提示中清楚地传达所需的语气、风格或情绪。无论是正式的、休闲的、幽默的、专业的还是任何其他特定的风格,明确提及它都有助于指导模特的写作。另外,请考虑合并反映所需风格的关键字或短语。例如,如果您想要正式的语气,请添加**“以专业方式”或“使用正式语言”**等短语。这为模型提供了有关您期望的语气的附加上下文。

示例

写一封正式的电子邮件来拒绝工作邀请。

3.1.4 给定条件

给出条件,然后要求模型遵循这些条件,有助于引导模型对特定行为或结果做出反应。

示例

您将获得由三引号分隔的文本。
如果它包含一个指令序列,则\
将这些说明改写为以下格式:步骤1 -…
步骤2 -…
…
步骤N -…如果文本不包含指令序列,则\
然后只需写上“没有提供步骤。"""在这里插入你的食谱文本"""

3.1.5 给出示例

向模型提供示例,然后要求它继续该行为。

示例:

仔细阅读示例并将其作为回答的基础。输入:香蕉
输出:水果输入:苹果
输出:水果输入:胡萝卜
输出:蔬菜根据提供的示例,为以下输入生成适当的回答:萝卜
橙子
梨
土豆
黄瓜
芹菜
西兰花
花椰菜

输出:

萝卜:蔬菜
橙子:水果
梨:水果
土豆:蔬菜
黄瓜:蔬菜
芹菜:蔬菜
西兰花:蔬菜
花椰菜:蔬菜

3.1.6 步骤分解

有时直接向模型询问某些内容可能不会产生最佳输出。这时可以分解这些步骤。
下面展示一个示例,提取故事中出现的名词和数量。有两种方式,一种是直接问,还有一种是步骤分解。

示例:

# 直接法给我一个JSON对象,带有以下键:`nouns_count`(出现在故事中的名词数量)和`nouns_french`(法语名词数组)。故事以"""隔开。"""In a charming village, siblings Jack and Jill set out on a quest to fetch water from a hilltop well. As they climbed, singing joyfully, misfortune struck—Jack tripped on a stone and tumbled down the hill, with Jill following suit. Though slightly battered, the pair returned home to comforting embraces. Despite the mishap, their adventurous spirits remained undimmed, and they continued exploring with delight."""

输出

{"nouns_count": 10,"nouns_french": ["village","siblings","Jack","Jill","quest","water","hilltop","well","stone","hill"]
}

可以看到输出不是法语。

#步骤分解法对以"""分隔的故事执行以下步骤。步骤1 翻译成法语
步骤2 列出译文中的每个名词。
步骤3 输出JSON对象,包含'nouns_count'法语故事中的名词数量和'nouns_french',即翻译中出现的名词数组。只输出JSON,我对其余步骤不感兴趣。"""In a charming village, siblings Jack and Jill set out on a quest to fetch water from a hilltop well. As they climbed, singing joyfully, misfortune struck—Jack tripped on a stone and tumbled down the hill, with Jill following suit. Though slightly battered, the pair returned home to comforting embraces. Despite the mishap, their adventurous spirits remained undimmed, and they continued exploring with delight."""

输出

{"nouns_count": 10,"nouns_french": ["village","frères","Jack","Jill","quête","eau","sommet de la colline","bien","pierre","colline"]
}

3.1.7 不断迭代

不要将写提示词视为一个一劳永逸的过程。应该不断的迭代,直到达到准确、一致结果。

3.2 提示工程

3.2.1 使用角色

角色提示是提示工程中使用的一种技术,旨在鼓励人工智能通过假设特定的角色、角色或观点来处理问题。根据给定的角色,这种策略可以带来更加专注、创造性或同理心的反应。

  • 确定处理任务的角色
  • 提供上下文,描述场景,介绍角色。
  • 提出问题或任务。

示例:

作为一名气候科学家,您将如何解决森林砍伐问题以尽量减少其对环境的影响?

3.2.2 使用示例

新的相关输入之前,可以先用少量的示例演示输入、输出。

  • 示例数量:2-10 个示例(但可能会有所不同),具体取决于任务的清晰度和复杂性。
  • 上下文和相关性:示例应与所需任务相关,并为塑造模型的输出提供充分的基础。
  • 平衡:力求在示例太少(规格不足)和示例过多(重复和规格过高)之间取得平衡。

3.2.3 思维链

这种方法将复杂的主题或问题分解为更小的、可管理的部分。假设我们希望模型分析在家工作的优点和缺点。我们可以通过一系列相互关联的提示来探讨这个主题。

“列出人们可能更喜欢在家工作的三个原因。”
“对于您提到的每个原因,请解释对个人和/或组织的好处和积极影响。”
“现在,考虑一下在家工作的挑战。确定三个潜在的缺点或负面影响。”
“对于每一个挑战,讨论个人和组织如何减轻或解决这些挑战。”

3.2.4 zero shot chain

  • 首先定义一个明确的初始问题或问题,将其作为链的起点。
  • 设计一个提示,不仅要求模型提供最初问题的答案,还要求模型逐步解释其推理。
  • 鼓励模型在其响应中明确考虑中间步骤、可能的替代方案或想法之间的联系。

示例:

请解释一下太阳能电池板的工作过程,从阳光照射到电池板表面开始,到产生电能结束。将你的回答组织成一个循序渐进的思维链,注意清楚每一步是如何通向下一步的。

3.3 提示的组成部分

  • 上下文
  • 说明/指令
  • 示例

四、 实际应用案例

LLM可以应用在

  • 自然语言处理
  • 信息检索
  • 问答
  • 文本生成
  • 文本摘要
  • 学习工具
  • 聊天机器人

4.1 编程助手

  • 代码生成
扮演一个初级python程序员。请编写代码,从3个数组生成madlib,每个数组6个项:介词,动词和名词,其中名词也用作直接对象。写完之后,执行代码。
  • 注释和重新格式化代码
请在Python代码中添加行注释并重新格式化以提高可读性:import math
amplitude = 30
frequency = 2
num_points = 50
for i in range(num_points):y = int(round(amplitude * math.sin(2 * math.pi * frequency * i / num_points)))print(' ' * (amplitude + y) + '*')
  • 调试
请调试下面的python代码:  pizza_cost = 100
partygoers = 10
while partygoers = 0:cost_per_person = pizza_cost / partygoersprint("the cost per person is $", "{:.2f}".format(cost_per_person))partygoers -= 2
  • 优化代码
扮演非常资深的python开发人员。请优化这个脚本:for num in range(1, 101):if num  1:for i in range(2, num):if (num % i) == 0:breakelse:print(num)
  • 编程语言之间的翻译
扮演一个既懂COBOL又懂Python的有经验的开发人员。请将这个COBOL程序转换为Python:IDENTIFICATION DIVISION.
PROGRAM-ID.  CALCULATE-SS-TAX.DATA DIVISION.
WORKING-STORAGE SECTION.
01 SALARY PIC 9(7)V99.
01 SS-TAX PIC 9(7)V99.PROCEDURE DIVISION.
DISPLAY "Enter employee's salary: ".
ACCEPT SALARY.COMPUTE SS-TAX = SALARY * 0.062.DISPLAY "Social Security tax is: $", SS-TAX.
STOP RUN.

4.2 写邮件

写一封电子邮件,通知客户他们的询价已经收到,并将很快得到答复。在电子邮件中包括订单号和客户姓名。

4.3 学习伙伴

  • 术语解释

    可以让LLM解释论文阅读中的术语。

  • 自测

    如,让LLM生成5个计算题。

其他的还有推理、聊天机器人等。这里不再举例说明。

五、大模型的局限性

  1. 无法完全理解提示的意图,生成通用响应。为了缓解这种情况,需要使提示更加明确或要求模型在提供最终答案之前逐步思考。
  2. 对提示措辞的敏感性,这可能会导致完全不同或不一致的回答。确保提示措辞恰当且清晰,以最大程度地减少混乱。
  3. 模型生成看似合理但不正确的答案。解决这个问题的一种方法是为模型添加一个步骤来验证其响应的准确性,或者提示模型提供给定信息的证据或来源。
  4. 冗长或过于技术性的回复。为了避免这种情况,请通过使提示更具体、要求更简单的响应或请求特定格式来明确指导模型。
  5. 当面临模棱两可的提示时,LLMs可能会尝试回答而不要求澄清。为了鼓励模型寻求澄清,可以在提示前面加上“如果问题不清楚,请要求澄清”。
  6. 模型无法执行多部分任务。为了避免这种情况,请考虑将任务分解为更小、更易于管理的子任务,或者确保在提示中清楚地标识任务的每个部分。
  7. LLMs大多数情况无法正确引用来源,因为他们无法访问网络。使用搜索增强LLMs
  8. 数学能力不及格
  9. 用户输入不规范。构建内容过滤器和精心设计的提示模板等安全机制,以防止模型生成有害或不需要的输出。

六、 大模型参数设置

LLM参数设置在提示工程中起着至关重要的作用,因为它们直接影响语言模型的行为和输出。在本节中,我们将讨论设计提示时需要考虑的一些重要的 LLM 设置。

  1. temperature

温度是一个超参数,控制语言模型生成的输出的随机性。较高的温度会产生更加多样化和创造性的反应,而较低的温度会产生更加集中和确定性的反应。

  1. Max Tokens

最大标记决定模型生成的输出的长度。通过控制响应中标记的数量,可以影响语言模型的详细程度。

  1. Top-K

Top-K 采样是一种限制语言模型可以考虑的预测单词数量的方法。通过指定较小的K值,可以限制输出的重点,防止模型生成不相关的信息。一般top-k和temperature设置一个就行了。


【参考】

  • https://roadmap.sh/prompt-engineering
  • Chat-GPT4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker】Linux路由连接两个不同网段namespace,连接namespace与主机

如果两个namespace处于不同的子网中&#xff0c;那么就不能通过bridge进行连接了&#xff0c;而是需要通过路由器进行三层转发。然而Linux并未像提供虚拟网桥一样也提供一个虚拟路由器设备&#xff0c;原因是Linux自身就具备有路由器功能。 路由器的工作原理是这样的&#xff…

Qt控件 UI设计 QPushbutton、QToolButton、QMenu

Qt控件 UI设计 QPushbutton、QToolButton、QMenu 个人设计QToolButton效果设计效果运行效果 Chapter1 Qt控件 UI设计 QPushbutton、QToolButton、QMenu1.QPushbutton和QToolButton的关联和区别&#xff1a;2.QMenu 可以配合QPushbutton做个下拉菜单3.点击按钮的功能&#xff0c…

k8s:endpoint

在 Kubernetes 中&#xff0c;Endpoint 是一种 API 对象&#xff0c;它用于表示集群内某个 Service 的具体网络地址。换句话说&#xff0c;它连接到一组由 Service 选择的 Pod&#xff0c;从而使它们能够提供服务。每个 Endpoint 对象都与相应的 Service 对象具有相同的名称&am…

【C语言初学者周冲刺计划】5.1C语言知识点小总结

目录 1知识点一&#xff1a; 2知识点二&#xff1a; 3知识点三&#xff1a; 4代码&#xff1a; 5总结&#xff1a; 1知识点一&#xff1a; 1 C语言中要求对变量作强制定义的主要理由是( )。 便于确定类型和分配空间 2 【单选题】若有定义&#xff1a;int m7; float x…

ssh 免密连接远程服务器并使用Python执行scp传输文件

找到自己Mac的ssh公钥&#xff0c;如果没有ssh密钥的话&#xff0c;需要生成一下 cat ~/.ssh/id_rsa.pub# 在~/.ssh路径下面执行命令生成ssh密钥 ssh-keygen -t rsa然后找到要免密登陆的远程服务器 ~/.ssh/authorized_keys 把自己Mac上面的公钥拷贝到这里面即可 Python脚本 …

云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介 k8s&#xff08;Kubernetes&#xff09; 是容器管理平台&#xff0c;用来管理容器化的应用&#xff0c;提供快速的容器调度、弹性伸缩等诸多功能&#xff0c;可以理解为容器云&#xff0c;不涉及到业务层面的开发。只要你的应用可以实现容器化&#xff0c;就可以部…

Webpack搭建本地服务器

一、搭建webpack本地服务 1.为什么要搭建本地服务器&#xff1f; 目前我们开发的代码&#xff0c;为了运行需要有两个操作&#xff1a; 操作一&#xff1a;npm run build&#xff0c;编译相关的代码&#xff1b;操作二&#xff1a;通过live server或者直接通过浏览器&#x…

Docker 查看Image镜像的Dockerfile方法

1、创建测试镜像 Dockerfile: FROM centos LABEL maintainer"NGINX Docker Maintainers docker-maintnginx.com" RUN yum install -y nginx RUN echo "Nginx Web: CMD defining default arguments for an ENTRYPOINT" > /usr/share/nginx/html/index.…

设计模式——迭代器模式(Iterator Pattern)+ Spring相关源码

文章目录 一、迭代器模式二、例子2.1 菜鸟例子2.1.1 定义迭代器接口2.1.2 定义迭代对象接口——用于返回一个迭代器2.1.3 实现 迭代对象 和 迭代器2.1.4 使用 2.2 JDK源码——ArrayList2.3 Spring源码——DefaultListableBeanFactory 三、其他设计模式 一、迭代器模式 类型&am…

Leetcode刷题详解——反转链表

1. 题目链接&#xff1a;206. 反转链表 2. 题目描述&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1…

炫云客户端信用额度如何修改?

现在炫云新注册用户信用额度是100元&#xff0c;但是有人觉得信用额度太高了&#xff0c;想修改信用额度&#xff0c;不知道炫云的信用额度如何修改&#xff0c;今天就教大家如何修改炫云的信用额度。炫云的信用额度在炫云官网和客户端都可以修改。 我们先来看炫云官网如何修改…

蓝桥杯官网填空题(递增序列)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 对于一个字母矩阵&#xff0c;我们称矩阵中的一个递增序列是指在矩阵中找到两个字母&#xff0c;它们在同一行&#xff0c;同一列&#xff0c;或者在同一 45 度的斜…

微服务设计模式-架构真题(六十八)

UNIX的源代码控制工具(Source Code control System,SCCS)是项目开发中常用的&#xff08;&#xff09;。 源代码静态分析工具文档分析工具版本控制工具再工程工具 答案&#xff1a;C 解析&#xff1a; SCCS是版本控制工具 网闸的描述错误的是&#xff08;&#xff09;。 双…

【数据结构】归并排序 的递归实现与非递归实现

归并排序 前言一、归并排序递归实现&#xff08;1&#xff09;归并排序的核心思路&#xff08;2&#xff09;归并排序实现的核心步骤&#xff08;3&#xff09;归并排序码源详解&#xff08;4&#xff09;归并排序效率分析1&#xff09;时间复杂度 O&#xff08;N*logN&#xf…

matlab双目标定中基线物理长度获取

在MATLAB进行双目摄像机标定时,通常会获得相机的内参,其中包括像素单位的焦距(focal length)以及物理单位的基线长度(baseline)。对于应用中的深度估计和测量,基线长度的物理单位非常重要,因为它直接影响到深度信息的准确性。有时候,您可能只能获取像素单位的焦距和棋…

ffmpeg的基本功能介绍

之前对ffmpeg有一个模糊的印象&#xff0c;后来经过一些项目对ffmpeg有了深入的认识&#xff0c;这里总结下。 最开始对ffmpeg的印象是可以对视频进行一些处理操作&#xff0c;但是做哪些操作又不是很清楚&#xff0c;知其然不知其所以然。下面对于ffmpeg的功能进行一个总结&a…

FPGA 如何 固化程序到 FLASH中

1、导出Hardware 2、导出bit文件 3、打开SDK 4、 点击Ok 5、创建工程 6、 输入工程名称&#xff1a;guhua 7、选择 Zynq FSBL 8、单击 guhua、然后点击 build 点击&#xff1a;build all 9、 右键之后&#xff0c;点击&#xff1a;Creat Boot Image 10、点击 Cr…

水库大坝可视化智能远程监管方案,助力安全监测智能巡检

一、背景需求 水库大坝作为防洪度汛的重要设施&#xff0c;其安全问题直接关系到人民群众的生命财产安全。因此&#xff0c;必须加强对大坝水库的安全管理&#xff0c;对水库除险加固和运行管护要消除存量隐患&#xff0c;实现常态化管理&#xff0c;同时要配套完善重点小型水…

Leetcode—485.最大连续1的个数【简单】

2023每日刷题&#xff08;十五&#xff09; Leetcode—485.最大连续1的个数 实现代码 int findMaxConsecutiveOnes(int* nums, int numsSize){int max 0;int i;int flag 0;int cnt 0;for(i 0; i < numsSize; i) {if(nums[i] 1) {if(flag 0) {flag 1;cnt 1;} else {…

【C++学习笔记】C++20的jthread

jthread基于std::thread主要增加了以下两个功能&#xff1a; jthread 对象被析构时&#xff0c;会自动调用join&#xff0c;等待其所表示的执行流结束。jthread支持外部请求中止&#xff08;通过 get_stop_source、get_stop_token 和 request_stop &#xff09;。 std::jthrea…