首页 > 其他分享 >《LLM入门教程》大模型教程笔记5:一、面向开发者的提示工程——2. 提示原则——原则二:给模型时间去思考(指定完成任务所需的步骤、指定大模型输出格式、指导模型在下结论之前找出一个自己的解法)

《LLM入门教程》大模型教程笔记5:一、面向开发者的提示工程——2. 提示原则——原则二:给模型时间去思考(指定完成任务所需的步骤、指定大模型输出格式、指导模型在下结论之前找出一个自己的解法)

时间:2024-12-27 10:26:51浏览次数:11  
标签:prompt get 提示 解决方案 模型 指定 总费用 print response

项目地址:llm-cookbook

教程在线阅读:面向开发者的LLM入门教程

openAI Python库版本:1.52.1

文章目录

第二章 提示原则

二、原则二 给模型时间去思考

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

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

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

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

复杂任务需求

接下来我们将通过给定一个复杂任务,给出完成该任务的一系列步骤,来展示这一策略的效果。

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

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

请用换行符分隔您的答案。

Text:
```{text}```
"""
response = get_completion(prompt_1)
print("prompt 1:")
print(response)
prompt 1 结果:
1-两个兄妹在山上打水时发生意外,但最终平安回家。
2-In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.
3-Jack, Jill
4-{"english_summary": "In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. While singing joyfully, they climbed up, but unfortunately, Jack tripped on a stone and rolled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back to their cozy home. Despite the mishap, their adventurous spirit remained undiminished as they continued to explore with delight.", "num_names": 2}
代码示例(基于原代码修改)
# -*- coding: utf-8 -*-

# test2.py

import os
from dotenv import load_dotenv, find_dotenv
import openai
import json


def get_openai_key():
    """
    自动查找 .env 文件并加载 OpenAI API 密钥。
    """
    load_dotenv(find_dotenv())
    return os.getenv('OPENAI_API_KEY')


def get_custom_openai_client():
    return openai.OpenAI(
        # 如果使用自定义 API 端点(如 https://xiaoai.plus/v1),取消下面一行的注释并设置你的 API 基础 URL
        base_url='https://xiaoai.plus/v1',
        api_key=get_openai_key()
    )


def get_completion(prompt):
    """
    调用 OpenAI API 获取完成内容。

    参数:
        prompt (str): 要发送给模型的提示内容。

    返回:
        str: 模型生成的回复内容。
    """
    try:
        client = get_custom_openai_client()
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # 根据需要选择合适的模型
            messages=[
                {"role": "user", "content": prompt}
            ]
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        print("获取完成内容失败,错误信息:", e)
        return None


if __name__ == "__main__":

    # 定义要处理的文本
    text = f"""
    在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
    他们一边唱着欢乐的歌,一边往上爬,\
    然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
    虽然略有些摔伤,但他们还是回到了温馨的家中。\
    尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
    """

    # 构建新的提示
    prompt_1 = f"""
    执行以下操作:
    1-用一句话概括下面用三个反引号括起来的文本。
    2-将摘要翻译成英语。
    3-在英语摘要中列出每个人名。
    4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。

    请用换行符分隔您的答案。

    Text:
    ```{text}```
    """

    # 使用 get_completion 函数生成结果
    response = get_completion(prompt_1)
    print("prompt 1:")
    print(response)

    if response:
        try:
            # 尝试将响应解析为 JSON 格式
            result = json.loads(response)
            print("\n解析后的 JSON 对象:")
            print(json.dumps(result, ensure_ascii=False, indent=4))
        except json.JSONDecodeError:
            # 如果响应不是有效的 JSON,则直接打印原始响应
            print("\n响应内容不是有效的 JSON 格式:")
            # print(response)

在这里插入图片描述

存在问题

上述输出仍然存在一定问题,例如,键“姓名”会被替换为法语(译注:在英文原版中,要求从英语翻译到法语,对应指令第三步的输出为 ‘Noms:’,为Name的法语,这种行为难以预测,并可能为导出带来困难)

改进prompt(进一步告知大模型需要的输出格式)

因此,我们将Prompt加以改进,该 Prompt 前半部分不变,同时确切指定了输出的格式

代码示例(原)
prompt_2 = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。

请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>

Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nprompt 2:")
print(response)
prompt 2 结果:
Summary: 在一个迷人的村庄里,兄妹杰克和吉尔在山顶井里打水时发生了意外,但他们的冒险精神依然没有减弱,继续充满愉悦地探索。

Translation: In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.

Names: Jack, Jill

JSON Output: {"English_summary": "In a charming village, siblings Jack and Jill set off to fetch water from a well on top of a hill. Unfortunately, Jack tripped on a rock and tumbled down the hill, with Jill following closely behind. Despite some minor injuries, they made it back home safely. Despite the mishap, their adventurous spirit remained strong as they continued to explore joyfully.", "num_names": 2}
代码示例(基于原代码修改)
# -*- coding: utf-8 -*-

# test2.py

import os
from dotenv import load_dotenv, find_dotenv
import openai
import json


def get_openai_key():
    """
    自动查找 .env 文件并加载 OpenAI API 密钥。
    """
    load_dotenv(find_dotenv())
    return os.getenv('OPENAI_API_KEY')


def get_custom_openai_client():
    return openai.OpenAI(
        # 如果使用自定义 API 端点(如 https://xiaoai.plus/v1),取消下面一行的注释并设置你的 API 基础 URL
        base_url='https://xiaoai.plus/v1',
        api_key=get_openai_key()
    )


def get_completion(prompt):
    """
    调用 OpenAI API 获取完成内容。

    参数:
        prompt (str): 要发送给模型的提示内容。

    返回:
        str: 模型生成的回复内容。
    """
    try:
        client = get_custom_openai_client()
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # 根据需要选择合适的模型
            # model="o1-mini",  # 根据需要选择合适的模型
            messages=[
                {"role": "user", "content": prompt}
            ]
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        print("获取完成内容失败,错误信息:", e)
        return None


if __name__ == "__main__":

    # 定义要处理的文本
    text = f"""
    在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\
    他们一边唱着欢乐的歌,一边往上爬,\
    然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\
    虽然略有些摔伤,但他们还是回到了温馨的家中。\
    尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。
    """

    # 构建新的提示
    prompt_2 = f"""
    1-用一句话概括下面用<>括起来的文本。
    2-将摘要翻译成英语。
    3-在英语摘要中列出每个名称。
    4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。

    请使用以下格式:
    文本:<要总结的文本>
    摘要:<摘要>
    翻译:<摘要的翻译>
    名称:<英语摘要中的名称列表>
    输出 JSON:<带有 English_summary 和 num_names 的 JSON>

    Text: <{text}>
    """

    # 使用 get_completion 函数生成结果
    response = get_completion(prompt_2)
    print("prompt 1:")
    print(response)

    if response:
        try:
            # 尝试将响应解析为 JSON 格式
            result = json.loads(response)
            print("\n解析后的 JSON 对象:")
            print(json.dumps(result, ensure_ascii=False, indent=4))
        except json.JSONDecodeError:
            # 如果响应不是有效的 JSON,则直接打印原始响应
            print("\n响应内容不是有效的 JSON 格式:")
            # print(response)

在这里插入图片描述

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

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

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

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

代码示例(原)

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

prompt = f"""
判断学生的解决方案是否正确。

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

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

