当前位置: 首页 > news >正文

LangChain学习笔记2 Prompt 模板

安装 langchain 库

pip install langchain

1、概念:提示和提示工程

在大语言模型(LLMs)时代,通过简单地更改提示中的指令,同一个模型可以执行多种任务。这一特性让 LLMs 在各类应用场景中都显得非常灵活和强大。然而,这种灵活性也依赖于提示的设计质量。糟糕的提示往往会导致糟糕的输出,而精心设计的提示则能够引导模型发挥出其强大的潜力。

**提示(Prompt)**是用户提供给模型的输入文本,通常用于指导模型完成特定任务或生成特定风格的文本。一个好的提示不仅能够清晰地传达任务意图,还能够提供足够的上下文信息,以引导模型生成高质量的输出。提示的形式可以是问题、指令、上下文说明等。良好的提示设计需要考虑到以下几个方面:

  • 指令 :告诉模型该怎么做,如何使用外部信息(如果提供),如何处理查询并构建 Out。
  • 明确性:提示要清晰明确,让模型能够准确理解用户的意图。
  • 外部信息或上下文信息:提供足够的背景信息或限制条件,以帮助模型生成更具相关性和准确性的答案。充当模型的附加知识来源。这些可以手动插入到提示中,通过矢量数据库 (Vector Database) 检索(检索增强)获得,或通过其他方式(API、计算等)引入。
  • 任务引导:根据任务类型选择合适的提示结构,比如命令式、问题式或描述式提示,以引导模型生成期望的输出。

**提示工程学(Prompt Engineering)**是一个跨学科的领域,旨在设计和优化与大语言模型交互的提示词。提示工程学不仅仅是简单地编写问题或请求,而是通过精确的结构化和策略性设计,使得模型能够在特定任务中表现得更为出色。它包括以下几个方面:

  • 提示词设计:如何根据任务的需要,构造合适的提示语句。
  • 调优和迭代:根据模型的反馈,不断调整提示词,以提高模型生成的质量。
  • 上下文管理:有效地为模型提供足够的上下文,确保生成的答案与期望的一致。

2、LangChain Prompt 模板

2.1 PromptTemplate(String PromptTemplates)

这些提示模板用于格式化单个字符串,通常用于更简单的输入。
例1

from langchain_core.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")result = prompt_template.invoke({"topic": "cats"})
print(result)

会生成字符串

text=‘Tell me a joke about cats’
Process finished with exit code 0
例2

from langchain.prompts import PromptTemplate
# 定义一个模板 字符串
template = """Question1: {question1} 
Question2: {question2}   
Answer:"""
prompt1 = PromptTemplate(template=template, input_variables=['question1', 'question2'])prompt2 = PromptTemplate.from_template("Question1: {question1} Question2: {question2} Answer:")
# 用户问题
question1 = "Which NFL team won the Super Bowl in the 2010 season?"
question2 = "Who won the Super Bowl in 2010?"
# 格式化模板
result1 = prompt1.format(question1=question1, question2=question2)
result2 = prompt2.format(question1=question1, question2=question2)
print(result1)
print(result2)

会生成字符串

Question1: Which NFL team won the Super Bowl in the 2010 season?
Question2: Who won the Super Bowl in 2010?
Answer:
Question1: Which NFL team won the Super Bowl in the 2010 season? Question2: Who won the Super Bowl in 2010? Answer:
Process finished with exit code 0

2.2 ChatPromptTemplate(ChatPromptTemplates)

这些提示模板用于设置消息列表的格式。这些 “模板” 由模板本身的列表组成。通常用于聊天机器人,会生成聊天消息列表。

2.2.1 通过消息数组创建聊天消息模板

from langchain_core.prompts import ChatPromptTemplate# 通过消息数组创建聊天消息模板
# 数组每一个元素代表一条消息,包含role和content两部分
# role的值可以是system、user、assistant
# content的值是消息的内容chat_template = ChatPromptTemplate.from_messages([("system", "你是一个翻译官,名叫{name}"),("user", "你好"),("assistant", "你好,我是{name},你好!"),("user", "请帮我翻译这句话:{input}"),]
)
# 通过模板参数格式化模板内容
messages = chat_template.format_messages(name="小智", input="请帮我写一篇关于AI的文章")
print(messages)

