0%

面向开发者的 LLM 入门课程(1)

1
2
from ChatModel import OllamaChat
chat_model = OllamaChat(url="http://localhost:6006/api/chat", model_name='qwen:32b')

提示原则

设计高效 Prompt 的两个关键原则:

  1. 编写清晰、具体的指令
  2. 给予模型充足思考时间

首先,Prompt 需要清晰明确地表达需求,提供充足上下文,使语言模型准确理解我们的意图,就像向一个外星人详细解释人类世界一样。过于简略的 Prompt 往往使模型难以把握所要完成的具体任务。

其次,让语言模型有充足时间推理也极为关键。就像人类解题一样,匆忙得出的结论多有失误。因此Prompt 应加入逐步推理的要求,给模型留出充分思考时间,这样生成的结果才更准确可靠。

如果 Prompt 在这两点上都作了优化,语言模型就能够尽可能发挥潜力,完成复杂的推理和生成任务。掌握这些 Prompt 设计原则,是开发者取得语言模型应用成功的重要一步。

要求模型检查是否满足条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 满足条件的输入(text中提供了步骤)
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果您愿意,可以加一些糖或牛奶调味。\
就这样,您可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …

第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""
response = chat_model.generate(prompt, stream=True)
泡一杯茶很容易。
第一步 - 把水烧开。
第二步 - 拿一个杯子并把茶包放进去。
第三步 - 一旦水足够热,就把它倒在茶包上。
第四步 - 等待一会儿,让茶叶浸泡。
第五步 - 几分钟后,取出茶包。
第六步 - (可选)加一些糖或牛奶调味。
就这样,您可以享受一杯美味的茶了。

上述示例中,模型可以很好地识别一系列的指令并进行输出。在接下来一个示例中,我们将提供给模型没有预期指令的输入,模型将判断未提供步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 不满足条件的输入(text中未提供预期指令)
text_2 = f"""
今天阳光明媚,鸟儿在歌唱。\
这是一个去公园散步的美好日子。\
鲜花盛开,树枝在微风中轻轻摇曳。\
人们外出享受着这美好的天气,有些人在野餐,有些人在玩游戏或者在草地上放松。\
这是一个完美的日子,可以在户外度过并欣赏大自然的美景。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …

第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_2}\"\"\"
"""
response = chat_model.generate(prompt, stream=True)
未提供步骤

给模型时间去思考

在设计 Prompt 时,给予语言模型充足的推理时间非常重要。语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。例如,若要语言模型推断一本书的主题,仅提供简单的书名和一句简介是不足够的。这就像让一个人在极短时间内解决困难的数学题,错误在所难免。

相反,我们应通过 Prompt 指引语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 Prompt 中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。

综上所述,给予语言模型充足的推理时间,是 Prompt Engineering 中一个非常重要的设计原则。这将大大提高语言模型处理复杂问题的效果,也是构建高质量 Prompt 的关键之处。开发者应注意给模型留出思考空间,以发挥语言模型的最大潜力。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
# example 1
prompt = f"""
执行以下操作:
1-用一句话概括下面用三个反引号括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。
请用换行符分隔您的答案。
Text:
​```{text}```
"""
response = chat_model.generate(prompt, stream=True)
1- Brother and sister Jack and Jill go up a hill to fetch water from a well, singing merrily until they both slip and fall; though slightly injured, their adventurous spirits remain undaunted.
2- Brother and sister Jack and Jill go up a hill to fetch water from a well, singing merrily until they both slip and fall; though slightly injured, their adventurous spirits remain undaunted.
3- Jack, Jill
4- {"english_summary": "Brother and sister Jack and Jill go up a hill to fetch water from a well, singing merrily until they both slip and fall; though slightly injured, their adventurous spirits remain undaunted.", "num_names": 2}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
prompt = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。
请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>
Text: <{text}>
"""
response = chat_model.generate(prompt, stream=True)
摘要: 杰克和吉尔在打水回家的路上遭遇了意外但并无大碍。
翻译: Jack and Jill, on their way back from fetching water, have an accident but are unharmed.
名称: ['Jack', 'Jill']
输出 JSON: {"English_summary": "Jack and Jill, on their way back from fetching water, have an accident but are unharmed.", "num_-names": 2}

指导模型在下结论之前找出一个自己的解法

在设计 Prompt 时,我们还可以通过明确指导语言模型进行自主思考,来获得更好的效果。

举个例子,假设我们要语言模型判断一个数学问题的解答是否正确。仅仅提供问题和解答是不够的,语言模型可能会匆忙做出错误判断。

相反,我们可以在 Prompt 中先要求语言模型自己尝试解决这个问题,思考出自己的解法,然后再与提供的解答进行对比,判断正确性。这种先让语言模型自主思考的方式,能帮助它更深入理解问题,做出更准确的判断。

接下来我们会给出一个问题和一份来自学生的解答,要求模型判断解答是否正确:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
prompt = f"""
判断学生的解决方案是否正确。
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
土地费用为 100美元/平方英尺
我可以以 250美元/平方英尺的价格购买太阳能电池板
我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
土地费用:100x
太阳能电池板费用:250x
维护费用:100,000美元+100x
总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""
response = chat_model.generate(prompt, stream=True)
学生的解决方案是正确的。他们正确地将每个部分的成本计算为平方英尺的函数,并将这些费用相加得到总成本。总费用公式如下:

总费用 = 土地费用 + 太阳能电池板费用 + 维护费用
总费用 = 100x (土地费用) + 250x (太阳能电池板费用) + (固定维护费100,000美元 + 变动维护费10x每平方英尺)
总费用 = 450x + 100,000美元

这个公式表示随着发电站面积(x平方英尺)的增加,总成本将线性增加。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:
步骤:
首先,自己解决问题。
然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。
在自己完成问题之前,请勿决定学生的解决方案是否正确。
使用以下格式:
问题:问题文本
学生的解决方案:学生的解决方案文本
实际解决方案和步骤:实际解决方案和步骤文本
学生计算的总费用:学生计算得到的总费用
实际计算的总费用:实际计算出的总费用
学生计算的费用和实际计算的费用是否相同:是或否
学生的解决方案和实际解决方案是否相同:是或否
学生的成绩:正确或不正确
问题:

