提示词Prompts(1)

摘要: 本文介绍了langchain.prompts中基础的提示词模板的用法,包括基础的文本模板、对话模板、小样本模板、以及主要两种样本选择器的用法。

文章目录

    • [1. prompts介绍?](#1. prompts介绍?)
    • [2. 提示词模板体系 Prompt Templates](#2. 提示词模板体系 Prompt Templates)
      • [2.1 基础文本模板 PromptTemplate](#2.1 基础文本模板 PromptTemplate)
      • [2.2 对话模板 ChatPromptTemplate](#2.2 对话模板 ChatPromptTemplate)
      • [2.3 小样本提示模板Few-shot](#2.3 小样本提示模板Few-shot)
      • [2.4 示例选择器Example Selector](#2.4 示例选择器Example Selector)
        • [2.4.1 按长度选择 LengthBasedExampleSelector](#2.4.1 按长度选择 LengthBasedExampleSelector)
        • [2.4.2 按相似度选择 LengthBasedExampleSelector](#2.4.2 按相似度选择 LengthBasedExampleSelector)

1. prompts介绍?

  • 提示词:就是输入给LLM的内容。包括我们和LLM对话的内容,

  • LangChain的Prompts模块是构建对话系统的核心组件,它通过结构化模板实现精准的提示工程管理。该模块将自然语言指令转化为大模型可解析的标准化输入,显著提升AI交互质量。

2. 提示词模板体系 Prompt Templates

LangChain 提供了 PromptTemplates,可以让用户根据输入动态地修改提示;提示词模板是一种预定义的文本结构,其中包含变量和固定文本部分,用于引导语言模型生成特定类型的输出。这些模板可以帮助模型更准确地理解上下文,并生成符合预期的响应。

提示词模板(Prompt Template)在自然语言处理和生成任务中,是设计和优化模型输入的一种方法。提示词模板可以帮助大型语言模型(LLM)更好地理解和生成目标内容。以下是提示词模板的介绍及其

在不同场景中的应用。

通常提示词模板包含两部分:

  • 静态部分:用于提供上下文,背景或引导语等用于控制LLM的大的方向。
  • 动态部分:根据具体输入替换,在模板中用占位符表示变量。

2.1 基础文本模板 PromptTemplate

python 复制代码
from langchain_core.prompts import PromptTemplate

# 定义含变量的模板
template = "请为{product}写广告语,突出{feature}特点"
prompt = PromptTemplate(
    input_variables=["product", "feature"],
    template=template
)

# 填充变量生成最终提示
filled_prompt = prompt.format(product="智能手表", feature="健康监测")

# 输出:请为智能手表写广告语,突出健康监测特点
print(filled_prompt)

输出:

markup 复制代码
请为智能手表写广告语,突出健康监测特点

使用partial_variables提前固定部分参数:

python 复制代码
# 预设置部分变量
partial_prompt = prompt.partial(product="电动汽车")
print(partial_prompt.format(feature="续航能力"))
# 输出:请为电动汽车写广告语,突出续航能力特点

2.2 对话模板 ChatPromptTemplate

用于对结构化的聊天消息管理,支持区分角色区分。

python 复制代码
from langchain.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages([
    ("system", "你是一位{role}"),
    ("human", "请分析:{question}") 
])
filled_chat = chat_template.format_messages(
    role="金融顾问", 
    question="当前股市走势"
)

print(filled_chat)
markup 复制代码
[SystemMessage(content='你是一位金融顾问', additional_kwargs={}, response_metadata={}), HumanMessage(content='请分析:当前股市走势', additional_kwargs={}, response_metadata={})]

我们可以看到它返回一个BaseMessage类型,可以直接传给聊天模型

python 复制代码
response = model.invoke(prompt)

2.3 小样本提示模板Few-shot

Few-shot examples 是一组可帮助语言模型生成更好响应的示例。要生成具有 few-shot examples 的 prompt,可以使用 FewShotPromptTemplate。该类接受一个 PromptTemplate 和一组 few-shot examples。然后,它使用这些 few-shot examples 格式化成 prompt 模板。

示例:输入一个情绪的词,要返回对应情绪的表现;我们根据提示词,告诉模型,什么是"情绪的表现"。

python 复制代码
'''
创建大模型LLM
'''
from langchain.chat_models import ChatOpenAI
# 定义模型调用API URL
base_url = "https://api.deepseek.com/v1"
# 定义模型调用API KEY(实际应用会放到环境变量中,避免明文暴露)
api_key = "你自己的api key"
# 定义模型名称(对应DeepSeek-V3)
model='deepseek-chat' 
llm= ChatOpenAI(
    base_url=base_url,
    api_key=api_key,
    model=model)


'''
创建小样本提示词模板
'''
from langchain import FewShotPromptTemplate

# 示例样本
examples = [{"input": "高兴", "output": "笑容满面"}, 
            {"input": "悲伤", "output": "泪流满面"}]

# 创建提示词模板
example_template = "输入:{input}\n输出:{output}"

example_prompt = PromptTemplate.from_template(example_template)

# 小样本提示词模板
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_prompt,
    prefix="请给出每个输入的情感进行分析,给出对应的表现。",
    suffix="输入:{text}\n输出:",
    input_variables=["text"]
)

# 格式化提示词
prompt_text = few_shot_prompt.format(text="愤怒")

'''
调用模型
'''
response = llm.invoke(prompt_text)
print("LLM 输出:")
print(response.content)

输出:

markup 复制代码
LLM 输出:
怒目圆睁

2.4 示例选择器Example Selector

在大量示例情况下,因为大量的示例会浪费token,还可能超出token限制。Example Selector可以从大量的示例中,自动选择最合适的部分示例纳入到提示词中。

主要两种方式选择:

  • 按长度: 较长的输入,选择较少示例;反之,较短输入,选择更多示例。
  • 按相似度: 查找与输入具有最大余弦相似度的嵌入示例。
2.4.1 按长度选择 LengthBasedExampleSelector

他可以根据输入文本长度自动增减示例数量,短输入时提供更多上下文示例,长输入时减少示例以避免超出模型上下文窗口限制。通过预设的max_length参数确保提示总长度不超过模型处理上限。

python 复制代码
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.example_selectors import LengthBasedExampleSelector

# 定义示例集
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "fast", "output": "slow"},
    {"input": "wind", "output": "calm"}
]

# 创建示例模板
example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}"
)

# 初始化选择器
selector = LengthBasedExampleSelector(
    examples=examples,
    example_prompt=example_prompt,
    max_length=10  # 假设模型上下文窗口为30字符
)

# 构建动态提示
dynamic_prompt = FewShotPromptTemplate(
    example_selector=selector,
    example_prompt=example_prompt,
    prefix="生成反义词",
    suffix="Input: {adjective}\nOutput:",
    input_variables=["adjective"]
)

# 测试不同长度输入
print(dynamic_prompt.format(adjective="big"))      # 显示全部3个示例
print(dynamic_prompt.format(adjective="extremely and huge and massive"))  # 可能只显示1个示例
2.4.2 按相似度选择 LengthBasedExampleSelector

以下是一个根据为输入,提供一个反义词的例子,当输入一个词时选择器会根据语义选择相近的例子;本例中,输入"red",选择器选择了和颜色相关的示例作为输出。

python 复制代码
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS

# 初始化嵌入模型embedings
model = "nomic-embed-text:latest"  # 模型名称
base_local_url = "http://localhost:11434" # 本地部署模型
embedings = OllamaEmbeddings(   # ①
    base_url=base_local_url,
    model=model
)

# 定义示例集
examples = [
    {"input": "happy", "output": "sad"},
    {"input": "tall", "output": "short"},
    {"input": "fast", "output": "slow"},
    {"input": "wind", "output": "calm"},
    {"input": "black", "output": "white"},
    {"input": "Light", "output": "Dark"},
    {"input": "Bright", "output": "Dull"},
    {"input": "Rainy", "output": "Dry"},
    {"input": "Warm", "output": "Cool"},
    {"input": "Summer", "output": "Winter"}
]

# 创建示例模板
example_prompt = PromptTemplate(
    input_variables=["input", "output"],
    template="Input: {input}\nOutput: {output}"
)

# 初始化选择器
selector = SemanticSimilarityExampleSelector.from_examples(
    examples=examples,
    embeddings=embedings, 
    vectorstore_cls=FAISS, # 使用Faiss作为矢量库
    k=3,# 选择三个相似的示例
    input_keys=["input"]
)

# 构建动态提示
dynamic_prompt = FewShotPromptTemplate(
    example_selector=selector,
    example_prompt=example_prompt,
    prefix="生成反义词",
    suffix="Input: {input}\nOutput:",
    input_variables=["input"]
)

# 测试不同长度输入
print(dynamic_prompt.format(input="red"))     

输出:

markup 复制代码
生成反义词

Input: Bright
Output: Dull

Input: black
Output: white

Input: Light
Output: Dark

Input: red
Output:

注:① 本例中使用本地部署一个Ollama框架Embedding模型,Ollama后续文章介绍。

**Embedding Model:**嵌入模型是一种将离散的高维数据(如单词、句子、图片等)映射到连续的低维向量空间的技术;嵌入模型的主要目的是捕捉输入数据中的语义或特征信息,使得相似的输入在嵌入空间中距离更近。嵌入模型通常计算高效,适合用于大规模数据的相似性搜索和分类任务。
嵌入模型适用场景:

  1. 文本相似度计算:比较两个文本的嵌入向量,计算相似度。
  2. 信息检索:通过嵌入向量进行高效的相似性搜索。
  3. 分类和聚类:使用嵌入向量进行文本或图像的分类和聚类。