提示词模板使用(Prompt Template Usage)
使用LangChain创建和使用提示模板来生成结构化的查询。 提示模板(Prompt Template)是一种用于生成提示(prompt)的模板。它允许您使用变量来填充模板,并生成结构化的查询。
技术要点
- 变量替换 : 使用花括号
{}定义模板变量 - 中文支持: 模板支持中文字符串
- 动态生成: 可以根据不同的输入生成不同的查询
- 类型安全: PromptTemplate对象包含输入变量验证
应用场景
- 问答系统构建
- 多语言查询生成
- 结构化提示工程
- 动态内容创建
核心功能说明
PromptTemplate类提供了以下功能:
1. 提示模板定义
- 定义模板字符串,包含变量占位符
- 支持中文字符串
python
from langchain_core.prompts import PromptTemplate
# Define template
template = "{country} 的首都是什么?"
# Create a `PromptTemplate` object using the `from_template` method.
prompt_template = PromptTemplate.from_template(template)
prompt_template
python
prompt = prompt_template.format(country="Korea")
prompt
回答:'Korea 的首都是什么?'
python
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
load_dotenv()
# 创建ChatOpenAI对象,配置为使用硅基流动API
Qwen2_5_7B_Instruct_llm = ChatOpenAI(
temperature=0.1, # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
model_name="Qwen/Qwen2.5-7B-Instruct", # 硅基流动支持的模型名称
openai_api_key=os.getenv("SILICONFLOW_API_KEY"), # 从环境变量获取API密钥
openai_api_base="https://api.siliconflow.cn/v1" # 硅基流动API的基础URL
)
# 创建提示模板对象
prompt = PromptTemplate.from_template("请简单解释一下 {topic} ")
# 将提示模板与模型组合成链
chain = prompt | Qwen2_5_7B_Instruct_llm
#使用管道(' | ')操作符连接' prompt '对象和' model '对象。
#使用' invoke '方法来传递' input '。
#这将返回由AI模型生成的消息
input = {"topic": "人工智能模型中的学习原理"}
# 完整输出
chain.invoke(input)
# 请求流式输出
answer = chain.stream(input)
# 流式输出
for token in answer:
print(token.content, end="", flush=True)
2. 变量替换
- 使用
format方法替换模板变量 - 支持多个变量替换
python
prompt = PromptTemplate.from_template("三句话描述 {topic} ")
# 将提示与模型连接,创建对话链
chain = prompt | Qwen2_5_7B_Instruct_llm | StrOutputParser()
chain.batch(
[
{"topic": "ChatGPT"},
{"topic": "Instagram"},
{"topic": "multimodal"},
{"topic": "programming"},
{"topic": "machineLearning"},
],
config={"max_concurrency": 3},
)
3. 动态生成
- 根据不同输入生成不同查询
python
from langchain_core.runnables import RunnablePassthrough # 用于在链中透传输入参数,保持数据流不变
# 可运行对象
RunnablePassthrough().invoke({"num": 10})
# 输出:{'num': 10}
runnable_chain = {"num": RunnablePassthrough()} | prompt | Qwen2_5_7B_Instruct_llm
# 字典的值已通过 RunnablePassthrough() 更新。
runnable_chain.invoke(10)
回答:'10 是一个偶数'
3.1 高效并行执行方案
python
#高效并行执行方案
from langchain_core.runnables import RunnableParallel
# 创建一个RunnableParallel实例。这个实例允许多个Runnable对象并行执行。
runnable = RunnableParallel(
# 将RunnablePassthrough实例作为'passed'关键字参数传入。这会直接将输入数据原样传递,不做任何修改。
passed=RunnablePassthrough(),
# 使用RunnablePassthrough.assign作为'extra'关键字参数来分配一个lambda函数'mult'。
# 这个函数将输入字典中'num'键对应的值乘以3。
extra=RunnablePassthrough.assign(mult=lambda x: x["num"] * 3),
# 将一个lambda函数作为'modified'关键字参数传入。
# 这个函数将输入字典中'num'键对应的值加1。
modified=lambda x: x["num"] + 1,
)
# 调用runnable实例的invoke方法,传入字典{'num': 1}作为输入。
runnable.invoke({"num": 1})
python
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from datetime import datetime
def get_today(a):
# 获取今天的日期,格式为"月-日"(例如:Jan-01)
return datetime.today().strftime("%b-%d")
# 打印今天的日期
get_today(None)
from langchain_core.runnables import RunnableLambda, RunnablePassthrough
# 创建提示模板:列出{n}位生日在{today}的名人,并包含出生日期
prompt = PromptTemplate.from_template(
"列出{n}位生日在{today}的名人。请包含他们的出生日期。"
)
# 构建链:将"today"字段通过RunnableLambda绑定到get_today函数,"n"字段直接透传
chain = (
{
"today": RunnableLambda(get_today),
"n": RunnablePassthrough()
}
| prompt
| Qwen2_5_7B_Instruct_llm
| StrOutputParser()
)
# 调用链,传入3,表示列出3位今天生日的名人
print(chain.invoke(3))
4. 使用特定itemgetter 提取特定键
itemgetter是Python operator模块中的一个实用函数,具有以下特性和优点:
- 核心功能
-
高效地从字典、元组和列表中的特定键或索引中提取值
-
能够同时提取多个键或索引
-
支持函数式编程风格
- 性能优化问题
-
对于重复的键访问操作,比常规索引更高效
-
优化内存使用
-
处理性能优势
- 在LangChain中的用法
-
链组合中的数据过滤
-
从复杂输入结构中选择性提取
-
与其他Runnable对象组合进行数据预处理
python
# 导入必要的库
from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableLambda
from langchain_openai import ChatOpenAI
Qwen2_5_7B_Instruct_llm = ChatOpenAI(
temperature=0.1, # 控制输出的随机性和创造性,值越低输出越稳定可预测,值越高输出越有创意但可能偏离预期 (范围: 0.0 ~ 2.0)
model_name="Qwen/Qwen2.5-7B-Instruct", # 硅基流动支持的模型名称
openai_api_key=os.getenv("SILICONFLOW_API_KEY"), # 从环境变量获取API密钥
openai_api_base="https://api.siliconflow.cn/v1" # 硅基流动API的基础URL
)
# 返回句子长度的函数
def length_function(text):
return len(text)
# 返回两个句子长度乘积的函数
def _multiple_length_function(text1, text2):
return len(text1) * len(text2)
# 使用_multiple_length_function函数计算两个句子长度的乘积
def multiple_length_function(_dict):
return _multiple_length_function(_dict["text1"], _dict["text2"])
# 创建聊天提示模板
prompt = ChatPromptTemplate.from_template("What is {a} + {b}?")
# 初始化OpenAI聊天模型
model = Qwen2_5_7B_Instruct_llm
# 创建基础链
chain1 = prompt | model
# 创建复杂的处理链
chain = (
{
# 获取word1的长度
"a": itemgetter("word1") | RunnableLambda(length_function),
# 获取word1和word2长度的乘积
"b": {"text1": itemgetter("word1"), "text2": itemgetter("word2")}
| RunnableLambda(multiple_length_function),
}
| prompt
| model
)
# 使用"hello"和"world"作为输入调用链
chain.invoke({"word1": "hello", "word2": "world"})