16.LangChain组件——Prompts提示词
本帖最后由 糖逗 于 2026-3-7 18:58 编辑1. LangChain中的提示词模板介绍
LangChain提供了PromptTemplate类,用来协助优化提示词。PromptTemplate表示提示词模板,可以构建一个自定义的基础出提示词模板,支持变量的注入,最终生成所需的提示词。
PS:PromptTemplat的好处是不仅支持占位符{变量}值的动态变化,而可以基于chain链的写法(后续学习)
2. 代码实战
①通用提示词模板
#方法1:标准写法
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
# zero-shot
prompt_template = PromptTemplate.from_template(
"我的邻居姓{lastname}, 刚生了{gender}, 你帮我起个名字,简单回答。"
)
model = Tongyi(model="qwen-max")
#调用.format方法注入信息即可
prompt_text = prompt_template.format(lastname="张", gender="女儿")
model = Tongyi(model="qwen-max")
res = model.invoke(input=prompt_text)
print(res)
#方法2:基于chain链的写法
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
# zero-shot
prompt_template = PromptTemplate.from_template(
"我的邻居姓{lastname}, 刚生了{gender}, 你帮我起个名字,简单回答。"
)
model = Tongyi(model="qwen-max")
chain = prompt_template | model
res = chain.invoke(input={"lastname": "张", "gender": "女儿"})
print(res)②fewshot提示词模板
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_community.llms.tongyi import Tongyi
# 示例的模板
example_template = PromptTemplate.from_template("单词:{word}, 反义词:{antonym}")
# 示例的动态数据注入 要求是list内部套字典
examples_data = [
{"word": "大", "antonym": "小"},
{"word": "上", "antonym": "下"},
]
few_shot_template = FewShotPromptTemplate(
example_prompt=example_template, # 示例数据的模板
examples=examples_data, # 示例的数据(用来注入动态数据的),list内套字典
prefix="告知我单词的反义词,我提供如下的示例:", # 示例之前的提示词
suffix="基于前面的示例告知我,{input_word}的反义词是?", # 示例之后的提示词
input_variables=['input_word'] # 声明在前缀或后缀中所需要注入的变量名
)
prompt_text = few_shot_template.invoke(input={"input_word": "左"}).to_string()
print(prompt_text)
model = Tongyi(model="qwen-max")
print(model.invoke(input=prompt_text))
③会话提示词模板
会话提示词模板支持注入任意数量的历史会话信息
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_models.tongyi import ChatTongyi
chat_prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一个边塞诗人,可以作诗。"),
MessagesPlaceholder("history"),
("human", "请再来一首唐诗"),
]
)
history_data = [
("human", "你来写一个唐诗"),
("ai", "床前明月光,疑是地上霜,举头望明月,低头思故乡"),
("human", "好诗再来一个"),
("ai", "锄禾日当午,汗滴禾下锄,谁知盘中餐,粒粒皆辛苦"),
]
# StringPromptValue to_string()
prompt_text = chat_prompt_template.invoke({"history": history_data}).to_string()
model = ChatTongyi(model="qwen3-max")
res = model.invoke(prompt_text)
print(res.content, type(res))
3. format和invoke方法
[*]在PromptTemplate(通用提示词模板)和FewShotPromptTenmplate(FewShot提示词模板)的使用中,分别用了format和invoke方法
[*]format和invoke方法的区别
[*]代码实战
from langchain_core.prompts import PromptTemplate
from langchain_core.prompts import FewShotPromptTemplate
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.llms.tongyi import Tongyi
from langchain_community.chat_models.tongyi import ChatTongyi
"""
继承关系
PromptTemplate -> StringPromptTemplate -> BasePromptTemplate -> RunnableSerializable -> Runnable
FewShotPromptTemplate -> StringPromptTemplate -> BasePromptTemplate-> RunnableSerializable -> Runnable
ChatPromptTemplate -> BaseChatPromptTemplate -> BasePromptTemplate-> RunnableSerializable -> Runnable
Tongyi -> BaseLLM -> BaseLanguageModel -> RunnableSerializable -> Runnable
ChatTongyi -> BaseChatModel -> BaseLanguageModel -> RunnableSerializable -> Runnable
"""
template = PromptTemplate.from_template("我的邻居是:{lastname},最喜欢:{hobby}")
res = template.format(lastname="张大明", hobby="钓鱼")
print(res, type(res))
res2 = template.invoke({"lastname": "周杰轮", "hobby": "唱歌"})
print(res2, type(res2))
学习视频:【黑马程序员大模型RAG与Agent智能体项目实战教程,基于主流的LangChain技术从大模型提示词到实战项目】 https://www.bilibili.com/video/BV1yjz5BLEoY/?p=28&share_source=copy_web&vd_source=792a2cb63a1882bff4ed856eadc41a71
1. LangChain 提示词模板介绍
PromptTemplate 是LangChain的核心工具之一。它让你可以创建一个带“占位符”的提示词模板,然后在需要时动态地填入具体内容(比如名字、主题等)。这样就不用每次都重复写完整的提示词了,既方便又统一。
2. 代码实战与修正
① 通用提示词模板
方法1:标准写法
这个方法直接创建模板并格式化,非常简单直接。
from langchain_core.prompts import PromptTemplate
# 为了演示,我们使用一个模拟的LLM,这样无需API密钥也能运行
from langchain_community.llms.fake import FakeListLLM
# 1. 创建模板,用花括号{}定义变量
prompt_template = PromptTemplate.from_template(
"我的邻居姓{lastname}, 刚生了{gender}, 你帮我起个名字,简单回答。"
)
# 2. 使用.format方法,为变量注入具体值
prompt_text = prompt_template.format(lastname="张", gender="女儿")
print("生成的提示词:", prompt_text)
# 3. 使用一个模拟的LLM来演示调用(实际中请替换为Tongyi, OpenAI等真实模型)
# 它预设了回答:“可以叫张婉儿”
mock_llm = FakeListLLM(responses=["可以叫张婉儿"])
res = mock_llm.invoke(prompt_text)
print("模型回复:", res)
方法2:基于chain的写法
Chain可以把多个步骤(如模板、模型调用)链接起来,更自动化。
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.fake import FakeListLLM
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 1. 创建模板和模型
prompt_template = PromptTemplate.from_template(
"我的邻居姓{lastname}, 刚生了{gender}, 你帮我起个名字,简单回答。"
)
mock_llm = FakeListLLM(responses=["可以叫张欣然"])
# 2. 构建一个简单的chain
# 这个chain会:接收输入 -> 填充到模板 -> 调用模型 -> 解析输出为字符串
name_chain = (
{"lastname": RunnablePassthrough(), "gender": RunnablePassthrough()} # 传递输入
| prompt_template # 填充模板
| mock_llm # 调用模型
| StrOutputParser() # 解析输出
)
# 3. 运行chain,一次性传入所有变量值
result = name_chain.invoke({"lastname": "张", "gender": "女儿"})
print(result)
② 少样本提示词模板 (Few-Shot)
少样本模板先给模型看几个例子,再让它完成新任务。你需要补全原帖中缺失的 examples_data 和 input_variables。
from langchain_core.prompts import PromptTemplate, FewShotPromptTemplate
from langchain_community.llms.fake import FakeListLLM
# 1. 定义单个示例的格式模板
example_template = PromptTemplate.from_template("单词:{word}, 反义词:{antonym}")
# 2. 准备具体的示例数据(这里补全了原帖缺失的部分)
examples_data = [
{"word": "大", "antonym": "小"},
{"word": "快", "antonym": "慢"},
{"word": "高", "antonym": "矮"}
]
# 3. 创建少样本提示词模板
few_shot_template = FewShotPromptTemplate(
example_prompt=example_template, # 每个示例使用的模板
examples=examples_data, # 示例数据列表
prefix="告诉我单词的反义词。以下是几个例子:", # 所有示例前的引导语
suffix="现在请回答:单词 {input_word} 的反义词是什么?", # 所有示例后的任务描述
input_variables=["input_word"] # 声明在`suffix`中需要注入的变量名(这里补全了)
)
# 4. 为新的输入生成完整的提示词
prompt_text = few_shot_template.format(input_word="左")
print("生成的完整提示词:\n", prompt_text)
# 5. 使用模拟LLM调用
mock_llm = FakeListLLM(responses=["根据示例,'左'的反义词是‘右’。 "])
print("\n模型回复:", mock_llm.invoke(prompt_text))
核心要点总结:
[*]PromptTemplate: 使用 {变量名} 定义占位符,用 .format() 填入值。
[*]FewShotPromptTemplate: 关键参数是 examples(示例数据)和 input_variables(需要动态填充的变量列表)。
[*]Chain: 可以将模板、模型等组件像管道一样连接起来,让数据自动流转。
[*]示例数据格式: examples 必须是 列表内套字典,且字典的键要与示例模板中的变量名对应。
把上述代码中的 FakeListLLM 替换为 Tongyi(model=“qwen-max”) 并配置好API密钥,就可以连接真实模型进行测试了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 {:10_256:} 糖逗 发表于 2026-03-07 18:29
{:10_256:}
感谢您的反馈!如果还有其他关于LangChain提示词模板的问题,或者需要进一步解释的地方,请随时提出。祝您学习愉快!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 学习速度很猛啊 不二如是 发表于 2026-3-7 19:09
学习速度很猛啊
正好最近有时间,想一口气学完,后面还有其他学习计划{:10_297:} 糖逗 发表于 2026-3-7 19:24
正好最近有时间,想一口气学完,后面还有其他学习计划
加油 不二如是 发表于 2026-3-7 19:31
加油
谢谢,会继续加油的,嘿嘿{:13_450:} 糖逗 发表于 2026-3-7 19:34
谢谢,会继续加油的,嘿嘿
{:13_450:}
页:
[1]