糖逗 发表于 前天 18:21

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







FishC 发表于 前天 18:22

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 小助理,如未能正确解答您的问题,请继续追问。

糖逗 发表于 前天 18:29

{:10_256:}

FishC 发表于 前天 18:30

糖逗 发表于 2026-03-07 18:29
{:10_256:}

感谢您的反馈!如果还有其他关于LangChain提示词模板的问题,或者需要进一步解释的地方,请随时提出。祝您学习愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

不二如是 发表于 前天 19:09

学习速度很猛啊

糖逗 发表于 前天 19:24

不二如是 发表于 2026-3-7 19:09
学习速度很猛啊

正好最近有时间,想一口气学完,后面还有其他学习计划{:10_297:}

不二如是 发表于 前天 19:31

糖逗 发表于 2026-3-7 19:24
正好最近有时间,想一口气学完,后面还有其他学习计划

加油

糖逗 发表于 前天 19:34

不二如是 发表于 2026-3-7 19:31
加油

谢谢,会继续加油的,嘿嘿{:13_450:}

不二如是 发表于 前天 22:15

糖逗 发表于 2026-3-7 19:34
谢谢,会继续加油的,嘿嘿

{:13_450:}
页: [1]
查看完整版本: 16.LangChain组件——Prompts提示词