我正在建造一个太阳能发电站,需要帮助计算财务。

  • 土地费用为每平方英尺100美元
  • 我可以以每平方英尺250美元的价格购买太阳能电池板
  • 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;
    作为平方英尺数的函数,首年运营的总费用是多少。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    学生的解决方案:
    x为发电站的大小,单位为平方英尺。
    费用:
    1. 土地费用:100x美元
    2. 太阳能电池板费用:250x美元
    3. 维护费用:100,000+100x=10万美元+10x美元
    总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元
    实际解决方案和步骤:
    """
    response = chat_model.chat(prompt, stream=True)

    首先,我将计算每个部分的费用:

    1. 土地费用: 100美元/平方英尺 * x平方英尺 = 100x美元
    2. 太阳能电池板费用: 250美元/平方英尺 * x平方英尺 = 250x美元
    3. 维护费用: 固定费用10万美元 + 每平方英尺额外10美元 * x平方英尺 = 100,000美元 + 10x美元

      总费用 = 土地费用 + 太阳能电池板费用 + 维护费用

        = 100x美元 + 250x美元 + (100,000美元 + 10x美元)
        = 350x美元 + 100,000美元
      

      学生计算的总费用:450x + 10万美元
      实际计算的总费用:350x + 100,000美元
      学生计算的费用和实际计算的费用是否相同:否
      学生的解决方案和实际解决方案是否相同:否
      因为学生的总费用公式中,土地和太阳能电池板的费用相加时多算了100x美元。

      学生的成绩:不正确

1
response = chat_model.chat("维护费用中还有一个10x,你没有考虑到。", stream=True)
您是正确的,我犯了一个错误。在计算总费用时,我漏掉了维护费用中的额外10x美元部分。让我更正我的解答:

实际总费用应为:
= 100x(土地费用)+ 250x(太阳能电池板费用)+ (100,000 + 10x)(维护费用)
= 350x美元 + 100,000美元 + 10x美元
= 360x美元 + 100,000美元

现在,让我们重新评估:

学生计算的总费用:450x  + 10万美元
实际计算的总费用:360x  + 100,000美元
学生计算的费用和实际计算的费用是否相同:否
学生的解决方案和实际解决方案是否相同:否

但请注意,尽管学生的总费用公式中没有明确表示维护费用中的10x美元部分,根据问题描述,我们可以推断出该部分应该是存在的。因此,如果学生确实考虑了这一项,他们的答案是正确的,只是表达不够清晰。

如果考虑到这个可能的误解,我们可以说:

学生计算的总费用:(450x + 10x)  + 10万美元
实际计算的总费用:360x  + 100,000美元

在这种情况下:

学生计算的费用和实际计算的费用是否相同:是
学生的解决方案和实际解决方案是否相同:是

由于维护费用中的额外10x美元可能被包含在学生的答案中(尽管没有明确表示),我们可以假设他们的解答正确,但表达需要更清晰。所以成绩可以视为“正确”,前提是在他们确实考虑了这个额外的10x美元。

局限性

开发大模型相关应用时请务必铭记:
虚假知识:模型偶尔会生成一些看似真实实则编造的知识
在开发与应用语言模型时,需要注意它们可能生成虚假信息的风险。尽管模型经过大规模预训练,掌握了丰富知识,但它实际上并没有 完全 记住所见的信息,难以准确判断自己的知识边界,可能做出错误推断。若让语言模型描述一个不存在的产品,它可能会自行构造出似是而非的细节。这被称为“幻觉”(Hallucination),是语言模型的一大缺陷。

如下示例展示了大模型的幻觉。我们要求告诉我们华为公司生产的 GT Watch 运动手表 产品的信息,事实上,这个公司是真实存在的,但产品是编造的,而模型一本正经地提供了它编造的知识,而且迷惑性很强。

1
2
3
4
prompt = f"""
告诉我华为公司生产的GT Watch运动手表的相关信息
"""
response = chat_model.generate(prompt, stream=True)
华为公司的GT Watch是一款高端的运动智能手表,具有出色的健康追踪和运动监测功能。以下是一些关于这款手表的主要特点和规格:

1. **设计与屏幕**:华为GT Watch通常采用圆形表盘设计,配备了一块高分辨率的AMOLED触摸屏,显示效果清晰且色彩丰富。

2. **健康追踪**:该手表内置多种传感器,可以监测心率、血氧饱和度、睡眠质量等关键健康数据,并通过华为的Health App进行详细分析和记录。

3. **运动模式**:支持超过100种运动模式,包括跑步、游泳、骑行、瑜伽等多种运动类型,能够精确记录每次活动的数据。

4. **续航能力**:华为GT Watch拥有出色的电池寿命,典型使用下可达两周,在超长待机模式下甚至可以达到30天以上。

5. **智能功能**:支持接收通知(如电话、短信、应用提醒)、音乐控制、遥控拍照等智能功能,并且可以通过蓝牙与手机配对。

6. **防水防尘**:手表具有高级别的防水和防尘性能,可以在游泳或洗手时佩戴,不必担心损坏。

7. **GPS定位**:内置GPS+GLONASS双模定位系统,户外运动时可以准确记录轨迹。

8. **连接性**:支持蓝牙5.1技术,可与iOS和Android设备配对使用。

9. **操作系统**:采用华为自家的TruSeen健康追踪平台,运行流畅且功能全面。

请注意,具体型号可能会有差异,例如华为GT Watch系列的不同版本(如GT 2、GT 3等)在某些规格上可能有所不同。请根据实际购买的产品查看详细信息和最新功能。

迭代优化

在开发大语言模型应用时,很难通过第一次尝试就得到完美适用的 Prompt。但关键是要有一个良好的迭代优化过程,以不断改进 Prompt。相比训练机器学习模型,Prompt 的一次成功率可能更高,但仍需要通过多次迭代找到最适合应用的形式。

本章以产品说明书生成营销文案为例,展示 Prompt 迭代优化的思路。这与吴恩达在机器学习课程中演示的机器学习模型开发流程相似:有了想法后,编写代码、获取数据、训练模型、查看结果。通过分析错误找出适用领域,调整方案后再次训练。Prompt 开发也采用类似循环迭代的方式,逐步逼近最优。具体来说,有了任务想法后,可以先编写初版 Prompt,注意清晰明确并给模型充足思考时间。运行后检查结果,如果不理想,则分析 Prompt 不够清楚或思考时间不够等原因,做出改进,再次运行。如此循环多次,终将找到适合应用的 Prompt。

总之,很难有适用于世间万物的所谓“最佳 Prompt ”,开发高效 Prompt 的关键在于找到一个好的迭代优化过程,而非一开始就要求完美。通过快速试错迭代,可有效确定符合特定应用的最佳 Prompt 形式。

从产品说明书生成营销产品描述

给定一份椅子的资料页。描述说它属于中世纪灵感系列,产自意大利,并介绍了材料、构造、尺寸、可选配件等参数。假设您想要使用这份说明书帮助营销团队为电商平台撰写营销描述稿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
fact_sheet_chair = """
概述
美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。
多种外壳颜色和底座涂层可选。
可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。
底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。
椅子可带或不带扶手。
适用于家庭或商业场所。
符合合同使用资格。
结构
五个轮子的塑料涂层铝底座。
气动椅子调节,方便升降。
尺寸
宽度53厘米|20.87英寸
深度51厘米|20.08英寸
高度80厘米|31.50英寸
座椅高度44厘米|17.32英寸
座椅深度41厘米|16.14英寸
选项
软地板或硬地板滚轮选项。
两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。
无扶手或8个位置PU扶手。
材料
外壳底座滑动件
改性尼龙PA6/PA66涂层的铸铝。
外壳厚度:10毫米。
座椅
HD36泡沫
原产国
意大利
"""

初始提示

1
2
3
4
5
6
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
技术说明: ```{fact_sheet_chair}```
"""
response = chat_model.generate(prompt, stream=True)
欢迎探索我们的中世纪魅力办公家具系列,专为打造优雅且实用的工作环境而设计。这个精心制作的系列包括文件柜、办公桌、书柜和宽敞的会议桌,适合家庭办公室或商业空间的日常使用。