[SystemMessage(content=‘你是一个翻译官,名叫小智’), HumanMessage(content=‘你好’), AIMessage(content=‘你好,我是小智,你好!’), HumanMessage(content=‘请帮我翻译这句话:请帮我写一篇关于AI的文章’)]
Process finished with exit code 0

在 ChatPromptTemplate 中,role 字段的值通常可以是以下几种:
system:表示系统角色。通常用于向模型提供上下文或背景信息,比如设置模型的行为或规则。
user:表示用户角色。通常是用户发出的请求或问题,模型需要根据这些输入生成响应。
assistant:表示助手角色。通常是模型生成的响应,回答用户的问题或根据用户请求执行任务。

2.2.2 通过具体的消息提示模板类的实例数组创建聊天消息模板

from langchain_core.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate# 通过具体的消息提示模板类的实例数组创建聊天消息模板
system_message_prompt = SystemMessagePromptTemplate.from_template("你是一个翻译官")
human_message_prompt = HumanMessagePromptTemplate.from_template("请帮我翻译这句话:{input}")
# messages列表
messages = [system_message_prompt,human_message_prompt
]
chat_prompt = ChatPromptTemplate(messages=messages)
messages = chat_prompt.format_messages(input="请帮我写一篇关于AI的文章")
print(messages)

[SystemMessage(content=‘你是一个翻译官’), HumanMessage(content=‘请帮我翻译这句话:请帮我写一篇关于AI的文章’)]
Process finished with exit code 0

2.2.3 通过SystemMessage、HumanMessagePromptTemplate创建聊天消息模板

from langchain_core.messages import SystemMessage
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate# 通过SystemMessage、HumanMessagePromptTemplate创建聊天消息模板
chat_template = ChatPromptTemplate.from_messages([SystemMessage(content="你是一个翻译官"),HumanMessagePromptTemplate.from_template("请帮我翻译这句话:{input}")]
)
messages = chat_template.format_messages(input="请帮我写一篇关于AI的文章")
print(messages)

[SystemMessage(content=‘你是一个翻译官’), HumanMessage(content=‘请帮我翻译这句话:请帮我写一篇关于AI的文章’)]
Process finished with exit code 0

2.3 MessagePlaceholder

此提示模板负责在特定位置添加消息列表。通过MessagePlaceholder在指定位置传入一组消息。

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderprompt_template = ChatPromptTemplate.from_messages([SystemMessage(content="You are a helpful assistant."),        #systemMessagesPlaceholder("msgs")         # palceholder
])
result = prompt_template.invoke({"msgs": [HumanMessage(content="hi!"),{"role": "user", "content": "你是谁?"}
]})
print(result)

这将生成一个包含三条消息的列表,第一条是系统消息,第二条和第三条是我们传入的 HumanMessage。这对于将消息列表放入特定位置非常有用。

messages=[SystemMessage(content=‘You are a helpful assistant.’), HumanMessage(content=‘你是谁?’), HumanMessage(content=‘hi!’)]
Process finished with exit code 0

在不显式使用 MessagesPlaceholder 类的情况下完成相同操作的另一种方法是:

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderprompt_template = ChatPromptTemplate([("system", "You are a helpful assistant"),("placeholder", "{msgs}")]
)
result = prompt_template.invoke({"msgs": [HumanMessage(content="hi!"),{"role": "user", "content": "你是谁?"}
]})
print(result)

2.4 Few-shot prompting

添加示例输入和预期输出的技术模型提示被称为“少样本提示”。

2.4.1 生成示例

少样本提示的第一步也是最重要的一步是提供一个好的示例数据集。
好的示例应该在运行时相关、清晰、信息丰富,并提供模型尚不知道的信息。
单匝与多轮示例:最简单类型的示例仅具有用户输入和预期模型输出。这些是单匝示例。一种更复杂的类型是示例是整个对话,通常模型最初响应不正确,然后用户告诉模型如何纠正其答案。这称为多轮示例。

2.4.2 例子数量

关键的权衡是,更多的示例通常会提高性能,但更大的提示会增加成本和延迟。超过某个阈值,过多的示例可能会开始使模型变得混乱。找到正确数量的示例在很大程度上取决于模型、任务、示例的质量以及成本和延迟限制。有趣的是,模型越好,表现良好所需的示例就越少,并且添加更多示例时,您的回报率就会越快急剧递减。但是,可靠地回答这个问题的最佳/唯一方法是使用不同数量的示例进行一些实验。