学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:

    土地费用:100x
    太阳能电池板费用:250x
    维护费用:100,000美元+100x
    总费用:100x+250x+100,000美元+100x=450x+100,000美元
"""
response = get_completion(prompt)
print(response)

学生的解决方案是正确的。他正确地计算了土地费用、太阳能电池板费用和维护费用,并将它们相加得到了总费用。

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

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

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

prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

步骤:

    首先,自己解决问题。
    然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。
    在自己完成问题之前,请勿决定学生的解决方案是否正确。

使用以下格式:

    问题:问题文本
    学生的解决方案:学生的解决方案文本
    实际解决方案和步骤:实际解决方案和步骤文本
    学生计算的总费用:学生计算得到的总费用
    实际计算的总费用:实际计算出的总费用
    学生计算的费用和实际计算的费用是否相同:是或否
    学生的解决方案和实际解决方案是否相同:是或否
    学生的成绩:正确或不正确

问题:

    我正在建造一个太阳能发电站,需要帮助计算财务。 
    - 土地费用为每平方英尺100美元
    - 我可以以每平方英尺250美元的价格购买太阳能电池板
    - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;

    作为平方英尺数的函数,首年运营的总费用是多少。

学生的解决方案:

    设x为发电站的大小,单位为平方英尺。
    费用:
    1. 土地费用:100x美元
    2. 太阳能电池板费用:250x美元
    3. 维护费用:100,000+100x=10万美元+10x美元
    总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元

实际解决方案和步骤:
"""
response = get_completion(prompt)
print(response)

