langchain提示词学习要点

提示词(Prompt)在LangChain中扮演着核心角色,直接影响模型输出的质量和准确性。以下是关键学习方向和实践方法:

基础结构设计

  • 明确指令:直接说明任务要求,例如"生成一份关于气候变化的报告摘要"
  • 提供上下文:添加背景信息提升相关性,如"针对2023年联合国气候报告数据"
  • 示例示范:通过few-shot learning提供输入输出示例

高级优化技巧

  • 变量插值:使用{variable}动态插入内容
  • 模板组合:将多个提示模板串联使用
  • 输出解析:指定返回格式如JSON或特定数据结构

常见应用场景

  • 问答系统:设计带知识库约束的提示
  • 文本生成:控制输出长度和风格
  • 数据提取:指定结构化输出要求

调试与评估

  • 记录不同提示版本的输出结果
  • 使用定量指标评估提示效果
  • 通过A/B测试比较不同模板

最佳实践

  • 保持提示词简洁明确
  • 逐步迭代优化提示内容
  • 考虑模型的具体版本特性
  • 处理敏感内容时添加安全约束

下面我介绍三个提示词类:

PromptTemplate

PromptTemplate 用于创建结构化提示词模板,允许动态插入变量。适用于需要重复使用相同提示结构但内容变化的场景。

核心功能

  • 支持变量插值:通过 input_variables 定义占位符,运行时填充具体值。
  • 支持模板格式化:支持 Jinja2 或 f-string 等语法,灵活控制输出格式。

示例代码

from langchain.prompts import PromptTemplate  

template = "请用{style}风格写一篇关于{topic}的文章。"  
prompt = PromptTemplate(input_variables=["style", "topic"], template=template)  
filled_prompt = prompt.format(style="幽默", topic="人工智能")  
print(filled_prompt)  

PromptTemplate 提供了两种填充模板的方法

方法 返回类型 用途
.format str 直接返回字符串
.format_prompt StringPromptValue 返回包装对象(更通用)
prompt=PromptTemplate.from_template(
    "我的邻居是{lastname},刚生了{gender},你帮我起个名字,简单回答,给出我理由"
)

# 方式 1:.format() 返回字符串
prompt_text = prompt.format(lastname="张", gender="男")
print(type(prompt_text))  # <class 'str'>

# 方式 2:.format_prompt() 返回 PromptValue
prompt_value = prompt.format_prompt(lastname="张", gender="男")
print(type(prompt_value))  # StringPromptValue

 

 

FewShotPromptTemplate

FewShotPromptTemplate 用于构建包含示例的提示词,通过少量示例指导模型生成符合预期的输出。适用于需要上下文学习的任务。

核心功能

  • 示例插入:通过 examples 参数提供示例列表,每个示例可包含输入和输出。
  • 示例格式化:支持自定义示例的展示格式(如前缀、分隔符等)。
  • 结构:
  • FewShotPromptTemplate(
        examples=None,        # 示例数据列表
        example_prompt=None,  # 示例的格式化模板
        prefix=None,          # 前缀(指令部分)
        suffix=None,          # 后缀(用户输入部分)
        input_variables=None, # 需要动态注入的变量
        example_separator="\n\n"  # 示例之间的分隔符
    )
     

示例代码

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_community.llms.tongyi import Tongyi

# 1. 定义示例模板
example_template = PromptTemplate.from_template(
    "评论:{review}\n情感:{sentiment}"
)

# 2. 准备示例数据
examples = [
    {
        "review": "这部电影太棒了,演员演技在线!",
        "sentiment": "正面"
    },
    {
        "review": "剧情拖沓,浪费时间,不推荐。",
        "sentiment": "负面"
    },
    {
        "review": "画面精美,但故事一般般。",
        "sentiment": "中性"
    }
]

# 3. 创建 FewShot Prompt
few_shot_prompt = FewShotPromptTemplate(
    examples=examples,
    example_prompt=example_template,
    prefix="请判断以下评论的情感倾向(正面/负面/中性):",
    suffix="评论:{new_review}\n情感:",
    input_variables=["new_review"]
)

