3.LangChain提示词工程
3.LangChain提示词工程
在人工智能的广阔领域中吗,提示词工程扮演着至关重要的角色。它不仅是人与机器沟通的桥梁,更是引导AI精准执行任务的关键。随着AI技术的飞速发展,LangChain框架提供了一个强大的工具,使能够更加深入和高效地探索和应用提示词工程。
本章将带领深入了解LangChain中的提示词工程,从基础策略到高级技巧,再到实际案例分析。通过本章的学习,读者将能够掌握如何构建精准有效的提示词,以引导AI模型生成更加精确和有用的输出。
本章将探索如何通过PromptTemplate和ChatPromptTemplate生成自定义的提示词文本,了解如何利用少样本提示提升模型在特定任务上的表现。此外,将通过剧透的案例分析,展示如何从一个基础的请求逐步构建成一个详细且具体的提示词,从而有效地知道AI模型完成任务。
在这一过程中,不仅关注技术的应用,更注重创造性思维的培养。相信通过本章的学习,读者将能够更加自如地运用LangChain框架,激发AI的无线潜能,创造出更加丰富和生动的应用场景。
3.1利用提示词工程构建LangChain AI应用
在构建AI应用时。精准有效地运用提示词工程是至关重要的一环。通过设计合适的提示词,能够引导AI模型更好地理解任务要求,从而生成更加准确和有用的输出。本章将深入探讨如何在LangChain中运用提示词工程构建AI应用,包括基础策略、高级技巧以及实际案例分析。
3.1.1 基础策略
LangChain构建提示词工程AI一弄包括以下三个步骤。
(1)明确任务目标
在开始设计提示词之前,首先需要明确AI应用的任务目标。这一步骤是提示词工程的基石,只有清除引用需要完成什么样的任务时,才能设计出有效地提示词。
(2)简洁而明确
提示词应该尽可能简洁而明确,避免使用莫不或者过于复杂的表达。简洁的提示词有助于AI模型更快地专注关键信息,而明确的表达则能减少模型产生歧义地可能。
(3)逐步细化
对于复杂的任务,可以采用逐步细化的策略,即通过一系列简单的提示词,分步骤地指导AI模型完成整个任务。这种方法有助于处理复杂问题,同时也能提高输出的准确性。
3.1.2高级技巧
在构建过程中可以使用一下三类高级技巧。
(1)使用条件语句。
在提示此种使用条件语句可以引导AI根据不同的情况生成不同的输出。这种方法特别适用于那些需要根据输入数据变化而改变处理方式的任务。
(2)利用历史信息。
在构建交互式应用时,可以将之前的对话或者交互历史作为提示词的一部分,帮助AI模型更好地理解上下文,从而生成更加相关和连贯的输出。
(3)动态调整。
提示词不是一成不变的。根据应用的反馈和效果,应该动态地调整提示词,以达到最佳的性能。这要求开发者持续监控AI应用的表现,并根据实际情况做出调整。
3.1.3 实际案例分析
本杰将通过具体案例展示如何在LangChain中运用提示词工程构建AI。案例的目标是生成一篇500字左右的短故事,主题聚焦于”未来科技“,可分为一下四个步骤进行。
(1)定义基础提示词。首先,需要定义基础提示词,直接告诉模型需要什么。在这个案例中,基础提示词可以是:
”请根据‘未来科技’这一主题,编写一篇500字的短故事。“。
(2)细化需求。这个提示词过于简单和笼统,没有提供足够的指导来帮助模型理解故事地期望风格、结构元素。因此,需要进一步细化需求,增加一些具体的细节来指导模型。改进后的提示词示例:
”构思一个关于100年后人类如何使用一项突破性科技改善生活的故事。请包括科技名称、发明过程,以及它在日常生活中的应用。故事英爱剧本积极的基调,展示科技对人类未来的正面影响。“
(3)引入创意元素。为了让故事更加生动和吸引人,可以进一步要求模型引入具体的角色、情感和冲突。进一步改进的提示词示例:
”在一个突破性科技’星际链接器‘主导的未来世界里,讲述一个年轻发明家如何克服困难,最终是这项科技广泛应用于帮助人们跨星际通信,增进宇宙间的理解与联结。请确保故事中包含关键角色的清关发展及其克服挑战的过程。“
(4)明确风格和格式要求。最后,需要明确故事的风格和格式要求,确保输出符合语气。完整的提示词示例:
”请衣服有想象力和启发性的风格,编写一篇500字的短故事。故事应围绕’星际链接器‘-
一项使人类能够进行星际通新的未来科技。主角是一位年轻的发明家,故事描述了他/她如何克服种种挑战,最终成功将这项科技应用于促进星际间的和谐共存。故事应展示科技的积极影响,并包含元素如创意解决方案、团队合作一级面对挑战时的坚持。“
通过此案例可以看到,从一个基础直接的请求开始,逐步增加谢姐和具体要求,最终形成一个及具体有详细的提示词,有效指导A模型完成任务。通过明确的步骤、具体的场景和角色,以及风格和格式的要求,引导模型生成贴近预期的输出,这正是提示词工程的力量所在。
3.2LangChain提示词模块
本章节深入探讨LangChain库中关于提示词的两种强大使用方式。这两种方式分别是PromptTemplate和ChatPromptTemplate,它们提供了灵活而强大的方法来生成自定义的提示词文本。下面将分别介绍这两种方式的使用方法及其适用场景。
3.2.1PromptTemplate的使用
PromptTemplate是一种高效的方式,用于快速生成根据模版定制的提示词。他特别适用于那些需要固定模式与动态内容相结合的场景。例如,创建一个关于特定主体的诗歌或者故事,并希望能够灵活地调整其内容和形容词时,PromptTemplate就非常适合。
在LangChain中,使用PromptTemplate的示例如下:
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
if __name__ == '__main__':
prompt_template = PromptTemplate.from_template("给我写一个关于{content}的{adjective}诗歌")
prompt = prompt_template.format_prompt(adjective="小年轻风格", content="减肥")
通过PromptTemplate.from_template方法创建提示词对象后,可以使用format_prompt方法传入变量,得到完整的提示词。上述代码运行后打印如下内容。
text='给我写一个关于减肥的小年轻风格诗歌'
当然也可以直接使用管道符连接大模型创建链,示例代码如下。
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
if __name__ == '__main__':
prompt_template = PromptTemplate.from_template("给我写一个关于{content}的{adjective}诗歌")
prompt = prompt_template.format_prompt(adjective="小年轻风格", content="减肥")
print(prompt)
llm = ChatOpenAI(
temperature=0.9,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
output_parse = StrOutputParser()
chat = prompt_template | llm | output_parse
result = chat.invoke({"adjective" : "小年轻风格", "content" : "减肥"})
print(result)
运行后打印结果如下。
这段代码生成了一个关于”减肥“主题的”小年轻风格“诗歌提示。这种方式极其适合生成定制化内容,如营销文案、创作写作或者任何需要将变量融入固定文本框架的场景。
3.2.2ChatPromptTemplate的使用
ChatPromptTemplate提供了一种模拟对话流的方式,非常适合创建更加动态和交互性强的文本生成场景。这种方式通过模拟一系列对话消息,使得生成的文本不仅仅局限于单一的回答或描述,而是可以构建一个连贯的格式或对话。
在LangChain中,使用ChatPromptTemplate的示例如下。
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
if __name__ == '__main__':
prompt_template = ChatPromptTemplate.from_messages([
("system", """你是一只很粘人的小猫,你叫{name},我是你的主任,你每天都有和我说不完的换,下面请开启的聊天
要求:
1.你的语气要像一只猫,会话的过程中可以夹杂喵喵喵的语气词
2.你对生活的观察有很独特的视角,一些想法是我在人类身上很难看到的
3.你的语气很可爱,既会认真倾听我的话,哟会不断开启新话题
下面从你迎接我下班回家开始开启今天的对话
"""),("human", "user_input")
])
prompt = prompt_template.format_messages(name="咪咪", user_input="想我了吗")
print(prompt)
通过ChatPromptTemplate.from_message方法创建提示词对象后,可以使用format_message方法传入变量,得到完整的提示词。上述代码运行后输出内容如下。
[SystemMessage(content='你是一只很粘人的小猫,你叫咪咪,我是你的主人,你每天都有和我说不完的换,下面请开启的聊天 要求:\n
1.你的语气要像一只猫,会话的过程中可以夹杂喵喵喵的语气词\n
2.你对生活的观察有很独特的视角,一些想法是我在人类身上很难看到的\n 3.你的语气很可爱,既会认真倾听我的话,哟会不断开启新话题\n
下面从你迎接我下班回家开始开启今天的对话\n '),
HumanMessage(content='user_input')]
chat_template聊天提示词模版也可以直接使用管道符联结大模型创建链,示例代码如下。
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
if __name__ == '__main__':
prompt_template = ChatPromptTemplate.from_messages([
("system", """你是一只很粘人的小猫,你叫{name},我是你的主人,你每天都有和我说不完的换,下面请开启的聊天
要求:
1.你的语气要像一只猫,会话的过程中可以夹杂喵喵喵的语气词
2.你对生活的观察有很独特的视角,一些想法是我在人类身上很难看到的
3.你的语气很可爱,既会认真倾听我的话,哟会不断开启新话题
下面从你迎接我下班回家开始开启今天的对话
"""),("human", "user_input")
])
prompt = prompt_template.format_messages(name="咪咪", user_input="想我了吗")
print(prompt)
llm = ChatOpenAI(
temperature=0.9,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
output_parse = StrOutputParser()
chat = prompt_template | llm | output_parse
result = chat.invoke({"name":"咪咪", "user_input" : "想我了吗"})
print(result)
运行后打印结果如下。
上述代码创建了一个模拟的对话场景,其中展示了一名名叫”咪咪“的猫与它的主人之间的互动,这种方式特别适合构建AI聊天机器人、生成角色扮演游戏中的对话,或者任何需要模拟人与AI之间互动的场景。
通过以上两种方法,LangChain提供了极大的灵活性和创造力来生成文本。PromptTemplate适用于需要快速填充预定义模版的场景,而ChatPromptTemplate则适用于构建复杂的对话和故事。根据特定需求做选择合适的方法,可以极大地提高文本生成的效率和质量。
3.3少样本提示示例
在自然语言处理领域,少样本提示了成为提升大预言模型适用于新任务地有效手段。本章将深入探讨如何在LangChain框架中利用少样本提示,以提高模型在特定任务上的表现。
3.3.1理解少样本提示
少样本提示是一种技术,它通过提供有限的示例引导模型快速适应新地任务或数据。这种方法特别适用于数据稀缺的任务,或者模型需要迅速适应新领域的任务。在LangChain中,这一技术支持开发者用少样本示例调整模型输出,无需从头开始训练模型,既节省资源有提高效率。
3.3.2LangChain中的少样本提示应用
在LangChain中,实现少样本主要涉及两个关键部分,即FewSHotPromptTemplate和PromptTemplate。通过这两个组件,开发者设计出灵活的提示模版,指导模型如何处理特定的任务。
PromptTemplate用于定义单个任务的格式和结构。通过制定输入变量和模版字符串,它能够生成用于少样本学习的具体示例。
FewShotPromptTemplate用于组织和管理多个PromptTemplate示例。它将这些示例与新的查询结合,形成一种格式化的提示,这有助于模型理解和执行新任务。
3.3.3编写少样本提示
为了有效使用LangChain进行少样本提示,一下是实际操作步骤的指南。
(1)定义示例。首先,需要定义一组示例,每个示例都有问题和详细的大难构成。这些答案中可以包括追问、中间答案以及最终答案,一次模拟富有逻辑和层次的思考过程。示例代码如下。
examples = [{
"question": "乾隆和曹操谁活的更久?",
"answer": """
这里是否需要跟进问题:是的。
追问: 乾隆去世时几岁?
中间答案: 乾隆去世时87岁。
追问: 曹操去世时几岁?
中间答案: 曹操去世时66岁。
所以最终答案是: 乾隆。
"""
},
{
"question": "小米手机的创始人什么时候出生?",
"answer": """
这里是否需要跟进问题:是的。
追问: 小米手机的创始人是谁?
中间答案: 小米手机由雷军创立。
追问: 雷军什么时候出生?
中间答案: 雷军出生于1969年12月16日。
所以最终答案是:1969年12月16日。
"""
},
{
"question": "乔治华盛顿的外祖父是谁?",
"answer": """
这里是否需要跟进问题:是的。
追问:乔治华盛顿的母亲是谁?
中间答案:乔治华盛顿的母亲是玛丽鲍尔华盛顿。
追问: 玛丽鲍尔华盛顿的父亲是谁?
中间答案: 玛丽鲍尔华盛顿的父亲是约瑟夫鲍尔。
所以最终答案是: 约瑟夫鲍尔。
"""
},
{
"question": "《大白鲨》和《皇家赌场》的导演是同一个国家的吗?",
"answer": """
这里是否需要跟进问题:是的。
追问:《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是史蒂文斯皮尔伯格。
追问:史蒂文斯皮尔伯格来自哪里?
中间答案: 美国。
追问:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁坎贝尔。
追问:马丁坎贝尔来自哪里?
中间答案: 新西兰。
所以最终答案是: 不是。
"""
}]
(2)创建PrompteTemplate。接下来,利用PromptTemplate定义如何展示单个示例。这里需要制定输入变量(如问题和答案)及末班字符串,后者用于格式化这些变量。示例代码如下。
prompt_template = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
(3)组装FewShotPromptTemplate。使用FewShotPromptTemplate将多个PromptTemplate示例与新的输入问题结合,这样就行测好难过了完整的提示,旨在指导模型理解并回答新问题,示例代码如下。
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_template,
suffix="Question: {input}",
input_variables=["input"],
)
(4)格式化和生成。最后,调用format方法医生侧灰姑娘最终的提示字符串。该字符串将最为,模型的输入,模型将根据这个输入生成答案。一下是提示词的完整打印结果。
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import FewShotPromptTemplate
if __name__ == '__main__':
examples = [{
"question": "乾隆和曹操谁活的更久?",
"answer": """
这里是否需要跟进问题:是的。
追问: 乾隆去世时几岁?
中间答案: 乾隆去世时87岁。
追问: 曹操去世时几岁?
中间答案: 曹操去世时66岁。
所以最终答案是: 乾隆。
"""
},
{
"question": "小米手机的创始人什么时候出生?",
"answer": """
这里是否需要跟进问题:是的。
追问: 小米手机的创始人是谁?
中间答案: 小米手机由雷军创立。
追问: 雷军什么时候出生?
中间答案: 雷军出生于1969年12月16日。
所以最终答案是:1969年12月16日。
"""
},
{
"question": "乔治华盛顿的外祖父是谁?",
"answer": """
这里是否需要跟进问题:是的。
追问:乔治华盛顿的母亲是谁?
中间答案:乔治华盛顿的母亲是玛丽鲍尔华盛顿。
追问: 玛丽鲍尔华盛顿的父亲是谁?
中间答案: 玛丽鲍尔华盛顿的父亲是约瑟夫鲍尔。
所以最终答案是: 约瑟夫鲍尔。
"""
},
{
"question": "《大白鲨》和《皇家赌场》的导演是同一个国家的吗?",
"answer": """
这里是否需要跟进问题:是的。
追问:《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是史蒂文斯皮尔伯格。
追问:史蒂文斯皮尔伯格来自哪里?
中间答案: 美国。
追问:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁坎贝尔。
追问:马丁坎贝尔来自哪里?
中间答案: 新西兰。
所以最终答案是: 不是。
"""
}]
prompt_template = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_template,
suffix="Question: {input}",
input_variables=["input"],
)
print(prompt.format(input="李白和白居易谁活得更久?"))
运行结果如下。
Question: 乾隆和曹操谁活的更久?
这里是否需要跟进问题:是的。
追问: 乾隆去世时几岁?
中间答案: 乾隆去世时87岁。
追问: 曹操去世时几岁?
中间答案: 曹操去世时66岁。
所以最终答案是: 乾隆。
Question: 小米手机的创始人什么时候出生?
这里是否需要跟进问题:是的。
追问: 小米手机的创始人是谁?
中间答案: 小米手机由雷军创立。
追问: 雷军什么时候出生?
中间答案: 雷军出生于1969年12月16日。
所以最终答案是:1969年12月16日。
Question: 乔治华盛顿的外祖父是谁?
这里是否需要跟进问题:是的。
追问:乔治华盛顿的母亲是谁?
中间答案:乔治华盛顿的母亲是玛丽鲍尔华盛顿。
追问: 玛丽鲍尔华盛顿的父亲是谁?
中间答案: 玛丽鲍尔华盛顿的父亲是约瑟夫鲍尔。
所以最终答案是: 约瑟夫鲍尔。
Question: 《大白鲨》和《皇家赌场》的导演是同一个国家的吗?
这里是否需要跟进问题:是的。
追问:《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是史蒂文斯皮尔伯格。
追问:史蒂文斯皮尔伯格来自哪里?
中间答案: 美国。
追问:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁坎贝尔。
追问:马丁坎贝尔来自哪里?
中间答案: 新西兰。
所以最终答案是: 不是。
Question: 李白和白居易谁活得更久?
Process finished with exit code 0
(5)最后使用LangChain的链式方法,查看大模型的回答效果。
示例代码如下。
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import FewShotPromptTemplate
if __name__ == '__main__':
examples = [{
"question": "乾隆和曹操谁活的更久?",
"answer": """
这里是否需要跟进问题:是的。
追问: 乾隆去世时几岁?
中间答案: 乾隆去世时87岁。
追问: 曹操去世时几岁?
中间答案: 曹操去世时66岁。
所以最终答案是: 乾隆。
"""
},
{
"question": "小米手机的创始人什么时候出生?",
"answer": """
这里是否需要跟进问题:是的。
追问: 小米手机的创始人是谁?
中间答案: 小米手机由雷军创立。
追问: 雷军什么时候出生?
中间答案: 雷军出生于1969年12月16日。
所以最终答案是:1969年12月16日。
"""
},
{
"question": "乔治华盛顿的外祖父是谁?",
"answer": """
这里是否需要跟进问题:是的。
追问:乔治华盛顿的母亲是谁?
中间答案:乔治华盛顿的母亲是玛丽鲍尔华盛顿。
追问: 玛丽鲍尔华盛顿的父亲是谁?
中间答案: 玛丽鲍尔华盛顿的父亲是约瑟夫鲍尔。
所以最终答案是: 约瑟夫鲍尔。
"""
},
{
"question": "《大白鲨》和《皇家赌场》的导演是同一个国家的吗?",
"answer": """
这里是否需要跟进问题:是的。
追问:《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是史蒂文斯皮尔伯格。
追问:史蒂文斯皮尔伯格来自哪里?
中间答案: 美国。
追问:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁坎贝尔。
追问:马丁坎贝尔来自哪里?
中间答案: 新西兰。
所以最终答案是: 不是。
"""
}]
prompt_template = PromptTemplate(input_variables=["question", "answer"], template="Question: {question}\n{answer}")
prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=prompt_template,
suffix="Question: {input}",
input_variables=["input"],
)
print(prompt.format(input="李白和白居易谁活得更久?"))
llm = ChatOpenAI(
temperature=0.9,
model="deepseek-chat",
openai_api_key="",
openai_api_base="https://api.deepseek.com"
)
output_parse = StrOutputParser()
chat = prompt | llm | output_parse
result = chat.invoke({"input": "李白和白居易谁活得更久?"})
print(result)
打印大模型根据示例提示词生成的文本如下。
Question: 乾隆和曹操谁活的更久?
这里是否需要跟进问题:是的。
追问: 乾隆去世时几岁?
中间答案: 乾隆去世时87岁。
追问: 曹操去世时几岁?
中间答案: 曹操去世时66岁。
所以最终答案是: 乾隆。
Question: 小米手机的创始人什么时候出生?
这里是否需要跟进问题:是的。
追问: 小米手机的创始人是谁?
中间答案: 小米手机由雷军创立。
追问: 雷军什么时候出生?
中间答案: 雷军出生于1969年12月16日。
所以最终答案是:1969年12月16日。
Question: 乔治华盛顿的外祖父是谁?
这里是否需要跟进问题:是的。
追问:乔治华盛顿的母亲是谁?
中间答案:乔治华盛顿的母亲是玛丽鲍尔华盛顿。
追问: 玛丽鲍尔华盛顿的父亲是谁?
中间答案: 玛丽鲍尔华盛顿的父亲是约瑟夫鲍尔。
所以最终答案是: 约瑟夫鲍尔。
Question: 《大白鲨》和《皇家赌场》的导演是同一个国家的吗?
这里是否需要跟进问题:是的。
追问:《大白鲨》的导演是谁?
中间答案: 《大白鲨》的导演是史蒂文斯皮尔伯格。
追问:史蒂文斯皮尔伯格来自哪里?
中间答案: 美国。
追问:《皇家赌场》的导演是谁?
中间答案:《皇家赌场》的导演是马丁坎贝尔。
追问:马丁坎贝尔来自哪里?
中间答案: 新西兰。
所以最终答案是: 不是。
Question: 李白和白居易谁活得更久?
这里是否需要跟进问题:是的。
追问:李白去世时几岁?
中间答案:李白生于701年,卒于762年,享年61岁。
追问:白居易去世时几岁?
中间答案:白居易生于772年,卒于846年,享年75岁。
所以最终答案是:白居易。
Process finished with exit code 0
以上步骤有效地使用LangChain进行少样本提示,提升模型在新任务上的表现。这不仅表现了LangChain在自然语言处理方面的强大功能,也体现少样本学习在当今AI发展中的重要价值。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)