🚀 在我们的新课程中掌握提示工程和构建 AI Agents!使用 PROMPTING20 享受 8 折优惠 ➜ 立即报名
程序辅助语言模型

PAL(程序辅助语言模型)

Gao 等人(2022) (在新标签页中打开)提出了一种方法,该方法使用 LLM 读取自然语言问题并生成程序作为中间推理步骤。这种方法被称为程序辅助语言模型(PAL),它与思维链提示不同之处在于,它不是使用自由格式文本来获取解决方案,而是将解决方案步骤卸载到程序运行时环境,例如 Python 解释器。

PAL

图片来源:Gao 等人(2022) (在新标签页中打开)

让我们来看一个使用 LangChain 和 OpenAI GPT-3 的例子。我们有兴趣开发一个简单的应用程序,它能够解释所提出的问题并通过利用 Python 解释器来提供答案。

具体来说,我们有兴趣创建一个功能,允许使用 LLM 来回答需要日期理解的问题。我们将为 LLM 提供一个提示,其中包含一些示例,这些示例摘自此处 (在新标签页中打开)

这些是我们需要的导入

import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv

首先配置一些设置

load_dotenv()
 
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
 
# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

设置模型实例

llm = OpenAI(model_name='text-davinci-003', temperature=0)

设置提示 + 问题

question = "Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born in MM/DD/YYYY?"
 
DATE_UNDERSTANDING_PROMPT = """
# Q: 2015 is coming in 36 hours. What is the date one week from today in MM/DD/YYYY?
# If 2015 is coming in 36 hours, then today is 36 hours before.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# One week from today,
one_week_from_today = today + relativedelta(weeks=1)
# The answer formatted with %m/%d/%Y is
one_week_from_today.strftime('%m/%d/%Y')
# Q: The first day of 2019 is a Tuesday, and today is the first Monday of 2019. What is the date today in MM/DD/YYYY?
# If the first day of 2019 is a Tuesday, and today is the first Monday of 2019, then today is 6 days later.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: The concert was scheduled to be on 06/01/1943, but was delayed by one day to today. What is the date 10 days ago in MM/DD/YYYY?
# If the concert was scheduled to be on 06/01/1943, but was delayed by one day to today, then today is one day later.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 days ago,
ten_days_ago = today - relativedelta(days=10)
# The answer formatted with %m/%d/%Y is
ten_days_ago.strftime('%m/%d/%Y')
# Q: It is 4/19/1969 today. What is the date 24 hours later in MM/DD/YYYY?
# It is 4/19/1969 today.
today = datetime(1969, 4, 19)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: Jane thought today is 3/11/2002, but today is in fact Mar 12, which is 1 day later. What is the date 24 hours later in MM/DD/YYYY?
# If Jane thought today is 3/11/2002, but today is in fact Mar 12, then today is 3/12/2002.
today = datetime(2002, 3, 12)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
later.strftime('%m/%d/%Y')
# Q: Jane was born on the last day of Feburary in 2001. Today is her 16-year-old birthday. What is the date yesterday in MM/DD/YYYY?
# If Jane was born on the last day of Feburary in 2001 and today is her 16-year-old birthday, then today is 16 years later.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Yesterday,
yesterday = today - relativedelta(days=1)
# The answer formatted with %m/%d/%Y is
yesterday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)

这将输出以下内容

# If today is 27 February 2023 and I was born exactly 25 years ago, then I was born 25 years before.
today = datetime(2023, 2, 27)
# I was born 25 years before,
born = today - relativedelta(years=25)
# The answer formatted with %m/%d/%Y is
born.strftime('%m/%d/%Y')

llm_out 的内容是一个 Python 代码片段。下面,使用 exec 命令执行此 Python 代码片段。

exec(llm_out)
print(born)

这将输出以下内容: 02/27/1998

🎓

在我们的新 AI 课程中了解更多关于高级提示方法的信息。立即加入!立即加入! (在新标签页中打开) 使用代码 PROMPTING20 可额外享受 8 折优惠。