# 4. 生成 Prompt
prompt_text = few_shot_prompt.invoke({
    "new_review": "服务态度很好,但是价格有点贵"
}).to_string()

print(prompt_text)

"""
# 输出:
# 请判断以下评论的情感倾向(正面/负面/中性):
#
# 评论:这部电影太棒了,演员演技在线!
# 情感:正面
#
# 评论:剧情拖沓,浪费时间,不推荐。
# 情感:负面
#
# 评论:画面精美,但故事一般般。
# 情感:中性
#
# 评论:服务态度很好,但是价格有点贵
# 情感:
"""


# 5. 调用模型
model = Tongyi(model="qwen-plus")
response = model.invoke(prompt_text)
print(response)  # 输出:中性

高级用法
动态选择示例(Example Selector)当示例很多时,可以智能选择最相关的示例:

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import DashScopeEmbeddings

# 1. 准备大量示例
examples = [
    {"input": "你好", "output": "Hello"},
    {"input": "再见", "output": "Goodbye"},
    {"input": "谢谢", "output": "Thank you"},
    {"input": "对不起", "output": "Sorry"},
    # ... 更多示例
]

# 2. 创建示例选择器(基于语义相似度)
example_selector = SemanticSimilarityExampleSelector.from_examples(
    examples=examples,
    embeddings=DashScopeEmbeddings(),  # 使用嵌入模型
    vectorstore_cls=FAISS,             # 向量数据库
    k=2                                # 选择最相似的 2 个示例
)

# 3. 使用动态示例
few_shot_prompt = FewShotPromptTemplate(
    example_selector=example_selector,  # ⭐ 使用选择器代替 examples
    example_prompt=PromptTemplate.from_template(
        "输入:{input}\n输出:{output}"
    ),
    prefix="翻译以下中文为英文:",
    suffix="输入:{new_input}\n输出:",
    input_variables=["new_input"]
)

# 4. 调用时自动选择最相关的示例
prompt_text = few_shot_prompt.invoke({
    "new_input": "早上好"
}).to_string()

# 会自动选择与"早上好"最相似的 2 个示例(如"你好"、"再见")
print(prompt_text)

ChatPromptTemplate

ChatPromptTemplate 专为对话场景设计,支持多角色消息(如系统、用户、AI)的模板化。适用于聊天机器人或交互式对话任务。

核心功能

  • 多角色支持:通过 SystemMessagePromptTemplateHumanMessagePromptTemplate 等区分角色。
  • 消息序列化:将多条消息按顺序组合为对话上下文。

示例代码

# ChatPromptTemplate: 支持注入任意数量的历史会话消息
from langchain_core.prompts import  ChatPromptTemplate,MessagesPlaceholder
from langchain_community.chat_models.tongyi import ChatTongyi
from dotenv import load_dotenv
load_dotenv()
chat_prompt_template=ChatPromptTemplate.from_messages(
    [
        ("system", "请按照唐诗的格式生成唐诗,且你是边塞诗人"),
        MessagesPlaceholder(variable_name="history"),
        ("human", "再来一首唐诗")
    ]
)

# 方式 1:使用元组(简洁,推荐用于简单场景)
history_data=[
    ("human", "请给我写一首唐诗"),
    ("ai", "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦"),
    ("human", "好诗好诗,再给我来一首"),
    ("ai", "西风瘦马,客输西风,西风瘦马,客输西风"),
]

# 方式 2:使用 Message 对象(规范,推荐用于复杂场景)
history_data_messages = [
    HumanMessage(content="请给我写一首唐诗"),
    AIMessage(content="锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦"),
    HumanMessage(content="好诗好诗,再给我来一首"),
    AIMessage(content="西风瘦马,客输西风,西风瘦马,客输西风"),
]

#链式结构
model=ChatTongyi(model="qwen-plus")
chai=chat_prompt_template|model
res=chai.invoke(input={"history":history_data})
print(res.content)

关键区别

  • PromptTemplate:基础模板,适用于单次输入输出。
  • FewShotPromptTemplate:通过示例引导模型,适合小样本学习。
  • ChatPromptTemplate:面向多轮对话,支持角色化消息编排。

 

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