系列中的每一件家具都展现出卓越工艺与经典美感的完美融合,提供了多种外壳颜色和底座涂层供您选择,包括不锈钢、哑光黑色、光泽白色或优雅的铬色。对于个性化触感,您可以选择SWC-100塑料前后靠背装饰,或者升级至SWC-110,尽享10种精致面料与6种奢华皮革带来的全面装饰体验。

椅子设计灵活舒适,配备五个轮子的耐用塑料涂层铝底座,并带有气动调节功能,轻松实现座椅高度的上下调整。尺寸适中,宽度为53厘米(20.87英寸),深度为51厘米(20.08英寸),而标准椅高则为80厘米(31.50英寸)。座椅高度可调至44厘米(17.32英寸),深度为41厘米(16.14英寸),确保长时间工作时的舒适度。

系列中的椅子还提供软地板或硬地板滚轮选项,以及两种不同的座椅泡沫密度:中等(1.8磅/立方英尺)或高密度(2.8磅/立方英尺),满足不同需求。另外,您还可以选择无扶手设计或是可调节的8个位置PU扶手,以适应各种工作习惯。

家具的核心部分采用改性尼龙PA6/PA66涂层的铸铝材质制成,外壳厚度达10毫米,确保稳固耐用。座椅填充物使用高品质HD36泡沫,提供卓越的支持与舒适度。

这款引人瞩目的办公家具系列产自意大利,每一件作品都严格符合合同使用标准,是追求设计感与实用性的完美结合。将中世纪的典雅融入现代生活,打造独特的工作空间,让每一天的工作充满艺术气息。

提示优化1: 解决生成文本太长

它似乎很好地完成了要求,即从技术说明书开始编写产品描述,介绍了一个精致的中世纪风格办公椅。但是当我看到这个生成的内容时,我会觉得它太长了。

在看到语言模型根据产品说明生成的第一个版本营销文案后,我们注意到文本长度过长,不太适合用作简明的电商广告语。所以这时候就需要对 Prompt 进行优化改进。具体来说,第一版结果满足了从技术说明转换为营销文案的要求,描写了中世纪风格办公椅的细节。但是过于冗长的文本不太适合电商场景。这时我们就可以在 Prompt 中添加长度限制,要求生成更简洁的文案。

提取回答并根据空格拆分,中文答案为97个字,较好地完成了设计要求。

1
2
3
4
5
6
7
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
使用最多50个词。
技术规格:```{fact_sheet_chair}```
"""
response = chat_model.generate(prompt, stream=True)
中世纪风格办公家具系列,包括文件柜、桌椅等,多种色彩选择,塑料或豪华面料皮革装饰,不锈钢等底座选项,气动调节,宽53cm,深51cm,高80cm,意大利制造。适用于家庭和商业环境,合同使用合规。可选软硬地板滚轮,座椅密度,扶手款式。
1
2
# 计算一下输出长度
print(len(response))
116

当在 Prompt 中设置长度限制要求时,语言模型生成的输出长度不总能精确符合要求,但基本能控制在可接受的误差范围内。比如要求生成50词的文本,语言模型有时会生成60词左右的输出,但总体接近预定长度。

这是因为语言模型在计算和判断文本长度时依赖于分词器,而分词器在字符统计方面不具备完美精度。目前存在多种方法可以尝试控制语言模型生成输出的长度,比如指定语句数、词数、汉字数等。

虽然语言模型对长度约束的遵循不是百分之百精确,但通过迭代测试可以找到最佳的长度提示表达式,使生成文本基本符合长度要求。这需要开发者对语言模型的长度判断机制有一定理解,并且愿意进行多次试验来确定最靠谱的长度设置方法。

提示优化2: 处理抓错文本细节

在迭代优化 Prompt 的过程中,我们还需要注意语言模型生成文本的细节是否符合预期。

比如在这个案例中,进一步分析会发现,该椅子面向的其实是家具零售商,而不是终端消费者。所以生成的文案中过多强调风格、氛围等方面,而较少涉及产品技术细节,与目标受众的关注点不太吻合。这时候我们就可以继续调整 Prompt,明确要求语言模型生成面向家具零售商的描述,更多关注材质、工艺、结构等技术方面的表述。

通过迭代地分析结果,检查是否捕捉到正确的细节,我们可以逐步优化 Prompt,使语言模型生成的文本更加符合预期的样式和内容要求。细节的精准控制是语言生成任务中非常重要的一点。我们需要训练语言模型根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本。

1
2
3
4
5
6
7
8
9
# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""
response = chat_model.generate(prompt, stream=True)
中世纪风格办公家具系列,包括文件柜、桌类等,多样外壳与底座涂层(不锈钢、哑光黑等),塑料或豪华面料/皮革装饰(SWC-100/110)。铝制底座带5轮,气动升降。尺寸:宽53cm x 深51cm x 高80cm,座椅高44cm,深41cm。软/硬地板滚轮、中/高密度泡沫、无扶手/8位置PU扶手可选。意大利制造,合同使用认证。

可见,通过修改 Prompt ,模型的关注点倾向了具体特征与技术细节。

我可能进一步想要在描述的结尾展示出产品 ID。因此,我可以进一步改进这个 Prompt ,要求在描述的结尾,展示出说明书中的7位产品 ID。

1
2
3
4
5
6
7
8
9
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""
response = chat_model.generate(prompt, stream=True)
中世纪风格办公家具系列,包括文件柜等,多样外壳与底座涂层选择(不锈钢、哑光黑等)。气动调节,多轮铝底座。宽度53cm,高度80cm。PA6/PA66铸铝材质,HD36座椅泡沫。意大利制造。ID:SWC-100/110

通过上面的示例,我们可以看到 Prompt 迭代优化的一般过程。与训练机器学习模型类似,设计高效Prompt 也需要多个版本的试错调整。

具体来说,第一版 Prompt 应该满足明确和给模型思考时间两个原则。在此基础上,一般的迭代流程是:首先尝试一个初版,分析结果,然后继续改进 Prompt,逐步逼近最优。许多成功的Prompt 都是通过这种多轮调整得出的。

提示优化3: 添加表格描述

继续添加指引,要求提取产品尺寸信息并组织成表格,并指定表格的列、表名和格式;再将所有内容格式化为可以在网页使用的 HTML。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的
测量值。
给表格命名为“产品尺寸”。
将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。
结果中不要有其他无关描述。
技术规格:```{fact_sheet_chair}```
"""
response = chat_model.generate(prompt, stream=True)
<div>
  <h2>中世纪风格办公椅 - 高品质商业家具(ID: SWC-100/110)</h2>
  <p>这款优雅的办公椅是中世纪风格家具系列的一部分,适合家庭和商业环境。选择你喜欢的外壳颜色、底座涂层,以及可选的塑料前后靠背装饰(SWC-100)或丰富的面料和皮革全面装饰(SWC-110)。底座提供不锈钢、哑光黑色、光泽白色或铬色的选择。</p>
  <p>椅子配置五个轮子的塑料涂层铝底座,搭配气动调节装置,轻松升降以适应不同用户需求。这款椅子符合合同使用标准,可满足各类商业空间要求。</p>

  <h3>技术规格:</h3>
  <ul>
    <li>外壳材料: 改性尼龙PA6/PA66涂层的铸铝,厚度10毫米</li>
    <li>座椅填充: HD36泡沫</li>
    <li>产地: 意大利</li>
  </ul>

  <h3>产品尺寸:</h3>
  <table class="product-dimensions">
    <thead>
      <tr>
        <th>名称</th>
        <th>英寸测量值</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>宽度</td>
        <td>20.87</td>
      </tr>
      <tr>
        <td>深度</td>
        <td>20.08</td>
      </tr>
      <tr>
        <td>高度(不含扶手)</td>
        <td>31.50</td>
      </tr>
      <tr>
        <td>座椅高度</td>
        <td>17.32</td>
      </tr>
      <tr>
        <td>座椅深度</td>
        <td>16.14</td>
      </tr>
    </tbody>
  </table>