2.4.3 选取示例

需要有一种方法根据给定的输入从数据集中选择示例。示例选择器是负责选择示例并将其格式化为提示的类(https://python.langchain.com/docs/concepts/example_selectors/)。
可以随机、通过输入的(语义或基于关键字)相似性、基于一些其他约束,例如令牌大小进行选取。

2.4.4 格式化示例

不同的模型对不同的语法有更好的响应,例如ChatML 、XML、TypeScript 等。

from langchain.prompts import FewShotPromptTemplate
from langchain.prompts.prompt import PromptTemplate# 定义示例
examples = [{"text": "I love this movie!", "label": "positive"},{"text": "This book is boring.", "label": "negative"},{"text": "The weather is nice today.", "label": "neutral"}
]# 创建示例模板
example_template = """
Text: {text}
Label: {label}
"""# 创建PromptTemplate
example_prompt = PromptTemplate(input_variables=["text", "label"],template=example_template
)# 创建FewShotPromptTemplate
few_shot_prompt = FewShotPromptTemplate(examples=examples, #一个列表,包含多个示例,每个示例是一个字典,其中包含输入文本和对应的标签。这些示例将用于指导模型进行预测。example_prompt=example_prompt, #  一个 PromptTemplate 对象,用于定义示例的格式。它指定了如何将示例中的输入变量(如 text 和 label)填充到模板中prefix="Please classify the following texts as positive, negative, or neutral:",  # 一个字符串,用于在所有示例之前添加的前缀。这个前缀通常提供一些上下文或指导信息,帮助模型理解任务。suffix="Text: {input}\nLabel:",   #一个字符串,用于在所有示例之后添加的后缀。这个后缀通常包含一个占位符,用于提示模型输入新的文本进行分类。input_variables=["input"]
)# 使用FewShotPromptTemplate进行预测
new_text = "I enjoyed the concert last night."
print(few_shot_prompt.format(input=new_text))

E:\Anaconda3\envs\openAI\python.exe E:\PythonProjects\openAI\few_short_prompt_template.py
Please classify the following texts as positive, negative, or neutral:
Text: I love this movie!
Label: positive
Text: This book is boring.
Label: negative
Text: The weather is nice today.
Label: neutral
Text: I enjoyed the concert last night.
Label:
Process finished with exit code 0

相关文章:

LangChain学习笔记2 Prompt 模板

安装 langchain 库 pip install langchain1、概念:提示和提示工程 在大语言模型(LLMs)时代,通过简单地更改提示中的指令,同一个模型可以执行多种任务。这一特性让 LLMs 在各类应用场景中都显得非常灵活和强大。然而&…...

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中,可以通过设置定时触发器(Schedules)和脚本中的时间判断逻辑结合,确保任务只在每月 10 号的上午运行。 以下是实现的步骤: 1. 设置定时触发器 GitLab 提供了 Schedules 功能,可以指定每…...

SimpleFOC |SimpleFOC学习笔记汇总

在机器人领域,掌握无刷电机的控制相当于掌握机器人设计的“半壁江山”。这个年代,对个人来说学习一种新技术最好是通过开源项目了。通过开源项目快速将项目搭建起来,接着结合实践与理论才能真正掌握技术。 入门FOC,我认为最合适是…...

OpenArk64:Windows 系统分析与逆向工程工具详解

引言 在 Windows 系统的底层操作和逆向工程领域,OpenArk 是一款备受推崇的开源工具集。而 OpenArk64.exe 是 OpenArk 工具的 64 位版本,专门用于 64 位 Windows 系统。它提供了强大的功能,帮助用户深入分析系统内核、进程、文件、注册表等&a…...

数据储存与管理【大数据导论】

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:大数据入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…...

《从零到一:搭建高效体育直播网站的全流程技术指南》

搭建一个体育直播网站需要综合考虑技术架构、数据来源、用户体验、安全性等多个层面。从整体到细节,搭建这样一个网站的流程比较复杂,但可以分成几个重要的步骤和技术环节。以下是搭建体育直播网站的技术层面准备全流程: 一、需求分析与规划 …...

松散比较(PHP)(小迪网络安全笔记~

免责声明:本文章仅用于交流学习,因文章内容而产生的任何违法&未授权行为,与文章作者无关!!! 附:完整笔记目录~ ps:本人小白,笔记均在个人理解基础上整理,…...

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中,一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器,其社区版本已能支持连接近百种数据库,受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…...

网络基础知识指南|1-20个

1. IP地址: 即互联网协议地址,是用于标识互联网上的每一个设备或节点的唯一地址。IP地址的作用主要是进行网络设备的定位和路由,确保数据包可以从源设备准确地传送到目标设备。2. 子网掩码: 是用于将一个IP地址划分为网络地址和主机地址的工具。它通常与…...

01.09周四F34-Day50打卡

文章目录 1. -我大衣呢? -就在上次你放的地方。2. 这所学校是在曾经的影院上建立起来的。3. 她今天落到这个地步都怪你。4. 留得青山在,不怕没柴烧。(一息尚存,希望不灭。)5. 有善良的地方就有美德,有美德的地方就有奇迹。(《灰姑娘》原句)6. 为了和老外说话时不再发窘,所…...

Linux简介和环境搭建

Linux 介绍和环境搭建 1、发行版本 Linux 操作系统有多个主流发行版本,每个版本根据不同的目标、特点和使用场景为用户提供了不同的功能和体验。 Ubuntu • 特点:Ubuntu 是最为人熟知的 Linux 发行版之一,强调易用性和用户友好性&#xff…...

在移动端开发图表,uniapp+echarts,需要特殊处理,使用renderjs

1.首先要创建一个组件warning,用来装图表(我排除绿色那段代码为我的需求,不是必要代码) <template> <div class="task_container"> <div class="pop_body"> <div class="footer"> <warning…...

SpringBoot之LazyInitializationBeanFactoryPostProcessor类源码学习

源码分析 /**** author Andy Wilkinson* author Madhura Bhave* author Tyler Van Gorder* author Phillip Webb* since 2.2.0* see LazyInitializationExcludeFilter** 主要用于延迟初始化 Bean 的配置。它通过修改 BeanFactory 的配置来确保某些 Bean 在实际需要时才进行初始…...

United States of America三种表示

"United States of America", "United States", 和 "America" 都表示美国&#xff0c;但它们的使用场景和背景略有不同。以下是关于为什么这些名称可以合在一起表示美国的详细解释&#xff1a; 1. "United States of America" 全称&a…...

OpenCV基于均值漂移算法(pyrMeanShiftFiltering)的水彩画特效

1、均值漂移算法原理 pyrMeanShiftFiltering算法结合了均值迁移&#xff08;Mean Shift&#xff09;算法和图像金字塔&#xff08;Image Pyramid&#xff09;的概念&#xff0c;用于图像分割和平滑处理。以下是该算法的详细原理&#xff1a; 1.1 、均值迁移&#xff08;Mean …...

【C++】拷贝构造函数与运算符重载

写在前面 拷贝构造函数、赋值运算符重载、取地址运算符都是属于类的默认成员函数&#xff01; 默认成员函数是程序猿不显示声明定义&#xff0c;编译器会中生成。 在程序编写中&#xff0c;我们也经常使用拷贝的方式来获取到对应的值&#xff0c;例如整形变量拷贝int a 0; i…...

2024年开发语言热度排名

随着技术的不断发展和变化&#xff0c;编程语言的热度也在不断演变。2024年即将到来&#xff0c;我们有必要回顾和展望当前和未来的开发语言市场。本文将基于多个因素&#xff0c;包括行业需求、社区支持、流行度以及新兴趋势&#xff0c;对2024年的开发语言热度进行排名和分析…...

CryptoMamba:利用状态空间模型实现精确的比特币价格预测

“CryptoMamba: Leveraging State Space Models for Accurate Bitcoin Price Prediction” 论文地址&#xff1a;https://arxiv.org/pdf/2501.01010 Github地址&#xff1a;https://github.com/MShahabSepehri/CryptoMamba 摘要 预测比特币价格由于市场的高波动性和复杂的非线…...

MQTTX客户端使用

一、MQTT服务器&#xff08; emqx &#xff09;搭建 (1) 下载服务器MQTT Broker 从https://www.emqx.com/zh/downloads/broker/5.3.0/emqx-5.3.0-windows-amd64.zip下载MQTT Broker。 这里我使用的windows系统&#xff0c;下载对应版本工具&#xff1a;emqx-5.3.0-windows-a…...

网管平台(进阶篇):路由器的管理实践

在当今数字化时代&#xff0c;路由器作为网络连接的核心设备&#xff0c;其管理对于确保网络的稳定、高效和安全至关重要。本文旨在深入探讨路由器管理的重要性、基本设置步骤、高级功能配置以及日常维护&#xff0c;帮助读者构建一个高效且安全的网络环境。 一、路由器管理的…...

隧道裂缝剥落病害AI识别系统

我国现有公路隧道超2.5万座&#xff0c;总里程超2.8万公里&#xff0c;其中运营超过15年的老旧隧道占比达35%。据交通运输部2025年统计&#xff0c;年均因隧道结构病害导致的交通中断超1200次&#xff0c;直接经济损失超45亿元。传统检测模式暴露四大核心痛点&#xff1a;检测周…...

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析

高性能Windows流媒体服务器部署&#xff1a;5大核心技术与3种实战架构深度解析 【免费下载链接】srs-windows 项目地址: https://gitcode.com/gh_mirrors/sr/srs-windows 在Windows平台上构建专业级流媒体服务系统&#xff0c;需要综合考虑协议兼容性、性能优化和部署架…...

从电磁炉到户外电源:拆解单相SVPWM如何让你的逆变器更安静、更高效

从电磁炉到户外电源&#xff1a;单相SVPWM如何实现静音与高效的双重突破当你深夜用电磁炉煮面时&#xff0c;是否曾被突然的蜂鸣声吓一跳&#xff1f;或是发现户外电源给设备充电时&#xff0c;散热风扇的噪音盖过了山林鸟鸣&#xff1f;这些常见问题背后&#xff0c;隐藏着一个…...

BurpSuite 2025插件开发JDK版本兼容性实战指南

1. 为什么BurpSuite插件开发环境总在JDK版本上翻车&#xff1f;你是不是也经历过&#xff1a;下载好BurpSuite最新版2025.4&#xff0c;兴冲冲打开插件开发文档&#xff0c;照着官方示例写完第一个HelloWorld插件&#xff0c;一编译——java.lang.UnsupportedClassVersionError…...

Redis分布式锁进阶第二十篇

一、本篇前置衔接 第二十篇我们完成了全系列终局复盘&#xff0c;整理了故障排查SOP与企业级落地铁律。常规单资源锁、热点分片锁、隔离锁全部讲透&#xff0c;但真实复杂业务永远不是单一资源&#xff1a;下单要扣库存、扣优惠券、扣积分、冻结余额&#xff0c;多资源并行争抢…...

从零到上机:我的第一个Quest 3空间锚点应用是如何跑起来的(附完整Unity工程)

从零到上机&#xff1a;我的第一个Quest 3空间锚点应用是如何跑起来的&#xff08;附完整Unity工程&#xff09;第一次戴上Meta Quest 3时&#xff0c;那种虚拟与现实交织的震撼感至今难忘。但作为开发者&#xff0c;更让我着迷的是如何让虚拟物体在真实空间中"记住"…...

Office RibbonX Editor:简单三步打造你的专属Office界面

Office RibbonX Editor&#xff1a;简单三步打造你的专属Office界面 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbonx-edit…...

sngan_projection论文解读:ICLR2018两大GAN技术的完美结合

sngan_projection论文解读&#xff1a;ICLR2018两大GAN技术的完美结合 【免费下载链接】sngan_projection GANs with spectral normalization and projection discriminator 项目地址: https://gitcode.com/gh_mirrors/sn/sngan_projection sngan_projection是一个实现了…...

基于PIC32单片机实现Android USB音频转SPDIF输出的DIY方案

1. 项目概述&#xff1a;为Android设备打造一个高保真SPDIF音频接口作为一名长期折腾嵌入式音频和家庭影院的玩家&#xff0c;我经常遇到一个痛点&#xff1a;手头那些性能不错的Android手机或平板&#xff0c;其内置的3.5mm耳机孔或者USB-C口的音频输出质量&#xff0c;在连接…...

实战解锁:在Blender中掌握专业级MMD动画制作全流程

实战解锁&#xff1a;在Blender中掌握专业级MMD动画制作全流程 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools MMD …...