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

Prompt组件以及使用技巧

Prompt组件的基本组成

大多数LLM应用程序都不会直接将用户输入传递给LLM,通常,它们会将用户输入添加到一个更大的文本片段中,称为提示模版,该模版提供有关特定任务的附加上下文。并且Prompt是所有AI应用交互的起点,以下是LangChain中一个最基础的聊天应用机器人的运行流程如下:

为了适配不同的 LLM,LangChain 封装了 Prompt 组件,并且 Prompt 组件是高可移植性的,同一个 Prompt 可以支持各种 LLM,在切换 LLM 的时候,无需修改Prompt。在 LangChain 中,Prompt 被分成了两大类:

  • Prompt Template:将 Prompt 按照 template 进行一定格式化,针对 Prompt 进行变量处理以及提示词的组合。
  • Selectors:根据不同条件去选择不同提示词,或者在不同情况下通过 Selector,选择不同示例去进一步提高 Prompt 支持能力。

本质上 Selectors 只是 Prompt Template 的二次封装,所以在课程中会重点使用 Prompt Template,因为 Selectors 使用范围太窄了,应用场景太小。

对于 Prompt Template,在 LangChain 中,又涵盖了多个子组件,例如:角色提示模板、消息占位符、文本提示模板、聊天消息提示模板、提示、消息等,Prompt Template 的运行流程如下:


不同 Prompt 组件功能的简介

  • PromptTemplate:用于创建文本消息提示模板,用于与大语言模型 / 文本生成模型进行交互。
  • ChatPromptTemplate:用于创建聊天消息提示模板,一般用于与聊天模型进行交互。
  • MessagePlaceholder:消息占位符,在聊天模型中对不确定是否需要的消息进行占位。
  • SystemMessagePromptTemplate:用于创建系统消息提示模板,角色为系统。
  • HumanMessagePromptTemplate:用于创建人类消息提示模板,角色为人类。
  • AIMessagePromptTemplate:用于创建 AI 消息提示模板,角色为 AI。
  • PipelinePromptTemplate:用于创建管道消息,管道消息可以将提示模板作为变量进行快速复用。

Prompt 不同方法的功能简介

  • partial:用于格式化提示模板中的部分变量。
  • format:传递变量数据,格式化提示模板为文本消息。
  • invoke:传递变量字典,格式化提示模板为提示。
  • to_string:将提示 / 消息提示列表转换成字符串。
  • to_messages:用于将消息提示列表转换成消息对象列表。

Prompt 中重载的运算符

    • 运算符:在 Prompt 组件中,对 + 运算符使用add方法进行重写,所以几乎所有 Prompt 组件都可以使用 + 进行组装拼接。

Prompt组件的格式化

在 Prompt 组件中,默认使用 f-string 方法来格式化变量。f-string 是 Python 3.6 以后版本中引入的一种特性,用于在字符串中插入表达式的值,语法简洁,直接利用 {} 花括号包裹变量或者表达式,即可执行简单的运算,性能较好,但是只限用在 Python 中。

例如:在传入的提示模板中,使用 {variable_name} 来定义提示模板内的变量,在模板中定义了多少个变量,调用时就需要传递多少个变量对应的值,如下:

fromlangchain_core.promptsimportPromptTemplate,ChatPromptTemplate prompt=PromptTemplate.from_template("请将一个关于{subject}的笑话")print(prompt.format(subject="程序员"))

jinja2 常被应用于网页开发,与 Flask 和 Django 等框架结合使用。它不仅支持变量替换,还支持其他的控制结构(例如循环和条件语句)以及自定义过滤器和宏等高级功能。此外,它的可用性范围更广,可在多种语境下使用。但与 f-string 不同,使用 jinja2 需要安装相应的库。

fromlangchain_core.promptsimportPromptTemplate,ChatPromptTemplate prompt=PromptTemplate.from_template("请将一个关于{{ subject }}的笑话",template_format="jinja2")print(prompt.format(subject="程序员"))

Prompt使用实例

基础用法

