LangChain提示模板概述| 豆包MarsCode AI刷题

275 阅读4分钟

提示工程(Prompt Engineering)是大语言模型应用中的核心技术,优秀的提示可以显著提升模型的生成质量。本文将结合LangChain,介绍如何利用其提供的各种提示模板,构建从简单到复杂的高效提示框架。


提示结构解析

在设计提示时,可以将其结构化为以下四个部分:

  1. 指令(Instruction)
    指明模型任务的总体要求和执行方式。例如,设定模型的角色为“有用的助手”或“专业顾问”,以确保模型理解任务的核心目标。
  2. 上下文(Context)
    提供模型额外的知识来源,比如通过矢量数据库检索到的信息、调用API的结果等。
  3. 提示输入(Prompt Input)
    即具体的问题或任务描述,可通过变量化设计实现模板复用。
  4. 输出指示器(Output Indicator)
    标记生成文本的开始。例如,“import”可提示模型生成Python代码。

LangChain提示模板类型

LangChain提供两种基本类型的模板:PromptTemplateChatPromptTemplate。此外,还扩展了 FewShotPromptTemplatePipelinePromptTemplate 等以支持复杂场景。

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强大的模块化能力,我们可以构建出高效、灵活的提示工程解决方案,为模型生成的高质量文本奠定基础。