提示工程(Prompt Engineering)是大语言模型应用中的核心技术,优秀的提示可以显著提升模型的生成质量。本文将结合LangChain,介绍如何利用其提供的各种提示模板,构建从简单到复杂的高效提示框架。
提示结构解析
在设计提示时,可以将其结构化为以下四个部分:
- 指令(Instruction)
指明模型任务的总体要求和执行方式。例如,设定模型的角色为“有用的助手”或“专业顾问”,以确保模型理解任务的核心目标。 - 上下文(Context)
提供模型额外的知识来源,比如通过矢量数据库检索到的信息、调用API的结果等。 - 提示输入(Prompt Input)
即具体的问题或任务描述,可通过变量化设计实现模板复用。 - 输出指示器(Output Indicator)
标记生成文本的开始。例如,“import”可提示模型生成Python代码。
LangChain提示模板类型
LangChain提供两种基本类型的模板:PromptTemplate 和 ChatPromptTemplate。此外,还扩展了 FewShotPromptTemplate、PipelinePromptTemplate 等以支持复杂场景。
1. PromptTemplate
用于简单的字符串提示模板,适合一般任务。
示例代码:
from langchain import PromptTemplate
template = "你是业务咨询顾问。你给一个销售{product}的公司起一个好的名字?"
prompt = PromptTemplate.from_template(template)
print(prompt.format(product="鲜花"))
输出:
你是业务咨询顾问。你给一个销售鲜花的公司起一个好的名字?
- 优势: 通过占位符动态生成提示,无需手动指定变量。
- 扩展: 可自定义输入变量列表,构造更复杂的提示。
2. ChatPromptTemplate
专为聊天模型设计,可设置多角色对话场景。
示例代码:
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
system_template = "你是一位专业顾问,负责为专注于{product}的公司起名。"
human_template = "公司主打产品是{product_detail}。"
system_msg = SystemMessagePromptTemplate.from_template(system_template)
human_msg = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_msg, human_msg])
prompt = chat_prompt.format_prompt(product="鲜花装饰", product_detail="创新的鲜花设计").to_messages()
- 应用场景: 定义模型角色(System)、用户输入(User)、模型响应(Assistant),用于更自然的对话模拟。
- 特点: 支持与OpenAI聊天模型的
messages格式兼容。
FewShotPromptTemplate:提示工程的核心
FewShotPromptTemplate 提供了“少样本学习”的能力,模型通过示例了解任务,从而提高生成效果。
Few-Shot 提示的意义
Few-Shot概念起源于机器学习,旨在通过少量示例让模型快速掌握任务。在提示工程中,Few-Shot被广泛应用于需要特定格式或语调的生成任务。
1. 构建 FewShotPromptTemplate
创建示例样本:
samples = [
{"flower_type": "玫瑰", "occasion": "爱情", "ad_copy": "玫瑰是浪漫的象征,向爱人表达爱意的最佳选择。"},
{"flower_type": "康乃馨", "occasion": "母亲节", "ad_copy": "康乃馨代表母爱,母亲节最完美的礼物。"}
]
定义示例模板:
from langchain.prompts.prompt import PromptTemplate
example_template = "鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}"
example_prompt = PromptTemplate.from_template(example_template)
创建 FewShotPromptTemplate:
from langchain.prompts.few_shot import FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(
examples=samples,
example_prompt=example_prompt,
suffix="鲜花类型: {flower_type}\n场合: {occasion}",
input_variables=["flower_type", "occasion"]
)
print(few_shot_prompt.format(flower_type="百合", occasion="庆祝"))
输出:
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰是浪漫的象征,向爱人表达爱意的最佳选择。
鲜花类型: 康乃馨
场合: 母亲节
文案: 康乃馨代表母爱,母亲节最完美的礼物。
鲜花类型: 百合
场合: 庆祝
调用大模型生成文案:
from langchain.llms import OpenAI
model = OpenAI(model_name="gpt-3.5-turbo-instruct")
result = model(few_shot_prompt.format(flower_type="向日葵", occasion="鼓励"))
print(result)
2. 使用示例选择器优化提示
当示例过多时,可以使用示例选择器仅选择最相关的Few-Shot示例,节省计算资源。
示例代码:
from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
selector = SemanticSimilarityExampleSelector.from_examples(
samples,
OpenAIEmbeddings(),
Chroma,
k=1
)
optimized_prompt = FewShotPromptTemplate(
example_selector=selector,
example_prompt=example_prompt,
suffix="鲜花类型: {flower_type}\n场合: {occasion}",
input_variables=["flower_type", "occasion"]
)
print(optimized_prompt.format(flower_type="红玫瑰", occasion="爱情"))
输出:
鲜花类型: 玫瑰
场合: 爱情
文案: 玫瑰是浪漫的象征,向爱人表达爱意的最佳选择。
鲜花类型: 红玫瑰
场合: 爱情
- 优势: 根据语义相似度自动选择示例,减少不必要的Token浪费。
- 应用: 适合示例数据量较大的场景,提升生成效率。
总结
- PromptTemplate 适合基础任务,简单灵活。
- ChatPromptTemplate 为对话任务设计,支持多角色互动。
- FewShotPromptTemplate 提供少样本学习能力,通过示例提升生成质量。
- 示例选择器 通过语义匹配选择相关样本,进一步优化提示。
通过以上工具,结合LangChain强大的模块化能力,我们可以构建出高效、灵活的提示工程解决方案,为模型生成的高质量文本奠定基础。