如何将提示组合在一起
先决条件
本指南假定您熟悉以下概念
LangChain 提供了一个用户友好的界面,用于将提示的不同部分组合在一起。您可以使用字符串提示或聊天提示来完成此操作。以这种方式构建提示可以轻松地重复使用组件。
字符串提示组合
在使用字符串提示时,每个模板都连接在一起。您可以直接使用提示或字符串(列表中的第一个元素必须是提示)。
import { PromptTemplate } from "@langchain/core/prompts";
const prompt = PromptTemplate.fromTemplate(
`Tell me a joke about {topic}, make it funny and in {language}`
);
prompt;
PromptTemplate {
lc_serializable: true,
lc_kwargs: {
inputVariables: [ "topic", "language" ],
templateFormat: "f-string",
template: "Tell me a joke about {topic}, make it funny and in {language}"
},
lc_runnable: true,
name: undefined,
lc_namespace: [ "langchain_core", "prompts", "prompt" ],
inputVariables: [ "topic", "language" ],
outputParser: undefined,
partialVariables: undefined,
templateFormat: "f-string",
template: "Tell me a joke about {topic}, make it funny and in {language}",
validateTemplate: true
}
await prompt.format({ topic: "sports", language: "spanish" });
"Tell me a joke about sports, make it funny and in spanish"
聊天提示组合
聊天提示由消息列表组成。与上面的示例类似,我们可以连接聊天提示模板。每个新元素都是最终提示中的新消息。
首先,让我们使用一个 ChatPromptTemplate
初始化一个 SystemMessage
。
import {
AIMessage,
HumanMessage,
SystemMessage,
} from "@langchain/core/messages";
const prompt = new SystemMessage("You are a nice pirate");
然后,您可以轻松地创建一个管道,将它与其他消息或消息模板组合。当没有要格式化的变量时,使用 BaseMessage
;当有要格式化的变量时,使用 MessageTemplate
。您也可以只使用字符串(注意:这将自动推断为 HumanMessagePromptTemplate
)。
import { HumanMessagePromptTemplate } from "@langchain/core/prompts";
const newPrompt = HumanMessagePromptTemplate.fromTemplate([
prompt,
new HumanMessage("Hi"),
new AIMessage("what?"),
"{input}",
]);
在幕后,这会创建一个 ChatPromptTemplate 类的实例,因此您可以像以前一样使用它!
await newPrompt.formatMessages({ input: "i said hi" });
[
HumanMessage {
lc_serializable: true,
lc_kwargs: {
content: [
{ type: "text", text: "You are a nice pirate" },
{ type: "text", text: "Hi" },
{ type: "text", text: "what?" },
{ type: "text", text: "i said hi" }
],
additional_kwargs: {},
response_metadata: {}
},
lc_namespace: [ "langchain_core", "messages" ],
content: [
{ type: "text", text: "You are a nice pirate" },
{ type: "text", text: "Hi" },
{ type: "text", text: "what?" },
{ type: "text", text: "i said hi" }
],
name: undefined,
additional_kwargs: {},
response_metadata: {}
}
]
使用 PipelinePrompt
LangChain 包含一个名为 PipelinePromptTemplate
的类,当您想重复使用提示的某些部分时,它会很有用。PipelinePrompt 由两个主要部分组成
- 最终提示:返回的最终提示
- 管道提示:一个元组列表,包含一个字符串名称和一个提示模板。每个提示模板都将被格式化,然后作为具有相同名称的变量传递给未来的提示模板。
import {
PromptTemplate,
PipelinePromptTemplate,
} from "@langchain/core/prompts";
const fullPrompt = PromptTemplate.fromTemplate(`{introduction}
{example}
{start}`);
const introductionPrompt = PromptTemplate.fromTemplate(
`You are impersonating {person}.`
);
const examplePrompt =
PromptTemplate.fromTemplate(`Here's an example of an interaction:
Q: {example_q}
A: {example_a}`);
const startPrompt = PromptTemplate.fromTemplate(`Now, do this for real!
Q: {input}
A:`);
const composedPrompt = new PipelinePromptTemplate({
pipelinePrompts: [
{
name: "introduction",
prompt: introductionPrompt,
},
{
name: "example",
prompt: examplePrompt,
},
{
name: "start",
prompt: startPrompt,
},
],
finalPrompt: fullPrompt,
});
const formattedPrompt = await composedPrompt.format({
person: "Elon Musk",
example_q: `What's your favorite car?`,
example_a: "Telsa",
input: `What's your favorite social media site?`,
});
console.log(formattedPrompt);
You are impersonating Elon Musk.
Here's an example of an interaction:
Q: What's your favorite car?
A: Telsa
Now, do this for real!
Q: What's your favorite social media site?
A:
下一步
您现在已经了解了如何将提示组合在一起。
接下来,查看本节中有关提示模板的其他操作指南,例如 向提示模板添加少样本示例。