大模型应用开发(九)_LangChain提示词模板

4. 提示词模板LangChain

提示词工程的基石:LangChain 提示词模板的艺术与实践

在 LLM 应用开发中,提示词(Prompt)是核心。但如果直接将提示词硬编码在代码中,会导致代码混乱、难以维护、不易优化

  • LangChain 的解决方案: LangChain 的 PromptTemplate 模块提供了一套标准、动态、可复用的机制,将提示词工程从业务逻辑中解耦出来,使开发者能像管理配置文件一样管理和迭代提示词。

4.1 PromptTemplate 的本质

提示词模板是 LangChain 对提示词工程的抽象化结构化

  • 定义: PromptTemplate 本质上是一个包含变量固定文本的字符串。它允许您将静态的指令、角色定义、以及格式要求与动态的用户输入(或中间结果)完美地结合起来。
  • 作用: 它是 LLM 应用中连接数据模型的桥梁,确保每次对 LLM 的调用都能接收到格式正确且上下文丰富的输入。

4.2 LangChain 模板的优势

优势点 详细描述 实际价值
可复用性 (Reusability) 一旦定义了模板,就可以在应用的不同部分,甚至不同的 Chain 中重复使用。 提升开发效率,确保提示词风格和要求的一致性。
动态输入 (Dynamic Inputs) 模板允许运行时注入变量,例如用户的提问、检索到的文档片段、或对话历史等。 使提示词能根据实时数据变化,实现上下文感知的交互。
工程化管理 (Engineering) 将提示词从 Python/JavaScript 代码中分离出来,便于版本控制、审计和A/B测试。 将提示词工程(Prompt Engineering)变成一个可管理的软件资产
类型抽象 (Abstraction) LangChain 提供多种模板类型(如 PromptTemplateChatPromptTemplate),以适应不同模型类型(文本模型 vs. 聊天模型)。 开发者无需关心底层模型如何区分"系统指令"、"用户消息"和"助手回复"。

4.3 提示模板类型

序号 提示模板类型 含义 / 功能 / 用途 关键参数 / 特点 备注 / 在官方文档中的定位 / 限制
1 PromptTemplate 最基础的字符串模板。用于将若干输入参数填入模板中,生成一条完整的 prompt 字符串 template(模板字符串)、input_variablespartial_variablestemplate_format(如 f-string、jinja2、mustache) LangChain+2LangChain+2 在官方 API 参考中有清晰定义。可用 PromptTemplate.from_template(...) 构造。 LangChain
2 ChatPromptTemplate 用于构建对话/聊天风格的提示,由多条消息 (system / human / ai) 组成 通常由若干消息模板组成,如 SystemMessagePromptTemplateHumanMessagePromptTemplate 等;接收 input variables 用于格式化各条消息 LangChain+2python.langchain.com.cn+2 在 LangChain 的 "Prompt Templates" 概念页有说明:ChatPromptTemplate 用来格式化一系列消息以交给聊天模型。 LangChain
3 FewShotPromptTemplate 在 prompt 中插入若干示例 (few-shot examples) 来"教"模型如何回答 example_prompt(单个示例模板)、examplesexample_selectorprefixsuffixexample_separatorinput_variablesLangChain+2python.langchain.com.cn+2 在官方 API Reference 有定义 FewShotPromptTemplate。 LangChain
4 PipelinePrompt / PipelinePromptTemplate 用于把多个子提示模板按顺序组合起来,最终生成一个整体 prompt final_prompt(最终模板),pipeline_prompts(一个由 (name, 子模板) 组成的列表) python.langchain.com.cn+1 在 LangChain 中文组合文档中称为 PipelinePrompt(或 PipelinePromptTemplate),用于重用、组合提示模板。 python.langchain.com.cn
5 自定义模板 用户可以继承现有模板类(如继承 StringPromptTemplateBaseChatPromptTemplate 等)来自定义自己的逻辑 通常要实现模板渲染逻辑(format/invoke 等方法)、变量管理、可能自定义流程 在 LangChain 官方文档中虽不一定有专门一节叫 "自定义模板",但在 "Prompt 组合 / 扩展" 相关章节有提及;在中文翻译或社区资料中,也有 "自定义模板" 的说法。 知乎专栏+2千帆大模型平台+2

4.4 代码应用示例

4.4.1 客服助手

这段代码演示了如何使用 LangChain 框架构建一个基于 OpenAI 聊天模型 的客服助手,并清晰地展示了 ChatPromptTemplate 的工程化使用流程。

具体代码如下

