微信扫码
与创始人交个朋友
我要投稿
提示模板的类型
提示模板有助于将用户输入和参数转换为语言模型的指令。用于指导模型的响应,帮助其理解上下文并生成相关且连贯的基于语言的输出。
一般提示模板以字典作为输入,其中每个key代表提示模板中要填写的变量。下面介绍两种提示模板:
PromptTemplate
该模板的输出为一个字符串,也可以转换为字符串或消息列表。此方法的存在是为了便于在字符串和消息之间切换。
from langchain_core.prompts import PromptTemplate
prompt_template = PromptTemplate.from_template("回答下面问题:{question}")
pt = prompt_template.invoke({"question": "今天是几号?"})
print(pt.to_string())
# result
# '回答下面问题:今天是几号?'
ChatPromptTemplate
这个提示模板用于格式化消息列表,由模板本身的列表组成。构建和使用 ChatPromptTemplate 的常见方法如下:
from langchain_core.prompts import ChatPromptTemplate
chat_prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
("user", "回答下面问题:{question}")
])
cpt = chat_prompt_template.invoke({"question": "今天是几号?"})
print(cpt.to_messages())
# result
# [SystemMessage(content='You are a helpful assistant'), HumanMessage(content='回答下面问题:今天是几号?')]
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessage
chat_prompt_template = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant"),
MessagesPlaceholder("msgs")# ("placeholder", "{msgs}")
])
print(chat_prompt_template.invoke({"msgs": pt.to_messages()}))
# result
# messages=[SystemMessage(content='You are a helpful assistant'), HumanMessage(content='回答下面问题:今天是几号?')]
例子的结果可以看出,把上面PromptTemplate生成的消息也传进去了,这在消息传输中非常有用,以后构建ChatBot会用到。当然MessagesPlaceholder也可以不显示表示,使用("placeholder","{msgs}")占位。
在PromptTemplate中插入Few-Shot
from langchain_core.prompts import PromptTemplate
example_prompt = PromptTemplate.from_template("Question: {question}\nAnswer: {answer}")
下面给出few-shot的候选集:
examples = [
{"question": "这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。",
"answer": "将所有奇数相加(9、15、1)得到25。答案为False。"},
{"question": "这组数中的奇数加起来是偶数:17、10、19、4、8、12、24。",
"answer": "将所有奇数相加(17、19)得到36。答案为True。"},
{"question": "这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。",
"answer": "将所有奇数相加(11、13)得到24。答案为True。"},
{"question": "这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。",
"answer": "将所有奇数相加(17、9、13)得到39。答案为False。"},
{"question": "中国首都是哪里?",
"answer": "北京"}]
print(example_prompt.invoke(examples[0]).to_string())
# result
Question: 这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。
Answer: 将所有奇数相加(9、15、1)得到25。答案为False。
上面打印出了第一个样例放入prompt后的输出。后面展示使用FewShotPromptTemplate方法拼接完整few-shot到模板中:
from langchain_core.prompts import FewShotPromptTemplate
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix="Question: {input}\nAnswer: ",
input_variables=["input"],
)
print(
prompt.invoke({"input": "这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。"}).to_string()
)
结果如下:
Question: 这组数中的奇数加起来是偶数:4、8、9、15、12、2、1。Answer: 将所有奇数相加(9、15、1)得到25。答案为False。Question: 这组数中的奇数加起来是偶数:17、10、19、4、8、12、24。Answer: 将所有奇数相加(17、19)得到36。答案为True。Question: 这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。Answer: 将所有奇数相加(11、13)得到24。答案为True。Question: 这组数中的奇数加起来是偶数:17、9、10、12、13、4、2。Answer: 将所有奇数相加(17、9、13)得到39。答案为False。Question: 中国首都是哪里?Answer: 北京Question: 这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。Answer:
这样我们就把提供的例子都按格式拼接到Prompt中了;可以看出上面答案都用到了思维链的方式(Chain-of-Thought Prompting)这也是有用的prompt优化方案,目前大模型微调数据都采用了此方法。
添加更好的few-shot
from langchain_chroma import Chroma
from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
example_selector = SemanticSimilarityExampleSelector.from_examples(
# 候选示例集.
examples,
# 向量模型,用于计算相似度.
OpenAIEmbeddings(),
# 向量数据库,用于储存向量和检索.
Chroma,
# 检索k个示例.
k=1,
)
# Select the most similar example to the input.
question = "这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。"
selected_examples = example_selector.select_examples({"question": question})
print(f"Examples most similar to the input: {question}")
for example in selected_examples:
print("\n")
for k, v in example.items():
print(f"{k}: {v}")
Examples most similar to the input: 这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
answer:
将所有奇数相加(11、13)得到24。答案为True。
question: 这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。
下面我来构建FewShotPrompt,prefix可以输入问题的描述,suffix可以输入问题的前缀(上篇文章有介绍,挺重要的。大模型Prompt提示设计简介(2):有效的建议)
prompt = FewShotPromptTemplate(
example_selector=example_selector,
example_prompt=example_prompt,
suffix="\n待判断问题:\nQuestion: {input}\nAnswer: ",
prefix="判断下面句子的对错,按下面例子的格式进行输出:\n例子:",
input_variables=["input"],
)
print(
prompt.invoke({"input": "这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。"}).to_string()
)
判断下面句子的对错,按下面例子的格式进行输出:
例子:
Question: 这组数中的奇数加起来是偶数:16、11、14、4、8、13、24。
Answer: 将所有奇数相加(11、13)得到24。答案为True。
待判断问题:
Question: 这组数中的奇数加起来是偶数:15、32、5、13、82、7、1。
Answer:
这样我们很好的召回了相似的示例作为上下文,这样可以准确的约束模型进行推理,也能对输出的格式进行约束。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-12-21
用LangChain教AI模仿你的写作风格:详细教程
2024-12-18
一站式 LLM 工程观测平台:Langfuse,让所有操作可观测
2024-12-17
LLMs开发者必看!Pydantic AI代理框架震撼登场!
2024-12-16
用LangChain实现一个Agent
2024-12-16
通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统
2024-12-16
大模型部署调用(vLLM+LangChain)
2024-12-14
利用 LangGraph 和代理优化工作流程效率:关键功能、用例和集成...
2024-12-09
深度丨LangChain团队基于Agents用户体验设计的研究
2024-04-08
2024-08-18
2024-06-03
2024-10-10
2024-04-08
2024-04-17
2024-06-24
2024-04-11
2024-07-13
2024-04-12
2024-12-02
2024-11-25
2024-10-30
2024-10-11
2024-08-18
2024-08-16
2024-08-04
2024-07-29