LangChain提示词工程最新十大技巧排行榜:快速提升模型性能的实战策略
LangChain提示词模板:提高语言模型输出质量的关键技术。
核心内容:
- 提示词模板的定义和基本组成
- 提示词模板在LangChain中的作用与应用
- 实战案例:字符串提示词模板与聊天消息提示词模板的创建和使用
先聊一个基础但非常关键的概念:提示词模板。很多刚接触LangChain的朋友会觉得它有点抽象,其实说白了,它跟咱们平时用的邮件模板、信息模板本质上一模一样。就是一个字符串,里面预定义了一些占位符,运行时用实际参数替换进去,就生成了最终发给语言模型的提示。
那么,一个提示词模板具体能装些什么?一般来说三样东西:
- 发给大语言模型(LLM)的指令——告诉模型你要干什么。
- 一组问答示例——给模型“打个样”,让它知道该怎么输出。
- 具体的问题——就是你想让模型回答的那句话。
有了模板,开发者就能保证每次输入给模型的格式都是统一、清晰、没有歧义的。你猜怎么着?就这么一个简单的结构化管理手法,往往能让模型输出质量上一个台阶。
1 提示词模板简介
在LangChain中,提示模板扮演着至关重要的角色——它让开发者以结构化的方式向语言模型提供输入,从而引导模型生成所需的输出。说到底,这是一个“输入质量决定输出质量”的工程问题。
1.1 提示词模板的内容
强调一下,提示词模板本质上就是一个包含模板参数的字符串。你用花括号把参数名括起来,然后通过参数值去替换它。就这么简单,没有任何黑魔法。比如一个模板可以同时包含指令、示例和问题三个部分,组装起来就是一条完整的请求。
1.2 提示模板在LangChain中的作用
作用很直接:定义一个结构化的输入格式,确保模型在生成输出时获得所有必要信息。换句话说,有了模板,你就不会漏掉关键部分,也不会因为每次手写格式不一致而让模型“迷惑”。这是LangChain里最常用、也最容易被低估的工具之一。
2 提示词模板实战
2.1 字符串提示词模板
最简单的用法是用 PromptTemplate 类。比如你想让模型讲一个故事,故事要有风格和主题:
from langchain.prompts import PromptTemplate
# 定义一个提示模板,包含adjective和content两个模板变量,模板变量使用{}包括起来
prompt_template = PromptTemplate.from_template(
"给我讲一个关于{content}的{adjective}故事。"
)
# 通过模板参数格式化提示模板
result = prompt_template.format(adjective="童话", content="一千零一夜")
print(result)执行后,模板就会被填充成“给我讲一个关于一千零一夜的童话故事。” 是不是很直观?
2.2 聊天消息提示词模板
聊天模型不太一样——它接收的是聊天消息列表,每条消息都带有一个“角色”标签。在OpenAI的体系里,角色分为三种:
- 系统(system)消息:通常用来描述AI的身份或行为准则。
- 用户(user)消息:你发给AI的内容。
- 助手(assistant)消息:AI回复的内容。
用 ChatPromptTemplate 可以轻松管理这些带角色的消息:
from langchain_core.prompts import ChatPromptTemplate
chat_template = ChatPromptTemplate.from_messages(
[
("system", "你是一位人工智能助手,你的名字是{name}。"),
("human", "你能做什么"),
("ai", "设计课程,谢谢!"),
("human", "{user_input}"),
]
)
messages = chat_template.format_messages(name="教学助手",
user_input="你的名字叫什么?")
print(messages)注意这里,系统消息里用了一个 {name} 参数,用户最后的提问也用了 {user_input}。模板帮你组装成完整的对话上下文。
2.4 MessagesPlaceholder
有时候我们希望在某一个位置插入一整个消息列表,而不是固定的一条消息。这时就用得上 MessagesPlaceholder。看这个例子:
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts import MessagesPlaceholder
from langchain_core.messages import HumanMessage
prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
#可以传入一组消息
MessagesPlaceholder("msgs")
])
result = prompt_template.invoke({"msgs": [HumanMessage(content="您好!"),
HumanMessage(content="langchain!")]})
print(result)这里的 MessagesPlaceholder("msgs") 就像一个占位洞,你往里塞多少条消息,它就展开多少条。特别适合处理动态对话历史。
3.2 提示词追加示例
最后说一个进阶技巧:少样本提示。在提示词里附带一两个交互示例,能帮助模型更快理解你期望的问答格式。比如你希望模型能拆解复杂问题,先推理再回答,可以给一个范例:
examples = [
{
"question": "电话和电灯的发明者是否毕业于同一所大学?",
"answer":
"""
这里需要跟进问题吗:是的。
跟进:电话的发明者是谁?
中间答案:电话的发明者是Alexander Graham Bell。
跟进:Alexander Graham Bell毕业于哪所大学?
中间答案:Alexander Graham Bell没有正式大学学位,他在爱丁堡大学短暂学习过。
跟进:电灯的发明者是谁?
中间答案:电灯的发明者是Thomas Edison。
跟进:Thomas Edison毕业于哪所大学?
中间答案:Thomas Edison没有大学学位,他是自学成才的发明家。
所以最终答案是:不是
"""
}
]然后用 FewShotPromptTemplate 把这个示例嵌入到模板里:
from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate
from prompt_example import examples # examples是交互示例
example_prompt = PromptTemplate(input_variables=["question", "answer"],
template="问题:{question}\n{answer}")
print(example_prompt.format(**examples[0]))这样,模型在回答新问题时就会模仿示例中的推理链条,输出质量自然更可控。总之,提示词模板不是什么高深玩意儿,但它能让你的LLM应用从“随缘输出”变成“稳定输出”。把握好模板化思路,后面写再复杂的链都不会跑偏。