复制代码
from langchain_openai import ChatOpenAI
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)

# 定义模型
llm = ChatOpenAI(model_name="gpt-4o-mini")

# 定义 Prompt 模板
template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template("你是 {product} 的客服助手,你的名字叫 {name}"),
    HumanMessagePromptTemplate.from_template("{query}")
])

# 格式化 Prompt
prompt = template.format_messages(
    product="智能家居",
    name="小傻子",
    query="你是谁?"
)

# 打印 Prompt
print(prompt)

# 调用模型
response = llm.invoke(prompt)

# # 打印结果
# print(response)
print(response.content)

4.4.2 多语言翻译专家

这段代码使用 LangChain 框架,构建了一个复杂的动态、多任务翻译工作流。它通过提示词模板(Prompt Templates)将 LLM 打造成一个"多语言翻译专家",能够根据每次请求的不同参数(输入语言、输出语言、翻译风格)动态地生成提示词,并循环执行多个定制化的翻译任务。

具体代码如下

复制代码
from langchain.prompts import (
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)
from langchain_openai import ChatOpenAI

# 定义 System 提示模板
system_template_text = (
    "你是一位多语言超译专家,能够将 {input_language} 翻译成 {output_language},"
    "并根据用户指定的风格 {style} 输出自然流畅、符合语境的译文。"
)
system_prompt_template = SystemMessagePromptTemplate.from_template(system_template_text)

# 定义 Human 提示模板
human_template_text = "原文内容:{text}"
human_prompt_template = HumanMessagePromptTemplate.from_template(human_template_text)

# 定义模型
llm = ChatOpenAI(model="gpt-4o-mini")

# 多组输入
requests = [
    {
        "input_language": "英语",
        "output_language": "汉语",
        "text": "I'm so hungry I could eat a horse",
        "style": "文言文"
    },
    {
        "input_language": "法语",
        "output_language": "英语",
        "text": "Je suis désolé pour ce que tu as fait",
        "style": "古英语"
    },
    {
        "input_language": "俄语",
        "output_language": "意大利语",
        "text": "Сегодня отличная погода",  # 正确俄语写法
        "style": "网络用语"
    },
    {
        "input_language": "韩语",
        "output_language": "日语",
        "text": "오늘은 정말 좋은 날이에요",  # 韩语:今天真是好日子
        "style": "俚语"
    }
]

# 循环执行每个请求
results = []
for req in requests:
    system_prompt = system_prompt_template.format(
        input_language=req["input_language"],
        output_language=req["output_language"],
        style=req["style"]
    )
    human_prompt = human_prompt_template.format(text=req["text"])

    response = llm.invoke([system_prompt, human_prompt])
    results.append({
        "输入语言": req["input_language"],
        "输出语言": req["output_language"],
        "风格": req["style"],
        "原文": req["text"],
        "译文": response.content.strip()
    })

# 输出结果
print("\\n===== 翻译结果 =====")
for r in results:
    print(f"\\n {r['输入语言']}  {r['输出语言']} (风格:{r['风格']})")
    print(f"原文:{r['原文']}")
    print(f"译文:{r['译文']}")
相关推荐
袋鼠云数栈6 小时前
官宣!ChunJun 1.16 Release 版本发布!
大数据·经验分享·大模型
W_Meng_H6 小时前
LangChain Agent - 通义千问+工具 (流式输出)
langchain
Wilber的技术分享9 小时前
【大模型实战笔记 7】RAG技术:从原理到实战——基于Streamlit的智能文档问答系统
人工智能·笔记·langchain·llm·问答系统·rag·知识库检索
Yeliang Wu10 小时前
LLaMA-Factory 分布式训练实践
大模型·微调·分布式训练·llamafactory·调优算法
工藤学编程11 小时前
零基础学AI大模型之新版LangChain向量数据库VectorStore设计全解析
数据库·人工智能·langchain
我很哇塞耶11 小时前
告别VAE压缩损耗,南京大学用DiP让扩散模型回归像素空间,实现10倍加速与SOTA级画质
人工智能·ai·大模型·图像生成
SiYuanFeng11 小时前
chatgpt降智的解决办法:
chatgpt
Yeliang Wu11 小时前
从原理到部署:LLaMA Factory 量化实战(Ubuntu 22.04)——PTQ/GPTQ/AWQ 等 9 种方法
大模型·微调·分布式训练·llamafactory·调优算法
七夜zippoe12 小时前
基于MLC-LLM的轻量级大模型手机端部署实战
android·智能手机·架构·大模型·mlc-llm