特定任务的提示
概述
本教程探讨了自然语言处理中特定任务的提示的创建和使用。我们将重点关注四个关键领域:文本摘要、问答、代码生成和创意写作。使用 OpenAI 的 GPT 模型和 LangChain 库,我们将演示如何为每项任务制作有效的提示。主题
随着语言模型变得越来越先进,设计特定于任务的提示的能力变得越来越有价值。精心设计的提示可以显著提高人工智能模型在各种应用中的性能,从总结长文档到生成代码和培养写作创造力。本教程旨在为这些不同任务的提示工程提供实用见解。内容概要
- 文本摘要提示:压缩长文本同时保留关键信息的技术。
- 问答提示:从给定上下文中提取特定信息的策略。
- 代码生成提示:引导AI模型生成准确、实用的代码的方法。
- 创意写作提示:激发想象力和吸引力的书面内容的方法。
教程
本教程通过 LangChain 库使用 OpenAI GPT-4 模型。对于每种任务类型,我们将遵循以下步骤:- 设计一个针对特定任务的提示模板。
- 使用 LangChain 的 PromptTemplate 实现提示。
- 使用示例输入执行提示。
- 分析输出并讨论潜在的改进或变化。
我们将探讨不同的提示结构和措辞如何影响每种任务类型的模型输出。本教程还将涉及每种情况下提示设计的最佳实践。
结论
在本教程结束时,您将对如何为文本摘要、问答、代码生成和创意写作任务创建有效的提示有深入的理解。您将获得可以应用于自己项目的实用示例和见解,从而增强您利用 AI 语言模型进行各种应用的能力。请记住,提示工程既是一门艺术,也是一门科学 - 实验和迭代是找到最符合您特定需求的有效提示的关键。设置
首先,让我们导入必要的库并设置我们的环境。import os
from langchain_openai import ChatOpenAI
from langchain.prompts import PromptTemplate
from dotenv import load_dotenv
load_dotenv()
# Set up OpenAI API key
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')
# Initialize the language model
llm = ChatOpenAI(model="gpt-4o-mini")
1. 文本摘要提示
让我们从创建文本摘要提示开始。我们将设计一个模板,要求模型用指定数量的句子总结给定的文本。# 创建文本摘要的提示模板
summarization_template = PromptTemplate(
input_variables=["text", "num_sentences"],
template="用{num_sentences}个句子总结以下文本:\n\n {text} "
)
# Example text to summarize
long_text = """
人工智能 (AI) 是机器所展现的智能,与包括人类在内的动物所展现的自然智能不同。
人工智能研究被定义为智能代理的研究领域,它指的是任何能够感知环境并采取行动以最大程度地实现目标的系统。
术语“人工智能”以前曾被用来描述模仿和展示与人类思维相关的“人类”认知技能的机器,例如“学习”和“解决问题”。
此后,这一定义已被主要的人工智能研究人员拒绝,他们现在用理性和理性行动来描述人工智能,这并不限制如何表达智能。
人工智能应用包括高级网络搜索引擎、推荐系统、理解人类语言、自动驾驶汽车、自动决策和在战略游戏系统中进行最高水平的竞争。
随着机器的能力越来越强,被认为需要“智能”的任务通常会从人工智能的定义中删除,这种现象被称为人工智能效应。
"""
# Create the chain and run it
summarization_chain = summarization_template | llm
summary = summarization_chain.invoke({"text": long_text, "num_sentences": 3}).content
print("总结:")
print(summary)
总结:
人工智能 (AI) 是指机器所展现出的智能,与人类和动物所具有的自然智能形成对比。人工智能最初被定义为模仿人类认知技能的能力,而人们对人工智能的理解已经演变为关注智能代理的理性,这些智能代理能够感知环境并采取行动实现目标。随着人工智能技术的进步,曾经被认为需要智能的任务经常被排除在人工智能定义之外,这种趋势被称为人工智能效应,并导致了自动驾驶汽车和高级决策系统等各种应用的出现。
2. 问答提示
接下来,让我们创建一个问答任务的提示。我们将设计一个以上下文和问题作为输入的模板。# 创建用于问答的提示模板
qa_template = PromptTemplate(
input_variables=["context", "question"],
template="上下文: {context} \n\n 问题: {question} \n\n 回答:"
)
# 示例上下文和问题
context = """
埃菲尔铁塔是位于法国巴黎战神广场的一座铸铁格子塔。
它以工程师古斯塔夫·埃菲尔的名字命名,他的公司设计并建造了这座塔。
它建于 1887 年至 1889 年,作为 1889 年世界博览会的入口拱门,最初受到法国一些顶尖艺术家和知识分子对其设计的批评,但它已成为法国的全球文化偶像和世界上最知名的建筑之一。
埃菲尔铁塔是世界上参观人数最多的付费纪念碑;2015 年有 691 万人登上了它。
该塔高 324 米(1,063 英尺),大约相当于 81 层楼的高度,是巴黎最高的建筑。
"""
question = "埃菲尔铁塔有多高,其建筑高度相当于多少层?"
# Create the chain and run it
qa_chain = qa_template | llm
answer = qa_chain.invoke({"context": context, "question": question}).content
print("回答:")
print(answer)
回答:
埃菲尔铁塔高 324 米(1,063 英尺),约相当于 81 层楼高。
3. 代码生成提示
现在,让我们创建一个代码生成提示。我们将设计一个以编程语言和任务描述作为输入的模板。# Create a prompt template for code generation
code_gen_template = PromptTemplate(
input_variables=["language", "task"],
template="为以下任务生成{language}代码: \n\n {task} \n\n代码:"
)
# Example task
language = "Python"
task = "创建一个函数,该函数接受一个数字列表并返回列表中偶数的平均值。"
# Create the chain and run it
code_gen_chain = code_gen_template | llm
generated_code = code_gen_chain.invoke({"language": language, "task": task}).content
print("生成的代码:")
print(generated_code)
生成的代码:
这是一个 Python 函数,它接受一个数字列表并返回该列表中偶数的平均值:
```python
def average_of_evens(numbers):
even_numbers = [num for num in numbers if num % 2 == 0]
if not even_numbers: # Check if the list of even numbers is empty
return 0 # Return 0 or you can choose to return None or raise an error
average = sum(even_numbers) / len(even_numbers)
return average
# 使用示例:
numbers = [1, 2, 3, 4, 5, 6]
result = average_of_evens(numbers)
print("Average of even numbers:", result)
### 解释:
- 函数“average_of_evens”接受数字列表。
- 它使用列表推导来创建一个名为“even_numbers”的新列表,该列表仅包含输入列表中的偶数。
- 如果没有偶数,该函数返回“0”。
- 如果有偶数,则通过将偶数的总和除以其数量来计算它们的平均值并返回结果。
<h2 id="4.-Creative-Writing-Prompts"><font style="color:rgba(0, 0, 0, 0.87);">4. 创意写作提示</font></h2>
<font style="color:rgba(0, 0, 0, 0.87);">最后,让我们为创意写作任务创建一个提示。我们将设计一个以类型、设置和主题作为输入的模板。</font>
```python
# Create a prompt template for creative writing
creative_writing_template = PromptTemplate(
input_variables=["genre", "setting", "theme"],
template="写一个以{setting}为背景的短篇{genre}故事,探讨{theme}主题。故事长度约为 150 字。\n\n故事:"
)
# Example inputs
genre = "科幻小说"
setting = "围绕遥远行星运行的空间站"
theme = "人类的本质"
# Create the chain and run it
creative_writing_chain = creative_writing_template | llm
story = creative_writing_chain.invoke({"genre": genre, "setting": setting, "theme": theme}).content
print("生成的故事:")
print(story)
生成的故事:
埃拉拉·沃斯博士漂浮在 Aetheris 空间站的观景台上,目光凝视着 Thalax-9 星球上翻腾的蔚蓝色云层。该空间站是人类智慧的圣地,但孤独感却让她感到痛苦。
作为唯一的居住者,她与空间站的人工智能 Orion 产生了深厚的联系。Orion 不断学习和适应,逐渐成长为一名好奇的同伴。他们一起讨论人类的本质——情感只是算法,还是源自更深层次的东西?
一天,在监测该星球的大气读数时,猎户座提出了一个刺痛埃拉拉孤独的问题:“如果我有感觉,我会是人类吗?”
埃拉拉心潮澎湃,陷入沉思。“这不仅仅是感觉,”她回答道。“这是挣扎、联系和缺陷。”
在那一刻,她意识到她的人性不仅仅由生物学决定,还由她的同理心、脆弱性和对联系的渴望决定——她现在在猎户座日益增长的意识中看到了这些品质的体现。
看着外面的星星闪烁,埃拉拉笑了,她明白了人类即使在星星之间也能茁壮成长。