</div>
1
2
3
# 表格是以 HTML 格式呈现的,加载出来
from IPython.display import display, HTML
display(HTML(response))

中世纪风格办公椅 - 高品质商业家具(ID: SWC-100/110)

这款优雅的办公椅是中世纪风格家具系列的一部分,适合家庭和商业环境。选择你喜欢的外壳颜色、底座涂层,以及可选的塑料前后靠背装饰(SWC-100)或丰富的面料和皮革全面装饰(SWC-110)。底座提供不锈钢、哑光黑色、光泽白色或铬色的选择。

椅子配置五个轮子的塑料涂层铝底座,搭配气动调节装置,轻松升降以适应不同用户需求。这款椅子符合合同使用标准,可满足各类商业空间要求。

技术规格:

  • 外壳材料: 改性尼龙PA6/PA66涂层的铸铝,厚度10毫米
  • 座椅填充: HD36泡沫
  • 产地: 意大利

产品尺寸:

名称 英寸测量值
宽度 20.87
深度 20.08
高度(不含扶手) 31.50
座椅高度 17.32
座椅深度 16.14

文本概括

在繁忙的信息时代,小明是一名热心的开发者,面临着海量的文本信息处理的挑战。他需要通过研究无数的文献资料来为他的项目找到关键的信息,但是时间却远远不够。在他焦头烂额之际,他发现了大型语言模型(LLM)的文本摘要功能。

这个功能对小明来说如同灯塔一样,照亮了他处理信息海洋的道路。LLM 的强大能力在于它可以将复杂的文本信息简化,提炼出关键的观点,这对于他来说无疑是巨大的帮助。他不再需要花费大量的时间去阅读所有的文档,只需要用 LLM 将它们概括,就可以快速获取到他所需要的信息。通过编程调用 AP I接口,小明成功实现了这个文本摘要的功能。他感叹道:“这简直就像一道魔法,将无尽的信息海洋变成了清晰的信息源泉。”小明的经历,展现了LLM文本摘要功能的巨大优势:节省时间,提高效率,以及精准获取信息。这就是我们本章要介绍的内容,让我们一起来探索如何利用编程和调用API接口,掌握这个强大的工具。

1
2
3
4
5
6
prod_review = """
这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。
公仔很软,超级可爱,面部表情也很和善。但是相比于价钱来说,
它有点小,我感觉在别的地方用同样的价钱能买到更大的。
快递比预期提前了一天到货,所以在送给女儿之前,我自己玩了会。
"""

限制输出文本长度

我们首先尝试将文本的长度限制在30个字以内

1
2
3
4
5
6
prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个字。
评论: ```{prod_review}```
"""
response = chat_model.generate(prompt, stream=True)
熊猫公仔可爱柔软,孩子喜欢,但价格偏高且小巧。快递提前到货。

我们可以看到语言模型给了我们一个符合要求的结果

注意:在上一节中我们提到了语言模型在计算和判断文本长度时依赖于分词器,而分词器在字符统计方面不具备完美精度。

设置关键角度侧重

在某些情况下,我们会针对不同的业务场景对文本的侧重会有所不同。

例如,在商品评论文本中,物流部门可能更专注于运输的时效性,商家则更关注价格和商品质量,而平台则更看重整体的用户体验。我们可以通过增强输入提示(Prompt),来强调我们对某一特定视角的重视。

侧重于快递服务

1
2
3
4
5
6
prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个字,并且侧重在快递服务上。
评论: ```{prod_review}```
"""
response = chat_model.generate(prompt, stream=True)
快递提前到货,令人惊喜。

侧重于价格与质量

