文章目录
- 前言
- 一、Langchain 概述
- 1. 概述
- 2. 应用场景
- 3. 案例
- 二、Prompt
- 1.Prompt 介绍
- 2.PromptTemplate
- a.PromptTemplate 案例
- 单个参数
- 多个参数
- 多个参数-结合字典解包
- b.使用jinja2与f-string来实现提示词模板格式化
- 3.ChatPromptTemplate
- a.ChatPromptTemplate 介绍
- b.ChatPromptTemplate 案例
- 4.ChatMessagePromptTemplate
- a.ChatMessagePromptTemplate 介绍
- b.ChatMessagePromptTemplate 案例
- 5.FewShotPromptTemplate
- 6.StringPromptTemplate
- a.StringPromptTemplate 介绍
- b.StringPromptTemplate 案例
- 7.PipelinePromptTemplate
- 多步提示词
- 8. 总结
前言
在探索人工智能与自然语言处理领域时,“Prompt
”是一个核心概念,尤其在 Langchain
中,它是连接人类与机器思维的桥梁,能解锁模型潜能。本篇博客将深入这一领域,首先揭开 Prompt
的神秘面纱,随后剖析Langchain中的几种重要PromptTemplate,包括基础而灵活的PromptTemplate
、专为聊天设计的ChatPromptTemplate
及其案例、能快速学习的FewShotPromptTemplate
、简洁的String PromptTemplate
及其示例,以及复杂任务中的组织协调者PipelinePromptTemplate
。
一、Langchain 概述
1. 概述
LangChain
是一个综合性的开发框架,专为利用语言模型(LLM
)构建应用程序而设计。它通过提供一套丰富的工具、组件和接口,极大地简化了开发流程。
LangChain框架核心特性:
- 数据集成:
LangChain
能够将语言模型与外部数据源无缝连接。- 自主交互:赋予语言模型与环境互动的能力,提升应用的自主性。
主要价值点:
- 组件化架构:提供语言模型使用的抽象层,以及各层的多样化实现,组件设计为模块化且用户友好。
- 即用型链结构:提供完成特定高级任务的结构化组件集合。
应用场景示例:
- 个人助理
- 文档问答系统
- 聊天机器人
- 数据表查询
- API交互
- 数据提取、评估与汇总
LangChain模型分类:
- 大型语言模型 (LLM):作为应用的核心,接收并输出文本字符串。
- 聊天模型 (Chat Model):结构化API支持,优化对话管理和上下文维护。
- 文本嵌入模型 (Text Embedding Models):将文本转换为嵌入向量,适用于文档检索和相似性分析。
LangChain功能特点:
- 模型与提示管理:简化提示管理、优化,并为LLM提供统一接口。
- 链调用序列:提供链的标准接口,支持与多种工具集成,实现端到端的解决方案。
- 数据增强:支持链与外部数据源交互,增强生成步骤的数据收集。
- 智能代理 (Agents):提供代理的标准接口和多样化实现,以及完整的代理示例。
- 内存管理:标准化内存接口,维护状态连续性,并提供内存使用示例。
- 评估工具:提供评估生成模型的提示和链,帮助开发者有效评估模型性能。
LangChain主要组件:
- 模型 (Models):集成并管理语言模型。
- 提示词 (Prompts):设计和优化与模型交互的提示。
- 代理 (Agents):实现LLM的决策和行动逻辑。
- 链 (Chains):序列化LLM调用,构建复杂流程。
- 索引 (Indexes):支持数据检索和访问。
- 内存 (Memory):管理应用状态和历史信息。
- 模式 (Schema):定义数据结构和交互模式。
2. 应用场景
- 信息检索
- LangChain可以根据用户的查询意图,通过记忆链中的语义信息,提供准确、全面的搜索结果。
- 无论是文本、图片还是视频等多媒体数据,LangChain都能进行深度理解和检索。
- 问答系统
- LangChain可以根据用户的问题,从记忆链中抽取相关信息,并给出准确的答案。
- 无论是常见问题还是专业领域的知识,LangChain都能提供高质量的回答。
- 个性化推荐
- LangChain可以根据用户的兴趣和偏好,从记忆链中推荐相关的内容。
- 无论是新闻、音乐还是电影等,LangChain都能根据用户的历史行为和喜好进行精准推荐。
- 机器翻译
- LangChain可以利用记忆链中的语义信息,进行更加准确、自然的机器翻译。
- 通过对源语言和目标语言的语义关联进行建模,LangChain可以提供更加流畅、准确的翻译结果。
- 聊天机器人
- LangChain可以用于构建聊天机器人,使其具备更丰富的交互能力和更准确的回答能力。
- 通过与大型语言模型的结合,聊天机器人可以更加智能地理解用户意图,并提供相应的回复。
- 生成式问答(GQA)和摘要
- LangChain允许将语言模型与其他数据源连接在一起,实现数据感知,从而支持生成式问答和摘要等任务。
- 这些任务通常需要处理大量的文本数据,LangChain的模块化设计和对LLM的通用接口实现可以极大地简化开发过程。
- 结合大型语言模型、知识库和计算逻辑快速开发AI应用
- LangChain通过其强大的框架和灵活的表达语言(LCEL),支持并行化、回退、批处理、流式传输和异步操作等功能。
- 这使得开发人员能够结合大型语言模型、知识库和计算逻辑快速开发强大的AI应用。
3. 案例
安装:
pip install langchain pip install langchain-community
示例代码:
# 1、导入大模型的类 from langchain_community.llms import Tongyi # 实例化 llm = Tongyi() # 调用通义千问 ret = llm.invoke("你是谁?") print(ret)
输出
二、Prompt
1.Prompt 介绍
LangChain
中的 prompt
是一个关键概念,它指的是输入给大型语言模型(LLM
)的文本指令或提示,用于引导模型生成特定的输出或执行特定的任务。在 LangChain
的框架中,prompt
的设计和使用对于构建高效、准确的链式应用至关重要。
LangChain 中 prompt 的应用场景和重要性:
- 任务定义:通过精心设计的 prompt,可以明确告诉 LLM 要执行什么任务。例如,对于问答系统,prompt 可能包含问题文本和指示模型生成答案的指令。
- 上下文提供:Prompt 可以包含必要的上下文信息,以帮助 LLM 理解当前任务的背景和上下文。这对于处理具有复杂依赖关系或需要跨多个步骤推理的任务尤为重要。
- 示例引导:通过提供示例 prompt(即少样本学习或零次学习中的例子),可以指导 LLM 如何生成符合要求的输出。这种方法特别适用于那些难以用明确规则定义的任务。
- 链式推理:在 LangChain 中,prompt 可以用于构建链式推理流程。通过设计一系列相互关联的 prompt,可以引导 LLM 逐步完成复杂的推理任务,如多步骤问题解答或对话生成。
- 安全和合规性:通过适当的 prompt 设计,可以确保 LLM 的输出符合特定的安全和合规性要求。例如,可以通过在 prompt 中包含适当的过滤器或指导原则来避免生成不适当或冒犯性的内容。
- 性能优化:Prompt 的设计也可以影响 LLM 的性能和效率。通过优化 prompt 的长度、结构和内容,可以提高 LLM 的响应速度和输出质量。
2.PromptTemplate
a.PromptTemplate 案例
实现流程:
- 导入prompt的类
- 导入通义大模型
- 定义一个模板
- 实例化模板类
- 提醒用户输入
- 生成prompt
- 实例化通义大模型
- 调用invoke进行提问
单个参数
# 1导入prompt的类
from langchain.prompts import PromptTemplate
# 2.导入通义大模型
from langchain_community.llms import Tongyi
# 3.定义一个模板
pp = "{county}的首都是哪里?"
# 4.实例化模板类
promptTemplate = PromptTemplate.from_template(pp)
# 5.输入
ins = input("请输入国家名:")
# 6.生成prompt
prompt = promptTemplate.format(county=ins)
print(prompt)
# 7.实例化通义大模型
tongyi = Tongyi()
# 8.调用invoke进行提问
ret = tongyi.invoke(prompt)
print(ret)
多个参数
# 导入prompt的类
from langchain.prompts import PromptTemplate
# 定义一个模板
pp = "{county}的首都是哪里?境内有多少{question}"
# 实例化模板类
promptTemplate = PromptTemplate.from_template(pp)
# 输入
country_name = input("请输入国家名:")
question_name = input("请输入问题名:")
# 生成prompt
prompt = promptTemplate.format(county=country_name, question=question_name)
print(prompt)
多个参数-结合字典解包
# 导入prompt的类
from langchain.prompts import PromptTemplate
# 定义 prompt 模板
template = "请用简明的语言介绍一下{topic}和{topic2}。"
# 创建 PromptTemplate 对象
prompt_template = PromptTemplate(
input_variables=["topic","topic2"],
template=template
)
# 定义输入变量
input_variables = {"topic": "人工智能","topic2": "深度学习"}
# 生成最终的 prompt
prompt = prompt_template.format(**input_variables)
print(prompt)
在 Python 中,
**
运算符用于将字典解包(unpack
)成关键字参数(keyword arguments
)。它将字典中的键值对传递给函数或方法,使每个键值对变成单独的关键字参数。
b.使用jinja2与f-string来实现提示词模板格式化
安装:
pip install jinja2
模板格式化:
jinja2方式格式化from langchain.prompts import PromptTemplate from langchain_community.llms import Tongyi pp = "{{county}}的首都是哪里?" # 实例化模板类 promptTemplate = PromptTemplate.from_template(pp,template_format="jinja2") p1 = promptTemplate.format(county="中国") print(p1) tongyi = Tongyi() ret = tongyi.invoke(p1) print(ret)
字符串方式格式化
from langchain.prompts import PromptTemplate from langchain_community.llms import Tongyi pp1 = "{county}的首都是哪里?" # 实例化模板类 promptTemplate = PromptTemplate.from_template(pp1,template_format="f-string") p2 = promptTemplate.format(county="中国") print(p2) tongyi = Tongyi() ret = tongyi.invoke(p2) print(ret)
3.ChatPromptTemplate
a.ChatPromptTemplate 介绍
ChatPromptTemplate
是一个模板化的对话工具,它允许用户创建、设定对话内容和格式,并与他人进行分享和互动。通过使用ChatPromptTemplate
,用户能够以一种简洁、清晰的方式组织和展示对话内容,从而提高沟通效率,减少信息混乱和误解的可能性。
功能:
- 上下文理解:
ChatPromptTemplate
的上下文功能有助于用户更好地理解对话的背景和情境,从而更好地参与和回应对话内容。- 模板创建:用户可以轻松创建对话模板,这些模板可以包含各种元素,如文字、图片、信息等,以适应不同的沟通需求。
- 角色和参数:在
ChatPromptTemplate
中,聊天消息可以与内容和一个称为角色的额外参数相关联。例如,在OpenAI Chat Completions API
中,聊天消息可以与AI助手、人类或系统角色相关联。
应用场景:
ChatPromptTemplate
广泛应用于各种聊天软件和社交平台,特别是在需要高效、清晰沟通的场景中,如客服系统、在线教育、社交媒体等。
优势:
- 提高沟通效率:通过预定义的模板和格式,用户可以更快地创建和发送对话内容。
- 减少误解:清晰的模板和上下文功能有助于减少信息混乱和误解的可能性。
- 可定制性:
ChatPromptTemplate
允许用户根据自己的需求创建和修改模板,以满足不同的沟通场景。
相比于PromptTemplate区别:
PromptTemplate
:这是一种通用形式的模板,用于生成系统提示或信息模板。它可以应用于多种场景,如用户输入错误时的提示、系统操作成功时的提示、数据加载提示、信息确认提示以及活动推广提示等。它并不特定于对话或聊天场景。ChatPromptTemplate
:这是PromptTemplate
在聊天领域的一个特殊表达。它专注于对话和聊天场景,帮助用户更好地组织和展示对话内容。ChatPromptTemplate
的上下文功能使得用户能够更好地理解对话的背景和情境,从而更好地参与和回应对话内容。
b.ChatPromptTemplate 案例
# 导入通义大模型
from langchain_community.llms import Tongyi
# 导入模板类
from langchain.prompts import ChatPromptTemplate
from langchain.schema import SystemMessage,HumanMessage,AIMessage
sm = SystemMessage(content="你是一个起名大师")
hm = HumanMessage("我姓{firstname},现在有一个{sex}孩,帮我起几个有深意的名字")
msg = [str(sm),str(hm)]
# 实例化模板类
cpt = ChatPromptTemplate.from_messages(msg)
prompt = cpt.format_messages(firstname="猫",sex="男")
print(prompt)
# 实例化通义大模型
tongyi = Tongyi()
ret = tongyi.invoke(prompt)
print(ret)
4.ChatMessagePromptTemplate
a.ChatMessagePromptTemplate 介绍
ChatMessagePromptTemplate
是LangChain
框架中用于生成特定角色或自定义角色对话提示的一个模板。这个模板允许用户指定角色的名称,并基于提供的模板字符串生成相应的聊天消息提示。
作用:
ChatMessagePromptTemplate
主要用于在对话模型(chat model
)中,封装并生成具有特定角色或自定义角色的聊天消息提示。
使用方式:
- 用户首先需要从
langchain.prompts
模块中导入ChatMessagePromptTemplate类。- 然后,用户可以定义一个包含占位符(如
{subject}
)的模板字符串。- 使用
ChatMessagePromptTemplate.from_template()
方法,用户可以指定角色的名称和模板字符串来创建一个ChatMessagePromptTemplate对象。- 接着,用户可以通过调用该对象的
format()
方法,并传入相应的参数来替换模板字符串中的占位符,从而生成具体的聊天消息提示。
b.ChatMessagePromptTemplate 案例
# ChatMessagePromptTemplate 可以自定义角色
from langchain.prompts import ChatMessagePromptTemplate
from langchain_community.llms import Tongyi
pt = "{country}的首都是哪里?"
# 实例化
cmpt = ChatMessagePromptTemplate.from_template(template=pt,role="地理小能手")
prom = cmpt.format(country='中国')
# 实例化通义大模型
tongyi = Tongyi()
ret = tongyi.invoke(prom.content)
print(ret)
5.FewShotPromptTemplate
小样本提示模板,思想是对少量示例进行“训练 train” - 我们称之为 few-shot learning
- 并将这些示例在提示中提供给模型。 few-shot learning
在我们的模型需要帮助理解我们要求它做什么时非常有效。
from langchain.prompts import PromptTemplate
from langchain.prompts import FewShotPromptTemplate
from langchain_community.llms import Tongyi
# 示例 / 样本
samples = [
{
"fruit_type": "玫瑰葡萄",
"occasion": "爱情",
"ad_copy": "A玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
},
{
"fruit_type": "金钻菠萝",
"occasion": "庆祝",
"ad_copy": "B金钻菠萝,庆祝的完美伴侣,为您的特别时刻增添甜蜜与奢华。"
},
{
"fruit_type": "蜜瓜",
"occasion": "休闲",
"ad_copy": "C蜜瓜,休闲时光的甜蜜伴侣,让您的闲暇时光更加美好。"
},
{
"fruit_type": "富士苹果",
"occasion": "健康",
"ad_copy": "D富士苹果,健康生活的选择,丰富您的营养,活力每一天。"
}
]
# 定义一个模板
template = "水果类型:{fruit_type}\n场景:{occasion}\n广告文案:{ad_copy}\n"
#实例化模板类
prompt_sample = PromptTemplate(template=template,input_variables=["fruit_type","occasion","ad_copy"])
#实例化少量样本模板类
prompt = FewShotPromptTemplate(
examples = samples,
example_prompt = prompt_sample,
suffix = "水果类型:{fruit_type}\n场景:{occasion}",
input_variables = ["fruit_type","occasion"]
)
# 生成Prompt
p = prompt.format(fruit_type="榴莲",occasion="居家")
print(p)
# 实例化通义大模型
llm = Tongyi()
ret = llm.invoke(p)
print(ret)
6.StringPromptTemplate
a.StringPromptTemplate 介绍
StringPromptTemplate
是一个类,它允许用户通过提供模板字符串和参数来生成自定义的Prompt。在LangChain
中,Prompt是引导大语言模型(LLM)生成响应的关键输入。StringPromptTemplate
提供了一种灵活且可重复的方式来创建这些Prompt。
特性:
- 参数化:模板字符串可以包含占位符,这些占位符在生成Prompt时会被实际参数替换。
- 灵活性:用户可以根据需要自定义模板字符串,以生成适应不同任务和场景的Prompt。
- 易于使用:通过简单的API调用,用户可以快速地根据模板和参数生成所需的Prompt。
b.StringPromptTemplate 案例
# 引入自定义的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)
7.PipelinePromptTemplate
多步提示词
- Final prompt: 最终返回的提示词模板
- Pipeline prompts:组成提示词管道的模板
#角色
你是一个擅长成语接龙的游戏玩家。
## 技能
### 技能1:进行成语接龙游戏
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}的游戏玩家。\n"""
name_prompt = PromptTemplate.from_template(name)
# 第二基本设计
skill = """## 技能
{skill}\n"""
skill_prompt = PromptTemplate.from_template(skill)
# 第三基本设计
limit = """## 限制
{limit}\n"""
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)
8. 总结
langchain
是一个自然语言处理库,提供了多种模板类来帮助用户构建和格式化提示(prompts)。这些模板类之间的关系如下:
PromptTemplate
:这是所有模板类的基类,它定义了基本的模板功能。其他模板类都继承自这个基类。ChatPromptTemplate
:这是一个特定于聊天场景的模板类,用于生成聊天机器人的提示。它继承了PromptTemplate
类。ChatMessagePromptTemplate
:这个模板类专门用于生成聊天消息的提示。它也继承自PromptTemplate
类。StringPromptTemplate
:这是一个通用的字符串模板类,用于生成简单的文本提示。它同样继承自PromptTemplate
类。PipelinePromptTemplate
:这个模板类用于在管道中生成提示。它可以包含多个子模板,每个子模板负责生成管道中的一个步骤的提示。它也继承自PromptTemplate
类。