Prompt介绍
LangChain 中的“Prompt”是一个关键概念,指的是输入给大型语言模型(LLM)的文本指令或提示,用于引导模型生成特定的输出或执行特定的任务。
在 LangChain 的框架中,prompt 的设计和使用对于构建高效、准确的链式应用至关重要。
Prompt的应用场景
-
任务定义:通过精心设计的 prompt,可以明确告诉 LLM 要执行什么任务。例如:对于问答系统,prompt 可能包含问题文本和指示模型生成答案的指令。
-
上下文提供:Prompt 可以包含必要的上下文信息,以帮助 LLM 理解当前任务的背景和上下文。这对于处理具有复杂依赖关系或需要跨多个步骤推理的任务尤为重要。
-
示例引导:通过提供示例 prompt(即少样本学习或零次学习中的例子),可以指导 LLM 如何生成符合要求的输出。这种方法特别适用于那些难以用明确规则定义的任务。
-
链式推理:在 LangChain 中,prompt 可以用于构建链式推理流程。通过设计一系列相互关联的 prompt,可以引导 LLM 逐步完成复杂的推理任务。例如:多步骤问题解答或对话生成。
-
安全和合规性:通过适当的 prompt 设计,可以确保 LLM 的输出符合特定的安全和合规性要求。例如:可以通过在 prompt 中包含适当的过滤器或指导原则来避免生成不适当或冒犯性的内容。
-
性能优化:Prompt 的设计也可以影响 LLM 的性能和效率。通过优化 prompt 的长度、结构和内容,可以提高 LLM 的响应速度和输出质量。
案例实现流程
实现流程分析
以通义大模型为例
# 导入prompt的类
from langchain.prompts import PromptTemplate
# 导入通义大模型
from langchain_community.llms import Tongyi
# 定义一个模板
pp = "{county}的首都是哪里?"
# 实例化模板类
promptTemplate = PromptTemplate.from_template(pp)
# 输入
country = "中国"
# 生成prompt
prompt = promptTemplate.format(country=country)
# 实例化通义大模型
tongyi = Tongyi()
ret = tongyi.invoke(prompt)
print(ret)
ChatPromptTemplate
概述
-
ChatPromptTemplate是一个模板化的对话工具,它允许用户创建、设定对话内容和格式,并与他人进行分享和互动。
-
通过使用ChatPromptTemplate,用户能够以一种简洁、清晰的方式组织和展示对话内容,从而提高沟通效率,减少信息混乱和误解的可能性。
功能
-
上下文理解:ChatPromptTemplate的上下文功能有助于用户更好地理解对话的背景和情境,从而更好地参与和回应对话内容。
-
模板创建:用户可以轻松创建对话模板,这些模板可以包含各种元素,如文字、图片、信息等,以适应不同的沟通需求。
-
角色和参数:在ChatPromptTemplate中,聊天消息可以与内容和一个称为角色的额外参数相关联。例如,在OpenAI Chat Completions API中,聊天消息可以与AI助手、人类或系统角色相关联。
应用场景
-
ChatPromptTemplate广泛应用于各种聊天软件和社交平台,特别是在需要高效、清晰沟通的场景中,如客服系统、在线教育、社交媒体等。
优势
-
提高沟通效率:通过预定义的模板和格式,用户可以更快地创建和发送对话内容。
-
减少误解:清晰的模板和上下文功能有助于减少信息混乱和误解的可能性。
-
可定制性:ChatPromptTemplate允许用户根据自己的需求创建和修改模板,以满足不同的沟通场景。
案例
# 导入通义大模型
from langchain_community.llms import Tongyi
# 导入模板类
from langchain.prompts import ChatPromptTemplate
# 定义模板
message = [
("system","假设你是起名字的大师"),
("human", "我家是{sex}宝宝,姓{firstName},请起3个好听的名字?"),
]
# 实例化模板类
chartpm = ChatPromptTemplate.from_messages(message);
prompt = chartpm.format_messages(sex="女",firstName="李")
# 实例化通义大模型
tongyi = Tongyi()
ret = tongyi.invoke(prompt)
print(ret)
ChatMessagePromptTemplate
概述
ChatMessagePromptTemplate是LangChain框架中用于生成特定角色或自定义角色对话提示的一个模板。这个模板允许用户指定角色的名称,并基于提供的模板字符串生成相应的聊天消息提示。
案例
from langchain.prompts import ChatMessagePromptTemplate
from langchain_community.llms import Tongyi
message = "请帮我写一篇关于{type}的文章"
# 实例化
promptTemplate = ChatMessagePromptTemplate.from_template(role = "地理学家",template=message)
prompt = promptTemplate.format(type="丹霞地貌")
print(prompt.content)
# 实例化通义大模型
tongyi = Tongyi()
ret = tongyi.invoke(prompt.content)
print(ret)
StringPromptTemplate
概述
在LangChain中,StringPromptTemplate(尽管在提供的参考文章中并未直接提及这个名字)可能是一个用于生成字符串形式Prompt的模板类。
定义与用途
-
定义:StringPromptTemplate
e
是一个类,它允许用户通过提供模板字符串和参数来生成自定义的Prompt。 -
用途:在LangChain中,Prompt是引导大语言模型(LLM)生成响应的关键输入。StringPromptTemplate提供了一种灵活且可重复的方式来创建这些Prompt。
特征
-
参数化:模板字符串可以包含占位符,这些占位符在生成Prompt时会被实际参数替换。
-
灵活性:用户可以根据需要自定义模板字符串,以生成适应不同任务和场景的Prompt。
-
易于使用:通过简单的API调用,用户可以快速地根据模板和参数生成所需的Prompt。
案例
# 引入自定义的Prompt模板
from langchain.prompts import StringPromptTemplate
from langchain_community.llms import Tongyi
# 代码解析器
import inspect
Prompt = "假设你是一个非常擅长编程的AI,现在给你如下函数名称,你会按照如下格式,输出这段代码的名称、源代码、中文解释。\n函数名称: {function_name}\n返回类型:{function_type}\n源代码:\n{source_code}\n代码解释:\n"
# 自定义的函数
def HelloWorld(abc):
print("Hello World"+ abc)
class CustmPrompt(StringPromptTemplate):
def format(self, **kwargs) -> str:
# 获得源代码
code = inspect.getsource(kwargs["function_name"])
# 生成提示词模板
prompt = Prompt.format(
function_name=kwargs["function_name"].__name__, function_type = kwargs["function_type"] , source_code=code
)
return prompt
pp = CustmPrompt(input_variables=["function_name","function_type"])
prop = pp.format(function_name=HelloWorld,function_type="int")
tongyi = Tongyi()
ret = tongyi.invoke(prop)
print(ret)
使用jinja2与f-string来实现提示词模板格式化
安装
pip install jinja2
模板格式化
from langchain.prompts import PromptTemplate
from langchain_community.llms import Tongyi
pp = "{{county}}的首都是哪里?"
# 实例化模板类
promptTemplate = PromptTemplate.from_template(pp,template_format="jinja2")
promt1 = promptTemplate.format(county="中国")
print(promt1)
pp1 = "{county}的首都是哪里?"
# 实例化模板类
promptTemplate = PromptTemplate.from_template(pp1,template_format="f-string")
promt = promptTemplate.format(county="中国")
print(promt)
使用PipelinePromptTemplate实现多步提示词
多步提示词
- Final prompt: 最终返回的提示词模板
- Pipeline prompts:组成提示词管道的模板
案例
# 角色
你是一个擅长成语接龙的游戏玩家。
# 技能
进行成语接龙游戏
1.当对方说出一个成语后,你首先判断它是不是一个成语。如果不是则提示用户,要求用户重新输入;如果是成语,则需要根据该成语的最后一个字,说出一个新的成语。
2.可以使用同音字接龙。
3.你说的必须是“成语”,不能是一般的词语
4.当用户或你无法找到下一个成语时,此游戏结束。用户可以输入一个新的成语,重新开始接龙
# 限制
只进行成语接龙游戏,拒绝回答其他话题
# 管道模板
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts.prompt import PromptTemplate
# Final Prompt由一系列变量构成
full_template = "{name}{skill}{limit}"
full_prompt = PromptTemplate.from_template(full_template)
# 第一层基本设计
name = """#角色
你是一个擅长{name}的游戏玩家。"""
name_prompt = PromptTemplate.from_template(name)
# 第二基本设计
skill = """## 技能
{skill}"""
skill_prompt = PromptTemplate.from_template(skill)
# 第三基本设计
limit = """## 限制
{limit}"""
limit_prompt = PromptTemplate.from_template(limit)
input_prompts = [
("name", name_prompt),
("skill", skill_prompt),
("limit", limit_prompt)
]
pipeline_prompt = PipelinePromptTemplate(final_prompt=full_prompt, pipeline_prompts=input_prompts)
ret1 = pipeline_prompt.format(
name="石头剪刀布",
skill="""### 技能1:进行石头剪刀布游戏
1.当对方说出一个石头剪刀布后,你首先判断它是不是一个石头剪刀布。如果不是则提示用户,要求用户重新输入;如果是剪刀,则需要根据该剪刀的最后一个字,说出一个新的剪刀。
2.你可以使用石头剪刀布接龙。
3.你说的必须是“剪刀”,不能是一般的词语""",
limit="只进行石头剪刀布游戏,拒绝回答其他话题")
print(ret1)
ret2 = pipeline_prompt.format(
name="成语接龙",
skill="""### 技能1:进行成语接龙游戏
1.当对方说出一个成语后,你首先判断它是不是一个成语。如果不是则提示用户,要求用户重新输入;如果是成语,则需要根据该成语的最后一个字,说出一个新的成语。
2.可以使用同音字接龙。
3.你说的必须是“成语”,不能是一般的词语
4.当用户或你无法找到下一个成语时,此游戏结束。用户可以输入一个新的成语,重新开始接龙""",
limit="只进行成语接龙游戏,拒绝回答其他话题")
print(ret2)
使用文件来管理提示词模板
- 便于共享
- 便于版本管理
- 便于存储
- 支持常见格式(json/yaml/txt)
from langchain.prompts import load_prompt
#加载yaml格式的prompt模版
# prompt = load_prompt("simple_prompt.yaml")
# print(prompt.format(name="小黑",what="恐怖的"))
# 加载json格式的prompt模版
prompt1 = load_prompt("simple_prompt.json")
print(prompt1.format(name="小红",what="搞笑的"))
from langchain.prompts import load_prompt
#支持加载文件格式的模版,并且对prompt的最终解析结果进行自定义格式化
prompt = load_prompt("simple_output_parser.json")
prompt.output_parser.parse(
"chartGPT在哪一年发布的.\n年: 2022年"
)