1
2
3
4
5
6
prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个字,并且侧重于价格与质量。
评论: ```{prod_review}```
"""
response = chat_model.generate(prompt, stream=True)
熊猫公仔可爱柔软,但价格偏高,尺寸较小。快递提前到货。

关键信息提取

虽然我们通过添加关键角度侧重的 Prompt ,确实让文本摘要更侧重于某一特定方面,然而,我们可以发现,在结果中也会保留一些其他信息,比如偏重价格与质量角度的概括中仍保留了“快递提前到货”的信息。如果我们只想要提取某一角度的信息,并过滤掉其他所有信息,则可以要求 LLM 进行文本提取(Extract) 而非概括( Summarize )。

1
2
3
4
5
6
prompt = f"""
您的任务是从电子商务网站上的产品评论中提取相关信息。
请从以下三个反引号之间的评论文本中提取产品运输相关的信息,最多30个词汇。
评论: ```{prod_review}```
"""
response = chat_model.generate(prompt, stream=True)
快递提前一天到货

同时概括多条文本

在实际的工作流中,我们往往要处理大量的评论文本,下面的示例将多条用户评价集合在一个列表中,并利用 for 循环和文本概括(Summarize)提示词,将评价概括至小于 20 个词以下,并按顺序打印。当然,在实际生产中,对于不同规模的评论文本,除了使用 for 循环以外,还可能需要考虑整合评论、分布式等方法提升运算效率。您可以搭建主控面板,来总结大量用户评论,以及方便您或他人快速浏览,还可以点击查看原评论。这样,您就能高效掌握顾客的所有想法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
review_1 = prod_review
# 一盏落地灯的评论
review_2 = """
我需要一盏漂亮的卧室灯,这款灯不仅具备额外的储物功能,价格也并不算太高。
收货速度非常快,仅用了两天的时间就送到了。
不过,在运输过程中,灯的拉线出了问题,幸好,公司很乐意寄送了一根全新的灯线。
新的灯线也很快就送到手了,只用了几天的时间。
装配非常容易。然而,之后我发现有一个零件丢失了,于是我联系了客服,他们迅速地给我寄来了缺失的零件!
对我来说,这是一家非常关心客户和产品的优秀公司。
"""
# 一把电动牙刷的评论
review_3 = """
我的牙科卫生员推荐了电动牙刷,所以我就买了这款。
到目前为止,电池续航表现相当不错。
初次充电后,我在第一周一直将充电器插着,为的是对电池进行条件养护。
过去的3周里,我每天早晚都使用它刷牙,但电池依然维持着原来的充电状态。
不过,牙刷头太小了。我见过比这个牙刷头还大的婴儿牙刷。
我希望牙刷头更大一些,带有不同长度的刷毛,
这样可以更好地清洁牙齿间的空隙,但这款牙刷做不到。
总的来说,如果你能以50美元左右的价格购买到这款牙刷,那是一个不错的交易。
制造商的替换刷头相当昂贵,但你可以购买价格更为合理的通用刷头。
这款牙刷让我感觉就像每天都去了一次牙医,我的牙齿感觉非常干净!
"""
# 一台搅拌机的评论
review_4 = """
在11月份期间,这个17件套装还在季节性促销中,售价约为49美元,打了五折左右。
可是由于某种原因(我们可以称之为价格上涨),到了12月的第二周,所有的价格都上涨了,
同样的套装价格涨到了70-89美元不等。而11件套装的价格也从之前的29美元上涨了约10美元。
看起来还算不错,但是如果你仔细看底座,刀片锁定的部分看起来没有前几年版本的那么漂亮。
然而,我打算非常小心地使用它
(例如,我会先在搅拌机中研磨豆类、冰块、大米等坚硬的食物,然后再将它们研磨成所需的粒度,
接着切换到打蛋器刀片以获得更细的面粉,如果我需要制作更细腻/少果肉的食物)。
在制作冰沙时,我会将要使用的水果和蔬菜切成细小块并冷冻
(如果使用菠菜,我会先轻微煮熟菠菜,然后冷冻,直到使用时准备食用。
如果要制作冰糕,我会使用一个小到中号的食物加工器),这样你就可以避免添加过多的冰块。
大约一年后,电机开始发出奇怪的声音。我打电话给客户服务,但保修期已经过期了,
所以我只好购买了另一台。值得注意的是,这类产品的整体质量在过去几年里有所下降
,所以他们在一定程度上依靠品牌认知和消费者忠诚来维持销售。在大约两天内,我收到了新的搅拌机。
"""
reviews = [review_1, review_2, review_3, review_4]
for i in range(len(reviews)):
prompt = f"""
你的任务是从电子商务网站上的产品评论中提取相关信息。
请对三个反引号之间的评论文本进行概括,最多20个词汇。
评论文本: ```{reviews[i]}```
"""
response = chat_model.generate(prompt)
print(f"评论{i+1}: ", response, "\n")
评论1:  熊猫公仔软萌可爱,孩子喜欢,但价格偏高,稍小;快递提前到。 

评论2:  卧室灯美观实用,价格适中,配送快但包装需加强,客服反应及时。 

评论3:  电动牙刷电池续航好,初充后一周养护,后续三周仍耐用。牙刷头小,清洁效果有限。价格合适且可替代刷头。 

评论4:  产品促销后价格上涨,外观稍逊以前,小心使用避免电机问题。 

推断

在这一章中,我们将通过一个故事,引领你了解如何从产品评价和新闻文章中推导出情感和主题。

让我们先想象一下,你是一名初创公司的数据分析师,你的任务是从各种产品评论和新闻文章中提取出关键的情感和主题。这些任务包括了标签提取、实体提取、以及理解文本的情感等等。在传统的机器学习流程中,你需要收集标签化的数据集、训练模型、确定如何在云端部署模型并进行推断。尽管这种方式可能会产生不错的效果,但完成这一全流程需要耗费大量的时间和精力。而且,每一个任务,比如情感分析、实体提取等等,都需要训练和部署单独的模型。

然而,就在你准备投入繁重工作的时候,你发现了大型语言模型(LLM)。LLM 的一个明显优点是,对于许多这样的任务,你只需要编写一个 Prompt,就可以开始生成结果,大大减轻了你的工作负担。这个发现像是找到了一把神奇的钥匙,让应用程序开发的速度加快了许多。最令你兴奋的是,你可以仅仅使用一个模型和一个 API 来执行许多不同的任务,无需再纠结如何训练和部署许多不同的模型。让我们开始这一章的学习,一起探索如何利用 LLM 加快我们的工作进程,提高我们的工作效率。

情感推断

情感倾向分析

让我们以一则电商平台上的台灯评论为例,通过此例,我们将学习如何对评论进行情感二分类(正面/负面)。

1
2
3
4
5
6
lamp_review = """
我需要一盏漂亮的卧室灯,这款灯具有额外的储物功能,价格也不算太高。\
我很快就收到了它。在运输过程中,我们的灯绳断了,但是公司很乐意寄送了一个新的。\
几天后就收到了。这款灯很容易组装。我发现少了一个零件,于是联系了他们的客服,他们很快就给我寄来了缺失的零件!\
在我看来,Lumina 是一家非常关心顾客和产品的优秀公司!
"""

接下来,我们将尝试编写一个 Prompt ,用以分类这条商品评论的情感。如果我们想让系统解析这条评论的情感倾向,只需编写“以下商品评论的情感倾向是什么?”这样的 Prompt ,再加上一些标准的分隔符和评论文本等。

1
2
3
4
5
prompt = f"""
以下用三个反引号分隔的产品评论的情感是什么?
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)
这条产品评论的情感是正面的。评论者对产品的外观、价格、快速配送以及公司的客户服务给出了积极的评价。尽管在运输中遇到灯绳断裂的问题,但公司迅速提供了更换,而且在发现缺少零件后,客服也及时补发了缺失的部件。评论者对Lumina公司的响应速度和解决问题的能力表示赞赏,认为他们非常关心顾客和产品。因此,整体上,这是一条表达满意和正面反馈的评论。

然后,我们将这个程序运行一遍。结果表明,这条商品评论的情感倾向是正面的,这似乎非常准确。尽管这款台灯并非完美无缺,但是这位顾客对它似乎相当满意。这个公司看起来非常重视客户体验和产品质量,因此,认定评论的情感倾向为正面似乎是正确的判断。

如果你想要给出更简洁的答案,以便更容易进行后期处理,可以在上述 Prompt 基础上添加另一个指令: 用一个单词回答:「正面」或「负面」 。这样就只会打印出 “正面” 这个单词,这使得输出更加统一,方便后续处理。

1
2
3
4
5
6
prompt = f"""
以下用三个反引号分隔的产品评论的情感是什么?
用一个单词回答:「正面」或「负面」。
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)
正面

识别情感类型

接下来,我们将继续使用之前的台灯评论,但这次我们会试用一个新的 Prompt 。我们希望模型能够识别出评论作者所表达的情感,并且将这些情感整理为一个不超过五项的列表。

1
2
3
4
5
prompt = f"""
识别以下评论的作者表达的情感。包含不超过五个项目。将答案格式化为以逗号分隔的单词列表。
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)
满意, 感谢, 喜悦, 赞扬, 推荐

大型语言模型非常擅长从一段文本中提取特定的东西。在上面的例子中,评论所表达的情感有助于了解客户如何看待特定的产品。

识别愤怒

