ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LangChain AI应用开发框架核心组件的使用 - 提示词模板组件的使用(1) : 提示词、字符串、占位符模板的使用

LangChain AI应用开发框架核心组件的使用 - 提示词模板组件的使用(1) : 提示词、字符串、占位符模板的使用 目录一、提示词模板 (Prompt Template)概念二、字符串模板三、聊天消息模板四、消息占位符五、使用 LangChain Hub 的提示词模板一、提示词模板 (Prompt Template)概念提示词模板Prompt Template是 LangChain 的核心抽象之一它被广泛应用于构建大语言模型 (LLM) 应用的各个环节。简单来说只要是需要动态、批量、或有结构地向大语言模型【发送请求】的地方几乎都会用到提示词模板。一个简单的例子假设我们想根据一个城市名询问 LLM 其历史按照之前的做法我们可以定义HumanMessage(请介绍上海的历史)、HumanMessage(请介绍西安的历史) 消息等等。可以发现每次询问都会描写重复的消息内容请介绍 xxx 的历史。在 LangChain 中针对这种情况可以定义一个模板固定文本 (模板) : 请介绍 {city} 的历史。输入变量 : [city]定义好后可以使用该模板当我们需要查询北京时就将 city 变量赋值为 北京。模板引擎会生成 请介绍北京的历史。当我们需要查询上海时就将 city 变量赋值为 上海。模板引擎会生成 请介绍上海的历史。由此可得提示词模板就是一个可复用的提示词蓝图它允许我们动态地生成提示词而不是每次都手动编写完整的提示词。它类似于编程中的字符串格式化功能。你创建一个带有 “占位符” 的模板然后在运行时用具体的值变量填充这些占位符从而生成一个最终发送给 LLM 的完整提示词。 提示词模板解决了以下几个核心问题可复用性只需定义一个模板就可以用于无数个类似的查询。关注点分离将提示词的结构和逻辑工程与具体的内容和数据分离开。提示工程师可以专注于优化模板而应用程序则负责提供变量值。一致性确保发送给 LLM 的提示词结构统一这有助于获得更稳定、可预测的输出结果。可维护性如果需要修改提示词的风格或结构只需修改一个模板文件而不用在代码的无数个地方进行修改。二、字符串模板LangChain 提供了 PromptTemplate 类来轻松实现这一功能。PromptTemplate 实现了标准的 Runnable 接口。示例如下代码讲解from langchain_core.prompts import PromptTemplate导入字符串提示模板类 PromptTemplate。PromptTemplate.from_template()调用类方法 from_template传入带占位符 {language} 的模板字符串生成模板对象。{language} 是占位符后续运行时传入真实值替换。.invoke({language: Chinese})因为 PromptTemplate 实现 Runnable 接口使用 invoke 方法传入字典字典 key 对应占位符变量名value 是要填充的实际内容完成占位符替换。print 打印填充完成之后得到的完整提示文本。打印结果说说明class langchain_core.prompts.prompt.PromptTemplate 类参数如下template提示模板input_variables需要其值作为提示输入的变量的名称列表。内置方法from_template()从模板定义提示模板。方法返回了一个 PromptTemplate 实例因此除了上面示例中 PromptTemplate.from_template 定义提示模板的方式外下面这种方法也可以直接初始化模板代码讲解使用 PromptTemplate 直接构造实例对象不使用 from_template 工厂方法。input_variables[language]显式声明模板当中用到的输入变量列表告诉模板有哪些占位符。templateTranslate the following into {language}传入原始模板字符串内部包含占位符 {language}。执行完成后得到的 prompt_template 对象功能和 from_template 创建出来的对象完全等价。三、聊天消息模板ChatPromptTemplate 模板专为 LangChain 聊天模型设计。可以方便地构建包含SystemMessa ge、HumanMessage、AIMessage 的消息模板。如下代码所示代码讲解from langchain_core.prompts import ChatPromptTemplate导入聊天专用的提示模板类 ChatPromptTemplate区别于普通字符串模板 PromptTemplate。构造模板的时候传入列表列表内部是元组格式第一个元素代表消息角色system/user/ai第二个元素是消息内容字符串可以写占位符 {language}、{text}。版本注释说明0.2.24 及更高版本支持直接传列表构造对象旧版本必须调用from_messages()类方法完成初始化。.invoke() 传入字典对模板内部全部占位符进行变量填充返回的不是普通字符串是 ChatPromptValue 对象。.to_messages()调用该方法把 ChatPromptValue 对象转换为真正可直接传给聊天大模型的消息对象列表SystemMessage、HumanMessage 实例。print 打印最终消息列表。打印结果现在我们可以将该结果发送给任何一个 LLM 来获取答案。如下所示代码讲解from langchain_openai import ChatOpenAI导入 OpenAI 聊天模型类用来实例化大模型对象。from langchain_core.prompts import ChatPromptTemplate导入聊天提示模板。from langchain_core.output_parsers import StrOutputParser导入字符串输出解析器用于把模型返回的 AIMessage 对象提取出里面文本字符串。model ChatOpenAI(modelgpt‑4o‑mini)实例化聊天大模型指定模型版本。构造 ChatPromptTemplate 聊天模板system 角色设置翻译指令user 角色接收待翻译文本{language}、{text} 是占位变量。prompt_template.invoke() 传入字典填充占位符得到 ChatPromptValue 对象。.to_messages() 转换为消息对象列表该列表可以直接传给聊天模型调用。parser StrOutputParser() 创建字符串解析器实例。chain model | parser利用 LCEL 管道运算符 | 构建链模型输出直接交给解析器把消息对象转为普通字符串。chain.invoke(messages) 把消息列表送入链执行得到最终文本结果打印输出。打印结果由于 ChatPromptTemplate 同样也实现了标准的 Runnable 接口因此我们还可以通过链来完成调用。如下所示代码讲解导入相关依赖实例化大模型、聊天模板、字符串解析器。chain prompt_template | model | parser 完整 LCEL 链路输入字典首先给到 prompt_template 填充占位符生成消息对象消息传入 model 大模型模型输出交给 parser 解析直接输出字符串。不需要手动调用 .to_messages()链内部自动完成转换。chain.stream() 开启流式调用传入变量字典会逐块返回生成的文本 token。for 循环迭代每一块 tokenprint(token, end|)每输出一个片段后打印分隔符|用来直观展示流式分片效果。打印结果四、消息占位符在上面的 ChatPromptTemplate 中我们看到了如何格式化两条消息并且每条消息都是一个字符串。但如果我们希望将消息插入特定位置怎么办使用 MessagesPlaceholder。MessagesPlaceholder 负责在特定位置添加消息列表。代码如下代码讲解导入 ChatPromptTemplate 聊天模板MessagesPlaceholder 消息占位符同时导入HumanMessage、AIMessage 消息对象。构建聊天模板先写 system 系统消息紧接着放置 MessagesPlaceholder(msgs) msgs是占位符的变量名。messages_to_pass 定义消息对象列表存放多条历史对话消息。.invoke() 传入字典key 为 msgs对应的值就是消息列表模板运行时会把这一整段消息列表插入到 MessagesPlaceholder 所在位置。得到格式化完成的 prompt 对象打印查看结果。打印结果在不显式使用 MessagesPlaceholder 类也可以完成该能力代码讲解不需要显式导入 MessagesPlaceholder 类直接使用元组写法 (placeholder, {msgs}) 实现消息占位。placeholder 是固定角色标识{msgs} 代表传入消息列表的变量名。messages_to_pass 同样构造历史消息对象列表。invoke 传入字典key 是 msgs把消息列表填充到模板内 placeholder 对应的位置效果和直接写 MessagesPlaceholder(msgs) 完全等价。打印输出格式化完成后的 prompt。五、使用 LangChain Hub 的提示词模板LangChain Hub 是一个用于上传、浏览、拉取和管理提示词 (prompts) 的地方。随着 LLM 的发展提示变得越来越重要。LangChain 正在打造一个与像 GitHub 这样的传统平台GitHub 长期以来一直是共享和协作代码的首选平台。于是推出了 LangChain Hub 平台。LangChain Hub 创建一个分享和发现 Prompt 的平台使得开发者可以更容易地发现新用例和精炼提示。这一举措使得提示工程师更容易合作重复使用现有的提示并对其进行微调以实现特定的结果从而加速对话代理和其他基于语言的应用程序的开发和部署。早期的时候 LangChain Hub 有 Prompt、Chain、Agent现在只有 Prompt。LangChain Hub 官网地址LangSmithTake agents from prototype to production. LangSmith gives you the tools to build, debug, evaluate, and ship reliable agents.https://smith.langchain.com/hub/通过登录到 Hub 来探索所有现有提示。目前收藏最高的提示词模板是hardkothari/prompt‑maker。我们就以它为示例演示一下如何使用 LangChain Hub 上的提示。Prompt Maker 模板是一个【提示生成器】它可以自动化优化提示的过程从而提高语言模型在各种应用中的质量和效果。要想使用该能力需要先申请并配置 LangSmith 环境变量LANGSMITH_API_KEY你的LangSmith API Key。接着需要从 hub 拉取相应的提示并使用代码如下代码讲解from langchain_openai import ChatOpenAI导入聊天大模型。from langsmith import Client导入 LangSmith 客户端对象用来访问 LangChain Hub 仓库拉取线上提示词模板。client Client()实例化客户端会读取本机环境变量里面的 LANGSMITH_API_KEY 完成身份认证。client.pull_prompt(hardkothari/prompt-maker, include_modelTrue)从 hub 拉取线上公开模板include_modelTrue 表示连同模板绑定的模型配置一并拉取。实例化 ChatOpenAI 模型对象指定模型。chain prompt | modelLCEL 构建执行链拉取得到的 hub 模板直接作为链的起始组件。while True 开启循环交互持续接收用户输入。读取两个输入task 代表任务目标lazy_prompt 代表用户原始粗糙提示词。输入 quit 就终止循环退出程序。chain.invoke() 传入参数字典将两个变量填充进远程拉取的提示模板.pretty_print() 格式化美观打印模型返回的消息对象。运行代码程序接收用户输入任务是写快排代码原始简单提示词是“开发专家需中文回复”。hub 拉取的 prompt‑maker 模板的作用接收简陋的原始提示自动扩写、优化生成一份更完善、约束更强的专业提示词模型输出的就是优化完成后的完整提示文本后续就可以拿这份优化后的提示直接去调用模型。通过使用这个模板可以大大减少手动调整提示所需的工作量从而节省时间和资源。Prompt Maker 通过分析初始提示的结构和内容然后应用一组预定规则或算法来优化提示以提高响应质量、清晰度和相关性。这在提示的质量对模型的输出有很大影响的场景中特别有用比如客户服务机器人、对话代理或数据分析任务。
返回列表