运行结果:

实际解决方案和步骤:

    1. 土地费用:每平方英尺100美元,所以总费用为100x美元。
    2. 太阳能电池板费用:每平方英尺250美元,所以总费用为250x美元。
    3. 维护费用:固定费用为10万美元,额外费用为每平方英尺10美元,所以总费用为10万美元+10x美元。
    4. 总费用:将上述三项费用相加,得到总费用为100x美元+250x美元+10万美元+10x美元=360x+10万美元。

学生计算的总费用:450x+10万美元
实际计算的总费用:360x+10万美元
学生计算的费用和实际计算的费用是否相同:否
学生的解决方案和实际解决方案是否相同:否
学生的成绩:不正确
代码示例(基于原代码修改)
# -*- coding: utf-8 -*-

# test2.py

import os
from dotenv import load_dotenv, find_dotenv
import openai
import json


def get_openai_key():
    """
    自动查找 .env 文件并加载 OpenAI API 密钥。
    """
    load_dotenv(find_dotenv())
    return os.getenv('OPENAI_API_KEY')


def get_custom_openai_client():
    return openai.OpenAI(
        # 如果使用自定义 API 端点(如 https://xiaoai.plus/v1),取消下面一行的注释并设置你的 API 基础 URL
        base_url='https://xiaoai.plus/v1',
        api_key=get_openai_key()
    )


