提示模板
语言模型以文本作为输入 - 这个文本通常称为提示。通常,这不仅仅是一个硬编码的字符串,而是模板、例子和用户输入的组合。LangChain提供了几个类和函数,使得构建和处理提示变得容易。
什么是提示模板?
提示模板是生成提示的可复制的方式。它包含一个文本字符串(”模板”),它可以从最终用户的一组参数中获取输入,并生成一个提示。
提示模板可以包含:
- 对语言模型的指令,
- 一组少量示例,帮助语言模型生成更好的响应,
- 对语言模型的问题。
这是一个简单的例子:
import { PromptTemplate } from "langchain/prompts";
// 如果传递了一个模板,输入变量将自动从模板中推理出来。
const prompt = PromptTemplate.fromTemplate(
`You are a naming consultant for new companies.
What is a good name for a company that makes {product}?`
);
const formattedPrompt = await prompt.format({
product: "colorful socks",
});
/*
You are a naming consultant for new companies.
What is a good name for a company that makes colorful socks?
*/
创建提示模板
您可以使用PromptTemplate
类创建简单的硬编码提示。提示模板可以接受任意数量的输入变量,并可以进行格式化以生成提示。
import { PromptTemplate } from "langchain/prompts";
// 一个没有输入变量的示例提示
const noInputPrompt = new PromptTemplate({
inputVariables: [],
template: "Tell me a joke.",
});
const formattedNoInputPrompt = await noInputPrompt.format();
console.log(formattedNoInputPrompt);
// "Tell me a joke."
// 一个带有一个输入变量的示例提示
const oneInputPrompt = new PromptTemplate({
inputVariables: ["adjective"],
template: "Tell me a {adjective} joke."
})
const formattedOneInputPrompt = await oneInputPrompt.format({
adjective: "funny",
});
console.log(formattedOneInputPrompt);
// "Tell me a funny joke."
// 一个带有多个输入变量的示例提示
const multipleInputPrompt = new PromptTemplate({
inputVariables: ["adjective", "content"],
template: "Tell me a {adjective} joke about {content}.",
});
const formattedMultipleInputPrompt = await multipleInputPrompt.format({
adjective: "funny",
content: "chickens",
});
console.log(formattedMultipleInputPrompt);
// "Tell me a funny joke about chickens."
如果您不想手动指定inputVariables
,您还可以使用fromTemplate
类方法创建PromptTemplate
。LangChain会根据传入的template
自动推断出inputVariables
。
import { PromptTemplate } from "langchain/prompts";
const template = "Tell me a {adjective} joke about {content}.";
const promptTemplate = PromptTemplate.fromTemplate(template);
console.log(promptTemplate.inputVariables);
// ['adjective', 'content']
const formattedPromptTemplate = await promptTemplate.format({
adjective: "funny",
content: "chickens",
});
console.log(formattedPromptTemplate);
// "Tell me a funny joke about chickens."
您可以创建自定义的提示模板,以任何您想要的方式格式化提示。有关更多信息,请参阅自定义提示模板。
聊天提示模板
聊天模型以聊天消息列表作为输入,这个列表通常被称为prompt
。与原始字符串(您将传递给LLM模型的字符串)不同的是,每条消息都与一个角色相关联。
例如,在OpenAI的Chat Completion API中,聊天消息可以与AI、人类或系统角色关联。模型应更加密切地遵循系统聊天消息的指导。
LangChain提供了几个提示模板,以便于构建和处理提示。鼓励您在调用聊天模型时使用这些与聊天相关的提示模板,以充分发掘模型的潜力。
import {
ChatPromptTemplate,
PromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
} from "langchain/prompts";
import {
AIMessage,
HumanMessage,
SystemMessage,
} from "langchain/schema";
创建与角色相关联的消息模板时,您可以使用相应的MessagePromptTemplate
。
为了方便起见,您还可以将消息提示模板声明为元组。它们将被强制转换为适当的提示模板类型:
const systemTemplate = "您是一个帮助翻译 {input_language} 到 {output_language} 的助理。";
const humanTemplate = "{text}";
const chatPrompt = ChatPromptTemplate.fromPromptMessages([
["system", systemTemplate],
["human", humanTemplate],
]);
// 格式化消息
const formattedChatPrompt = await chatPrompt.formatMessages({
input_language: "英语",
output_language: "法语",
text: "我喜欢编程。",
});
console.log(formattedChatPrompt);
/*
[
SystemMessage {
content: '您是一个帮助翻译英语到法语的助理。'
},
HumanMessage {
content: '我喜欢编程。'
}
]
*/
您还可以使用ChatPromptTemplate
的.formatPrompt()
方法,它返回一个PromptValue
,您可以将其转换为字符串或消息对象,具体取决于您是否希望将格式化的值用作LLM或聊天模型的输入。
如果您更喜欢使用消息类,这些类上公开了一个fromTemplate
方法。这是它的用法:
const template = "您是一个帮助翻译 {input_language} 到 {output_language} 的助理。";
const systemMessagePrompt = SystemMessagePromptTemplate.fromTemplate(template);
const humanTemplate = "{text}";
const humanMessagePrompt = HumanMessagePromptTemplate.fromTemplate(humanTemplate);
如果您希望更直接地构建MessagePromptTemplate
,可以在外部创建一个PromptTemplate,然后传入,例如:
const prompt = new PromptTemplate({
template: "您是一个帮助翻译 {input_language} 到 {output_language} 的助理。",
inputVariables: ["input_language", "output_language"],
});
const systemMessagePrompt2 = new SystemMessagePromptTemplate({
prompt,
});
注意:如果使用TypeScript,您可以通过传递一个类型参数来为.fromPromptMessages
创建的提示添加类型,像这样:
const chatPrompt = ChatPromptTemplate.fromPromptMessages([
systemMessagePrompt,
humanMessagePrompt
]);