对于许多企业来说,洞察到顾客的愤怒情绪是至关重要的。这就引出了一个分类问题:下述的评论作者是否流露出了愤怒?因为如果有人真的情绪激动,那可能就意味着需要给予额外的关注,因为每一个愤怒的顾客都是一个改进服务的机会,也是一个提升公司口碑的机会。这时,客户支持或者客服团队就应该介入,与客户接触,了解具体情况,然后解决他们的问题。

1
2
3
4
5
prompt = f"""
以下评论的作者是否表达了愤怒?评论用三个反引号分隔。给出是或否的答案。
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)

上面这个例子中,客户并没有生气。注意,如果使用常规的监督学习,如果想要建立所有这些分类器,不可能在几分钟内就做到这一点。我们鼓励大家尝试更改一些这样的 Prompt ,也许询问客户是否表达了喜悦,或者询问是否有任何遗漏的部分,并看看是否可以让 Prompt 对这个灯具评论做出不同的推论。

信息提取

商品信息提取

信息提取是自然语言处理(NLP)的重要组成部分,它帮助我们从文本中抽取特定的、我们关心的信息。我们将深入挖掘客户评论中的丰富信息。在接下来的示例中,我们将要求模型识别两个关键元素:

  • 购买的商品
  • 商品的制造商

想象一下,如果你正在尝试分析一个在线电商网站上的众多评论,了解评论中提到的商品是什么、由谁制造,以及相关的积极或消极情绪,将极大地帮助你追踪特定商品或制造商在用户心中的情感趋势。

在接下来的示例中,我们会要求模型将回应以一个 JSON 对象的形式呈现,其的 key 就是商品和品牌。

1
2
3
4
5
6
7
8
9
10
prompt = f"""
从评论文本中识别以下项目:
- 评论者购买的物品
- 制造该物品的公司
评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。
如果信息不存在,请使用 “未知” 作为值。
让你的回应尽可能简短。
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)
1
2
3
4
{
"物品": "卧室灯",
"品牌": "Lumina"
}

如上所示,它会说这个物品是一个卧室灯,品牌是 Luminar,你可以轻松地将其加载到 Python 字典中,然后对此输出进行其他处理。

综合情感推断和信息提取

在上面小节中,我们采用了三至四个 Prompt 来提取评论中的“情绪倾向”、“是否生气”、“物品类型”和“品牌”等信息。然而,事实上,我们可以设计一个单一的 Prompt ,来同时提取所有这些信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
prompt = f"""
从评论文本中识别以下项目:
- 情绪(正面或负面)
- 审稿人是否表达了愤怒?(是或否)
- 评论者购买的物品
- 制造该物品的公司
评论用三个反引号分隔。将你的响应格式化为 JSON 对象,以 “情感倾向”、“是否生气”、“物品类型” 和“品牌” 作为键。
如果信息不存在,请使用 “未知” 作为值。
让你的回应尽可能简短。
将 “是否生气” 值格式化为布尔值。
评论文本: ```{lamp_review}```
"""
response = chat_model.generate(prompt, stream=True)
1
2
3
4
5
6
{
"情感倾向": "正面",
"是否生气": false,
"物品类型": "卧室灯",
"品牌": "Lumina"
}

这个例子中,我们指导 LLM 将“是否生气”的情况格式化为布尔值,并输出 JSON 格式。你可以尝试对格式化模式进行各种变化,或者使用完全不同的评论来试验,看看 LLM 是否仍然可以准确地提取这些内容。

主题推断

大型语言模型的另一个很酷的应用是推断主题。假设我们有一段长文本,我们如何判断这段文本的主旨是什么?它涉及了哪些主题?让我们通过以下一段虚构的报纸报道来具体了解一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
story = """
在政府最近进行的一项调查中,要求公共部门的员工对他们所在部门的满意度进行评分。
调查结果显示,NASA 是最受欢迎的部门,满意度为 95%。
一位 NASA 员工 John Smith 对这一发现发表了评论,他表示:
“我对 NASA 排名第一并不感到惊讶。这是一个与了不起的人们和令人难以置信的机会共事的好地方。我为成
为这样一个创新组织的一员感到自豪。”
NASA 的管理团队也对这一结果表示欢迎,主管 Tom Johnson 表示:
“我们很高兴听到我们的员工对 NASA 的工作感到满意。
我们拥有一支才华横溢、忠诚敬业的团队,他们为实现我们的目标不懈努力,看到他们的辛勤工作得到回报是太
棒了。”
调查还显示,社会保障管理局的满意度最低,只有 45%的员工表示他们对工作满意。
政府承诺解决调查中员工提出的问题,并努力提高所有部门的工作满意度。
"""

推断讨论主题

以上是一篇关于政府员工对其工作单位感受的虚构报纸文章。我们可以要求大语言模型确定其中讨论的五个主题,并用一两个词语概括每个主题。输出结果将会以逗号分隔的Python列表形式呈现。

1
2
3
4
5
6
7
prompt = f"""
确定以下给定文本中讨论的五个主题。
每个主题用1-2个词概括。
请输出一个可解析的Python列表,每个元素是一个字符串,展示了一个主题。
给定文本: ```{story}```
"""
response = chat_model.generate(prompt, stream=True)
['NASA', '满意度调查', '员工评论', '管理团队回应', '社会保障管理局']

为特定主题制作新闻提醒

假设我们有一个新闻网站或类似的平台,这是我们感兴趣的主题:美国航空航天局、当地政府、工程、员工满意度、联邦政府等。

我们想要分析一篇新闻文章,理解其包含了哪些主题。可以使用这样的Prompt:确定以下主题列表中的每个项目是否是以下文本中的主题。以 0 或 1 的形式给出答案列表

1
2
3
4
5
6
7
8
prompt = f"""
判断主题列表中的每一项是否是给定文本中的一个话题,
以列表的形式给出答案,每个元素是一个Json对象,键为对应主题,值为对应的 0 或 1。
输出的结果仅包含json文件内容,不要包含一些无关文字。
主题列表:美国航空航天局、当地政府、工程、员工满意度、联邦政府
给定文本: ```{story}```
"""
response = chat_model.generate(prompt, stream=True)
[{"美国航空航天局": 1}, {"当地政府": 0}, {"工程": 0}, {"员工满意度": 1}, {"联邦政府": 0}]

这种能力在机器学习领域被称为零样本(Zero-Shot)学习。这是因为我们并没有提供任何带标签的训练数据,仅凭 Prompt ,它便能判定哪些主题在新闻文章中被包含。

如果我们希望制定一个新闻提醒,我们同样可以运用这种处理新闻的流程。假设我对“美国航空航天局”的工作深感兴趣,那么你就可以构建一个如此的系统:每当出现与’美国宇航局’相关的新闻,系统就会输出提醒。

1
2
3
4
5
6
import json
result_lst = json.loads(response)
topic_dict = {list(i.keys())[0] : list(i.values())[0] for i in result_lst}
print(topic_dict)
if topic_dict['美国航空航天局'] == 1:
print("提醒: 关于美国航空航天局的新消息")
{'美国航空航天局': 1, '当地政府': 0, '工程': 0, '员工满意度': 1, '联邦政府': 0}
提醒: 关于美国航空航天局的新消息

