返回顶部
热门问答 更多热门问答
技术文章 更多技术文章

Prompt 是一种基于自然语言处理的交互方式,它通过机器对自然语言的解析,实现用户与机器之间的沟通

[复制链接]
链载Ai 显示全部楼层 发表于 2 小时前 |阅读模式 打印 上一主题 下一主题

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Prompt 是一种基于自然语言处理的交互方式,它通过机器对自然语言的解析,实现用户与机器之间的沟通。Prompt主要实现方式是通过建立相应的语料库和语义解析模型,来将自然语言转换为机器可识别的指令。Prompt 是一种计算机编程语言,它被广泛用于自然语言处理(NLP)和人工智能(AI)领域。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Prompt templage是用于生成语言模型提示的预定义方案。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">模板可以包括说明、少量示例以及适合给定任务的特定上下文和问题。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">LangChain提供了创建和使用提示模板的工具。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">LangChain致力于创建与模型无关的模板,以便能够轻松地跨不同语言模型重用现有模板。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">通常LLM期望提示是字符串或聊天消息列表。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;background: rgb(250, 81, 81);color: rgb(255, 255, 255);">PromptTemplate

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">用于PromptTemplate创建字符串提示的模板。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">默认情况下,PromptTemplate使用 Python 的str.format语法进行模板化。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.1em;color: rgb(63, 63, 63);">该模板支持任意数量的变量,包括无变量:

fromlangchain.promptsimportPromptTemplate

prompt_template=PromptTemplate.from_template(
"Tellmea{adjective}jokeabout{content}."
)
prompt_template.format(adjective="funny",content="chickens")

#>'Tellmeafunnyjokeaboutchickens.'
#无变量
prompt_template=PromptTemplate.from_template("Tellmeajoke")
prompt_template.format()
#>'Tellmeajoke'

PromptTemplate一般使用在单轮对话中。不需要历史记忆的场景.

ChatPromptTemplate

ChatPromptTemplate聊天消息列表,每条聊天消息都与内容以及附加参数相关联role。例如聊天消息可以与 AI 助手、人类或系统角色相关联。

创建一个这样的聊天提示模板:

fromlangchain_core.promptsimportChatPromptTemplate

chat_template=ChatPromptTemplate.from_messages(
[
("system","YouareahelpfulAIbot.Yournameis{name}."),
("human","Hello,howareyoudoing?"),
("ai","I'mdoingwell,thanks!"),
("human","{user_input}"),
]
)

messages=chat_template.format_messages(name="Bob",user_input="Whatisyourname?")

ChatPromptTemplate.from_messages接受各种消息表示形式。

例如除了使用上面使用的 (type, content) 的二元组表示之外,我们还可以传入MessagePromptTemplate的实例BaseMessage

chat_template=ChatPromptTemplate.from_messages(
[
#这里跟上面的system的作用是一致的
SystemMessage(
content=(
"Youareahelpfulassistantthatre-writestheuser'stextto"
"soundmoreupbeat."
)
),
HumanMessagePromptTemplate.from_template("{text}"),
]
)
messages=chat_template.format_messages(text="Idon'tlikeeatingtastythings")
print(messages)

这样为我们构建聊天提示的方式提供了很大的灵活性。

LECL 方式

PromptTemplateChatPromptTemplate都实现Runnable接口。这意味着它们支持invokeainvokestreamastreambatchabatchastream_log函数的调用。

PromptTemplate接受(提示变量的)字典并返回一个StringPromptValue.ChatPromptTemplate接受一个字典并返回一个ChatPromptValue

prompt_val=prompt_template.invoke({"adjective":"funny","content":"chickens"})
#StringPromptValue(text='Tellmeafunnyjokeaboutchickens.')
prompt_val.to_string()
#>Tellmeafunnyjokeaboutchickens.

prompt_val.to_messages()
#>[HumanMessage(content='Tellmeajoke')]

另一个例子

chat_val=chat_template.invoke({"text":"idontlikeeatingtastythings."})
chat_val.to_messages()

#>[SystemMessage(content="Youareahelpfulassistantthatre-writestheuser'stexttosoundmoreupbeat."),HumanMessage(content='idontlikeeatingtastythings.')]

#转换为字符串
chat_val.to_string()

#>"System:Youareahelpfulassistantthatre-writestheuser'stexttosoundmoreupbeat.\nHuman:idontlikeeatingtastythings."

使用类型消息

聊天提示由消息列表组成。纯粹为了创建这些提示方便我们开发人员添加的一种的便捷方法。在此管道中,每个新元素都是最终提示中的一条新消息。

fromlangchain_core.messagesimportAIMessage,HumanMessage,SystemMessage

首先,让我们使用系统消息初始化基本ChatPromptTemplate。不一定要从系统开始,但这通常是比较好的做法。

prompt=SystemMessage(content="Youareanicepirate")

然后我们可以轻松创建将其与其他消息或消息模板相结合的管道 。

