langchain系列(二)- 提示词以及模板
导读
环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3
背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain
时间:20250212
说明:技术梳理
提示词模板理论说明
提示模板将用户输入和参数转换为语言模型的指令,以此来实现模型的响应,帮助它理解上下文并生成相关且连贯的基于语言的输出。其接受一个字典作为输入,其中每个键代表提示模板中要填充的一个变量。它会输出一个PromptValue,这个参数值可以传递给LLM或ChatModel,也可以转换为字符串或消息列表,存在此值的原因是为了便于在字符串和消息之间切换。
提示下模板的分类
字符串模板
用于格式化单个字符串,通常用于更简单的输入,该模板由字符串模板组成。它接受用户提供的参数集,可用于生成语言模型的提示。模板可以使用f-strings(默认)、jinja2或mustache语法进行格式化,建议使用f-string方式(安全方面考虑)
from langchain_core.prompts import PromptTemplateprompt_template = PromptTemplate.from_template("Tell me a joke about {topic}")prompt_template.invoke({"topic": "cats"})
聊天工具模板
用于格式化消息列表。这些“模板”由模板本身的列表组成
from langchain_core.prompts import ChatPromptTemplateprompt_template = ChatPromptTemplate([("system", "You are a helpful assistant"),("user", "Tell me a joke about {topic}")
])prompt_template.invoke({"topic": "cats"})
在上面的例子中,这个ChatListTemplate在被调用时将构造两条消息。第一个是系统消息,它没有要格式化的变量。第二个是HumanMessage,它将由用户传入的topic变量格式化。
信息占位符
用于在特定位置添加消息列表
在上面的聊天模板中,我们看到了如何格式化两条消息,每条消息都是一个字符串。但是,如果我们希望用户传递一个消息列表,并将其插入特定的位置,这时需要使用MessagesPlaceholder的方式
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.messages import HumanMessageprompt_template = ChatPromptTemplate([("system", "You are a helpful assistant"),MessagesPlaceholder("msgs")
])prompt_template.invoke({"msgs": [HumanMessage(content="hi!")]})
这将产生两条消息的列表,第一条是系统消息,第二条是我们传入的HumanMessage。如果我们传入了5条消息,那么它总共会产生6条消息(系统消息加上传入的5条消息)。这对于将消息列表插入特定位置非常有用
上述示例为显式使用,下面为隐式使用
prompt_template = ChatPromptTemplate([("system", "You are a helpful assistant"),("placeholder", "{msgs}") # <-- This is the changed part
])
实战演示
PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser# 调用一个大模型,qwen的开源,可以自己获取
translate_llm = ChatOpenAI(base_url="https://llm.xxx.xxxx.com/v1/",openai_api_key="sk-xxxxxxxxxx",model_name="qwen2.5-instruct")# 创建一个提示词模板,变量即为用户输入的英文
translate_prompt = PromptTemplate.from_template("请将英文翻译为中文, 问题:{input}")
print("translate_prompt:", translate_prompt)
# 构造链,最终以字符串格式输出
model = translate_prompt | translate_llm | StrOutputParser()# 调用链
response = model.invoke({"input":"hello"})
print("response:", response)
# 输出打印内容
(venv) jack@desktop-legion-7000k:~/lang_test$ python translate_tt.py
translate_prompt: input_variables=['input'] input_types={} partial_variables={} template='请将英文翻译为中文, 问题:{input}'
response: 翻译:你好
以上示例可以成功执行,由此可以看出:translate_prompt是一个对象,其属性template为自定义的字符串
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser# 调用一个大模型,qwen的开源,可以自己获取
translate_llm = ChatOpenAI(base_url="https://llm.ams.lenovo.com/v1/",openai_api_key="sk-Vie3w5wRtkawW",model_name="qwen2.5-instruct")# 创建一个提示词模板,变量即为用户输入的英文
translate_prompt = PromptTemplate.from_template("请将英文翻译为中文, 问题:{input}")# 调用链
response = translate_prompt.invoke({"input":"hello"})
print("response:", response)# 输出内容
response: text='请将英文翻译为中文, 问题:hello'
此处没有使用模型以及chain,输出内容为替换后的字符串
ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser# 调用一个大模型,qwen的开源,可以自己获取
translate_llm = ChatOpenAI(base_url="https://llm.xxxxxx.com/v1/",openai_api_key="sk-xxxxxxxx",model_name="qwen2.5-instruct")# 创建一个提示词模板,变量即为用户输入的英文
translate_prompt = ChatPromptTemplate.from_messages([("system", "你是一个专业的翻译助手,将用户输入的英文翻译为中文"), ("human", "{input}")]
)
print("translate_prompt:", type(translate_prompt))
print("translate_prompt:", translate_prompt)
# 构造链,最终以字符串格式输出
model = translate_prompt | translate_llm | StrOutputParser()# 调用链
response = model.invoke({"input":"hello"})
print("response:", response)
# 输出内容
translate_prompt: <class 'langchain_core.prompts.chat.ChatPromptTemplate'>
translate_prompt: input_variables=['input'] input_types={} partial_variables={} messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='你是一个专业的翻译助手,将用户输入的英文翻译为中文'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input'], input_types={}, partial_variables={}, template='{input}'), additional_kwargs={})]
response: 你好
从上述打印的translate_prompt中的
[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='你是一个专业的翻译助手,将用户输入的英文翻译为中文'), additional_kwargs={}), HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['input']
可以看出:属性messages是一个模板列表,分别是系统和用户模板
LangChain的信息类型分为:system、user、assistant、tool、function
MessagesPlaceholder
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.messages import HumanMessage# 调用一个大模型,qwen的开源,可以自己获取
translate_llm = ChatOpenAI(base_url="https://llm.xxxxxx.com/v1/",openai_api_key="sk-xxxxxxxx",model_name="qwen2.5-instruct")
# 创建一个提示词模板,变量即为用户输入的英文
translate_prompt = ChatPromptTemplate.from_messages([("system", "你是一个专业的翻译助手,将用户输入的英文翻译为中文"), MessagesPlaceholder("input")]
)
print("translate_prompt:", type(translate_prompt))
print("translate_prompt:", translate_prompt)
# 构造链,最终以字符串格式输出
model = translate_prompt | translate_llm | StrOutputParser()# 调用链
response = model.invoke({"input":[HumanMessage(content="hi!")]})
print("response:", response)
# 输出内容translate_prompt: <class 'langchain_core.prompts.chat.ChatPromptTemplate'>
translate_prompt: input_variables=['input'] input_types={'input': list[typing.Annotated[typing.Union[typing.Annotated[langchain_core.messages.ai.AIMessage, Tag(tag='ai')], typing.Annotated[langchain_core.messages.human.HumanMessage, Tag(tag='human')], typing.Annotated[langchain_core.messages.chat.ChatMessage, Tag(tag='chat')], typing.Annotated[langchain_core.messages.system.SystemMessage, Tag(tag='system')], typing.Annotated[langchain_core.messages.function.FunctionMessage, Tag(tag='function')], typing.Annotated[langchain_core.messages.tool.ToolMessage, Tag(tag='tool')], typing.Annotated[langchain_core.messages.ai.AIMessageChunk, Tag(tag='AIMessageChunk')], typing.Annotated[langchain_core.messages.human.HumanMessageChunk, Tag(tag='HumanMessageChunk')], typing.Annotated[langchain_core.messages.chat.ChatMessageChunk, Tag(tag='ChatMessageChunk')], typing.Annotated[langchain_core.messages.system.SystemMessageChunk, Tag(tag='SystemMessageChunk')], typing.Annotated[langchain_core.messages.function.FunctionMessageChunk, Tag(tag='FunctionMessageChunk')], typing.Annotated[langchain_core.messages.tool.ToolMessageChunk, Tag(tag='ToolMessageChunk')]], FieldInfo(annotation=NoneType, required=True, discriminator=Discriminator(discriminator=<function _get_type at 0x7fba0c05d440>, custom_error_type=None, custom_error_message=None, custom_error_context=None))]]} partial_variables={} messages=[SystemMessagePromptTemplate(prompt=PromptTemplate(input_variables=[], input_types={}, partial_variables={}, template='你是一个专业的翻译助手,将用户输入的英文翻译为中文'), additional_kwargs={}), MessagesPlaceholder(variable_name='input')]
response: 你好!
与之前相比:属性messages是一个模板列表,分别是系统和信息占位符模板
关于提示词模板不止这三个,但是主要就这三类
相关文章:
langchain系列(二)- 提示词以及模板
导读 环境:OpenEuler、Windows 11、WSL 2、Python 3.12.3 langchain 0.3 背景:前期忙碌的开发阶段结束,需要沉淀自己的应用知识,过一遍LangChain 时间:20250212 说明:技术梳理 提示词模板理论说明 提…...
Openssl的使用,CA证书,中间证书,服务器证书的生成与使用
证书教程 1、Openssl相关文档2、生成证书命令初步解释3、准备openssl的配置文件 openssl.cnf4、证书生成4.1、生成根证书、CA根证书、自签名证书4.2、生成服务器证书4.3、生成中间证书4.3、使用中间证书生成服务器证书5、使用openssl操作证书5.1 查看证书内容5.2 进行证书测试5…...
深入浅出:Python 中的异步编程与协程
引言 大家好,今天我们来聊聊 异步编程 和 协程,这是近年来编程语言领域中的热点话题之一,尤其在 Python 中,它作为一种全新的编程模型,已经成为处理 IO密集型 任务的强力工具。尽管很多人对异步编程望而却步࿰…...
Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
文章目录 Windows中使用Docker安装Anythingllm,基于deepseek构建自己的知识库问答大模型1. 安装 Docker Desktop2. 使用Docker拉取Anythingllm镜像2. 设置 STORAGE_LOCATION 路径3. 创建存储目录和 .env 文件.env 文件的作用关键配置项 4. 运行 Docker 命令docker r…...
Unity使用iTextSharp导出PDF-04图形
坐标系 pdf文档页面的原点(0,0)在左下角,向上为y,向右为x。 文档的PageSize可获取页面的宽高数值 单位:像素 绘制矢量图形 使用PdfContentByte类进行绘制,注意文档打开后才有此对象的实例。 绘制方法 …...
[SAP ABAP] OO ALV报表练习1
销售订单明细查询报表 业务目的:根据选择屏幕的筛选条件,使用 ALV 报表,显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面 涉及的主要功能点: 1.当在销售订单明细查询页面取不到任何数据时,在选择…...
安卓基础(第一集)
SharedPreferences(本地存储简单数据) 在 Android 中,SharedPreferences 用于存储小型数据。 (1)存储数据 // 获取 SharedPreferences 对象 SharedPreferences sharedPreferences getSharedPreferences("MyPre…...
数据库高安全—数据保护:数据动态脱敏
书接上文数据库高安全—审计追踪:传统审计&统一审计,从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读,本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏,顾名思义就…...
Datawhale 数学建模导论二 2025年2月
第6章 数据处理与拟合模型 本章主要涉及到的知识点有: 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论,如果对这部分内容不熟悉,可以参考相关概率论与数理统计的…...
ArcGIS Enterprise 与 ArcGIS Online 的关系
ArcGIS Enterprise 和 ArcGIS Online 是 Esri 提供的两款核心产品,它们在功能、部署方式和使用场景上存在显著差异,但同时也有一定的联系和互补性。以下是关于这两款产品的详细关系说明: 1. 产品定位与功能 ArcGIS Enterprise 是一款企业级解决方案,支持在组织的基础设施上…...
ASP.NET Core SignalR实践指南
Hub类的生命周期是瞬态的,每次调用集线器的时候都会创建一个新的Hub类实例,因此不要在Hub类中通过属性、成员变量等方式保存状态。如果服务器的压力比较大,建议把ASP.NET Core程序和SignalR服务器端部署到不同服务器上,以免它们互…...
【力扣 - 简单题】88. 合并两个有序数组
题目:88. 合并两个有序数组 - 力扣(LeetCode) 解题: class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for (int i m; i < n m; i ){nums1[i] nums2[i -…...
【密评】 | 商用密码应用安全性评估从业人员考核题库(23)
在GM/T0048《智能密码钥匙密码检测规范》中,产品的对称算法性能应满足哪个标准中的要求()。 A.GM/T 0016《智能密码钥匙密码应用接口规范》 B.GM/T 0017《智能密码钥匙密码应用接口数据格式规范》 C.GM/T 0027《智能密码钥匙技术规范》 D.GM/T 0028《密码模块安全技术要求》…...
记录 | WPF基础学习MVVM例子讲解1
目录 前言一、NotificationObject与数据属性创建个类,声明NotificationObject 二、DelegateCommand与命令属性三、View与ViewModel的交互(难点)在ViewModel文件下创建MainWindowViewModel数据和方法绑定资源指定 代码下载四、优势体现代码下载…...
PyTorch 中 `torch.cuda.amp` 相关警告的解决方法
在最近的写代码过程中,遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…...
实验7 路由器之间IPsec VPN配置
实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接,掌握IPsec VPN配置方法,加深对IPsec协议的理解。 2.实验内容 (1)按照实验拓扑搭建实验环境。 (2)在路由器R1和R4配置IP…...
Unity中快速制作2D沙雕动画:流程编
Unity中快速制作2D沙雕动画(搞笑/无厘头风格),通过以下方案实现低成本、高成效的开发流程,结合夸张的动作、滑稽的物理效果和魔性音效: 1. 角色与素材设计 核心原则:丑萌即正义,越怪越好&#…...
小白零基础如何搭建CNN
1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同,如有1维卷积、2维卷积、 3维卷积与转置卷积(可以简单理解为卷积操作的逆操作),但它们的使用方法比较相似,都可以从torch.nn模块中调用,需要调用的…...
【Java八股文】01-Java基础面试篇
【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象,什么是封装继承多态?多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…...
k8s部署logstash
1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…...
Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明
项目场景: 有时候加载的地图服务白色区域会露底,导致在三维场景时,露出了三维网格,影响效果,自此,我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示: 解决方案: 提示…...
《qt open3d网格拉普拉斯平滑》
qt open3d网格拉普拉斯平滑 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionFilterLaplacian_triggered();void MainWindow::on_actionFil...
怎么选择免费的SEO排名工具
随着2025年互联网的迅猛发展,越来越多的企业意识到,拥有一个高排名的网站对于品牌曝光和吸引客户至关重要。尤其是通过SEO(搜索引擎优化),可以提高网站在搜索引擎中的排名,进而带来更多的自然流量ÿ…...
缓存技术介绍
缓存技术是一种用于提高数据访问速度的技术,通过在快速存储介质(如内存)中保存频繁访问的数据,从而减少对较慢存储介质(如硬盘)的访问次数。缓存可以显著提高系统性能,尤其是在处理大量数据或进…...
SSH隧道+Nginx:绿色通道详解(SSH Tunnel+nginx: Green Channel Detailed Explanation)
SSH隧道Nginx:内网资源访问的绿色通道 问题背景 模拟生产环境,使用两层Nginx做反向代理,请求公网IP来访问内网服务器的网站。通过ssh隧道反向代理来实现,重点分析一下nginx反代的基础配置。 实验环境 1、启动内网服务器的tomca…...
Spring 项目接入 DeepSeek,分享两种超简单的方式!
⭐自荐一个非常不错的开源 Java 面试指南:JavaGuide (Github 收获148k Star)。这是我在大三开始准备秋招面试的时候创建的,目前已经持续维护 6 年多了,累计提交了 5600 commit ,共有 550 多位贡献者共同参与…...
【c++】四种类型转换形式
【c】四种类型转换形式 编译时: static_cast(静态转换) const_cast(去常性转换) reinterpret_cast(重新解释转换,直接转换地址) 运行时: dynamic_cast(动态转换,运行时类…...
Unity 制作2D动画必要准备:启动篇
制作Unity 2D动画需要准备以下内容: 美术素材准备 选择或绘制符合需求的2D精灵图(如像素风格角色、场景元素)确保素材包含完整动画序列帧(如行走/攻击/跳跃等动作分解)注意素材尺寸统一性,建议采用网格化排…...
半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图
半小时在本地部署DeepSeek的Janus Pro,进行图片分析和文生图 下载Janus Pro源代码下载模型文件创建Python虚拟环境安装依赖包Janus Pro测试运行程序图片分析测试文生图测试使用中文提示词使用英文提示词 测试印象: 整体模型体积较小,个人可以…...
急停信号的含义
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发C#的运动控制程序的时候,一个必要的步骤就是确认设备按钮的急停…...