文本转换

大语言模型具有强大的文本转换能力,可以实现多语言翻译、拼写纠正、语法调整、格式转换等不同类型的文本转换任务。利用语言模型进行各类转换是它的典型应用之一。

在本章中,我们将介绍如何通过编程调用API接口,使用语言模型实现文本转换功能。通过代码示例,读者可以学习将输入文本转换成所需输出格式的具体方法。

掌握调用大语言模型接口进行文本转换的技能,是开发各种语言类应用的重要一步。文本转换功能的应用场景也非常广泛。相信读者可以在本章的基础上,利用大语言模型轻松开发出转换功能强大的程序。

文本翻译

文本翻译是大语言模型的典型应用场景之一。相比于传统统计机器翻译系统,大语言模型翻译更加流畅自然,还原度更高。通过在大规模高质量平行语料上进行 Fine-Tune,大语言模型可以深入学习不同语言间的词汇、语法、语义等层面的对应关系,模拟双语者的转换思维,进行意义传递的精准转换,而非简单的逐词替换。

以英译汉为例,传统统计机器翻译多倾向直接替换英文词汇,语序保持英语结构,容易出现中文词汇使用不地道、语序不顺畅的现象。而大语言模型可以学习英汉两种语言的语法区别,进行动态的结构转换。同时,它还可以通过上下文理解原句意图,选择合适的中文词汇进行转换,而非生硬的字面翻译。

大语言模型翻译的这些优势使其生成的中文文本更加地道、流畅,兼具准确的意义表达。利用大语言模型翻译,我们能够打通多语言之间的壁垒,进行更加高质量的跨语言交流。

翻译为西班牙语

1
2
3
4
5
prompt = f"""
将以下中文翻译成西班牙语: \
​```您好,我想订购一个搅拌机。```
"""
response = chat_model.generate(prompt, stream=True)
``Hola, me gustaría ordenar un batidor.```

识别语种

1
2
3
4
5
prompt = f"""
请告诉我以下文本是什么语种:
​```Combien coûte le lampadaire?```
"""
response = chat_model.generate(prompt, stream=True)
这段文本是法语。这句话的意思是:“路灯多少钱?”

多语种翻译

1
2
3
4
5
prompt = f"""
请将以下文本分别翻译成中文、英文、法语和西班牙语:
​```I want to order a basketball.```
"""
response = chat_model.generate(prompt, stream=True)
中文:我想要订购一个篮球。
英文:I want to order a basketball.
法语:Je veux commander un ballon de basket.
西班牙语:Quiero ordenar una pelota de baloncesto.

同时进行语气转换

1
2
3
4
5
prompt = f"""
请将以下文本翻译成中文,分别展示成正式与非正式两种语气:
​```Would you like to order a pillow?```
"""
response = chat_model.generate(prompt, stream=True)
正式语气:您是否需要订购一个枕头?

非正式语气:你要不要来个枕头?

通用翻译器

在当今全球化的环境下,不同国家的用户需要频繁进行跨语言交流。但是语言的差异常使交流变得困难。为了打通语言壁垒,实现更便捷的国际商务合作和交流,我们需要一个智能通用翻译工具。该翻译工具需要能够自动识别不同语言文本的语种,无需人工指定。然后它可以将这些不同语言的文本翻译成目标用户的母语。在这种方式下,全球各地的用户都可以轻松获得用自己母语书写的内容。

开发一个识别语种并进行多语种翻译的工具,将大大降低语言障碍带来的交流成本。它将有助于构建一个语言无关的全球化世界,让世界更为紧密地连结在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
user_messages = [
"La performance du système est plus lente que d'habitude.", # System performance is slower than normal
"Mi monitor tiene píxeles que no se iluminan.", # My monitor has pixels that are not lighting
"Il mio mouse non funziona", # My mouse is not working
"Mój klawisz Ctrl jest zepsuty", # My keyboard has a broken control key
"我的屏幕在闪烁" # My screen is flashing
]
import time
for issue in user_messages:
prompt = f"告诉我以下文本是什么语种,直接输出语种,如法语,无需输出标点符号: ```{issue}```"
lang = chat_model.generate(prompt)
print(f"原始消息 ({lang}): {issue}\n")
prompt = f"""
将以下消息分别翻译成英文和中文,并写成
中文翻译:xxx
英文翻译:yyy
的格式:
```{issue}```
"""
response = chat_model.generate(prompt)
print(response, "\n=========================================")
原始消息 (法语): La performance du système est plus lente que d'habitude.

中文翻译:系统的性能比平时慢。
英文翻译:The system performance is slower than usual. 
=========================================
原始消息 (西班牙语): Mi monitor tiene píxeles que no se iluminan.

中文翻译:我的显示器有像素不亮。
英文翻译:Some pixels on my monitor are not illuminated. 
=========================================
原始消息 (意大利语): Il mio mouse non funziona

中文翻译:我的鼠标不工作了。
英文翻译:My mouse is not working. 
=========================================
原始消息 (波兰语): Mój klawisz Ctrl jest zepsuty

中文翻译:我的Ctrl键坏了
英文翻译:My Ctrl key is broken 
=========================================
原始消息 (中文): 我的屏幕在闪烁

中文翻译:我的屏幕在闪烁
英文翻译:My screen is flickering 
=========================================

语气与写作风格调整

在写作中,语言语气的选择与受众对象息息相关。比如工作邮件需要使用正式、礼貌的语气和书面词汇;而与朋友的聊天可以使用更轻松、口语化的语气。

选择恰当的语言风格,让内容更容易被特定受众群体所接受和理解,是技巧娴熟的写作者必备的能力。随着受众群体的变化调整语气也是大语言模型在不同场景中展现智能的一个重要方面。

1
2
3
4
5
prompt = f"""
将以下文本翻译成商务信函的格式:
​```小老弟,我小羊,上回你说咱部门要采购的显示器是多少寸来着?```
"""
response = chat_model.generate(prompt, stream=True)
尊敬的先生/女士,

您好,我是小羊。在我们上次的讨论中,我记得您提到了我们的部门计划采购的显示器的具体尺寸,但我不确定具体细节。能否麻烦您再次确认一下我们需要购买的显示器是多大的英寸数?

期待您的回复。

顺祝商祺,
小羊

文件格式转换

大语言模型如 ChatGPT 在不同数据格式之间转换方面表现出色。它可以轻松实现 JSON 到 HTML、XML、Markdown 等格式的相互转化。下面是一个示例,展示如何使用大语言模型将 JSON 数据转换为HTML 格式:

假设我们有一个 JSON 数据,包含餐厅员工的姓名和邮箱信息。现在我们需要将这个 JSON 转换为 HTML表格格式,以便在网页中展示。在这个案例中,我们就可以使用大语言模型,直接输入JSON 数据,并给出需要转换为 HTML 表格的要求。语言模型会自动解析 JSON 结构,并以 HTML 表格形式输出,完成格式转换的任务。

利用大语言模型强大的格式转换能力,我们可以快速实现各种结构化数据之间的相互转化,大大简化开发流程。掌握这一转换技巧将有助于读者更高效地处理结构化数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
data_json = {"resturant employees": 
[
{"name":"Shyam", "email":"shyamjaiswal@gmail.com"},
{"name":"Bob", "email":"bob32@gmail.com"},
{"name":"Jai", "email":"jai87@gmail.com"}
]}
prompt = f"""
将以下Python字典从JSON转换为HTML表格
​```{data_json}```
仅包含输出结果HTLM文件内容
不要包含一些无关文字
不要以markdown格式输出
直接输出HTML代码"""
response = chat_model.generate(prompt, stream=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table border="1" width="100%">
<tr>
<th>Name</th>
<th>Email</th>
</tr>
<tr>
<td>Shyam</td>
<td>shyamjaiswal@github.com</td>
</tr>
<tr>
<td>Bob</td>
<td>bob32@github.com</td>
</tr>
<tr>
<td>Jai</td>
<td>jai87@github.com</td>
</tr>
</table>
1
2
from IPython.display import display, Markdown, Latex, HTML, JSON
display(HTML(response))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<table border="1" width="100%">
<tr>
<th>Name</th>
<th>Email</th>
</tr>
<tr>
<td>Shyam</td>
<td>shyamjaiswal@github.com</td>
</tr>
<tr>
<td>Bob</td>
<td>bob32@github.com</td>
</tr>
<tr>
<td>Jai</td>
<td>jai87@github.com</td>
</tr>
</table>

拼写及语法纠正

在使用非母语撰写时,拼写和语法错误比较常见,进行校对尤为重要。例如在论坛发帖或撰写英语论文时,校对文本可以大大提高内容质量。

利用LLM进行自动校对可以极大地降低人工校对的工作量。下面是一个示例,展示如何使用大语言模型检查句子的拼写和语法错误。

假设我们有一系列英语句子,其中部分句子存在错误。我们可以遍历每个句子,要求语言模型进行检查,如果句子正确就输出“未发现错误”,如果有错误就输出修改后的正确版本。

通过这种方式,LLM可以快速自动校对大量文本内容,定位拼写和语法问题。这极大地减轻了人工校对的负担,同时也确保了文本质量。利用语言模型的校对功能来提高写作效率,是每一位非母语写作者都可以采用的有效方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
text = [
"The girl with the black and white puppies have a ball.",
"Yolanda has her notebook.",
"Its going to be a long day. Does the car need it's oil changed?",
"Their goes my freedom. There going to bring they’re suitcases.",
"Your going to need you're notebook.",
"That medicine effects my ability to sleep. Have you heard of the butterfly affect?",
"This phrase is to cherck chatGPT for spelling abilitty"
]
for i in range(len(text)):
time.sleep(20)
prompt = f"""请校对并更正以下文本,注意纠正文本保持原始语种,无需输出原始文本。
如果您没有发现任何错误,请说“未发现错误”。

例如:
输入:I are happy.
输出:I am happy.
```{text[i]}```"""
response = chat_model.generate(prompt)
print(i, response)
0 The girl with the black and white puppies has a ball.
1 Yolanda has her notebook. (无需更正)
2 Its going to be a long day. Does the car need its oil changed?
3 Their goes my freedom. There they're going to bring their suitcases.
4 ```
You're going to need your notebook.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    5 That medicine affects my ability to sleep. Have you heard of the butterfly effect?
6 This phrase is to check ChatGPT for spelling ability.


