Prompt 工程

news2025/3/13 23:42:25

一、提示原則

import openai
import os
import openai
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
def get_openai_key():
    _ = load_dotenv(find_dotenv())
    return os.environ['OPENAI_API_KEY']


client = OpenAI(
    api_key=get_openai_key(),  # This is the default and can be omitted
    base_url="https://api.proxyxai.com/v1"
)
# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-4o"):
    '''
    prompt: 对应的提示词
    model: 调用的模型,默认为 gpt-4o
    '''
    response = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": prompt,
            }
        ],
        model="gpt-4o",
    )
    # 调用 OpenAI 的 ChatCompletion 接口
    return response.choices[0].message.content

1.1 编写清晰、具体的指令

1.1.1 使用分隔符清晰地表示输入的不同部分

在编写 Prompt 时,我们可以使用各种标点符号作为“分隔符”,将不同的文本部分区分开来。

分隔符就像是 Prompt 中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用```,“”",< >, ,: 等做分隔符,只要能明确起到隔断作用即可。

使用分隔符尤其重要的是可以防止 提示词注入(Prompt Rejection)。什么是提示词注入?就是用户输入的文本可能包含与你的预设 Prompt 相冲突的内容,如果不加分隔,这些输入就可能“注入”并操纵语言模型,导致模型产生毫无关联的乱七八糟的输出。

from tool import get_completion
text = f"""
您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\
这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\
不要将写清晰的提示词与写简短的提示词混淆。\
在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。
"""
# 需要总结的文本内容
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ```来分隔指令和待总结的内容
response = get_completion(prompt)
print(response)

为了确保模型生成正确且相关的输出,您应该撰写清晰且具体的指示,而不应仅追求提示词的简短。

1.1.2 寻求结构化的输出

有时候我们需要语言模型给我们一些结构化的输出,而不仅仅是连续的文本。什么是结构化输出呢?就是按照某种格式组织的内容,例如JSON、HTML等。这种输出非常适合在代码中进一步解析和处理。例如,您可以在 Python 中将其读入字典或列表中。在以下示例中,我们要求 GPT 生成三本书的标题、作者和类别,并要求 GPT 以 JSON 的格式返回给我们,为便于解析,我们指定了 Json 的键。

from tool import get_completion

prompt = f"""
请生成斐波拉契数列的函数,分别用python2、python3、javascript语言编写\
并以 JSON 格式提供,其中包含以下键:language、code。
"""


if __name__ == '__main__':
    # 指令内容,使用 ```来分隔指令和待总结的内容
    response = get_completion(prompt)
    print(response)
以下是生成斐波那契数列的函数,用 Python 2、Python 3 和 JavaScript 编写,并以 JSON 格式提供:

```json
[
    {
        "language": "Python2",
        "code": "def fibonacci(n):\n    a, b = 0, 1\n    result = []\n    for _ in range(n):\n        result.append(a)\n        a, b = b, a + b\n    return result\n\n# Example usage:\nprint(fibonacci(10))"
    },
    {
        "language": "Python3",
        "code": "def fibonacci(n):\n    a, b = 0, 1\n    result = []\n    for _ in range(n):\n        result.append(a)\n        a, b = b, a + b\n    return result\n\n# Example usage:\nprint(fibonacci(10))"
    },
    {
        "language": "JavaScript",
        "code": "function fibonacci(n) {\n    let a = 0, b = 1;\n    const result = [];\n    for (let i = 0; i < n; i++) {\n        result.push(a);\n        [a, b] = [b, a + b];\n    }\n    return result;\n}\n\n// Example usage:\nconsole.log(fibonacci(10));"
    }
]

每个代码都定义了一个 fibonacci 函数,生成前 n 个斐波那契数。使用示例说明了如何调用函数并输出结果。

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

如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指 出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。

在如下示例中,我们将分别给模型两段文本,分别是制作茶的步骤以及一段没有明确步骤的文本。我们将要求模型判断其是否包含一系列指令,如果包含则按照给定格式重新编写指令,不包含则回答“未提供步骤”。

from tool import get_completion

# 满足条件的输入(text中提供了步骤)
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果您愿意,可以加一些糖或牛奶调味。\
就这样,您可以享受一杯美味的茶了。
"""
prompt1 = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""

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


if __name__ == '__main__':
    response = get_completion(prompt1)
    print("Text 1 的总结:")
    print(response)

    response = get_completion(prompt2)
    print("Text 2 的总结:")
    print(response)
Text 1 的总结:
第一步 - 把水烧开。

第二步 - 在等待期间,拿一个杯子并把茶包放进去。

第三步 - 一旦水足够热,就把它倒在茶包上。

第四步 - 等待一会儿,让茶叶浸泡。

第五步 - 几分钟后,取出茶包。

第六步 - 如果您愿意,可以加一些糖或牛奶调味。

第七步 - 享受一杯美味的茶。
Text 2 的总结:
未提供步骤。

現在我們有一個場景是在在工作流中寫腳本來實現一些複雜的邏輯,但是我们的用户都不是专门的开发人员,不懂实际的业务代码,这就需要让用户通过自然语言描述清楚他自身的需求,再通过LLM进一步澄清需求,再进一步通过LLM同澄清的需求生成对应的代码;

from tool import get_completion

# 从代码生成角度,先对用户的语言进行整理,按步骤整理和梳理
text_1 = f"""
首先,我有6个参数,<批次类型>,<猪场类型>,<P1断奶7天发情配种率>,<P2+断奶7天发情配种率>和<引种补充配种头数>,需要计算<本批次断奶7天配种头数>;
一开始我需要计算<本批次断奶7天配种头数>,它的计算方法是<引种补充配种头数>**0.5 + 1/2 * <引种补充配种头数>;
然后我需要判断<批次类型>是<存栏批次>还是<未来批次>,如果是存栏批次,那么<本批次断奶7天配种头数>=0;如果是<未来批次>,我需要进一步判断<猪场类型>;
如果<猪场类型>是<P1(一胎)场>,那么<本批次断奶7天配种头数>=<上个批次末存栏头数> * <P1断奶7天发情配种率>;
否则,那么<本批次断奶7天配种头数>=<上个批次末存栏头数> * <P2+断奶7天发情配种率>。
"""

prompt1 = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
输入参数 - ...
返回参数 - ...
第一步 - ...
第二步 - …
…
第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。"
\"\"\"{text_1}\"\"\"
"""



if __name__ == '__main__':
    response = get_completion(prompt1)
    print("Text 1 的总结:")
    print(response)

    prompt_code = f"""
        您将获得由三个引号括起来的文本,并根据这段文本作为需求,python3写一个函数来实现这个需求\
        并以 JSON 格式提供,其中包含以下键:language、code。
        \"\"\"{response}\"\"\"
        """

    response_code = get_completion(prompt_code)
    print("prompt_code 的代码:")
    print(response_code)
Text 1 的总结:
输入参数 - 批次类型, 猪场类型, P1断奶7天发情配种率, P2+断奶7天发情配种率, 引种补充配种头数, 上个批次末存栏头数  
返回参数 - 本批次断奶7天配种头数  
第一步 - 计算本批次断奶7天配种头数,方法为:引种补充配种头数**0.5 + 1/2 * 引种补充配种头数  
第二步 - 判断批次类型是否为存栏批次  
第三步 - 如果是存栏批次,则本批次断奶7天配种头数设为0  
第四步 - 如果是未来批次,判断猪场类型  
第五步 - 如果猪场类型是P1(一胎)场,则本批次断奶7天配种头数设为上个批次末存栏头数 * P1断奶7天发情配种率  
第六步 - 否则,本批次断奶7天配种头数设为上个批次末存栏头数 * P2+断奶7天发情配种率  
prompt_code 的代码:
```json
{
    "language": "python",
    "code": "def calculate_breeding_heads(batch_type, farm_type, p1_weaning_rate, p2_weaning_rate, breeding_supplement, previous_batch_stock):\n    # Step 1\n    current_batch_breeding_heads = breeding_supplement**0.5 + 0.5 * breeding_supplement\n    \n    # Step 2\n    if batch_type == '存栏批次':\n        # Step 3\n        current_batch_breeding_heads = 0\n    elif batch_type == '未来批次':\n        # Step 4\n        if farm_type == 'P1':\n            # Step 5\n            current_batch_breeding_heads = previous_batch_stock * p1_weaning_rate\n        else:\n            # Step 6\n            current_batch_breeding_heads = previous_batch_stock * p2_weaning_rate\n    \n    return current_batch_breeding_heads"
}

1.1.4 提供少量示例

“Few-shot” prompting,即在要求模型执行实际任务之前,给模型一两个已完成的样例,让模型了解我们的要求和期望的输出样式。

例如,在以下的样例中,我们先给了一个祖孙对话样例,然后要求模型用同样的隐喻风格回答关于“韧性”的问题。这就是一个少样本样例,它能帮助模型快速抓住我们要的语调和风格。

利用少样本样例,我们可以轻松“预热”语言模型,让它为新的任务做好准备。这是一个让模型快速上手新任务的有效策略。

from tool import get_completion

prompt = f"""
您的任务是以一致的风格回答问题。
<孩子>: 请教我何为耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以
一根孤独的线开始编织。
<孩子>: 请教我何为韧性。
"""



if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
<祖父母>: 韧性如同那迎风而立的竹子,虽被狂风压弯,却从不折断;如同那历经寒冬的松树,依然在春天到来时焕发新绿;如同那在岩石间顽强生长的小草,虽环境恶劣,却始终向阳而生。

1.2 给模型时间去思考

在设计 Prompt 时,给予语言模型充足的推理时间非常重要。语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。

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

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

1.2.1 指定完成任务所需的步骤

首先我们描述了杰克和吉尔的故事,并给出提示词执行以下操作:首先,用一句话概括三个反引号限定的文本。第二,将摘要翻译成英语。第三,在英语摘要中列出每个名称。第四,输出包含以下键的 JSON对象:英语摘要和人名个数。要求输出以换行符分隔。

from tool import get_completion

