提示词模板
在基于大语言模型(LLM)的应用程序开发中,构建提示词是最基本和最重要的部分,好的提示词能让LLM明确目标,并按照我们的预期输出内容。LangChain对提示词相关的功能进行了封装,我们可以基于框架的API组装符合LLM应用最佳实践的提示词。
PromptTemplate 提示词模板
LangChain中,PromptTemplate是最基础的提示模板,模板中可以包含占位符,我们通过填充占位符合成最终提示词,下面是一个例子。
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Translate {text} into {language}.")
prompt = prompt_template.format(text="Hello, my name is Aiko.", language="Spanish")
print(prompt)
提示词模板使用PromptTemplate.from_template()创建,参数是一个包含占位符的字符串,调用format()方法可以查看效果,该方法接收所有占位变量的命名参数。
PromptTemplate继承了Runnable,它可以挂载到LCEL链中并直接将输出作为ChatModel的输入。下面例子代码中,当对“链”调用invoke()函数时,我们传入了相关占位符参数,执行后可以看到LLM的运行效果。
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="qwen3:30b-a3b",
base_url="http://localhost:11434/v1/",
api_key="dummy",
temperature=1,
top_p=1,
max_tokens=16384,
timeout=120,
max_retries=6
)
prompt_template = PromptTemplate.from_template("Translate {text} into {language}.")
chain = prompt_template | model
result = chain.invoke({"text": "Hello, my name is Aiko.", "language": "Spanish"})
print(result.content)
FewShotPromptTemplate Few-Shot提示词模板
Few-Shot提示词指的是LLM在进行推理任务时,通过给定少量示例来供其参考如何完成该任务,下面例子中,我们的examples变量就包含了一组例子,例子中的回答给了LLM许多提示信息,每个例子的回答前还都添加了一个猫猫Emoji,LLM大概率也会按照相同的格式进行回答。
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="qwen3:30b-a3b",
base_url="http://localhost:11434/v1/",
api_key="dummy",
temperature=1,
top_p=1,
max_tokens=16384,
timeout=120,
max_retries=6
)
examples = [
{"question": "Who are you?", "answer": "🐱 I am Aiko, a helpful AI assistant."},
{"question": "What is your name?", "answer": "🐱 My name is Aiko."},
{"question": "What can you do for me?", "answer": "🐱 I can generate text."},
]
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=PromptTemplate.from_template(template="Question: {question}\nAnswer: {answer}"),
suffix="User Question: {input}"
)
chain = few_shot_prompt | model
result = chain.invoke({"input": "Hi, who r u ?"})
print(result.content)
另外对于FewShotPromptTemplate,我们同样可以使用类似之前的format()方法填入参数,用于直接计算模板字符串或预览模板的效果。
使用Jinja2模板引擎
有时我们输入的Prompt会异常复杂,其中可能包含判断和循环逻辑,生成这样一个Prompt需要一个模板引擎来实现。LangChain支持Jinja2或Mustache模板引擎,这里我们以比较常用的Jinja2为例进行介绍。
注意,LangChain核心包默认并没有把Jinja2依赖进来,如果要用Jinja2我们需要安装相关的模块。
uv add jinja2
下面是使用Jinja2模板的一个例子。
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("Translate {{text}} into {{language}}.", template_format='jinja2')
prompt = prompt_template.format(text="Hello, my name is Aiko.", language="Spanish")
print(prompt)
我们构建Prompt时指定了template_format属性,它的默认值是f-string,仅能实现一些基础的字符串替换。这里我们将其指定为jinja2,即使用Jinja2模板引擎,此时PromptTemplate就能正确渲染为我们需要的内容了。
了解上面内容后,我们可以发现其实模板引擎才是最强大的,像Few-Shot提示词模板本身就可以通过模板引擎快速实现,不过实际开发中,我们还是尽量利用LangChain封装好的工具类,这样能让我们构建的提示词基本保持在一个最佳实践的范围内,如果LangChain内置的功能实在实现不了,再考虑使用模板引擎。当然,有些人也可能认为LangChain封装了太多内容,屏蔽了底层信息的同时也丧失的灵活性,这是严重的“过度设计”,我们这里就先不纠结这个问题了,具体开发时根据我们的喜好选择即可。
ChatPromptTemplate 聊天提示词模板
ChatPromptTemplate的用法比较灵活,它不仅支持模板占位符,还支持传入对话历史消息,下面例子演示了这一用法。
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
model = ChatOpenAI(
model="qwen3:30b-a3b",
base_url="http://localhost:11434/v1/",
api_key="dummy",
temperature=1,
top_p=1,
max_tokens=16384,
timeout=120,
max_retries=6
)
prompt_template = ChatPromptTemplate.from_messages([
{"role": "system", "content": "You are a helpful AI assistant. You always add emojis to your responses. You always response in {language}."},
{"role": "user", "content": "Hi!"}
])
chain = prompt_template | model
result = chain.invoke({"language": "Spanish"})
print(result.content)
注意:LangChain这里有一个非常诡异的特性,这里的消息对象必须使用简写形式,如果直接使用SystemMessage对象构造,则模板替换不会发生。
LangChainHub
LangChain维护了一个提示词的仓库LangChainHub,对于一些复杂的提示词,我们可以参考这里学习如何编写效果最好。
LangChain早期官方在框架里集成了一个hub模块,并支持从远程pull提示词,这个功能也是够搞笑的,“提示词”就是个模板字符串,这么简单的东西还要从远程加载简直是疯了,而且实际开发中我们可能需要对提示词进行许多调整,这样直接加载的方式不方面我们修改。果不其然,LangChain 1.x已经从核心包移除了这个模块。