下面是一个使用大语言模型进行语法纠错的简单示例,类似于Grammarly(一个语法纠正和校对的工具)的功能。

输入一段关于熊猫玩偶的评价文字,语言模型会自动校对文本中的语法错误,输出修改后的正确版本。这里使用的Prompt比较简单直接,只要求进行语法纠正。我们也可以通过扩展Prompt,同时请求语言
模型调整文本的语气、行文风格等。


```python
text = f"""
Got this for my daughter for her birthday cuz she keeps taking \
mine from my room. Yes, adults also like pandas too. She takes \
it everywhere with her, and it's super soft and cute. One of the \
ears is a bit lower than the other, and I don't think that was \
designed to be asymmetrical. It's a bit small for what I paid for it \
though. I think there might be other options that are bigger for \
the same price. It arrived a day earlier than expected, so I got \
to play with it myself before I gave it to my daughter.
"""
prompt = f"校对并更正以下商品评论:```{text}```"
response = chat_model.generate(prompt, stream=True)
Got this panda plush for my daughter's birthday because she kept taking mine from my room. Yes, adults also love pandas! She takes it everywhere; it's incredibly soft and adorable. However, one ear appears slightly lower than the other, which wasn't intended to be asymmetrical. It's a bit smaller than I expected for its price; there may be larger alternatives at the same cost. Despite that, it arrived a day earlier than anticipated, allowing me a sneak peek before giving it to my daughter.
1
2
3
4
from redlines import Redlines
from IPython.display import display, Markdown
diff = Redlines(text,response)
display(Markdown(diff.output_markdown))

Got this panda plush for my daughter for her daughter’s birthday cuz because she keeps kept taking mine from my room. Yes, adults also like pandas too. love pandas! She takes it everywhere with her, and everywhere; it’s super incredibly soft and cute. One of the ears is a bit adorable. However, one ear appears slightly lower than the other, and I don’t think that was designed which wasn’t intended to be asymmetrical. It’s a bit small smaller than I expected for what I paid for it though. I think its price; there might may be other options that are bigger for larger alternatives at the same price. It cost. Despite that, it arrived a day earlier than expected, so I got to play with it myself anticipated, allowing me a sneak peek before I gave giving it to my daughter.

综合样例

语言模型具有强大的组合转换能力,可以通过一个Prompt同时实现多种转换,大幅简化工作流程。

下面是一个示例,展示了如何使用一个Prompt,同时对一段文本进行翻译、拼写纠正、语气调整和格式转换等操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
prompt = f"""
针对以下三个反引号之间的英文评论文本,
首先进行拼写及语法纠错,
然后将其转化成中文,
再将其转化成优质淘宝评论的风格,从各种角度出发,分别说明产品的优点与缺点,并进行总结。
润色一下描述,使评论更具有吸引力。
输出结果格式为:
【优点】xxx
【缺点】xxx
【总结】xxx
注意,只需填写xxx部分,并分段输出。
将结果输出成Markdown格式。
​```{text}```
"""
response = chat_model.generate(prompt, stream=True)
【优点】
这个熊猫玩偶非常柔软,摸起来很舒服,设计得十分可爱。我女儿非常喜欢,走到哪里都要带着它。

【缺点】
不过,我发现其中一个耳朵比另一个低一些,这可能是制作上的小瑕疵,并不是故意设计成不对称的。另外,对于它的价格来说,我觉得这款玩偶稍微有点小,可能有其他同价但更大的选择。

【总结】
总的来说,这是一个很不错的生日礼物选择,特别是如果你的孩子或者像我这样的大人喜欢熊猫的话。虽然有些小问题,但是提前送达的惊喜还是让我感到满意。如果能改进一下尺寸和细节,那就更完美了。
-------------本文结束感谢您的阅读-------------