在这里插入图片描述

前言

提⽰词模板(PromptTemplate) 是LangChain的核⼼抽象之⼀,它被⼴泛应⽤于构建⼤语⾔模型(LLM)应⽤的各个环节。

简单来说,只要是需要动态、批量、或有结构地向⼤语⾔模型【发送请求】的地⽅,⼏乎都会⽤到提⽰词模板。

如下:

在这里插入图片描述

一、基础提示词模版(prompt_template.py)

核心概念

使用 ChatPromptTemplate 创建结构化的提示词模版,支持变量占位符动态填充内容。

代码示例

from langchain_core.prompts import ChatPromptTemplate
from langchain_deepseek import ChatDeepSeek

# 定义提示词模版
chatprompt = ChatPromptTemplate([
    ("system", "你是一个专业的翻译,把下面的提示词翻译成{target_language}"),
    ("human", "{input}"),
])

# 实例化模版
message = chatprompt.invoke({
    "input": "你好",
    "target_language": "德语"
}).to_messages()

# 创建 LLM 实例
llm = ChatDeepSeek(
    model="deepseek-chat",
    temperature=0.7,
    max_tokens=8192,
)

# 方式一:链式调用
chain = chatprompt | llm
result = chain.invoke({"input": "你好", "target_language": "德语"})

# 方式二:直接调用
result = llm.invoke(message)

关键要点

  • 消息角色:支持 systemhumanai 等角色定义
  • 变量占位符:使用 {variable_name} 格式定义动态变量
  • 链式操作:通过 | 操作符连接 prompt 和 llm
  • invoke 方法:传入字典参数填充模版变量

二、占位符提示词模版(prompt_template_placeholder.py)

核心概念

使用 placeholder 类型插入完整的消息历史记录,适用于多轮对话场景。

代码示例

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.messages import HumanMessage, AIMessage

# 定义带占位符的模版
chatprompt = ChatPromptTemplate([
    ("system", "站在科学家的角度,回答下面问题"),
    ("placeholder", "{pd}"),
])

# 准备消息历史
message = [
    HumanMessage(content="地球为什么是圆的"),
    AIMessage(content="因为...."),
    HumanMessage(content="那人为什么要呼吸?")
]

# 填充占位符
finalmessage = chatprompt.invoke({"pd": message}).to_messages()

# 调用 LLM
result = llm.invoke(finalmessage)

关键要点

  • placeholder 类型:专门用于插入消息列表
  • 消息对象:使用 HumanMessageAIMessage 构建对话历史
  • 上下文保持:适合需要保留对话上下文的场景
  • 灵活性:可以动态插入任意数量的历史消息

三、官方提示词模版(prompt_sdk.py)

核心概念

通过 LangSmith Hub (https://smith.langchain.com/hub/)获取社区共享的专业提示词模版,快速复用优质 prompt。

如下:

在这里插入图片描述

代码示例

from langsmith import Client
from langchain_core.prompts import ChatPromptTemplate
from langchain_deepseek import ChatDeepSeek

# 从 LangSmith Hub 拉取提示词模版
client = Client()
prompt = client.pull_prompt("hardkothari/prompt-maker")

# 创建链
chain = prompt | ChatDeepSeek(
    model="deepseek-chat",
    temperature=0.7,
    max_tokens=8192,
)

# 调用
result = chain.invoke({
    "lazy_prompt": "你是一个全栈专家",
    "task": "帮我写一个简单的全栈项目"
})

关键要点

  • LangSmith Hub:提示词模版共享平台
  • pull_prompt:通过用户名/模版名拉取模版
  • 即插即用:无需自己编写复杂 prompt
  • 社区资源:利用专业人士优化的提示词

四、少样本增强提示词(fewshot_prompt.py)

核心概念

通过提供少量示例(Few-Shot Learning)引导模型理解任务模式,提升输出质量。

代码示例

from langchain_core.prompts import ChatPromptTemplate, FewShotChatMessagePromptTemplate

# 定义示例样本
examples = [
    {"input": "1$2", "output": "0.5"},
    {"input": "2$3", "output": "0.6666666666666666"},
]

# 定义示例模版
template_prompt = ChatPromptTemplate.from_messages([
    ("human", "{input}"),
    ("ai", "{output}"),
])

# 创建 Few-Shot 提示模版
few_shot_prompt = FewShotChatMessagePromptTemplate(
    examples=examples,
    example_prompt=template_prompt,
    input_variables=["input"],
)

# 组合最终提示词
final_prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个数学老师,下面是一些数学问题和答案示例"),
    few_shot_prompt,
    ("human", "请根据示例回答下面的问题:{input}"),
])

# 创建链并调用
chain = final_prompt | llm
result = chain.invoke({"input": "3$6"})

关键要点

  • 示例驱动:通过 examples 列表提供输入输出样本
  • FewShotChatMessagePromptTemplate:专门处理少样本学习的模版类
  • 模式识别:帮助模型理解特定任务规则(如示例中的除法运算)
  • 组合使用:可与 system、human 等消息类型组合

五、最佳实践总结

使用场景对比

模版类型 适用场景 优势
基础模版 简单的单轮对话 简洁直观,易于上手
占位符模版 多轮对话、上下文保持 灵活插入历史消息
官方模版 复杂任务、专业领域 复用优质 prompt,节省时间
Few-Shot 模版 特定模式识别、规则学习 提升准确性,减少误解

开发建议

  1. 简单任务:优先使用基础模版
  2. 对话系统:使用占位符模版管理上下文
  3. 复杂任务:先搜索 LangSmith Hub 是否有现成模版
  4. 规则学习:使用 Few-Shot 提供示例引导
  5. 变量命名:使用清晰的变量名提高可读性
  6. 测试优化:通过调整 temperature 和示例数量优化效果

解决问题

提⽰词模板解决了以下⼏个核⼼问题:

  1. 可复⽤性: 只需定义⼀个模板,就可以⽤于⽆数个类似的查询。
  2. 关注点分离: 将提⽰词的结构和逻辑(⼯程)与具体的内容和数据分离开。提⽰⼯程师可以专注于优化模板,⽽应⽤程序则负责提供变量值。
  3. ⼀致性: 确保发送给LLM的提⽰词结构统⼀,这有助于获得更稳定、可预测的输出结果。
  4. 可维护性: 如果需要修改提⽰词的⻛格或结构,只需修改⼀个模板⽂件,⽽不⽤在代码的⽆数个地⽅进⾏修改。

六、完整工作流程

# Step 1: 选择合适的模版类型
# Step 2: 定义提示词结构
# Step 3: 准备变量/示例数据
# Step 4: 实例化 LLM
# Step 5: 创建链或直接调用
# Step 6: 获取结果并处理

示例:构建翻译助手

# 1. 定义模版
prompt = ChatPromptTemplate([
    ("system", "你是专业翻译,将{source_lang}翻译成{target_lang}"),
    ("human", "{text}")
])

# 2. 创建链
chain = prompt | ChatDeepSeek(model="deepseek-chat")

# 3. 调用
result = chain.invoke({
    "source_lang": "中文",
    "target_lang": "英文",
    "text": "你好世界"
})
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