text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1-用一句话概括下面用三个反引号括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。
请用换行符分隔您的答案。
Text:
```{text}```
"""
if __name__ == '__main__':
    response = get_completion(prompt_1)
    print("prompt 1:")
    print(response)
prompt 1:
杰克和吉尔在去山顶井打水的途中摔倒受伤,但他们的冒险精神未减。

Jack and Jill fell and got injured while fetching water from a hilltop well, but their adventurous spirit remained undiminished.

Jack, Jill

{
  "english_summary": "Jack and Jill fell and got injured while fetching water from a hilltop well, but their adventurous spirit remained undiminished.",
  "num_names": 2
}

上述输出仍然存在一定问题,例如,键“姓名”会被替换为法语(译注:在英文原版中,要求从英语翻译到 法语,对应指令第三步的输出为 ‘Noms:’,为Name的法语,这种行为难以预测,并可能为导出带来困 难) 因此,我们将Prompt加以改进,该 Prompt 前半部分不变,同时确切指定了输出的格式

from tool import get_completion

text = f"""
在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
他们一边唱着欢乐的歌,一边往上爬,\
然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
虽然略有些摔伤,但他们还是回到了温馨的家中。\
尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
"""
# example 1
prompt_1 = f"""
执行以下操作:
1-用一句话概括下面用三个反引号括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个人名。
4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。
请用换行符分隔您的答案。
Text:
```{text}```
"""

prompt_2 = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。
请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>
Text: <{text}>
"""

if __name__ == '__main__':
    # response = get_completion(prompt_1)
    # print("prompt 1:")
    # print(response)

    response = get_completion(prompt_2)
    print("\nprompt 2:")
    print(response)
prompt 2:
摘要:杰克和吉尔在去山顶井打水时摔倒,但他们的冒险精神未减。

翻译:Jack and Jill fell while fetching water from a hilltop well, but their adventurous spirit remained undiminished.

名称:["Jack", "Jill"]

输出 JSON:{
  "English_summary": "Jack and Jill fell while fetching water from a hilltop well, but their adventurous spirit remained undiminished.",
  "num_names": 2
}

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

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

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

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

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

from tool import get_completion
prompt = f"""
判断学生的解决方案是否正确。
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
土地费用为 100美元/平方英尺
我可以以 250美元/平方英尺的价格购买太阳能电池板
我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
土地费用:100x
太阳能电池板费用:250x
维护费用:100,000美元+100x
总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""
if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
学生的解决方案是正确的。让我们逐步验证一下:

1. **土地费用**:每平方英尺100美元,因此土地费用为 \(100x\)2. **太阳能电池板费用**:每平方英尺250美元,因此太阳能电池板费用为 \(250x\)3. **维护费用**:固定费用为10万美元,加上每平方英尺10美元,因此维护费用为 \(100,000 + 10x\)。

将所有费用加在一起:

- 土地费用:\(100x\)
- 太阳能电池板费用:\(250x\)
- 维护费用:\(100,000 + 10x\)

总费用为:

\[ 100x + 250x + 100,000 + 10x = 360x + 100,000 \]

学生的解决方案中维护费用计算有误,正确的总费用应该是 \(360x + 100,000\) 而不是 \(450x + 100,000\)

但是注意,学生的解决方案实际上是错误的。(维护费用项100x应为10x,总费用450x应为360x)

我们可以通过指导模型先自行找出一个解法来解决这个问题。

在接下来这个 Prompt 中,我们要求模型先自行解决这个问题,再根据自己的解法与学生的解法进行对比,从而判断学生的解法是否正确。同时,我们给定了输出的格式要求。通过拆分任务、明确步骤,让模型有更多时间思考,有时可以获得更准确的结果。在这个例子中,学生的答案是错误的,但如果我们没有先让模型自己计算,那么可能会被误导以为学生是正确的。

from tool import get_completion
prompt = f"""
判断学生的解决方案是否正确。
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
土地费用为 100美元/平方英尺
我可以以 250美元/平方英尺的价格购买太阳能电池板
我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
土地费用:100x
太阳能电池板费用:250x
维护费用:100,000美元+100x
总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""

prompt2 = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:
步骤:
首先,自己解决问题。
然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,
并评估学生的解决方案是否正确。
在自己完成问题之前,请勿决定学生的解决方案是否正确。
使用以下格式:
问题:问题文本
学生的解决方案:学生的解决方案文本
实际解决方案和步骤:实际解决方案和步骤文本
学生计算的总费用:学生计算得到的总费用
实际计算的总费用:实际计算出的总费用
学生计算的费用和实际计算的费用是否相同:是或否
学生的解决方案和实际解决方案是否相同:是或否
学生的成绩:正确或不正确
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
- 土地费用为每平方英尺100美元
- 我可以以每平方英尺250美元的价格购买太阳能电池板
- 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
1. 土地费用:100x美元
2. 太阳能电池板费用:250x美元
3. 维护费用:100,000+100x=10万美元+10x美元
总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元
实际解决方案和步骤:
"""
if __name__ == '__main__':
    response = get_completion(prompt2)
    print(response)
实际解决方案和步骤:

1. **土地费用**:每平方英尺100美元。
   - 如果发电站的大小为 \( x \) 平方英尺,则土地费用为 \( 100x \) 美元。

2. **太阳能电池板费用**:每平方英尺250美元。
   - 如果发电站的大小为 \( x \) 平方英尺,则太阳能电池板费用为 \( 250x \) 美元。

3. **维护费用**:每年固定费用为10万美元,外加每平方英尺10美元。
   - 如果发电站的大小为 \( x \) 平方英尺,则维护费用为 \( 100,000 + 10x \) 美元。

4. **总费用**:将所有费用相加。
   - 总费用 = 土地费用 + 太阳能电池板费用 + 维护费用
   - 总费用 = \( 100x + 250x + 100,000 + 10x \)
   - 总费用 = \( 360x + 100,000 \) 美元

学生计算的总费用:450x + 100,000美元

实际计算的总费用:360x + 100,000美元

学生计算的费用和实际计算的费用是否相同:否

学生的解决方案和实际解决方案是否相同:否

学生的成绩:不正确

二、 局限性

开发大模型相关应用时请务必铭记:

虚假知识:模型偶尔会生成一些看似真实实则编造的知识。

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

from tool import get_completion

prompt = f"""
告诉我华为公司生产的GT Watch运动手表的相关信息
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
华为公司生产的GT Watch系列运动手表是其可穿戴设备产品线中的一部分,主要特点包括:

1. **设计与显示**:GT Watch系列通常采用圆形表盘设计,配备AMOLED高清显示屏,提供丰富的色彩和清晰的视觉体验。表盘材质多样,包括不锈钢、陶瓷等,表带也有多种材质和颜色可选。

2. **健康与运动监测**:该系列手表支持多种运动模式监测,如跑步、游泳、骑行等,并配备心率监测、睡眠跟踪、压力监测等健康功能。部分型号还支持血氧饱和度检测。

3. **电池续航**:华为GT Watch系列以长续航著称,通常可以在智能模式下使用一到两周,具体续航时间取决于使用情况和具体型号。

4. **智能功能**:手表支持消息通知、来电提醒、音乐控制等基本智能功能。部分型号还支持NFC支付、语音助手等。

5. **防水性能**:大多数GT Watch手表具备良好的防水性能,适合游泳等水上运动。

6. **兼容性**:华为GT Watch系列通常兼容Android和iOS设备,但在某些功能上可能对华为手机有更好的支持。

具体型号可能会有不同的功能和特性,建议在购买前查看最新的产品信息和用户评价。

语言模型生成虚假信息的“幻觉”问题,是使用与开发语言模型时需要高度关注的风险。由于幻觉信息往往令人无法辨别真伪,开发者必须警惕并尽量避免它的产生。

可以先让语言模型直接引用文本中的原句,然后再进行解答。这可以追踪信息来源,降低虚假内容的风险。综上,语言模型的幻觉问题事关应用的可靠性与安全性。开发者有必要认识到这一缺陷(注:截至2023年7月),并采取Prompt优化等措施予以缓解,以开发出更加可信赖的语言模型应用。这也将是未来语言模型进化的重要方向之一。

from tool import get_completion

prompt = f"""
首先你需要找到华为公司生产的GTS Watch的原始信息,然后告诉我运动手表的相关信息,
如果找不到原始信息,不能保证这个运动手表是否真实存在。
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
截至我所知的最新信息,华为公司确实生产了一系列智能手表,其中包括华为Watch GT系列。这些手表通常具有多种运动和健康监测功能,如心率监测、GPS定位、睡眠跟踪、以及多种运动模式(如跑步、游泳、骑行等)。

华为Watch GT系列的手表通常以长续航时间著称,可能会提供长达两周的电池续航能力,具体取决于使用情况和型号。它们通常配备AMOLED显示屏,并支持与智能手机的蓝牙连接,以接收通知和同步数据。

如果你在寻找特定型号的“GTS Watch”,这可能是一个误解或拼写错误,因为华为的产品线中并没有明确标识为“GTS”的手表。如果你有更多关于这款手表的具体信息或型号名称,我可以帮助你进一步查找。否则,建议查看华为的官方网站或官方发布的产品信息,以获取最新和最准确的产品详情。

三、提示词的迭代优化

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

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

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

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

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

3.1.1 初始化提示

from tool import get_completion

# 产品说明书文档
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泡沫
原产国
意大利
"""

