在AI和自然语言处理的世界里,提示词(Prompt)是至关重要的。它们不仅帮助引导模型的行为和输出,还决定了模型在特定任务中的表现。在LangChain中,提示词工程提供了非常强大和灵活的功能,使开发者能够以更加系统化的方式设计和优化与语言模型的交互。今天,我们将通过以下四个关键组件来深入了解LangChain中的提示词工程:PromptTemplate、ChatPromptTemplate、FewShotPrompt 和 Chain of Thought。
1. PromptTemplate:提示模板
PromptTemplate是LangChain中最基本的提示词构建工具,它允许开发者通过预定义的结构化模板来创建提示词。该模板可以通过占位符将输入变量动态地插入到提示中,帮助语言模型生成所需的输出。
使用示例:
from langchain import PromptTemplate
template = """\
你是业务咨询顾问。
你给一个销售{product}的电商公司,起一个好的名字?
"""
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="鲜花"))
通过这种方式,PromptTemplate使得提示的创建变得灵活且可重用。你可以动态传入不同的变量,而不需要手动调整提示的内容。
2. ChatPromptTemplate:聊天对话提示模板
ChatPromptTemplate是专门为聊天型对话模型设计的扩展。与PromptTemplate不同,它不仅能够处理单一输入,还能管理多个对话轮次,处理复杂的对话上下文。
使用示例:
# 导入聊天消息类模板
from langchain.prompts import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
# 模板的构建
template="你是一位专业顾问,负责为专注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="公司主打产品是{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# 格式化提示消息生成提示
prompt = prompt_template.format_prompt(product="鲜花装饰", product_detail="创新的鲜花设计。").to_messages()
# 下面调用模型,把提示传入模型,生成结果
import os
os.environ["OPENAI_API_KEY"] = '你的OpenAI Key'
from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()
result = chat(prompt)
print(result)
ChatPromptTemplate使得对话的多轮输入和输出更加灵活,有助于创建复杂且上下文相关的对话场景。
3. FewShotPrompt:少样本提示词
在一些任务中,模型可能无法完全理解用户的意图,尤其是在数据稀缺的情况下。FewShotPrompt是一种利用少量样本来增强模型理解能力的方法,它通过提供若干个“示例”来帮助模型更好地理解如何处理新的输入。
使用示例:
python
复制代码
from langchain.prompts import FewShotPromptTemplate
# 定义少样本提示模板
few_shot_template = FewShotPromptTemplate(
examples=[
{"input": "苹果的颜色是什么?", "output": "苹果的颜色通常是红色或绿色。"},
{"input": "香蕉的颜色是什么?", "output": "香蕉的颜色通常是黄色。"}
],
input_variables=["question"],
template="以下是一些示例:\n{examples}\n现在回答:{question}的颜色是什么?"
)
# 使用模板生成少样本提示
final_prompt = few_shot_template.format(question="草莓的颜色是什么?")
print(final_prompt)
通过这种方式,FewShotPrompt通过给定一些示例,帮助模型更准确地理解和回答类似的问题。
4. Chain of Thought:思维链
Chain of Thought是近来非常流行的一种提示工程技巧,旨在帮助模型在回答问题时进行推理,逐步展示思考过程。这种方法特别适用于需要多步骤推理或计算的问题,能够使得模型的推理过程更加透明,并提高问题解决的准确性。
使用示例:
# 1. 创建一些示例
samples = [
{
"flower_type": "玫瑰",
"occasion": "爱情",
"ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
},
{
"flower_type": "康乃馨",
"occasion": "母亲节",
"ad_copy": "康乃馨代表着母爱的纯洁与伟大,是母亲节赠送给母亲的完美礼物。"
},
{
"flower_type": "百合",
"occasion": "庆祝",
"ad_copy": "百合象征着纯洁与高雅,是你庆祝特殊时刻的理想选择。"
},
{
"flower_type": "向日葵",
"occasion": "鼓励",
"ad_copy": "向日葵象征着坚韧和乐观,是你鼓励亲朋好友的最好方式。"
}
]
# 2. 创建一个提示模板
from langchain.prompts.prompt import PromptTemplate
template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"
prompt_sample = PromptTemplate(input_variables=["flower_type", "occasion", "ad_copy"],
template=template)
print(prompt_sample.format(**samples[0]))
# 3. 创建一个FewShotPromptTemplate对象
from langchain.prompts.few_shot import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
examples=samples,
example_prompt=prompt_sample,
suffix="鲜花类型: {flower_type}\n场合: {occasion}",
input_variables=["flower_type", "occasion"]
)
print(prompt.format(flower_type="野玫瑰", occasion="爱情"))
通过使用 LangChain 的 PromptTemplate 和 FewShotPromptTemplate,我们能够灵活地生成基于鲜花类型和场合的广告文案。PromptTemplate 适用于简单的模板化填充,而 FewShotPromptTemplate 则利用少量示例来帮助模型理解更复杂的任务。
这些功能在实际应用中非常有用,尤其是在需要自动化生成定制化文案的场景,比如电子商务、营销活动等。通过将提示模板与少样本学习结合,我们可以显著提高模型的表现和适应性。
总结
在LangChain中,提示词工程是构建智能应用的核心组成部分。无论是简单的PromptTemplate,还是更复杂的ChatPromptTemplate、FewShotPrompt和Chain of Thought,每种方法都提供了独特的优势,能够帮助我们在不同场景下优化语言模型的表现。掌握这些提示词技巧,将让你能够更灵活、高效地利用大语言模型,构建出更具交互性和智能化的应用。
特别实验
提示工程不仅可以在一定程度上控制大语言模型的输出结果,包括格式、内容和回答的具体要求,甚至通过添加一些巧妙的提示,就能让模型的回复更加生动和有趣。
比如最近在某学习平台看到的一个提示词,它可以让大语言模型的回复减少那么一些AI味道。我们先看看在不加任何提示词的情况下大语言模型的输出效果:
提问:
你需要以《鸡哥的篮球梦》为标题写一篇400字的作文。
回答:
《鸡哥的篮球梦》
在一个阳光明媚的夏日午后,鸡哥正在小镇的篮球场上练习投篮。鸡哥并不是一个真正的鸡,而是一个外表憨厚、性格直率的小男孩,他有着一个与常人不同的梦想——成为一名篮球明星。
从小,鸡哥就对篮球充满了热情。他常常拿着篮球在家门前的小巷里练习,虽然周围的环境并不理想,但他从未因此放弃过自己的梦想。每天放学后,鸡哥都会背着书包来到篮球场上,蹲在场边默默地观察那些高年级的哥哥们打球。每次看到他们在空中飞翔,做出精彩的扣篮,他的眼睛总是闪闪发光,心中暗自发誓:“有一天,我也要像他们一样!”
然而,现实总是给他带来一些挑战。鸡哥个子不高,体力也不算出众,这让他在与别人对抗时总是处于劣势。很多时候,他的投篮不准,运球也容易失误,甚至被嘲笑是“篮球场上的菜鸟”。尽管如此,鸡哥从不气馁,他相信只要自己坚持不懈,终有一天会突破自己的局限,追逐自己的梦想。
为了提高自己的技术,鸡哥不仅坚持每天练习,还特意请教了篮球场上那些经验丰富的哥哥们。每当有球场上的高手指导他时,他总是虚心请教,努力吸收每一条建议。慢慢地,他的运球技巧越来越娴熟,投篮也变得更加精准。
终于有一天,在学校的篮球比赛中,鸡哥迎来了他的首次亮相。尽管对手强大,但鸡哥毫不畏惧。他拼尽全力,为自己的队伍争取了宝贵的分数,最终帮助球队赢得了比赛。那个瞬间,鸡哥的脸上洋溢着灿烂的笑容,他知道,这只是他篮球梦的开始。
鸡哥的故事告诉我们,无论面临多少困难,只要我们坚持不懈、努力追求梦想,终究会收获成功。
其实这段文字看起来已经挺不错的,但是仔细阅读会发现这段文字的AI味道是比较重的。如何优化这段文字呢?首先我们最常用的办法就是告诉AI,让AI知道自己是什么样的角色,这在LangChain的课程中也有介绍过。
比如当你告诉AI,你是一个严谨的科学家,他就会在输出结果之前先仔细地斟酌一下,而不是直接的就开始胡乱的随意发言。
这里我也先尝试加入一个角色的提示词:
你是一个专业的文案写作者。 你需要以《鸡哥的篮球梦》为标题写一篇400字的作文。
回答:
《鸡哥的篮球梦》
在一个不起眼的小镇上,住着一位名叫“鸡哥”的年轻人。鸡哥的名字虽然普通,但他的篮球梦却不容小觑。小时候,他看着电视里那些篮球明星在赛场上飞翔,心中便埋下了一个梦想——有一天,也要像他们一样在篮球场上大展拳脚。
鸡哥的家庭并不富裕,镇上的篮球场也简陋不堪,甚至没有正规的篮球架。然而,这些都没有阻挡他追逐梦想的脚步。每天放学后,他总是独自一人来到那个破旧的篮球场,开始他的训练。没有教练,只有自己对篮球的热爱,他通过反复练习投篮、运球,逐渐掌握了一些技巧。
虽然他并没有条件参加正规的篮球训练班,但他从不放弃每一次练习的机会。有时候,他会在球场上练到天黑,直到双手酸痛,直到球场空无一人。每当这个时候,他心里总是默默对自己说:“只要坚持下去,就一定能实现自己的梦想。”
终于,鸡哥的努力得到了回报。镇上的篮球比赛即将举行,虽然比赛的规模并不大,但对鸡哥来说,却是一次证明自己的机会。比赛当天,他穿上了自己那件有些破旧的球衣,带着全身的激情和汗水,走进了赛场。尽管他面对的是比自己更强的对手,但鸡哥凭借着坚持不懈的训练和勇气,最终帮助自己所在的队伍赢得了比赛。
从那一刻起,鸡哥更加坚信了一个道理:梦想不在于你起步时的条件,而在于你是否愿意为它付出努力。虽然他依旧是那个小镇上的普通青年,但他的篮球梦已经不再是遥不可及的幻想,而是通过无数次汗水与坚持,逐渐变成了现实。
鸡哥的篮球梦,也许不会成为全国瞩目的传奇,但它却是属于他自己的一段独特旅程,充满了勇气与坚持,闪烁着不灭的光芒。
这段文字你看就发现,他已经比上一段文字要好了许多,文章中增加了不少修辞,并且文字也更加优美了许多。
下面我就要介绍学习来的一个黑科技提示词。由于大语言模型的本质就是预测接下来可能的词并选择概率最大的进行输出,而大语言模型的训练数据是极其庞大的,而优质的内容往往只是其中的少数,所以想要得到优质内容,就需要使用prompt去避免这种大概率的数据生成。
话不多说,直接上链接:
写作要求: 多样性(Perplexity)衡量文本的复杂程度,反映了词汇的丰富性和不可预测性。更高的多样性表示内容更加多变并且更难预测。
节奏感(Burstiness)则指句子长度和句式的波动幅度。 高多样性和高节奏感的写作风格通常包含丰富的词汇、长短交替的句子,以及多样化的句式,这能让内容更生动和阅富有层次感。
你的输出应必须展现高多样性和高节奏感。
直接看效果:
鸡哥的篮球梦
从小,鸡哥就对篮球充满了热情。那是一个清晨,阳光透过窗户洒在地板上,空气中弥漫着清新的味道。鸡哥站在家门口,看着邻居家的男孩们在篮球场上奔跑。每一次篮球落入网中,那激动的瞬间,总能让鸡哥心跳加速。他不是最强壮的,也不是最迅速的,但他有一颗不屈的心——篮球梦就此启航。
小时候,鸡哥总是自信满满地站在场边,热切地观看那些技术精湛的球员挥洒汗水。他梦想着有一天,自己也能像他们一样,在球场上自如地飞翔。可是,现实却总是很残酷。虽然身体瘦弱,但他从未放弃过对篮球的热爱。每天放学后,他都会跑到学校的破旧篮球场上,开始一人练习——投篮、运球、突破,甚至连那些看似简单的动作,他也练得如痴如醉。
渐渐地,鸡哥发现自己变得越来越灵活,投篮的准确度也有了显著提升。一天,他在一次和朋友们的对抗赛中,忽然突破了重围,一记漂亮的三分球直接命中篮筐!全场顿时沸腾,鸡哥的脸上绽放出灿烂的笑容。他知道,这不仅是一次普通的得分,更是他追逐梦想的象征。
然而,成功的背后从来没有捷径。为了实现自己的篮球梦,鸡哥付出了比别人更多的努力。每一个夜晚,他都会在球场上孤独地投着篮球,直到球场的灯光熄灭,直到疲惫的身体告诉他:休息一下吧。但他从未停下脚步,追逐的梦想始终如星辰般闪烁在他的心中。
最终,鸡哥的努力没有白费。他不仅成为了学校篮球队的核心球员,甚至还在比赛中获得了MVP称号。这是属于鸡哥的荣耀,但更重要的是,他明白了一个道理:梦想,永远不会背叛那些为之奋斗的人。
鸡哥的篮球梦,仍在继续——不论未来多么不可预测,他都会坚守在这条充满汗水与泪水的篮球道路上。
“阳光透过窗户洒在地板上,空气中弥漫着清新的味道”,“每一次篮球落入网中,那激动的瞬间,总能让鸡哥心跳加速。”这样的文字,都是之前的结果中所没有的。怎么样,prompt就是如此的神奇。其实也有很多其他有效的提示词可以进行尝试。所以说Prompt Is All You Need。