def get_completion(prompt):
    """
    调用 OpenAI API 获取完成内容。

    参数:
        prompt (str): 要发送给模型的提示内容。

    返回:
        str: 模型生成的回复内容。
    """
    try:
        client = get_custom_openai_client()
        response = client.chat.completions.create(
            model="gpt-4o-mini",  # 根据需要选择合适的模型
            # model="o1-mini",  # 根据需要选择合适的模型
            messages=[
                {"role": "user", "content": prompt}
            ]
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        print("获取完成内容失败,错误信息:", e)
        return None


if __name__ == "__main__":

    # 构建新的提示
    prompt = f"""
    请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:

    步骤:

        首先,自己解决问题。
        然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。
        在自己完成问题之前,请勿决定学生的解决方案是否正确。

    使用以下格式:

        问题:问题文本
        学生的解决方案:学生的解决方案文本
        实际解决方案和步骤:实际解决方案和步骤文本
        学生计算的总费用:学生计算得到的总费用
        实际计算的总费用:实际计算出的总费用
        学生计算的费用和实际计算的费用是否相同:是或否
        学生的解决方案和实际解决方案是否相同:是或否
        学生的成绩:正确或不正确

    问题:

        我正在建造一个太阳能发电站,需要帮助计算财务。 
        - 土地费用为每平方英尺100美元
        - 我可以以每平方英尺250美元的价格购买太阳能电池板
        - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;

        作为平方英尺数的函数,首年运营的总费用是多少。

    学生的解决方案:

        设x为发电站的大小,单位为平方英尺。
        费用:
        1. 土地费用:100x美元
        2. 太阳能电池板费用:250x美元
        3. 维护费用:100,000+100x=10万美元+10x美元
        总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元

    实际解决方案和步骤:
    """

    # 使用 get_completion 函数生成结果
    response = get_completion(prompt)
    print("prompt 1:")
    print(response)

    if response:
        try:
            # 尝试将响应解析为 JSON 格式
            result = json.loads(response)
            print("\n解析后的 JSON 对象:")
            print(json.dumps(result, ensure_ascii=False, indent=4))
        except json.JSONDecodeError:
            # 如果响应不是有效的 JSON,则直接打印原始响应
            print("\n响应内容不是有效的 JSON 格式:")
            # print(response)

在这里插入图片描述

标签:prompt,get,提示,解决方案,模型,指定,总费用,print,response
From: https://blog.csdn.net/Dontla/article/details/144719926

相关文章

  • Qt 模型Model/视图View/代理Delegate
    一、模型/视图/代理架构简介1、应用程序中往往要存储大量的数据,并对它们进行处理,然后可以通过各种形式显示给用户,用户需要时还可以对数据进行编辑。2、Qt中的模型/视图架构就是用来实现大量数据的存储、处理及其显示的。3、MVC设计模式:(1)、模型(Model)是应用对象,用......
  • 玩《英雄联盟》提示d3dx9_43.dll缺失是什么原因?玩游戏提示d3dx9_43.dll缺失怎么解决?
    一、d3dx9_43.dll缺失的根源d3dx9_43.dll是DirectX9.0c的一个组件,它负责处理游戏中的图形渲染、音效等多媒体功能。当《英雄联盟》提示d3dx9_43.dll缺失时,通常意味着以下几种可能:DirectX版本不兼容:游戏所需的DirectX版本与系统安装的版本不匹配,导致d3dx9_43.dll文件无法被......
  • 使用纯css3画一个火箭的模型
    要使用纯CSS3来绘制一个火箭的模型,你可以利用CSS的伪元素(:before和:after),边框(border),线性渐变(linear-gradient),以及转换(transform)等属性。以下是一个简单的火箭模型的示例:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport&......
  • 创建用于预测序列的人工智能模型,调整模型的超参数。
    上一篇:《创建用于预测序列的人工智能模型(四),评估模型的能力》序言:人工智能模型的研发过程实际上是一个多阶段的迭代过程,包括数据准备、模型架构设计、训练和验证,而超参数的调整和优化则始终贯穿其中,是提升模型性能的重要环节。调整学习率在前面的例子中,你可能还记得,我们使用了......
  • 【AI音效】原神ai声音及模型、米哈游ai声音及模型、崩铁ai声音模型
    想要自己直接实现AI声音,一键生成萝莉,变成原神角色声音,各类米哈游的ai声音么今天分享给大家的这个开源工具就是集成了200种 原神 模型 米哈游模型 崩铁 角色 的ai声音模型工具首先需要下载我们的这个一键安装包当然安装包分为两个,一个是包含了 声音大模型和另一个不......
  • 模型 八角行为分析法(行为激发)
    系列文章分享 模型,了解更多......
  • Suno AI使用订阅升级会员全攻略:从入门到精通,玩转多风格提示词!
    在人工智能的浪潮中,SunoAI以其强大的音乐生成能力,成为音乐爱好者和创作者的得力助手。无论你是新手小白,还是资深音乐人,都能在Suno的世界中找到属于自己的创作乐趣。一、Suno简介Suno是一款基于AI的音乐生成工具,支持多种音乐风格和语言的创作。通过输入提示词(Prompt),你可以快......
  • 光伏功率预测!Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预
    目录预测效果基本介绍程序设计参考资料预测效果基本介绍光伏功率预测!Transformer-BiLSTM、Transformer、CNN-BiLSTM、BiLSTM、CNN五模型时序预测(Matlab2023b多输入单输出)1.程序已经调试好,替换数据集后,仅运行一个main即可运行,数据格式为excel!!!2......
  • 实操了4个 AI 大模型项目落地,我又行了!
    根据《2024年全球人工智能行业报告》最新的数据显示,全球AI市场预计将以每年超过40%的速度增长,到2030年市值将达到数万亿美元,这也是预示着在接下来的十年到十五年里,人工智能将获得巨大的发展红利。在过去的一年多时间里,我持续关注着大模型的发展趋势,并且尽可能地进行......
  • 【岗位招聘】人工智能大模型高级专家
    参考:中石化岗位职责负责人工智能领域前瞻性研究与技术应用落地。参与集团公司人工智能技术架构设计和优化。负责人工智能关键技术难点和问题攻关并制定解决方案。负责组织人工智能技术交流与对外合作,培养人工智能技术与业务结合的复合型人才。应聘要求全日制本科及以上......