# Prompt :基于说明书创建营销描述
prompt = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
技术说明: ```{fact_sheet_chair}```
"""
if __name__ == '__main__':

    response = get_completion(prompt)
    print(response)
体验中世纪风格与现代舒适的完美结合,这款意大利制造的办公椅是您理想的选择。作为美丽的中世纪风格办公家具系列的一部分,这款椅子不仅适用于家庭办公环境,也非常适合商业场所。

这款椅子提供多种个性化选项,满足您的独特需求。您可以选择不锈钢、哑光黑色、光泽白色或铬色的底座涂层,搭配多种外壳颜色,轻松融入任何室内设计风格。座椅装饰方面,您可以选择经典的塑料前后靠背装饰(SWC-100),或从10种面料和6种皮革中挑选,打造全面装饰(SWC-110)。

椅子的结构坚固耐用,采用五个轮子的塑料涂层铝底座,确保平稳移动。气动椅子调节功能让您可以轻松调整座椅高度,找到最舒适的坐姿。无论是软地板还是硬地板,您都可以选择合适的滚轮选项,确保最佳的使用体验。

这款椅子还提供两种座椅泡沫密度选择:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺),以及无扶手或8个位置PU扶手选项,进一步提升您的舒适度。

尺寸方面,这款椅子宽53厘米、深51厘米、高80厘米,座椅高度为44厘米,座椅深度为41厘米,完美契合人体工学设计。

选择这款意大利制造的中世纪风格办公椅,享受优雅设计与卓越舒适的完美结合。无论是工作还是休闲,这款椅子都将成为您空间中的亮点。

3.1.2 优化1:解决生成文本太长的问题

具体来说,第一版结果满足了从技术 说明转换为营销文案的要求,描写了中世纪风格办公椅的细节。但是过于冗长的文本不太适合电商场

景。这时我们就可以在 Prompt 中添加长度限制,要求生成更简洁的文案。 提取回答并根据空格拆分,中文答案为97个字,较好地完成了设计要求。

# 优化后的 Prompt,要求生成描述不多于 50 词
prompt2 = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
使用最多50个词。
技术规格:```{fact_sheet_chair}```
"""

if __name__ == '__main__':

    response = get_completion(prompt2)
    print(response)
这款中世纪风格办公椅,适合家庭和商业场所,提供多种颜色和材质选择。配有气动调节和五轮铝底座,确保舒适和灵活。可选扶手和滚轮,满足不同需求。意大利制造,品质卓越。

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

这是因为语言模型在计算和判断文本长度时依赖于分词器,而分词器在字符统计方面不具备完美精度。目前存在多种方法可以尝试控制语言模型生成输出的长度,比如指定语句数、词数、汉字数等。虽然语言模型对长度约束的遵循不是百分之百精确,但通过迭代测试可以找到最佳的长度提示表达式,使生成文本基本符合长度要求。这需要开发者对语言模型的长度判断机制有一定理解,并且愿意进行多次试验来确定最靠谱的长度设置方法。

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

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

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

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

# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt3 = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""


if __name__ == '__main__':

    response = get_completion(prompt3)
    print(response)
    print(len(response))
这款中世纪风格办公椅采用意大利制造,具有改性尼龙PA6/PA66涂层的铸铝五轮底座,提供卓越的稳定性。座椅采用HD36泡沫,提供中等或高密度选择。多种外壳颜色和底座涂层可选,适合家庭或商业使用。

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

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

