零基础学AI大模型之LangChain-PromptTemplate
大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
---|---|
实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
AI大模型 | 零基础学AI大模型之Prompt提示词工程 |
前情摘要:
1、零基础学AI大模型之读懂AI大模型
2、零基础学AI大模型之从0到1调用大模型API
3、零基础学AI大模型之SpringAI
4、零基础学AI大模型之AI大模型常见概念
5、零基础学AI大模型之大模型私有化部署全指南
6、零基础学AI大模型之AI大模型可视化界面
7、零基础学AI大模型之LangChain
8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路
9、零基础学AI大模型之Prompt提示词工程
本文章目录
- 零基础学AI大模型之LangChain:PromptTemplate核心用法与实战解析
- 一、先搞懂:什么是PromptTemplate?
- 二、核心要素:3个关键变量+2个常用方法
- 三、实战案例:从基础到进阶(附代码解析)
- 案例1:基础款——手动定义模板与变量
- 案例2:快捷款——用from_template自动推断变量
- 案例3:进阶款——用partial_variables设置默认值
- 案例4:实战款——PromptTemplate结合LLM生成结果
- 四、新手避坑:3个常见问题与解决方案
- 五、总结:PromptTemplate的核心价值
零基础学AI大模型之LangChain:PromptTemplate核心用法与实战解析
在“零基础学AI大模型”系列中,我们已经掌握了LangChain的基础框架(第7篇),而今天要聚焦的PromptTemplate,正是LangChain中“让提示词结构化、可复用”的核心组件——它就像“提示词的预制菜谱”,帮你把零散的需求(食材)变成标准化的指令(菜品),避免重复写硬编码提示词的麻烦。下面从基础概念到实战案例,一步步拆解它的用法。
一、先搞懂:什么是PromptTemplate?
对零基础同学来说,不用记复杂定义,记住一句话:
PromptTemplate是LangChain中用于构建“带占位符的提示词模板”的工具——它能把“固定文本”和“动态变量”(比如用户输入、业务数据)拼合成LLM能理解的完整提示词,同时解决两个核心问题:
- 动态组装内容:比如写广告语时,只需改“产品名”变量,不用重新写整个提示词;
- 避免硬编码:不用把“领域、语言、问题”这些可变内容写死在代码里,后续修改更灵活。
这里要注意一个区分:PromptTemplate是单纯的文本模板(只处理字符串拼接),后续我们会学的ChatPromptTemplate(对话模板)是它的进阶版,专门适配多轮对话场景,今天先聚焦基础的PromptTemplate。
二、核心要素:3个关键变量+2个常用方法
想用好PromptTemplate,必须掌握它的核心组成部分,我们用“菜谱类比”帮你理解:
核心要素 | 作用(对应菜谱) | 通俗解释 |
---|---|---|
template | 菜谱框架(固定步骤) | 带占位符的文本,比如“为{product}写3个广告语” |
input_variables | 必须准备的“食材清单” | 需要手动填充的变量(如product),必填 |
partial_variables | 提前备好的“预制配料”(可选) | 固定不变的变量(如默认语言“中文”),不用每次填 |
format()方法 | 按菜谱组合食材 | 填充所有input_variables,生成最终提示词 |
from_template()方法 | 自动识别“食材清单”的快捷方式 | 不用手动写input_variables,模板里的{变量}会被自动识别 |
三、实战案例:从基础到进阶(附代码解析)
下面用4个递进案例,结合“零基础友好”的代码注释,帮你快速上手(所有案例可直接复制运行,注意替换API密钥等个人信息)。
案例1:基础款——手动定义模板与变量
场景:生成不同领域的专业回答(比如网络安全、Java开发),需要灵活切换“领域”和“问题”。
# 1. 导入PromptTemplate(从langchain核心库中引入,和系列前文LangChain框架呼应)
from langchain.prompts import PromptTemplate # 2. 定义模板(template):固定文本+{占位符},占位符就是要动态填的变量
template = """
你是一位专业的{domain}顾问,请用{language}回答以下问题,要求简洁易懂(适合零基础):
问题:{question}
回答:
""" # 3. 创建PromptTemplate实例:指定“必须填的变量”(input_variables)
prompt = PromptTemplate( input_variables=["domain", "language", "question"], # 3个必填变量,少填会报错template=template # 关联上面定义的模板
) # 4. 查看模板结构(可选,帮你确认变量是否正确)
print("模板结构:", prompt)
# 输出会显示:input_variables=['domain', 'language', 'question'], template=...# 5. 用format()填充变量,生成最终提示词
final_prompt = prompt.format( domain="网络安全", # 填“领域”变量language="中文", # 填“语言”变量question="如何防范钓鱼攻击?" # 填“问题”变量
) # 6. 查看最终提示词(实际调用大模型时,就用这个final_prompt作为输入)
print("\n最终提示词:", final_prompt)
运行效果预期:
最终提示词会变成:
“你是一位专业的网络安全顾问,请用中文回答以下问题,要求简洁易懂(适合零基础):
问题:如何防范钓鱼攻击?
回答:”
关键提醒:input_variables里的变量必须全部在format()中填充,少一个都会报错。
案例2:快捷款——用from_template自动推断变量
场景:模板里的变量少(比如只有2个),不想手动写input_variables,让LangChain自动识别。
from langchain.prompts import PromptTemplate # 1. 定义模板:里面有{target_language}和{text}两个占位符
template = "请将以下文本翻译成{target_language},翻译后保持原意不变:\n文本:{text}"# 2. 用from_template()创建实例:自动识别模板中的{变量},生成input_variables
prompt = PromptTemplate.from_template(template) # 3. 查看自动推断的变量(验证是否正确)
print("自动识别的变量:", prompt.input_variables) # 输出:['target_language', 'text']# 4. 填充变量(和案例1一样用format())
final_prompt = prompt.format( target_language="英语", text="LangChain的PromptTemplate很适合零基础学习"
) print("\n最终提示词:", final_prompt)
核心优势:适合新手——不用手动核对input_variables,减少“漏写变量”的错误,尤其是模板变量较多时。
案例3:进阶款——用partial_variables设置默认值
场景:有些变量固定不变(比如默认“分析类型=情感极性分析”),不想每次format()都重复填。
from langchain.prompts import PromptTemplate # 1. 定义模板:包含“固定默认变量”{analysis_type}和“动态变量”{user_input}
template = """分析用户输入的情绪(默认分析类型:{analysis_type}):
用户输入:{user_input}
分析结果(要求:用“正面/负面/中性”总结,再补1句解释):"""# 2. 创建实例:用partial_variables固定默认值,input_variables只填“动态变量”
prompt_template = PromptTemplate(input_variables=["user_input"], # 只需要填“用户输入”这个动态变量template=template,template_format="f-string", # 指定模板格式为f-string(适配Python字符串语法)partial_variables={"analysis_type": "情感极性分析"} # 固定“分析类型”,不用每次填
)# 3. 填充动态变量(只需填user_input)
final_prompt = prompt_template.format(user_input="这个产品太难用了")
print("最终提示词:", final_prompt)# 4. 查看模板的所有属性(可选,帮你理解内部结构)
print("\n模板文本:", prompt_template.template)
print("必填变量:", prompt_template.input_variables)
print("默认变量:", prompt_template.partial_variables)
运行效果预期:
最终提示词中,{analysis_type}会自动替换成“情感极性分析”,无需手动填:
“分析用户输入的情绪(默认分析类型:情感极性分析):
用户输入:这个产品太难用了
分析结果(要求:用“正面/负面/中性”总结,再补1句解释):”
案例4:实战款——PromptTemplate结合LLM生成结果
场景:把模板和大模型(如千问)结合,生成实际内容(比如介绍LangChain-PromptTemplate),这是真实项目中最常用的流程。
# 1. 导入需要的库:模板、大模型、输出解析器(和系列前文“调用大模型API”呼应)
from langchain_core.prompts import PromptTemplate # LangChain核心模板
from langchain_openai import ChatOpenAI # 千问等模型的调用类(兼容OpenAI格式)
from langchain_core.output_parsers import StrOutputParser # 解析大模型输出的工具# 2. 创建PromptTemplate:生成“面向年轻人的产品广告语”
prompt_template = PromptTemplate(input_variables=["product"], # 动态变量:产品名template="为{product}写3个吸引年轻人的介绍语,要求:1. 带网络热词(如“绝绝子”“刚需”);2. 每句不超过15字",
)# 3. 填充模板变量(生成最终提示词)
# 用invoke()替代format():LangChain新版推荐用法,支持后续和大模型“链式调用”
prompt = prompt_template.invoke({"product": "LangChain-PromptTemplate"})model = ChatOpenAI(model_name='deepseek-r1:7b', # 本地模型名称,根据实际情况填写base_url="http://127.0.0.1:11434/v1", # 本地模型API地址api_key="none", # 本地模型通常不需要真实API密钥temperature=0.7 # 可根据需要调整温度参数
)# 5. 调用大模型生成结果
response = model.invoke(prompt) # 把提示词传给大模型
# print("大模型原始输出:", response) # 原始输出是对象,包含content、role等信息# 6. 解析输出结果(用StrOutputParser提取纯文本,避免处理复杂对象)
out_parser = StrOutputParser()
answer = out_parser.invoke(response) # 提取response中的content文本# 7. 打印最终结果
print("\n大模型生成的介绍语:")
print(answer)
运行效果预期:
大模型会输出3句符合要求的广告语,比如:
- AI小能手绝绝子!一键搞定各种需求!你还在等什么?
- 用LangChain-PromptTemplate,秒变创意达人!还在犹豫做什么?
- 创意插上翅膀,轻松实现想要的效果!这就是 LangChain-PromptTemplate!
关键提醒:
- API密钥要替换成自己的(从千问、OpenAI等平台获取),否则会调用失败;
- temperature=0.7:如果想要更固定的结果,可设为0.2;想要更多样化,设为0.9。
四、新手避坑:3个常见问题与解决方案
在实际使用中,零基础同学容易遇到以下问题,提前规避能少走弯路:
常见问题 | 原因分析 | 解决方案 |
---|---|---|
format()时报错“缺少变量” | input_variables中的变量没全部填充 | 1. 用prompt.input_variables查看需要填的变量;2. 检查format()中是否漏填 |
模板变量识别错误 | 用了特殊符号(如{ }里加空格),或from_template没识别到 | 1. 变量名不要加空格(如{product},不是{ product });2. 手动指定input_variables |
结合LLM时输出是对象 | 没加输出解析器,直接打印response对象 | 导入StrOutputParser,用out_parser.invoke(response)提取纯文本 |
五、总结:PromptTemplate的核心价值
对“零基础学AI大模型”的同学来说,PromptTemplate不是“必学的复杂工具”,而是“提高效率的实用技巧”——它的核心价值在于:
- 降本:不用重复写提示词,改变量就行;
- 提效:模板可复用,团队内共享后不用各自造轮子;
- 避错:结构化模板减少“提示词遗漏关键信息”的问题。
下一篇我们会进阶学习ChatPromptTemplate,看看如何用它处理多轮对话场景(比如客服机器人、连续问答),记得结合今天的PromptTemplate基础来学哦!
喜欢请点赞收藏。如果有想看的内容,也可以在评论区告诉我~