fromlangchain_core.promptsimport(PromptTemplate,ChatPromptTemplate,MessagesPlaceholder,HumanMessagePromptTemplate)fromdatetimeimportdatetimefromlangchain_core.messagesimportAIMessage prompt=PromptTemplate.from_template("请将一个关于{subject}的冷笑话")print(prompt.format(subject="程序员"))prompt_value=prompt.invoke({"subject":"休息休息吧"})print(prompt_value.to_string())print(prompt_value.to_messages())print("=========================================")chat_prompt=ChatPromptTemplate.from_messages([("system","你是openAI开发的聊天机器人,请根据用户的提问进行回复,当前的时间为:{now}"),# 有时候可能还有其他的消息,但是不确定MessagesPlaceholder("chat_history"),HumanMessagePromptTemplate.from_template("请讲一个关于{subject}的冷笑话")]).partial(now=datetime.now())chat_prompt_value=chat_prompt.invoke({# "now": datetime.now(),"chat_history":[("human","我叫钱多多"),AIMessage("你好,我是ChatGtp, 有什么可以帮助到你")],"subject":"程序员"})print(chat_prompt_value)print(chat_prompt_value.to_string())

字符串提示拼接

代码

fromlangchain_core.promptsimportPromptTemplate prompt=(PromptTemplate.from_template("请将一个关于{subject}的冷笑话")+", 让我开心下"+"\n使用{language}语言。")print(prompt)print(prompt.format(subject="程序员",language="中文"))

输出:

input_variables=['language','subject']template='请将一个关于{subject}的冷笑话, 让我开心下\n使用{language}语言。'请将一个关于程序员的冷笑话,让我开心下 使用中文语言。

聊天提示拼接

fromlangchain_core.promptsimportChatPromptTemplate system_chat_prompt=ChatPromptTemplate.from_messages([("system","你是OpenAI开发的聊天机器人,请根据用户的提问进行回复,我叫{username}")])human_chat_prompt=ChatPromptTemplate.from_messages([("human","{query}")])chat_prompt=system_chat_prompt+human_chat_promptprint(chat_prompt.invoke({"username":"莫小课","query":"你好,你是?"}))

复用提示模版

fromlangchain_core.promptsimportPromptTemplatefromlangchain_core.runnablesimportRunnableLambda full_template=PromptTemplate.from_template(""" {example} {start} """)# 描述模版instruction_prompt=PromptTemplate.from_template("你正在模拟{person}")# 实例模版example_prompt=PromptTemplate.from_template("""下面是一个交互例子: Q:{example_q} A:{example_a} """)# 开始模版start_prompt=PromptTemplate.from_template("""现在,你是一个真实的人,请回答用户的问题: Q:{input} A: """)pipeline_prompts=[("instruction",instruction_prompt),("example",example_prompt),("start",start_prompt),]defpipeline_prompt_func(inputs:dict):instruction=instruction_prompt.invoke(inputs).text example=example_prompt.invoke(inputs).text start=start_prompt.invoke(inputs).textreturnfull_template.invoke({"instruction":instruction,"example":example,"start":start}).text pipeline_prompt=RunnableLambda(pipeline_prompt_func)print(pipeline_prompt.invoke({"person":"雷军","example_q":"你最喜欢的汽车是什么?","example_a":"小米su7","input":"你最喜欢的手机是什么"}))
http://www.jsqmd.com/news/737865/

相关文章:

  • 在旧手机(Android 5.0)上用Termux 0.118跑Alpine Linux,我踩过的那些坑都帮你填平了
  • TranslucentTB终极指南:让Windows任务栏焕然一新的免费神器
  • Roofline模型在LLM边缘部署中的优化实践
  • LLaMA Pro:块扩展技术如何低成本增强大模型专业能力
  • 别再手动切数据源了!用Dynamic-Datasource轻松管理MySQL多库与Druid连接池
  • 2026全国专精特新小巨人画像
  • ADS1231低功耗模式实战:用STM32的GPIO控制实现电池供电的电子秤
  • 手把手带你理解:DDR5 On Die ECC如何从芯片内部防御‘Row Hammer’攻击
  • 如何让单人游戏变身多人派对?解密Nucleus Co-Op的分屏魔法
  • AlienFX Tools:逆向工程驱动的Alienware硬件控制开源架构
  • 3步解锁AI语音新维度:RVC的检索增强式语音转换实践
  • 5分钟快速上手:Retrieval-based-Voice-Conversion-WebUI终极语音克隆指南
  • YOLOv5/v7.0 anchor设置错了怎么办?从零教你用自定义数据集重新聚类生成最佳anchor尺寸
  • WechatRealFriends:如何一键检测微信单向好友的终极完整指南
  • 本地Cookie导出神器:Get cookies.txt LOCALLY完全指南
  • 如何让单人游戏变多人分屏:Nucleus Co-Op完整实战指南
  • 如何用SMUDebugTool精准调控AMD Ryzen处理器:免费开源硬件调试终极指南
  • 【FDA 2026嵌入式C合规终极指南】:20年医疗设备认证专家亲授——避开97%团队踩过的3类致命代码陷阱
  • 5分钟快速上手:TranslucentTB让Windows任务栏透明美化的终极指南
  • 李辉《曾国藩日记》笔记:请了八个人来斟酌这谢恩折该如何写好
  • R3nzSkin英雄联盟换肤工具:从零开始实现游戏皮肤自由
  • 保姆级教程:手把手带你搞定RHCSA考试中的网络配置与SELinux调试(附避坑指南)
  • 3秒获取百度网盘提取码:开源工具baidupankey完全指南
  • 创业团队如何利用统一API管理多个大模型以应对不同业务场景
  • 微信聊天记录永久备份终极指南:开源工具WeChatExporter让你轻松掌控珍贵数据
  • 如何5分钟上手AI语音转换:AICoverGen完整实战指南
  • 3分钟搞定GitHub下载加速:这个免费插件让你告别龟速等待!
  • 从SENet到GhostNetV2:注意力机制在移动端模型中的实战优化与选型指南
  • 轻量级上下文管理库lean-ctx:嵌入式与高性能场景的线程局部存储实践
  • 3步搞定B站缓存视频合并:Android手机上的终极解决方案