Langchain简单快速上手教程(八)—— 核心组件之提示词模板

@

前言

本期将要介绍的Langchain关于提示词模板的组件能力。我们都知道提示词在利用AI进行工作时发挥着重要作用,而提示词模板可以将那些反复使用一类结构相识的模板化,这将极大地简化我们使用AI发开的过程。

一、概念

从一个简单的例子出发,例如我们每次询问AI关于某个城市的天气如何,如“今天北京的天气如何?”、“今天上海的天气如何?”,像这样每次询问都会描写重复的消息内容,此时就可以定义一个提示词模板:“今天{city}的天气如何?”,使用时给[city]变量输入对应的值即可。像这样是需要动态、批量、或有结构地向大语言模型【发送请求】的地方,几乎都会用到提示词模板。

同时提示词模板有以下几个特点:

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

二、使用方法

关于提示词模板,LangChain 提供了 PromptTemplate 类与相关的Runnable 接口来实现这一功能。

(一)字符串模板

class langchain_core.prompts.prompt.PromptTemplate 类参数如下
template :提示词模板
input_variables :需要其值作为提示输入的变量的名称列表

内置方法如下
from_template() :从模板定义提示模板。方法返回了一个 PromptTemplate 实例

代码例子:

from langchain_core.prompts import PromptTemplate, ChatPromptTemplate,MessagesPlaceholder
from langchain_deepseek import ChatDeepSeek
from langchain_core.messages import HumanMessage, AIMessage

model = ChatDeepSeek(model = "deepseek-flash")

# 定义文本提示词模板,Runnable 实例
# 方式1
prompt_template1 = PromptTemplate(
    template="介绍{city}的历史",
    input_variables=["city"]
)

# 方式2
prompt_template2 = PromptTemplate.from_template("将文本从{language_from}翻译为{language_to}")

# 调用:实例化模板
print(prompt_template2.invoke({"language_from": "英文", "language_to": "中文"}))

(二)聊天消息模板

ChatPromptTemplate类同时提供了可以方便地构建包含 SystemMessage 、 HumanMessage 、 AIMessage 的消息模板

# 处理聊天消息的模板
chat_prompt_template = ChatPromptTemplate(
    [
        ("system", "将文本从{language_from}翻译为{language_to}"),
        ("user", "{text}"),
    ]
)

messages = chat_prompt_template.invoke(
    {
        "language_from": "英文",
        "language_to": "中文",
        "text": "hi, what is your name?"
    }
)

print(messages)
#实例化结果
messages=[
    SystemMessage(
        content='将文本从英文翻译为中文',
        additional_kwargs={},
        response_metadata={}
    ),
    HumanMessage(
        content='hi, what is your name?',
        additional_kwargs={},
        response_metadata={}
    )
]
model.invoke(messages).pretty_print()

(三)消息占位符

在上面的 ChatPromptTemplate 中,我们看到了如何格式化两条消息,并且每条消息都是⼀个字符串。当我们想要将消息插入特定位置时,可以使用 MessagesPlaceholder 。MessagesPlaceholder 负责在特定位置添加消息列表。

例子如下:

chat_prompt_template = ChatPromptTemplate(
    [
        ("system", "将文本从{language_from}翻译为{language_to}"),
        MessagesPlaceholder("msgs"),  # 消息占位符
        ("user", "{text}"),
        # ("ai", "")
    ]
)

messages_placeholder = [
    HumanMessage(content="hi, what is your name?"),
    AIMessage(content="你好,你叫什么名字?")
]

messages = chat_prompt_template.invoke(
    {
        "language_from": "英文",
        "language_to": "中文",
        "text": "hi, what is your age?",
        "msgs": messages_placeholder,
    }
)
print(messages)

LangChain Hub 的提示词模板

LangChain Hub 是⼀个用于上传、浏览、拉取和管理提示词(prompts)的地方,其作用类似于提示词领域的GitHub。其官方地址如下:点击此处

LangSmith
我们使用 hardkothari/prompt-maker 来作为例子。其中的Prompt Maker 模板是⼀个【提示词生成器】 ,它可以自动化优化提示的过程,从而提高语言模型在各种应用中的质量和效果。

在使用LangChain Hub 内的提示词模板前,我们需要在LangSmith上有一个属于自己的API keys,这方面相关操作在我之前的文章里也有介绍,这里不再再多介绍。

from langchain_deepseek import ChatDeepSeek
from langsmith import Client
import os

client = Client()
# prompt 就是一个提示词模板 , Runnable 实例
prompt = client.pull_prompt(
    "hardkothari/prompt-maker:c5db8eee",
    dangerously_pull_public_prompt=True
)

model = ChatDeepSeek(model = "deepseek-v4-flash")

chain = prompt | model

while True:
    task = input("\n你的任务是什么? (输入 quit 退出聊天)\n")
    if task == 'quit':
        break

    lazy_prompt = input("\n你当前任务对应的提示词是什么? (输入 quit 退出聊天)\n")
    if lazy_prompt == 'quit':
        break

    chain.invoke({"task": task, "lazy_prompt": lazy_prompt}).pretty_print()

通过使用这个模板,可以极大减少手动调整提示词所需的工作量,从从而节省时间和资源。同时 Prompt Maker 通过分析初始提示词的结构和内容,会对原本的提示词进行优化、提高提示词的质量。

结语

以上便是Langchain关于提示词模板的内容。通过使用提示词模板,我们将会极大地提升使用提示词在AI方面的开发效率。如果喜欢我的内容,请点赞、收藏加关注,多多支持我,以及欢迎各位在评论区讨论交流,并指出我的不足,谢谢大家。

posted @ 2026-10-15 10:31  _梦影  阅读(14)  评论(0)    收藏  举报