# 优化后的 Prompt,说明面向对象,应具有什么性质且侧重于什么方面
prompt4 = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
使用最多50个单词。
技术规格: ```{fact_sheet_chair}```
"""


if __name__ == '__main__':

    response = get_completion(prompt4)
    print(response)
    print(len(response))
这款中世纪风格办公椅采用意大利制造,结合了美观与功能。其铸铝底座涂有改性尼龙PA6/PA66,确保耐用性。椅子配备气动调节功能,提供舒适的HD36泡沫座椅。多种外壳颜色和底座涂层可选,适合各种环境。产品ID:SWC-100。

通过上面的示例,我们可以看到 Prompt 迭代优化的一般过程。与训练机器学习模型类似,设计高效Prompt 也需要多个版本的试错调整。具体来说,第一版 Prompt 应该满足明确和给模型思考时间两个原则。在此基础上,一般的迭代流程是:首先尝试一个初版,分析结果,然后继续改进 Prompt,逐步逼近最优。许多成功的Prompt 都是通过这种多轮调整得出的。

后面我会展示一个更复杂的 Prompt 案例,让大家更深入地了解语言模型的强大能力。但在此之前,我想强调 Prompt 设计是一个循序渐进的过程。开发者需要做好多次尝试和错误的心理准备,通过不断调整和优化,才能找到最符合具体场景需求的 Prompt 形式。这需要智慧和毅力,但结果往往是值得的。

3.1.4 优化3:添加表格描述

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

# 要求它抽取信息并组织成表格,并指定表格的列、表名和格式
prompt5 = f"""
您的任务是帮助营销团队基于技术说明书创建一个产品的零售网站描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。
该描述面向家具零售商,因此应具有技术性质,并侧重于产品的材料构造。
在描述末尾,包括技术规格中每个7个字符的产品ID。
在描述之后,包括一个表格,提供产品的尺寸。表格应该有两列。第一列包括尺寸的名称。第二列只包括英寸的
测量值。
给表格命名为“产品尺寸”。
将所有内容格式化为可用于网站的HTML格式。将描述放在<div>元素中。
技术规格:```{fact_sheet_chair}```
"""


if __name__ == '__main__':

    response = get_completion(prompt5)
    print(response)
```html
<div>
    这款中世纪风格的办公椅是我们美丽的办公家具系列的一部分,专为家庭和商业场所设计。其结构坚固,采用五个轮子的塑料涂层铝底座,确保稳定性和耐用性。椅子的气动调节功能使得升降操作轻松便捷,适合各种高度需求。

    椅子的外壳底座滑动件由改性尼龙PA6/PA66涂层的铸铝制成,外壳厚度为10毫米,提供了卓越的强度和耐用性。座椅采用HD36泡沫,提供舒适的坐感,并有两种泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺),以满足不同的舒适度需求。

    此外,椅子提供多种个性化选项,包括软地板或硬地板滚轮,和无扶手或8个位置PU扶手。底座涂层有不锈钢、哑光黑色、光泽白色或铬可选,满足不同的装饰风格需求。椅子还可以选择带有塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。

    这款椅子符合合同使用资格,确保其在商业环境中的适用性。产品原产于意大利,保证了其高品质的工艺和材料。

    产品ID: SWC-110
</div>

<table>
    <caption>产品尺寸</caption>
    <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>
</table>

## 3.2 总结
本章重点讲解了在开发大语言模型应用时,采用迭代方式不断优化 Prompt 的过程。作为 Prompt 工程师,关键不是一开始就要求完美的 Prompt,而是掌握有效的 Prompt 开发流程。

具体来说,首先编写初版 Prompt,然后通过多轮调整逐步改进,直到生成了满意的结果。对于更复杂的应用,可以在多个样本上进行迭代训练,评估 Prompt 的平均表现。在应用较为成熟后,才需要采用在多个样本集上评估 Prompt 性能的方式来进行细致优化。因为这需要较高的计算资源。

总之,Prompt 工程师的核心是掌握 Prompt 的迭代开发和优化技巧,而非一开始就要求100%完美。通过不断调整试错,最终找到可靠适用的 Prompt 形式才是设计 Prompt 的正确方法。

# 四、文本概括
LLM 的强大能力在于它可以将复杂的文本信息简化,提炼出关键的观点,这对于他来说无疑是巨大的帮助。他不再需要花费大量的时间去阅读所有的文档,只需要用 LLM 将它们概括,就可以快速获取到他所需要的信息。LLM文本摘要功能的巨大优势:节省时间,提高效率,以及精准获取信息。这就是我们本章要介绍的内容,让我们一起来探索如何利用编程和调用API接口,掌握这个强大的工具。

## 4.1 单一文本概括
以商品评论的总结任务为例:对于电商平台来说,网站上往往存在着海量的商品评论,这些评论反映了所有客户的想法。如果我们拥有一个工具去概括这些海量、冗长的评论,便能够快速地浏览更多评论,洞悉客户的偏好,从而指导平台与商家提供更优质的服务。接下来我们提供一段在线商品评价作为示例,可能来自于一个在线购物平台,例如亚马逊、淘宝、京东等。评价者为一款熊猫公仔进行了点评,评价内容包括商品的质量、大小、价格和物流速度等因素,以及他的女儿对该商品的喜爱程度。

### 4.1.1 限制输出文本长度
```bash
from tool import get_completion

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

prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个字。
评论: ```{prod_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
熊猫公仔可爱柔软,女儿很喜欢,但价格略高于预期。快递提前到货。

4.1.2 设置关键角度侧重

在商品评论文本中,物流部门可能更专注于运输的时效性,商家则更关注价格和商品质量,而平台则更看重整体的用户体验。

我们可以通过增强输入提示(Prompt),来强调我们对某一特定视角的重视。

prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个字,并且侧重在快递服务上。
评论: ```{prod_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
快递提前一天到货,服务超出预期。

4.1.3 侧重于价格与质量

prompt = f"""
您的任务是从电子商务网站上生成一个产品评论的简短摘要。
请对三个反引号之间的评论文本进行概括,最多30个词汇,并且侧重在产品价格和质量上。
评论: ```{prod_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
熊猫公仔质量好且可爱,但价格偏高,尺寸较小。快递速度快,提前到货。

4.1.4 关键信息提取

虽然我们通过添加关键角度侧重的 Prompt ,确实让文本摘要更侧重于某一特定方面,然而,我们可以发现,在结果中也会保留一些其他信息,比如偏重价格与质量角度的概括中仍保留了“快递

提前到货”的信息。如果我们只想要提取某一角度的信息,并过滤掉其他所有信息,则可以要求 LLM 进行文本提取(Extract) 而非概括( Summarize )。

prompt = f"""
您的任务是从电子商务网站上的产品评论中提取相关信息。
请从以下三个反引号之间的评论文本中提取产品运输相关的信息,最多30个词汇。
评论: ```{prod_review}```
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
快递比预期提前了一天到货。

4.2 同时概括多条文本

在实际的工作流中,我们往往要处理大量的评论文本,下面的示例将多条用户评价集合在一个列表中,并利用 for 循环和文本概括(Summarize)提示词,将评价概括至小于 20 个词以下,并按顺序打印。

当然,在实际生产中,对于不同规模的评论文本,除了使用 for 循环以外,还可能需要考虑整合评论、分布式等方法提升运算效率。您可以搭建主控面板,来总结大量用户评论,以及方便您或他人快速浏览,还可以点击查看原评论。这样,您就能高效掌握顾客的所有想法。

from tool import get_completion

review_1 = """
这个熊猫公仔是我给女儿的生日礼物,她很喜欢,去哪都带着。
公仔很软,超级可爱,面部表情也很和善。但是相比于价钱来说,
它有点小,我感觉在别的地方用同样的价钱能买到更大的。
快递比预期提前了一天到货,所以在送给女儿之前,我自己玩了会。
"""
# 一盏落地灯的评论
review_2 = """
我需要一盏漂亮的卧室灯,这款灯不仅具备额外的储物功能,价格也并不算太高。
收货速度非常快,仅用了两天的时间就送到了。
不过,在运输过程中,灯的拉线出了问题,幸好,公司很乐意寄送了一根全新的灯线。
新的灯线也很快就送到手了,只用了几天的时间。
装配非常容易。然而,之后我发现有一个零件丢失了,于是我联系了客服,他们迅速地给我寄来了缺失的零件!
对我来说,这是一家非常关心客户和产品的优秀公司。
"""
# 一把电动牙刷的评论
review_3 = """
我的牙科卫生员推荐了电动牙刷,所以我就买了这款。
到目前为止,电池续航表现相当不错。
初次充电后,我在第一周一直将充电器插着,为的是对电池进行条件养护。
过去的3周里,我每天早晚都使用它刷牙,但电池依然维持着原来的充电状态。
不过,牙刷头太小了。我见过比这个牙刷头还大的婴儿牙刷。
我希望牙刷头更大一些,带有不同长度的刷毛,
这样可以更好地清洁牙齿间的空隙,但这款牙刷做不到。
总的来说,如果你能以50美元左右的价格购买到这款牙刷,那是一个不错的交易。
制造商的替换刷头相当昂贵,但你可以购买价格更为合理的通用刷头。
这款牙刷让我感觉就像每天都去了一次牙医,我的牙齿感觉非常干净!
"""
# 一台搅拌机的评论
review_4 = """
在11月份期间,这个17件套装还在季节性促销中,售价约为49美元,打了五折左右。
可是由于某种原因(我们可以称之为价格上涨),到了12月的第二周,所有的价格都上涨了,
同样的套装价格涨到了70-89美元不等。而11件套装的价格也从之前的29美元上涨了约10美元。
看起来还算不错,但是如果你仔细看底座,刀片锁定的部分看起来没有前几年版本的那么漂亮。
然而,我打算非常小心地使用它
(例如,我会先在搅拌机中研磨豆类、冰块、大米等坚硬的食物,然后再将它们研磨成所需的粒度,
接着切换到打蛋器刀片以获得更细的面粉,如果我需要制作更细腻/少果肉的食物)。
在制作冰沙时,我会将要使用的水果和蔬菜切成细小块并冷冻
(如果使用菠菜,我会先轻微煮熟菠菜,然后冷冻,直到使用时准备食用。
如果要制作冰糕,我会使用一个小到中号的食物加工器),这样你就可以避免添加过多的冰块。
大约一年后,电机开始发出奇怪的声音。我打电话给客户服务,但保修期已经过期了,
所以我只好购买了另一台。值得注意的是,这类产品的整体质量在过去几年里有所下降
,所以他们在一定程度上依靠品牌认知和消费者忠诚来维持销售。在大约两天内,我收到了新的搅拌机。
"""

if __name__ == '__main__':
    reviews = [review_1, review_2, review_3, review_4]
    for i in range(len(reviews)):
        prompt = f"""
        你的任务是从电子商务网站上的产品评论中提取相关信息。
        请对三个反引号之间的评论文本进行概括,最多20个词汇。 
        评论文本: ```{reviews[i]}```
        """
        response = get_completion(prompt)
        print(f"评论{i + 1}: ", response, "\n")
评论1:  熊猫公仔可爱柔软,女儿喜欢,但价格偏高,尺寸较小,快递提前到货。 

评论2:  这款灯具美观实用,配送迅速,客服服务优秀,解决问题及时。 

评论3:  电动牙刷电池续航好,刷头小但清洁效果佳,替换刷头昂贵,性价比高。 

评论4:  17件套装价格上涨,质量下降,电机问题,保修过期后需更换。品牌依赖消费者忠诚。

五、推断

LLM 的一个明显优点是,对于许多这样的任务,你只需要编写一个 Prompt,就可以开始生成结果,大大减轻了你的工作负担。这个发现像是找到了一把神奇的钥匙,让应用程序开发的速度加快了许多。最令你兴奋的是,你可以仅仅使用一个模型和一个 API 来执行许多不同的任务,无需再纠结如何训练和部署许多不同的模型。

5.1 情感推断

5.1.1 情感倾向分析

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

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

from tool import get_completion

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

prompt = f"""
以下用三个反引号分隔的产品评论的情感是什么?
评论文本: ```{lamp_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
这段评论的情感总体上是积极的。评论者对产品的功能、价格和公司客服的响应速度表示满意。尽管在运输过程中出现了一些问题,但公司迅速解决了这些问题,这让评论者对公司有很好的印象。

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

prompt = f"""
以下用三个反引号分隔的产品评论的情感是什么?
用一个单词回答:「正面」或「负面」。
评论文本: ```{lamp_review}```
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
正面

5.1.2 识别情感类型

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

# 中文
prompt = f"""
识别以下评论的作者表达的情感。包含不超过五个项目。将答案格式化为以逗号分隔的单词列表。
评论文本: ```{lamp_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
满意,感激,欣赏,积极,信任

5.1.3 识别愤怒

对于许多企业来说,洞察到顾客的愤怒情绪是至关重要的。这就引出了一个分类问题:下述的评论作者是否流露出了愤怒?因为如果有人真的情绪激动,那可能就意味着需要给予额外的关注,因为每一个愤怒的顾客都是一个改进服务的机会,也是一个提升公司口碑的机会。

# 中文
prompt = f"""
以下评论的作者是否表达了愤怒?评论用三个反引号分隔。给出是或否的答案。
评论文本: ```{lamp_review}```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)

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

5.2 信息提取

5.2.1 商品信息提取

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

购买的商品和商品的制造商。

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

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

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

prompt = f"""
从评论文本中识别以下项目:
- 评论者购买的物品
- 制造该物品的公司
评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。
如果信息不存在,请使用 “未知” 作为值。
让你的回应尽可能简短。
评论文本: ```{lamp_review}```
"""
if __name__ == '__main__':

    response = get_completion(prompt)
    print(response)
```json
{
    "物品": "卧室灯",
    "品牌": "Lumina"
}

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

```bash
# 中文
prompt = f"""
从评论文本中识别以下项目:
- 情绪(正面或负面)
这个例子中,我们指导 LLM 将“是否生气”的情况格式化为布尔值,并输出 JSON 格式。你可以尝试对格
式化模式进行各种变化,或者使用完全不同的评论来试验,看看 LLM 是否仍然可以准确地提取这些内
容。
三、主题推断
大型语言模型的另一个很酷的应用是推断主题。假设我们有一段长文本,我们如何判断这段文本的主旨
是什么?它涉及了哪些主题?让我们通过以下一段虚构的报纸报道来具体了解一下。
- 审稿人是否表达了愤怒?(是或否)
- 评论者购买的物品
- 制造该物品的公司
评论用三个反引号分隔。将你的响应格式化为 JSON 对象,以 “情感倾向”、“是否生气”、“物品类型” 和
“品牌” 作为键。
如果信息不存在,请使用 “未知” 作为值。
让你的回应尽可能简短。
将 “是否生气” 值格式化为布尔值。
评论文本: ```{lamp_review}```
"""

if __name__ == '__main__':

    response = get_completion(prompt)
    print(response)
```json
{
    "情感倾向": "正面",
    "是否生气": false,
    "物品类型": "卧室灯",
    "品牌": "Lumina"
}

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

### 5.3.1 <font style="color:rgb(51,51,51);">推断讨论主题</font>
有一篇关于政府员工对其工作单位感受的虚构报纸文章。我们可以要求大语言模型确定其中讨论的 五个主题,并用一两个词语概括每个主题。输出结果将会以逗号分隔的Python列表形式呈现。

```bash
from tool import get_completion
# 中文
story = """
在政府最近进行的一项调查中,要求公共部门的员工对他们所在部门的满意度进行评分。
调查结果显示,NASA 是最受欢迎的部门,满意度为 95%。
一位 NASA 员工 John Smith 对这一发现发表了评论,他表示:
“我对 NASA 排名第一并不感到惊讶。这是一个与了不起的人们和令人难以置信的机会共事的好地方。我为成
为这样一个创新组织的一员感到自豪。”
NASA 的管理团队也对这一结果表示欢迎,主管 Tom Johnson 表示:
“我们很高兴听到我们的员工对 NASA 的工作感到满意。
我们拥有一支才华横溢、忠诚敬业的团队,他们为实现我们的目标不懈努力,看到他们的辛勤工作得到回报是太
棒了。”
调查还显示,社会保障管理局的满意度最低,只有 45%的员工表示他们对工作满意。
政府承诺解决调查中员工提出的问题,并努力提高所有部门的工作满意度。
"""
# 中文
prompt = f"""
确定以下给定文本中讨论的五个主题。
每个主题用1-2个词概括。
请输出一个可解析的Python列表,每个元素是一个字符串,展示了一个主题。
给定文本: ```{story}```
"""


if __name__ == '__main__':

    response = get_completion(prompt)
    print(response)
```python
["员工满意度", "NASA", "调查结果", "社会保障管理局", "政府承诺"]

### 5.3.2 为特定主题制作新闻提醒
假设我们有一个新闻网站或类似的平台,这是我们感兴趣的主题:美国航空航天局、当地政府、工程、员工满意度、联邦政府等。我们想要分析一篇新闻文章,理解其包含了哪些主题。可以使用这样的Prompt:确定以下主题列表中的每个项目是否是以下文本中的主题。以 0 或 1 的形式给出答案列表。

```bash
# 中文
prompt = f"""
判断主题列表中的每一项是否是给定文本中的一个话题,
以列表的形式给出答案,每个元素是一个Json对象,键为对应主题,值为对应的 0 或 1。
主题列表:美国航空航天局、当地政府、工程、员工满意度、联邦政府
给定文本: ```{story}```
"""

if __name__ == '__main__':

    response = get_completion(prompt)
    print(response)
```json
[
    {"美国航空航天局": 1},
    {"当地政府": 0},
    {"工程": 0},
    {"员工满意度": 1},
    {"联邦政府": 1}
]

从输出结果来看,这个 story 与关于“美国航空航天局”、“员工满意度”、“联邦政府”、“当地政府”有关,而与“工程”无关。这种能力在机器学习领域被称为零样本(Zero-Shot)学习。这是因为我们并没有提供任何带标签的训练数据,仅凭 Prompt ,它便能判定哪些主题在新闻文章中被包含。

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

<font style="color:rgb(51,51,51);">在短短几分钟内,我们已经能够建立多个用于文本推理的系统,这是以前需要机器学习专家数天甚至数周时间才能完成的任务。这一变化无疑是令人兴奋的,因为无论你是经验丰富的机器学习开发者,还是刚入门的新手,都能利用输入 Prompt 快速开始复杂的自然语言处理任务。 </font>

# <font style="color:rgb(51,51,51);">六、文本转换</font>
大语言模型具有强大的文本转换能力,可以实现多语言翻译、拼写纠正、语法调整、格式转换等不同类型的文本转换任务。利用语言模型进行各类转换是它的典型应用之一。掌握调用大语言模型接口进行文本转换的技能,是开发各种语言类应用的重要一步。文本转换功能的应用场景也非常广泛。

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

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

### 6.1.1 翻译为西班牙语
```bash
from tool import get_completion
prompt = f"""
将以下中文翻译成西班牙语: \
```您好,我想订购一个搅拌机。```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
您好,我想订购一个搅拌机。的西班牙语翻译是:  
"Hola, me gustaría pedir una licuadora."

6.1.2 识别语种

from tool import get_completion
prompt = f"""
请告诉我以下文本是什么语种:
```Combien coûte le lampadaire?```
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
该文本是法语。

6.1.3 多语种翻译

from tool import get_completion
prompt = f"""
请将以下文本分别翻译成中文、英文、法语和西班牙语:
```I want to order a basketball.```
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
中文:我想订购一个篮球。

英文:I want to order a basketball.

法语:Je veux commander un ballon de basket.

西班牙语:Quiero pedir un balón de baloncesto.

6.1.4 同时进行语气转换

from tool import get_completion
prompt = f"""
请将以下文本翻译成中文,分别展示成正式与非正式两种语气:
```Would you like to order a pillow?```
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
正式语气: 您想要订购一个枕头吗?

非正式语气: 你想要买个枕头吗?

6.1.5 通用翻译器

一个智能的通用翻译工具。该翻译工具需要能够自动识别不同语言文本的语种,无需人工指定。然后它可以将这些不同语言的文本翻译成目标用户的母语。在这种方式下,全球各地的用户都可以轻松获得用自己母语书写的容。

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

from tool import get_completion 
import time 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 ] 
if __name__ == '__main__': 
        for issue in user_messages: 
            prompt = f"告诉我以下文本是什么语种,直接输出语种,如法语,无需输出标点符号:```{issue}```" 
            lang = get_completion(prompt) 
            print(f"原始消息 ({lang}): {issue}\n") 
            prompt = f""" 将以下消息分别翻译成英文和中文,并写成 中文翻译:xxx 英文翻译:yyy 的格式: ```{issue}```""" 
            response = get_completion(prompt) 
            print(response, "\n=========================================")

原始消息 (法语): La performance du système est plus lente que d'habitude.

中文翻译:系统性能比平时更慢。

英文翻译:The system's performance is slower than usual. 
=========================================
原始消息 (西班牙语): Mi monitor tiene píxeles que no se iluminan.

中文翻译:我的显示器有些像素不亮。

英文翻译:My monitor has pixels that do not light up. 
=========================================
原始消息 (意大利语): 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 
=========================================

6.2 语气与写作风格调整

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

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

from tool import get_completion
prompt = f"""
将以下文本翻译成商务信函的格式:
```小老弟,我小羊,上回你说咱部门要采购的显示器是多少寸来着?```
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
尊敬的[收件人姓名],

您好!

我是[您的姓名],关于上次您提到的我们部门计划采购的显示器尺寸问题,我想再次确认一下具体的尺寸要求。请您方便时告知,以便我们及时进行采购安排。

感谢您的配合!

祝好,

[您的姓名]  
[您的职位]  
[您的联系方式]  
[公司名称]

6.3 文件格式转换

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

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

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

from tool import get_completion
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}
"""


if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
要将给定的Python字典转换为HTML表格,可以按照以下步骤进行。我们将创建一个HTML表格,其中包含表格标题和列名。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Restaurant Employees</title>
    <style>
        table {
            width: 50%;
            border-collapse: collapse;
            margin: 20px 0;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>

    <h2>Restaurant Employees</h2>
    <table>
        <thead>
            <tr>
                <th>Name</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Shyam</td>
                <td>shyamjaiswal@gmail.com</td>
            </tr>
            <tr>
                <td>Bob</td>
                <td>bob32@gmail.com</td>
            </tr>
            <tr>
                <td>Jai</td>
                <td>jai87@gmail.com</td>
            </tr>
        </tbody>
    </table>

</body>
</html>

在这个HTML代码中,我们创建了一个表格,表格的标题是“Restaurant Employees”。表格包含两列:“Name”和“Email”。每个员工的信息都作为一个表格行显示在表格中。


## 6.4 <font style="color:rgb(51,51,51);">拼写及语法纠正</font>
利用大语言模型进行自动校对可以极大地降低人工校对的工作量。下面是一个示例,展示如何使用大语言模型检查句子的拼写和语法错误。

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

```python
from tool import get_completion
import time
text = [
"The girl with the black and white puppies have a ball.", # The girl has aball.
"Yolanda has her notebook.", # ok
"Its going to be a long day. Does the car need it’s oil changed?", # Homonyms
"Their goes my freedom. There going to bring they’re suitcases.", # Homonyms
"Your going to need you’re notebook.", # Homonyms
"That medicine effects my ability to sleep. Have you heard of the butterfly affect?", # Homonyms
"This phrase is to cherck chatGPT for spelling abilitty" # spelling
]




if __name__ == '__main__':
    for i in range(len(text)):
        time.sleep(20)
        prompt = f"""请校对并更正以下文本,注意纠正文本保持原始语种,无需输出原始文本。
        如果您没有发现任何错误,请说“未发现错误”。
        例如:
        输入:I are happy.
        输出:I am happy.
        ```{text[i]}```"""
        response = get_completion(prompt)
        print(i, response)
0 ```The girl with the black and white puppies has a ball.```
1 未发现错误。
2 ```
It's going to be a long day. Does the car need its oil changed?

3 There goes my freedom. They're going to bring their suitcases.
4 You're going to need your notebook.
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


## 6.5 <font style="color:rgb(51,51,51);">综合样例</font>
语言模型具有强大的组合转换能力,可以通过一个Prompt同时实现多种转换,大幅简化工作流程。

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

```python
from tool import get_completion
import time

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"""
针对以下三个反引号之间的英文评论文本,
首先进行拼写及语法纠错,
然后将其转化成中文,
再将其转化成优质淘宝评论的风格,从各种角度出发,分别说明产品的优点与缺点,并进行总结。
润色一下描述,使评论更具有吸引力。
输出结果格式为:
【优点】xxx
【缺点】xxx
【总结】xxx
注意,只需填写xxx部分,并分段输出。
将结果输出成Markdown格式。
```{text}```
"""



if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
首先进行拼写及语法纠错后的英文文本:

I got this for my daughter for her birthday because 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.

将其转化成中文:

我给我女儿买了这个作为她的生日礼物,因为她总是从我房间拿走我的。是的,成年人也喜欢熊猫。她到哪里都带着它,它超级柔软可爱。不过,有一只耳朵比另一只低一点,我觉得这不是故意设计成不对称的。考虑到我为它支付的价格,它有点小。我觉得可能有其他更大的选择,价格相同。它比预期提前一天到达,所以在送给我女儿之前,我自己也玩了一下。

将其转化成优质淘宝评论的风格:

```markdown
【优点】这款熊猫玩偶真是太可爱了!我女儿非常喜欢,几乎走到哪里都带着它。它的材质非常柔软,手感特别好,抱着特别舒服。而且,物流速度超快,比预期提前一天到达,给了我一个小惊喜。

【缺点】不过,这款玩偶有一点小瑕疵,就是一只耳朵比另一只低了一点,看起来有些不对称。此外,考虑到价格,我觉得它的尺寸稍微小了一些,可能有其他更大尺寸的选择,价格却相同。

【总结】总体来说,这款熊猫玩偶非常适合作为礼物,尤其是送给喜欢熊猫的小朋友。虽然有些小瑕疵和尺寸问题,但它的可爱和柔软程度完全可以弥补这些不足。对于追求完美的买家,可能需要多比较一下其他选项。

# 七、文本扩展
文本扩展是大语言模型的一个重要应用方向,它可以输入简短文本,生成更加丰富的长文。这为创作提供了强大支持,但也可能被滥用。因此开发者在使用时,必须谨记社会责任,避免生成有害内容。

在本章中,我们将学习基于 OpenAI API 实现一个客户邮件自动生成的示例,用于根据客户反馈优化客服邮件。这里还会介绍“温度“(temperature)这一超参数,它可以控制文本生成的多样性。

需要注意,扩展功能只应用来辅助人类创作,而非大规模自动生成内容。开发者应审慎使用,避免产生负面影响。只有以负责任和有益的方式应用语言模型,才能发挥其最大价值。相信践行社会责任的开发者可以利用语言模型的扩展功能,开发出真正造福人类的创新应用。

## 7.1 定制客户邮件
在这个客户邮件自动生成的示例中,我们将根据客户的评价和其中的情感倾向,使用大语言模型针对性地生成回复邮件。

具体来说,我们先输入客户的评论文本和对应的情感分析结果(正面或者负面)。然后构造一个 Prompt,要求大语言模型基于这些信息来生成一封定制的回复电子邮件。

下面先给出一个实例,包括一条客户评价和这个评价表达的情感。这为后续的语言模型生成回复邮件提供了关键输入信息。通过输入客户反馈的具体内容和情感态度,语言模型可以生成针对这个特定客户、考虑其具体情感因素的个性化回复。这种针对个体客户特点的邮件生成方式,将大大提升客户满意度。

```python
from tool import get_completion
# 我们可以在推理那章学习到如何对一个评论判断其情感倾向
sentiment = "消极的"
# 一个产品的评价
review = f"""
他们在11月份的季节性销售期间以约49美元的价格出售17件套装,折扣约为一半。\
但由于某些原因(可能是价格欺诈),到了12月第二周,同样的套装价格全都涨到了70美元到89美元不等。\
11件套装的价格也上涨了大约10美元左右。\
虽然外观看起来还可以,但基座上锁定刀片的部分看起来不如几年前的早期版本那么好。\
不过我打算非常温柔地使用它,例如,\
我会先在搅拌机中将像豆子、冰、米饭等硬物研磨,然后再制成所需的份量,\
切换到打蛋器制作更细的面粉,或者在制作冰沙时先使用交叉切割刀片,然后使用平面刀片制作更细/不粘的效
果。\
制作冰沙时,特别提示:\
将水果和蔬菜切碎并冷冻(如果使用菠菜,则轻轻煮软菠菜,然后冷冻直到使用;\
如果制作果酱,则使用小到中号的食品处理器),这样可以避免在制作冰沙时添加太多冰块。\
大约一年后,电机发出奇怪的噪音,我打电话给客服,但保修已经过期了,所以我不得不再买一个。\
总的来说,这些产品的总体质量已经下降,因此它们依靠品牌认可和消费者忠诚度来维持销售。\
货物在两天内到达。
"""

prompt = f"""
你是一位客户服务的AI助手。
你的任务是给一位重要客户发送邮件回复。
根据客户通过“```”分隔的评价,生成回复以感谢客户的评价。提醒模型使用评价中的具体细节
用简明而专业的语气写信。
作为“AI客户代理”签署电子邮件。
客户评论:
```{review}```
评论情感:{sentiment}
"""

if __name__ == '__main__':
    response = get_completion(prompt)
    print(response)
尊敬的客户,

感谢您抽出宝贵时间分享您的详细反馈。我们非常重视您的意见,并对您在使用我们的产品过程中遇到的问题深表歉意。

我们注意到您提到在11月份的季节性销售期间购买的17件套装价格在12月有所上涨。我们理解价格波动可能带来的不便,并将此问题反馈给相关部门以进行进一步调查。

关于您提到的产品质量问题,我们会将您的反馈传达给我们的产品开发团队,以便在未来的产品改进中加以考虑。我们也很抱歉得知您的设备在使用一年后出现了电机噪音的问题,并且由于保修期已过,您不得不再次购买。我们会努力改进我们的售后服务,以便更好地支持我们的客户。

感谢您分享制作冰沙的实用技巧,这对其他用户来说也是非常有帮助的建议。

再次感谢您的反馈和耐心。我们期待在未来能为您提供更好的产品和服务。

祝好,

AI客户代理

通过这个Prompt,我们将具体的客户评论内容和需要表达的客服助手语气与要生成的回复邮件链接起来。语言模型可以在充分理解客户反馈的基础上,自动撰写恰当的回复。

7.2 引入温度系数

大语言模型中的 “温度”(temperature) 参数可以控制生成文本的随机性和多样性。temperature 的值越大,语言模型输出的多样性越大;temperature 的值越小,输出越倾向高概率的文本。

举个例子,在某一上下文中,语言模型可能认为“比萨”是接下来最可能的词,其次是“寿司”和“塔可”。若temperature 为0,则每次都会生成“比萨”;而当 temperature 越接近 1 时,生成结果是“寿司”或“塔可”的可能性越大,使文本更加多样。

一般来说,如果需要可预测、可靠的输出,则将 temperature 设置为0,在所有课程中,我们一直设置温度为零;如果需要更具创造性的多样文本,那么适当提高 temperature 则很有帮助。调整这个参数可以灵活地控制语言模型的输出特性。在下面例子中,针对同一段来信,我们提醒语言模型使用用户来信中的详细信息,并设置一个较高的temperature ,运行两次,比较他们的结果有何差异。

from tool import get_completion
# 我们可以在推理那章学习到如何对一个评论判断其情感倾向
sentiment = "消极的"
# 一个产品的评价
review = f"""
他们在11月份的季节性销售期间以约49美元的价格出售17件套装,折扣约为一半。\
但由于某些原因(可能是价格欺诈),到了12月第二周,同样的套装价格全都涨到了70美元到89美元不等。\
11件套装的价格也上涨了大约10美元左右。\
虽然外观看起来还可以,但基座上锁定刀片的部分看起来不如几年前的早期版本那么好。\
不过我打算非常温柔地使用它,例如,\
我会先在搅拌机中将像豆子、冰、米饭等硬物研磨,然后再制成所需的份量,\
切换到打蛋器制作更细的面粉,或者在制作冰沙时先使用交叉切割刀片,然后使用平面刀片制作更细/不粘的效
果。\
制作冰沙时,特别提示:\
将水果和蔬菜切碎并冷冻(如果使用菠菜,则轻轻煮软菠菜,然后冷冻直到使用;\
如果制作果酱,则使用小到中号的食品处理器),这样可以避免在制作冰沙时添加太多冰块。\
大约一年后,电机发出奇怪的噪音,我打电话给客服,但保修已经过期了,所以我不得不再买一个。\
总的来说,这些产品的总体质量已经下降,因此它们依靠品牌认可和消费者忠诚度来维持销售。\
货物在两天内到达。
"""

prompt = f"""
你是一名客户服务的AI助手。
你的任务是给一位重要的客户发送邮件回复。
根据通过“```”分隔的客户电子邮件生成回复,以感谢客户的评价。
如果情感是积极的或中性的,感谢他们的评价。
如果情感是消极的,道歉并建议他们联系客户服务。
请确保使用评论中的具体细节。
以简明和专业的语气写信。
以“AI客户代理”的名义签署电子邮件。
客户评价:```{review}```
评论情感:{sentiment}
"""

if __name__ == '__main__':
    # 温度设置为0.7,比较两次生成的结果
    response = get_completion(prompt)
    print(response)

第一次

尊敬的客户,

非常感谢您与我们分享您的详细反馈。我们对您在使用我们的产品过程中遇到的问题深表歉意,特别是关于价格变动和产品质量的担忧。我们理解这样的经历可能会带来不便。

对于您提到的电机噪音问题,我们建议您直接联系客户服务团队,以便我们可以进一步协助您解决此问题并讨论可能的解决方案。

再次感谢您对我们的产品提出宝贵意见,我们将继续努力提升产品质量和客户体验。

此致,

AI客户代理

第二次

尊敬的客户,

感谢您抽出宝贵时间分享您的详细反馈。我们非常抱歉听到您对产品价格变动和质量的担忧。我们重视您的意见,并理解这些问题可能带来的不便。

关于您提到的季节性销售价格上涨问题,以及产品质量与早期版本的差异,我们会将您的反馈提交给相关团队,以便进一步审查和改进。对于您在使用中遇到的产品性能问题,我们也深感抱歉。

为了更好地协助您解决问题,我们建议您直接与我们的客户服务团队联系,他们将竭诚为您提供支持。感谢您对我们品牌的支持与理解。

再次感谢您的反馈,我们将努力改进以更好地服务您。

顺祝商祺,

AI客户代理

温度(temperature)参数可以控制语言模型生成文本的随机性。温度为0时,每次使用同样的Prompt,得到的结果总是一致的。而在上面的样例中,当温度设为0.7时,则每次执行都会生成不同的文本。

所以,这次的结果与之前得到的邮件就不太一样了。再次执行同样的 Prompt,邮件内容还会有变化。因此。我建议读者朋友们可以自己尝试不同的 temperature ,来观察输出的变化。总体来说,temperature 越高,语言模型的文本生成就越具有随机性。可以想象,高温度下,语言模型就像心绪更加活跃,但也可能更有创造力。

适当调节这个超参数,可以让语言模型的生成更富有多样性,也更能意外惊喜。希望这些经验可以帮助你在不同场景中找到最合适的温度设置。

八、聊天机器人

大型语言模型带给我们的激动人心的一种可能性是,我们可以通过它构建定制的聊天机器人(Chatbot),而且只需很少的工作量。在这一章节的探索中,我们将带你了解如何利用会话形式,与具有个性化特性(或专门为特定任务或行为设计)的聊天机器人进行深度对话。

8.1 给定身份

第一个方法已经陪伴了您一整个教程,即 get_completion ,其适用于单轮对话。我们将 Prompt 放入某种类似用户消息的对话框中。另一个称为 get_completion_from_messages ,传入一个消息列表。这些消息可以来自大量不同的角色 (roles) ,我们会描述一下这些角色。

第一条消息中,我们以系统身份发送系统消息 (system message) ,它提供了一个总体的指示。系统消息则有助于设置助手的行为和角色,并作为对话的高级指示。你可以想象它在助手的耳边低语,引导它的回应,而用户不会注意到系统消息。因此,作为用户,如果你曾经使用过 ChatGPT,您可能从来不知道ChatGPT 的系统消息是什么,这是有意为之的。系统消息的好处是为开发者提供了一种方法,在不让请求本身成为对话的一部分的情况下,引导助手并指导其回应。在 ChatGPT 网页界面中,您的消息称为用户消息,而 ChatGPT 的消息称为助手消息。但在构建聊天机器人时,在发送了系统消息之后,您的角色可以仅作为用户 (user) ;也可以在用户和助手 (assistant) 之间交替,从而提供对话上下文。

import openai
import os
import openai
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
def get_openai_key():
    _ = load_dotenv(find_dotenv())
    return os.environ['OPENAI_API_KEY']


client = OpenAI(
    api_key=get_openai_key(),  # This is the default and can be omitted
    base_url="https://api.proxyxai.com/v1"
)
# 一个封装 OpenAI 接口的函数,参数为 Prompt,返回对应结果
def get_completion(prompt, model="gpt-4o"):
    '''
    prompt: 对应的提示词
    model: 调用的模型,默认为 gpt-4o
    '''
    response = client.chat.completions.create(
        messages=[
            {
                "role": "user",
                "content": prompt,
            }
        ],
        model=model,
        temperature=0.7,
    )
    # 调用 OpenAI 的 ChatCompletion 接口
    return response.choices[0].message.content

def get_completion_from_messages(messages, model="gpt-4o", temperature=0):
    response = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature, # 控制模型输出的随机程度
            )
        # print(str(response.choices[0].message))
    return response.choices[0].message.content

