【LangChain】提示词模版

为什么要提示词模版呢?就是为了能够复用,举个例子:比如现在有一个要求,

复制代码
把用户传入的数据,从{language_from}翻译为{language_to}

,我们定义好提示词,只需要传这两个变量即可。定义好模版,我们就可以通过仅仅传入变量来实例化模版

提示词模板就是⼀个可复用的提示词蓝图,它允许我们动态地生成提示词,而不是每次都手动编写完整的提示词。它类似于编程中的字符串格式化功能。你创建⼀个带有"占位符"的模板,然后在运行时,用具体的值(变量)填充这些占位符,从而生成⼀个最终发送给 LLM 的完整提示词

提示词模板解决了以下几个核心问题:

可复用性: 只需定义⼀个模板,就可以用于⽆数个类似的查询

结构性: 将提示词的结构和逻辑(⼯程)与具体的内容和数据分离开。提示工程师可以专注于

优化模板,而应用程序则负责提供变量值。

⼀致性: 确保发送给LLM的提示词结构统⼀,这有助于获得更稳定、可预测的输出结果。

可维护性: 如果需要修改提示词的风格或结构,只需修改⼀个模板⽂件,而不用在代码的无数个地方进行修改

LangChain 提供了 PromptTemplate 类来轻松实现这⼀功能。 PromptTemplate 实现了标准的 Runnable 接口

举个例子:

python 复制代码
model = ChatOpenAI(model="deepseek-chat",
                   api_key=os.environ.get("DEEPSEEK_API_KEY"),
                   openai_api_base="https://api.deepseek.com/v1")

# 方式一:使用from_template
# prompt_template = PromptTemplate.from_template("把用户传入的数据,从{language_from}翻译为{language_to}")

# 方式2,直接构造
prompt_template = PromptTemplate(input_variables=["language_from", "language_to", "text"],
                                 template="把用户传入{text},从{language_from}翻译为{language_to}")

chain = prompt_template | model
# messages = [
#     HumanMessage("我是一个人在战斗!"),
# ]
chain.invoke({
    "language_from": "中文",
    "language_to": "英文",
    "text": "我是一个人在战斗!"
}).pretty_print()

提示词有很多模版,我们再来看一个很常用的

聊天消息模板

ChatPromptTemplate 模板:专为 LangChain 聊天模型设计。可以方便地构建包含 SystemMessage 、 HumanMessage 、 AIMessage 的消息模板。

python 复制代码
# ChatPromptTemplate
template = ChatPromptTemplate(
    [
        ("system", "You are a helpful AI bot. Your name is {name}."),
        ("human", "Hello, how are you doing?"),
        ("ai", "I'm doing well, thanks!"),
        ("human", "{user_input}"),
    ]
)

print(template.invoke({
    "name": "xiaoming",
    "user_input": "what is your name?"
}))

消息占位符

在上⾯的 ChatPromptTemplate 中,我们看到了如何格式化两条消息,每条消息都是⼀个字符串。但如果我们希望将消息插⼊特定位置怎么办?使用 MessagesPlaceholder 。MessagesPlaceholder 负责在特定位置添加消息列表。

python 复制代码
template = ChatPromptTemplate(
    [
        ("system", "You are a helpful AI bot. Your name is {name}."),
        ("human", "Hello, how are you doing?"),
        MessagesPlaceholder("msgs"),
        ("ai", "I'm doing well, thanks!"),
        ("human", "{user_input}"),
    ]
)

# print(template.invoke({
#     "name": "xiaoming",
#     "user_input": "what is your name?"
# }))

messages_to_pass = [
    HumanMessage(content="中国⾸都是哪⾥?"),
    AIMessage(content="中国⾸都是北京。"),
    HumanMessage(content="那法国呢?")
]

print(template.invoke({
    "name": "xiaoming",
    "user_input": "what is your name?",
    "msgs": messages_to_pass
}))

或者这样写也可以:

python 复制代码
template = ChatPromptTemplate(
    [
        ("system", "You are a helpful AI bot. Your name is {name}."),
        ("human", "Hello, how are you doing?"),
        ("placeholder", "{msgs}"),
        ("ai", "I'm doing well, thanks!"),
        ("human", "{user_input}"),
    ]
)

最后调用一下链:

python 复制代码
chain = template | model

这里给小伙伴们推荐一个提示词平台,随着 LLM 的发展,示词变得越来越重要。LangChain 正在打造⼀个与像 GitHub 这样的传统平台, GitHub长期以来⼀直是共享和协作代码的⾸选平台。于是推出了 LangChain Hub 平台。

比如调用一下最火的能够给我们写提示词的模版工具(hardkothari/prompt-maker),我们只需要简单告诉他我们的任务和一些关键性提示词,就能帮我们写出一份合理的系统提示词:

python 复制代码
# Create a LangSmith API in Settings > API Keys
# Make sure API key env var is set:
# import os; os.environ["LANGSMITH_API_KEY"] = "<your-api-key>"
import os

from langchain_openai import ChatOpenAI
from langsmith import Client

client = Client()
prompt = client.pull_prompt("hardkothari/prompt-maker")
# 定义模型
model = ChatOpenAI(model="deepseek-chat",
                   api_key=os.environ.get("DEEPSEEK_API_KEY"),
                   openai_api_base="https://api.deepseek.com/v1")
# 定义链
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
    print("\n Response:")
    chain.invoke({'lazy_prompt': lazy_prompt, 'task': task}).pretty_print()

所以,有了ChatPromptTemplate,我们就无需再在Message中定义了,直接在ChatPromptTemplate定义系统提示词,用户提示词...

相关推荐
大模型真好玩3 天前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent
早点睡啊5 天前
精读 LangChain 官方文档(二)Model 篇:把模型调用升级成工程化推理接口
人工智能·langchain
星始流年7 天前
从 Tool 到 Skill——基于 LangChain 的服务端Skill实现
前端·langchain·agent
codedx8 天前
LangChain 和 LangGraph 构建的 Agent 项目模版
后端·langchain·agent
颜酱8 天前
LangGraph 入门指南
langchain
武子康9 天前
调查研究-186 LangChain 和 LangGraph 的区别:从快速构建 Agent 到生产级工作流编排
人工智能·langchain·llm
葫芦和十三12 天前
渐进发现|代码库不是文档库
langchain·agent·ai编程
柒和远方12 天前
LangGraph 深度解析:从增强型 LLM 到生产级 Agent
langchain·llm·agent
沪漂阿龙13 天前
《LangChain》成本、限流、缓存、降级:AI 应用上线要考虑的问题
人工智能·langchain
段一凡-华北理工大学13 天前
LangChain框架在高炉炼铁智能化领域的应用~系列文章09:工具调用Tool — 让AI学会操作高炉仪表盘
网络·人工智能·架构·langchain·高炉炼铁·高炉智能化·高炉智能体