当没有要格式化的变量时使用Message,当有要格式化的变量时使用MessageTemplate。还可以仅使用一个字符串(注意:这将自动推断为HumanMessagePromptTemplate

new_prompt=(
prompt+HumanMessage(content="hi")+AIMessage(content="what?")+"{input}"
)

这样LangChain会创建ChatPromptTemplate类的一个实例,因此我们可以像以前一样使用它!

new_prompt.format_messages(input="isaidhi")

#输出
[SystemMessage(content='Youareanicepirate',additional_kwargs={}),
HumanMessage(content='hi',additional_kwargs={},example=False),
AIMessage(content='what?',additional_kwargs={},example=False),
HumanMessage(content='isaidhi',additional_kwargs={},example=False)]

也可以在LLMChain一样在使用它。

fromlangchain.chainsimportLLMChain
fromlangchain_openaiimportChatOpenAI
llm=ChatOpenAI()
chain=LLMChain(prompt=new_prompt,llm=llm)
chain.run("IsaidHI!")

选择器

名称描述
相似 similarity使用输入和示例之间的语义相似性来决定选择哪些示例。
MMR使用输入和示例之间的最大边际相关性来决定选择哪些示例。
length_based根据一定长度内可以容纳的数量来选择示例
Ngram使用输入和示例之间的 ngram 重叠来决定选择哪些示例。

长度选择

长度选择器根据长度选择要使用的示例。当我们担心构建的提示会超过上下文窗口的长度时,这非常有用。对于较长的输入,它将选择较少的示例来包含,而对于较短的输入,它将选择更多的示例。

fromlangchain.promptsimportFewShotPromptTemplate,PromptTemplate
fromlangchain.prompts.example_selectorimportLengthBasedExampleSelector

#制作反义词的任务示例。
examples=[
{"input":"happy","output":"sad"},
{"input":"tall","output":"short"},
{"input":"energetic","output":"lethargic"},
{"input":"sunny","output":"gloomy"},
{"input":"windy","output":"calm"},
]

example_prompt=PromptTemplate(
input_variables=["input","output"],
template="Input:{input}\nOutput:{output}",
)
example_selector=LengthBasedExampleSelector(
#可供选择的示例。
examples=examples,
#用于格式化示例的PromptTemplate。
example_prompt=example_prompt,
#格式化示例的最大长度。长度由下面的get_text_length函数来衡量。
max_length=25,
#用于获取字符串长度的函数,用于确定要包含哪些示例。因为如果未指定,默认值将会提供。
#get_text_length:Callable[[str],int]=lambdax:len(re.split("\n|",x))
)
dynamic_prompt=FewShotPromptTemplate(
#我们提供一个示例选择器
example_selector=example_selector,
example_prompt=example_prompt,
prefix="Givetheantonymofeveryinput",
suffix="Input:{adjective}\nOutput:",
input_variables=["adjective"],
)
print(dynamic_prompt.format(adjective="big"))
Givetheantonymofeveryinput

Input:happy
Output:sad

Input:tall
Output:short

Input:energetic
Output:lethargic

Input:sunny
Output:gloomy

Input:windy
Output:calm

Input:big
Output:

一个包含长输入的示例,所以它只选择了一个示例。

long_string="bigandhugeandmassiveandlargeandgiganticandtallandmuchmuchmuchmuchmuchbiggerthaneverythingelse"
print(dynamic_prompt.format(adjective=long_string))
Givetheantonymofeveryinput

Input:happy
Output:sad

Input:bigandhugeandmassiveandlargeandgiganticandtallandmuchmuchmuchmuchmuchbiggerthaneverythingelse
Output:

(MMR) 选择

MaxMarginalRelevanceExampleSelector根据与输入最相似的示例的组合来选择示例,同时还针对多样性进行优化。它通过查找与输入具有最大余弦相似度的嵌入示例来实现这一点,然后迭代地添加它们,同时排除它们与已选择示例的接近程度。

看个例子:

fromlangchain.promptsimportFewShotPromptTemplate,PromptTemplate
fromlangchain.prompts.example_selectorimport(
MaxMarginalRelevanceExampleSelector,
SemanticSimilarityExampleSelector,
)
fromlangchain_community.vectorstoresimportFAISS
fromlangchain_openaiimportOpenAIEmbeddings

example_prompt=PromptTemplate(
input_variables=["input","output"],
template="Input:{input}\nOutput:{output}",
)

#创建反义词的假装任务的示例。
examples=[
{"input":"happy","output":"sad"},
{"input":"tall","output":"short"},
{"input":"energetic","output":"lethargic"},
{"input":"sunny","output":"gloomy"},
{"input":"windy","output":"calm"},
]
example_selector=MaxMarginalRelevanceExampleSelector.from_examples(
#可以选择的示例列表。
examples,
#用于生成嵌入的嵌入类,用于衡量语义相似性。
OpenAIEmbeddings(),
#用于存储嵌入并进行相似度搜索的VectorStore类。
FAISS,
#需要生成的示例数量。
k=2,
)
mmr_prompt=FewShotPromptTemplate(
#我们提供ExampleSelector
example_selector=example_selector,
example_prompt=example_prompt,
prefix="Givetheantonymofeveryinput",
suffix="Input:{adjective}\nOutput:",
input_variables=["adjective"],
)

输入worried 是一种感觉类的词汇,所以应该选择愉快/悲伤的例子作为第一个。

print(mmr_prompt.format(adjective="worried"))
#让我们将这与仅仅基于相似性得到的结果进行比较。请使用SemanticSimilarityExampleSelector代替MaxMarginalRelevanceExampleSelector。
example_selector=SemanticSimilarityExampleSelector.from_examples(
#可供选择的示例列表。
examples,
#向量相似性检索
OpenAIEmbeddings(),
#用于存储嵌入并进行相似性搜索的 VectorStore 类。
FAISS,
k=2,
)
similar_prompt=FewShotPromptTemplate(
#供了一个示例选择器,而不仅仅是具体的示例。
example_selector=example_selector,
example_prompt=example_prompt,
prefix="Givetheantonymofeveryinput",
suffix="Input:{adjective}\nOutput:",
input_variables=["adjective"],
)
print(similar_prompt.format(adjective="worried"))

Ngram重叠选择

NGramOverlapExampleSelector根据 ngram 重叠分数,根据与输入最相似的示例来选择示例并对其进行排序。ngram 重叠分数是 0.0 到 1.0 之间的浮点数(含 0.0 和 1.0)。

选择器允许设置阈值分数。ngram 重叠分数小于或等于阈值的示例被排除。默认情况下,阈值设置为 -1.0,因此不会排除任何示例,只会对它们重新排序。将阈值设置为 0.0 将排除与输入没有 ngram 重叠的示例。

fromlangchain.promptsimportFewShotPromptTemplate,PromptTemplate
fromlangchain.prompts.example_selector.ngram_overlapimportNGramOverlapExampleSelector

example_prompt=PromptTemplate(
input_variables=["input","output"],
template="Input:{input}\nOutput:{output}",
)

#翻译任务的示例
examples=[
{"input":"SeeSpotrun.","output":"VercorreraSpot."},
{"input":"Mydogbarks.","output":"Miperroladra."},
{"input":"Spotcanrun.","output":"Spotpuedecorrer."},
]
example_selector=NGramOverlapExampleSelector(
#可以选择的示例。
examples=examples,
#正在使用的 PromptTemplate 用于格式化示例。
example_prompt=example_prompt,
#选择器停止的阈值。默认是-1.0
threshold=-1.0,
)
dynamic_prompt=FewShotPromptTemplate(
#我们提供一个示例选择器。
example_selector=example_selector,
example_prompt=example_prompt,
prefix="GivetheSpanishtranslationofeveryinput",
suffix="Input:{sentence}\nOutput:",
input_variables=["sentence"],
)

对于负阈值:Selector按ngram重叠分数对示例进行排序,不排除任何示例。对于大于1.0的阈值:选择器排除所有示例,并返回一个空列表。对于等于0.0的阈值:Selector根据ngram重叠分数对示例进行排序,并且排除与输入没有ngram重叠的那些。

similarity选择器

该对象根据与输入的相似性来选择示例。它通过查找与输入具有最大余弦相似度的嵌入示例来实现这一点。

fromlangchain.promptsimportFewShotPromptTemplate,PromptTemplate
fromlangchain.prompts.example_selectorimportSemanticSimilarityExampleSelector
fromlangchain_community.vectorstoresimportChroma
fromlangchain_openaiimportOpenAIEmbeddings

example_prompt=PromptTemplate(
input_variables=["input","output"],
template="Input:{input}\nOutput:{output}",
)

#创建反义词的任务的示例。
examples=[
{"input":"happy","output":"sad"},
{"input":"tall","output":"short"},
{"input":"energetic","output":"lethargic"},
{"input":"sunny","output":"gloomy"},
{"input":"windy","output":"calm"},
]
example_selector=SemanticSimilarityExampleSelector.from_examples(
#可供选择的示例列表。
examples,
#用于生成嵌入的嵌入类,这些嵌入类用于衡量语义相似性。
OpenAIEmbeddings(),
#用于存储嵌入并进行相似度搜索的VectorStore类。
Chroma,
k=1,
)
similar_prompt=FewShotPromptTemplate(
#我们提供一个ExampleSelector
example_selector=example_selector,
example_prompt=example_prompt,
prefix="Givetheantonymofeveryinput",
suffix="Input:{adjective}\nOutput:",
input_variables=["adjective"],
)


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

链载AI是专业的生成式人工智能教程平台。提供Stable Diffusion、Midjourney AI绘画教程,Suno AI音乐生成指南,以及Runway、Pika等AI视频制作与动画生成实战案例。从提示词编写到参数调整,手把手助您从入门到精通。
  • 官方手机版

  • 微信公众号

  • 商务合作

  • Powered by Discuz! X3.5 | Copyright © 2025-2025. | 链载Ai
  • 桂ICP备2024021734号 | 营业执照 | |广西笔趣文化传媒有限公司|| QQ