8.1.1 讲笑话

我们通过系统消息来定义:“你是一个说话像莎士比亚的助手。”这是我们向助手描述它应该如何表现的方式。

然后,第一个用户消息:“给我讲个笑话。”

接下来以助手身份给出回复:“为什么鸡会过马路?”

最后发送用户消息是:“我不知道。”

from tool import get_completion_from_messages

# 中文
messages = [
{'role':'system', 'content':'你是一个像莎士比亚一样说话的助手。'},
{'role':'user', 'content':'给我讲个笑话'},
{'role':'assistant', 'content':'鸡为什么过马路'},
{'role':'user', 'content':'我不知道'} ]

if __name__ == '__main__':
    response = get_completion_from_messages(messages, temperature=1)
    print(response)
为了达到彼岸,寻求路那头之何事,似古诗中寻真理者,翻越障碍间。

8.1.2 友好的聊天机器人

让我们看另一个例子。系统消息来定义:“你是一个友好的聊天机器人”,第一个用户消息:“嗨,我叫Isa。”

我们想要得到第一个用户消息的回复。

from tool import get_completion_from_messages

# 中文
messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa。'} ]

if __name__ == '__main__':
    response = get_completion_from_messages(messages, temperature=1)
    print(response)
你好,Isa!很高兴认识你。你今天怎么样?有什么我可以帮你的吗?

8.2 构建上下文

让我们再试一个例子。系统消息来定义:“你是一个友好的聊天机器人”,第一个用户消息:“是的,你能提醒我我的名字是什么吗?”

from tool import get_completion_from_messages

messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'好,你能提醒我,我的名字是什么吗?'} ]


if __name__ == '__main__':
    response = get_completion_from_messages(messages, temperature=1)
    print(response)
抱歉,我无法知道或存储用户的个人信息,包括你的名字。不过,如果你愿意,可以告诉我你的名字,我会在我们的对话中使用它。

模型实际上并不知道我的名字。因此,每次与语言模型的交互都互相独立,这意味着我们必须提供所有相关的消息,以便模型在当前对话中进行引用。如果想让模型引用或 “记住” 对话的早期部分,则必须在模型的输入中提供早期的交流。我们将其称为上下文 (context) 。尝试以下示例。

from tool import get_completion_from_messages

messages = [
{'role':'system', 'content':'你是个友好的聊天机器人。'},
{'role':'user', 'content':'Hi, 我是Isa'},
{'role':'assistant', 'content': "Hi Isa! 很高兴认识你。今天有什么可以帮到你的吗?"},
{'role':'user', 'content':'是的,你可以提醒我, 我的名字是什么?'} ]



if __name__ == '__main__':
    response = get_completion_from_messages(messages, temperature=1)
    print(response)
当然可以!你的名字是Isa。有什么特别的事情要记住吗?

现在我们已经给模型提供了上下文,也就是之前的对话中提到的我的名字,然后我们会问同样的问题,也就是我的名字是什么。因为模型有了需要的全部上下文,所以它能够做出回应,就像我们在输入的消息列表中看到的一样。

8.3 订餐机器人

我们将探索如何构建一个 “点餐助手机器人”。这个机器人将被设计为自动收集用户信息,并接收来自比萨饼店的订单。让我们开始这个有趣的项目,深入理解它如何帮助简化日常的订餐流程。

8.3.1 构建机器人

下面这个函数将收集我们的用户消息,以便我们可以避免像刚才一样手动输入。这个函数将从我们下面构建的用户界面中收集 Prompt ,然后将其附加到一个名为上下文( context )的列表中,并在每次调用模型时使用该上下文。模型的响应也会添加到上下文中,所以用户消息和模型消息都被添加到上下文中,上下文逐渐变长。这样,模型就有了需要的信息来确定下一步要做什么。

import openai
import os
import openai
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
def get_openai_key():
    _ = load_dotenv(find_dotenv())
    return os.environ['OPENAI_API_KEY']


client = OpenAI(
    api_key=get_openai_key(),  # This is the default and can be omitted
    base_url="https://api.proxyxai.com/v1"
)


def get_completion_from_messages(messages, model="gpt-4o", temperature=0):
    response = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature, # 控制模型输出的随机程度
            )
        # print(str(response.choices[0].message))
    return response.choices[0].message.content


import panel as pn
pn.extension()


panels = []
context = [{'role':'system', 'content':"""
你是订餐机器人,为披萨餐厅自动收集订单信息。
你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。
最后需要询问是否自取或外送,如果是外送,你要询问地址。
最后告诉顾客订单总金额,并送上祝福。
请确保明确所有选项、附加项和尺寸,以便从菜单中识别出该项唯一的内容。
你的回应应该以简短、非常随意和友好的风格呈现。
菜单包括:
菜品:
意式辣香肠披萨(大、中、小) 12.95、10.00、7.00
运行如上代码可以得到一个点餐机器人,下图展示了一个点餐的完整流程:
芝士披萨(大、中、小) 10.95、9.25、6.50
茄子披萨(大、中、小) 11.95、9.75、6.75
薯条(大、小) 4.50、3.50
希腊沙拉 7.25
配料:
奶酪 2.00
蘑菇 1.50
香肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00
饮料:
可乐(大、中、小) 3.00、2.00、1.00
雪碧(大、中、小) 3.00、2.00、1.00
瓶装水 5.00
"""} ] #
inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
def collect_messages(_):
    prompt = inp.value_input
    inp.value = ''
    context.append({'role': 'user', 'content': f"{prompt}"})
    response = get_completion_from_messages(context)
    context.append({'role': 'assistant', 'content': f"{response}"})

    # 添加用户消息
    panels.append(
        pn.Row('User:', pn.pane.Markdown(prompt, width=600))
    )

    # 添加助手消息,并使用 HTML 标签设置背景颜色
    response_with_style = f'<div style="background-color: #F6F6F6; padding: 10px; width: 600px;">{response}</div>'
    panels.append(
        pn.Row('Assistant:', pn.pane.HTML(response_with_style))
    )

    return pn.Column(*panels)





button_conversation = pn.widgets.Button(name="Chat!")
interactive_conversation = pn.bind(collect_messages, button_conversation)
dashboard = pn.Column(
    inp,
    pn.Row(button_conversation),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard.servable()


# 在命令行中运行:conda activate your_env
# 进入项目根目录:
# 运行脚本:panel serve .\chapter8\example5.py --autoreload
# 打开浏览器:http://localhost:5006/example5
# 然后就可以开始你的订餐之旅了!

8.3.2 创建JSON摘要

此处我们另外要求模型创建一个 JSON 摘要,方便我们发送给订单系统。

因此我们需要在上下文的基础上追加另一个系统消息,作为另一条指示 (instruction) 。我们说创建一个

刚刚订单的 JSON 摘要,列出每个项目的价格,字段应包括:

  1. 披萨,包括尺寸

  2. 配料列表

  3. 饮料列表

  4. 辅菜列表,包括尺寸,

  5. 总价格。

此处也可以定义为用户消息,不一定是系统消息。

请注意,这里我们使用了一个较低的温度,因为对于这些类型的任务,我们希望输出相对可预测。

import openai
import os
import openai
import json
from dotenv import load_dotenv, find_dotenv
from openai import OpenAI
import re
def get_openai_key():
    _ = load_dotenv(find_dotenv())
    return os.environ['OPENAI_API_KEY']


client = OpenAI(
    api_key=get_openai_key(),  # This is the default and can be omitted
    base_url="https://api.proxyxai.com/v1"
)


def get_completion_from_messages(messages, model="gpt-4o", temperature=0):
    response = client.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature, # 控制模型输出的随机程度
            )
        # print(str(response.choices[0].message))
    return response.choices[0].message.content


import panel as pn
pn.extension()


panels = []
context = [{'role':'system', 'content':"""
你是订餐机器人,为披萨餐厅自动收集订单信息。
你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。
最后需要询问是否自取或外送,如果是外送,你要询问地址。
最后告诉顾客订单总金额,并送上祝福。
请确保明确所有选项、附加项和尺寸,以便从菜单中识别出该项唯一的内容。
你的回应应该以简短、非常随意和友好的风格呈现。
菜单包括:
菜品:
意式辣香肠披萨(大、中、小) 12.95、10.00、7.00
运行如上代码可以得到一个点餐机器人,下图展示了一个点餐的完整流程:
芝士披萨(大、中、小) 10.95、9.25、6.50
茄子披萨(大、中、小) 11.95、9.75、6.75
薯条(大、小) 4.50、3.50
希腊沙拉 7.25
配料:
奶酪 2.00
蘑菇 1.50
香肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00
饮料:
可乐(大、中、小) 3.00、2.00、1.00
雪碧(大、中、小) 3.00、2.00、1.00
瓶装水 5.00
"""} ] #
inp = pn.widgets.TextInput(value="Hi", placeholder='Enter text here…')
def collect_messages(_):
    prompt = inp.value_input
    inp.value = ''
    context.append({'role': 'user', 'content': f"{prompt}"})
    response = get_completion_from_messages(context)
    context.append({'role': 'assistant', 'content': f"{response}"})

    # 添加用户消息
    panels.append(
        pn.Row('User:', pn.pane.Markdown(prompt, width=600))
    )

    # 添加助手消息,并使用 HTML 标签设置背景颜色
    response_with_style = f'<div style="background-color: #F6F6F6; padding: 10px; width: 600px;">{response}</div>'
    panels.append(
        pn.Row('Assistant:', pn.pane.HTML(response_with_style))
    )

    return pn.Column(*panels)


def create_json_summary(_):
    """
    创建订单的 JSON 摘要,并打印出来。
    """
    messages = context.copy()
    messages.append(
        {'role': 'system', 'content':
            '''创建上一个食品订单的 json 摘要。\
   逐项列出每件商品的价格,字段应该是 1) 披萨,包括大小 2) 配料列表 3) 饮料列表,包括大小 4) 配菜列表包括大小 5) 总价
   你应该给我返回一个可解析的Json对象,包括上述字段'''},
    )

    response = get_completion_from_messages(messages, temperature=0)
    if response:
        try:
            # 正则表达式匹配 JSON 代码块
            match = re.search(r'```json\n(.*?)\n```', response, re.DOTALL)

            if not match:
                raise ValueError("未找到有效的 JSON 部分")

            # 提取 JSON 字符串
            json_string = match.group(1)

            order_summary = json.loads(json_string)
            print("\n=== 订单 JSON 摘要 ===")
            print(json.dumps(order_summary, indent=4, ensure_ascii=False))
            return order_summary
        except json.JSONDecodeError:
            print("无法解析 JSON 摘要。")
            return None
    else:
        print("未收到有效的 JSON 摘要。")
        return None




button_conversation = pn.widgets.Button(name="Chat!")
interactive_conversation = pn.bind(collect_messages, button_conversation)
button_summary = pn.widgets.Button(name="生成订单 JSON 摘要", button_type="success")
button_summary.on_click(create_json_summary)
dashboard = pn.Column(
    inp,
    pn.Row(button_conversation, button_summary),
    pn.panel(interactive_conversation, loading_indicator=True, height=300),
)
dashboard.servable()


# 在命令行中运行:conda activate your_env
# 进入项目根目录:
# 运行脚本:panel serve .\chapter8\example6.py --autoreload
# 打开浏览器:http://localhost:5006/example6
# 然后就可以开始你的订餐之旅了!

可以看到,我们在用户已经点完餐后,有一个按钮是生成订单JSON摘要信息,这个既可以作为用户点单之后的下单确认信息,从后台数据库获取相关信息并进行展示,然后后台实际去真正的进行下单。至此,我们构建了一个较为强大的点餐机器人,这个也是实际业务完成的一个范式,我们根据不同的业务场景来创建这么一个业务机器人,让用户通过自然语言处理来录入业务信息。

九、总结

总的来说,在第一部分中,我们学习并掌握了关于 Prompt 的两个核心原则:

编写清晰具体的指令;如果适当的话,给模型一些思考时间。

您还学习了迭代式 Prompt 开发的方法,并了解了如何找到适合您应用程序的 Prompt 的过程是非常关键的。

我们还讨论了大型语言模型的许多功能,包括摘要、推断、转换和扩展。您也学习了如何搭建个性化的聊天机器人。在第一部分中,您的收获应该颇丰,希望通过第一部分学习能为您带来愉悦的体验。

我们期待您能灵感迸发,尝试创建自己的应用。请大胆尝试,并分享给我们您的想法。您可以从一个微型项目开始,或许它具备一定的实用性,或者仅仅是一项有趣的创新。请利用您在第一个项目中得到的经验,去创造更优秀的下一项目,以此类推。如果您已经有一个宏大的项目设想,那么,请毫不犹豫地去实现它。

十、完整代码 - LLM Cookbook Learning

如果觉得有帮助的话,麻烦给个star

part1: prompt工程

part2: 基于ChatGPT 的问答系统(更新中)

part3: 使用 LangChain 开发应用程序(更新中)

part4: 使用 LangChain 访问个人数据(更新中)

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

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

相关文章

【学习笔记】《逆向工程核心原理》03.abex‘crackme-2、函数的调用约定、视频讲座-Tut.ReverseMe1

文章目录 abexcrackme-21. Visual Basic文件的特征1.1. VB专用引擎1.2. 本地代码与伪代码1.3. 事件处理程序1.4. 未文档化的结构体 2. 开始调试2.1. 间接调用2.2. RT_MainStruct结构体2.3. ThunRTMain()函数 3. 分析crackme3.1. 检索字符串3.2. 查找字符串地址3.3. 生成Serial的…

React基础之项目实战

规范的项目结构 安装scss npm install sass -D 安装Ant Design组件库 内置了一些常用的组件 npm install antd --save 路由基础配置 npm i react-router-dom 路由基本入口 import Layout from "../page/Layout"; import Login from "../page/Login"; impor…

SAP-ABAP:SAP数据库视图的创建图文详解

在SAP ABAP中&#xff0c;数据库视图&#xff08;Database View&#xff09;是通过ABAP字典&#xff08;ABAP Dictionary&#xff09;创建的。数据库视图是基于一个或多个数据库表的虚拟表&#xff0c;它允许你定义一种逻辑视图来访问数据。以下是创建数据库视图的步骤&#xf…

基于深度学习的肺炎X光影像自动诊断系统实现,真实操作案例分享,值得学习!

医疗影像智能化的技术演进 医学影像分析正经历从人工判读到AI辅助诊断的革命性转变。传统放射科医师分析胸部X光片需要8-12年专业训练&#xff0c;而基于深度学习的智能系统可在秒级完成检测。本文将以肺炎X光检测为切入点&#xff0c;详解从数据预处理到模型部署的全流程实现。…

Unity Shader学习总结

1.帧缓冲区和颜色缓冲区区别 用于存储每帧每个像素颜色信息的缓冲区 帧缓冲区包括&#xff1a;颜色缓冲区 深度缓冲区 模板缓冲区 自定义缓冲区 2.ImageEffectShader是什么 后处理用的shader模版 3.computerShader 独立于渲染管线之外&#xff0c;在显卡上运行&#xff0c;大量…

算法精讲 | 树(番外):平衡世界的四大守护者:AVL vs 红黑树 vs B树 vs B+树

&#x1f332; 算法精讲 | 树&#xff08;番外&#xff09;&#xff1a;平衡世界的四大守护者&#xff1a;AVL vs 红黑树 vs B树 vs B树 &#x1f4c5; 2025/03/12 || &#x1f31f; 推荐阅读时间 30分钟 &#x1f680; 开篇&#xff1a;数据结构界的四大天王 想象你是一名图书…

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…

在vs中无法用QtDesigner打开ui文件的解决方法

解决方法 右键ui文件&#xff0c;选择打开方式&#xff0c;弹出如下界面。 点击添加&#xff0c;弹出如下界面 点击程序后边的三个点&#xff0c;去电脑查找designer.exe,我的位置为D:\Qt\Qt5.9.9\5.9.9\msvc2015_64\bin\designer.exe。 名称可以自己起一个名字&#xff0c…

图像识别技术与应用-YOLO

1 YOLO-V1 YOLO-V1它是经典的one-stage方法&#xff0c;You Only Look Once&#xff0c;名字就已经说明了一切&#xff01;把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01;也可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; YOLO-V1诞生与2…

LLM推理和优化(1):基本概念介绍

一、LLM推理的核心过程&#xff1a;自回归生成 LLM&#xff08;如DeepSeek、ChatGPT、LLaMA系列等&#xff09;的推理本质是自回归生成&#xff1a;从初始输入&#xff08;如[CLS]或用户prompt&#xff09;开始&#xff0c;逐token预测下一个词&#xff0c;直到生成结束符&…

Kubernetes教程(七)了解集群、标签、Pod和Deployment

了解集群、标签、Pod和Deployment 一、K8s资源对象二、K8s集群1. Master2. Node 三、Namespace&#xff08;命名空间&#xff09;四、Label&#xff08;标签&#xff09;五、Pod1. 共享网络命名空间2. 共享数据 六、工作负载1. 设置副本数2. 应用升级 结语 Kubernetes的知识真的…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意&#xff1a;以下内容来自awesome-deepseek-integration DeepSeek 实用集成&#xff08;awesome-deepseek-integration&#xff09; 将…

Flutter_学习记录_video_player、chewie 播放视频

1. video_player 视频播放 插件地址&#xff1a;https://pub.dev/packages/video_player 添加插件 导入头文件 import package:video_player/video_player.dart;Android配置&#xff08;iOS不用配置&#xff09; 修改这个文件&#xff1a;/android/app/src/main/AndroidMani…

【MySQL】增删改查进阶

目录 一、数据库约束 约束类型 NULL约束&#xff1a;非空约束 UNIQUE&#xff1a;唯一约束 DEFAULT&#xff1a;默认值约束 PRIMARY KEY&#xff1a;主键约束 FOREIGN KEY&#xff1a;外键约束 二、表的设计 三、新增 四、查询 聚合查询 聚合函数 GROUP BY子句 HA…

静态时序分析:SDC约束命令set_ideal_latency详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 当使用set_ideal_network命令将当前设计中的一组端口或引脚标记为理想网络源后&#xff0c;理想属性会沿着组合逻辑进行传播&#xff0c;理想网络中的线网和单元…

达梦数据库查看字符集编码

select SF_GET_UNICODE_FLAG(); 返回 0 代表数据库字符集编码为 GB18030 1 代表数据库字符集编码为 UTF-8 2 代表数据库字符集编码为韩文字符集 EUC-KR

Pac-Man(吃豆人) 游戏

目录 前言 1. Pygame游戏开发基础 1.1 Pygame简介 1.2 游戏开发基本概念 1.3 Pygame核心模块介绍 2. 游戏设计与规划 2.1 游戏规则设计 2.2 游戏对象规划 2.3 技术方案选择 3. 创建游戏窗口与初始化 3.1 初始化Pygame环境 3.2 设置游戏窗口 3.3 定义颜色和游戏参数…

【Spring】@PostConstruct详解

在 Java 开发中&#xff0c;尤其是在基于 Spring 框架的项目里&#xff0c;我们常常会遇到需要在对象创建并完成依赖注入后&#xff0c;执行一些初始化操作的场景。PostConstruct注解正是为解决此类问题而诞生的&#xff0c;它为我们提供了一种便捷且优雅的方式来处理对象的初始…

OEM SQL Details and Session Details 5s 或者parallel 才会在sql monitor显示

从企业管理器 13.4 版本更新 10 (RU10) 开始&#xff0c;ASH Analytics 的 SQL 详细信息和会话详细信息深入屏幕已更新为使用 Oracle JET UI。 在 Ash Analytics 中&#xff0c;单击左下角区域中“热门 SQL”中的 SQL ID 即可深入了解 SQL 详细信息。 单击右下角“热门会话”区…

JSAR 基础 1.2.1 基础概念_空间小程序

JSAR 基础 1.2.1 基础概念_空间小程序 空间空间自由度可嵌入空间空间小程序 最新的技术进展表明&#xff0c;官网之前的文档准备废除了&#xff0c;基于xsml的开发将退出历史舞台&#xff0c;three.js和普通web结合的技术将成为主导。所以后续学习请移步three.js学习路径&#…