LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt

LangChain系列文章

  1. LangChain 实现给动物取名字,
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出

在这里插入图片描述

语言模型的提示是用户提供的一组指令或输入,用于指导模型的响应,帮助它理解上下文并生成相关和连贯的基于语言的输出,比如回答问题、完成句子或参与对话。

LangChain提供了几个类和函数来帮助构建和处理提示。

  • Prompt templates提示模板:参数化模型输入
  • Example selectors示例选择器:动态选择要包含在提示中的示例

提示模板是预定义的配方,用于生成语言模型的提示。

模板可能包括说明、少量示例,以及适用于特定任务的具体背景和问题。

LangChain提供工具来创建和使用提示模板。

LangChain致力于创建模型无关的模板,以便轻松地在不同的语言模型之间重用现有的模板。

通常,语言模型期望提示要么是一个字符串,要么是一个聊天消息列表。

1. ChatPromptTemplate

聊天模型的提示是一系列聊天消息。

每条聊天消息都与内容和一个称为角色的额外参数相关联。例如,在OpenAI Chat Completions API中,聊天消息可以与AI助手、人类或系统角色相关联。
文件名字chat_prompt_template.py(代码参考了黄佳老师的课程Demo,如需要知道代码细节请读原文)

# 导入Langchain库中的OpenAI模块,该模块提供了与OpenAI语言模型交互的功能
from langchain.llms import OpenAI  

# 导入Langchain库中的PromptTemplate模块,用于创建和管理提示模板
from langchain.prompts import PromptTemplate  

# 导入Langchain库中的LLMChain模块,它允许构建基于大型语言模型的处理链
from langchain.chains import LLMChain  

# 导入dotenv库,用于从.env文件加载环境变量,这对于管理敏感数据如API密钥很有用
from dotenv import load_dotenv  

# 导入Langchain库中的ChatOpenAI类,用于创建和管理OpenAI聊天模型的实例。
from langchain.chat_models import ChatOpenAI

# 调用dotenv库的load_dotenv函数来加载.env文件中的环境变量。
# 这通常用于管理敏感数据,如API密钥。
load_dotenv()  

# 创建一个ChatOpenAI实例,配置它使用gpt-3.5-turbo模型,
# 设定温度参数为0.7(控制创造性的随机性)和最大令牌数为60(限制响应长度)。
chat = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0.7,
    max_tokens=120
)
# 导入Langchain库中的模板类,用于创建聊天式的提示。
from langchain.prompts import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate
)

# 定义一个系统消息模板,用来设定AI的角色和任务(这里是起名字专家)。
template = "你是一位起名字专家,负责为专注于{product}的公司起名。"
system_message_prompt = SystemMessagePromptTemplate.from_template(template)

# 定义一个人类消息模板,用来模拟用户的提问(这里是请求为公司起名)。
human_template = "请为我们的公司起个名字,我们专注于{product_detail}。"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

# 将系统消息和人类消息的模板组合成一个聊天提示模板。
prompt_template = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

# 使用聊天提示模板生成具体的聊天提示,这里指定产品为“水果”和产品细节为“高端送礼设计”。
prompt = prompt_template.format_prompt(product="水果", product_detail="高端送礼设计").to_messages()

# 使用chat函数(需要事先定义)发送生成的提示,获取结果。
result = chat(prompt)

# 打印聊天结果。
print(result)

运行输出

zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python chat_prompt_template.py
content='果香珍品'
zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python chat_prompt_template.py
content='水果佳礼'
zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python chat_prompt_template.py
content='果香尚礼'

2. Few Shot Prompt

文件名text_prompt_few_shot.py

# 导入Langchain库中的OpenAI模块,该模块提供了与OpenAI语言模型交互的功能
from langchain.llms import OpenAI  

# 导入Langchain库中的PromptTemplate模块,用于创建和管理提示模板
from langchain.prompts import PromptTemplate  

# 导入Langchain库中的LLMChain模块,它允许构建基于大型语言模型的处理链
from langchain.chains import LLMChain  

# 导入dotenv库,用于从.env文件加载环境变量,这对于管理敏感数据如API密钥很有用
from dotenv import load_dotenv  

# 调用load_dotenv函数来加载.env文件中的环境变量
load_dotenv()  


# 使用OpenAI类创建一个名为llm的实例。这个实例配置了用于生成文本的模型参数。
# 模型使用的是"text-davinci-003",这是一个高级的GPT-3模型。
# temperature设置为0.8,这决定了生成文本的随机性和创造性。
# max_tokens设置为60,限制生成文本的最大长度。
llm = OpenAI(
    model="text-davinci-003",
    temperature=0.6,
    max_tokens=120
)

samples = [
  {
    "fruit_type": "玫瑰葡萄",
    "occasion": "爱情",
    "ad_copy": "玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。"
  },
  {
    "fruit_type": "金钻菠萝",
    "occasion": "庆祝",
    "ad_copy": "金钻菠萝,庆祝的完美伴侣,为您的特别时刻增添甜蜜与奢华。"
  },
  {
    "fruit_type": "蜜瓜",
    "occasion": "休闲",
    "ad_copy": "蜜瓜,休闲时光的甜蜜伴侣,让您的闲暇时光更加美好。"
  },
  {
    "fruit_type": "富士苹果",
    "occasion": "健康",
    "ad_copy": "富士苹果,健康生活的选择,丰富您的营养,活力每一天。"
  }
]

# 导入PromptTemplate类,用于创建和管理提示模板。
from langchain.prompts import PromptTemplate

# 定义一个提示模板,包括水果类型、场景和广告文案。
# {fruit_type}, {occasion}, 和 {ad_copy} 是占位符,稍后将被替换。
template = "水果类型:{fruit_type}\n场景:{occasion}\n广告文案:{ad_copy}\n"

# 创建一个PromptTemplate实例,传入输入变量和模板。
prompt_sample = PromptTemplate(input_variables=["fruit_type", "occasion", "ad_copy"], template=template)

# 使用format方法格式化提示,使用samples列表中的第一个样本数据。
# 假设samples是一个预先定义的包含多个样本的列表。
print(prompt_sample.format(**samples[0]))

# 导入FewShotPromptTemplate类,用于创建包含多个示例的提示模板。
from langchain.prompts.few_shot import FewShotPromptTemplate

# 创建一个FewShotPromptTemplate实例。
# 使用samples作为示例,prompt_sample作为每个示例的格式,定义输入变量和后缀。
prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_sample,
    suffix="水果类型:{fruit_type}\n场景:{occasion}",
    input_variables=["fruit_type", "occasion"],
)
# 格式化提示,用于生成特定水果类型和场景的广告文案。
print(prompt.format(fruit_type="玫瑰葡萄", occasion="爱情"))

# 使用语言模型(如GPT-3)生成文案。
result = llm(prompt.format(fruit_type="火龙果", occasion="爱情"))
print(result)

运行

zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python text_prompt_few_shot.py
水果类型:玫瑰葡萄
场景:爱情
广告文案:玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。

水果类型:玫瑰葡萄
场景:爱情
广告文案:玫瑰,浪漫的象征,是你向心爱的人表达爱意的最佳选择。


水果类型:金钻菠萝
场景:庆祝
广告文案:金钻菠萝,庆祝的完美伴侣,为您的特别时刻增添甜蜜与奢华。


水果类型:蜜瓜
场景:休闲
广告文案:蜜瓜,休闲时光的甜蜜伴侣,让您的闲暇时光更加美好。


水果类型:富士苹果
场景:健康
广告文案:富士苹果,健康生活的选择,丰富您的营养,活力每一天。


水果类型:玫瑰葡萄
场景:爱情

广告文案:火龙果,爱情的最佳象征,让你的爱情更加灿烂耀眼。

在这里插入图片描述

3. 提示工程(Prompt Engineering)

是指在与大型语言模型(如GPT-3或GPT-4)交互时,精心设计输入(即“提示”)的过程,以获得最佳的输出结果。这一过程对于充分利用大型语言模型的能力至关重要。以下是进行有效提示工程的几个关键原则:

1. 明确目标

  • 具体目标:在设计提示之前,要明确你想从模型中获取什么类型的信息或响应。
  • 明确指令:确保提示清晰、具体,避免模糊不清的要求。

2. 理解模型的能力和限制

  • 能力范围:了解模型的强项和弱点,以及它在处理特定类型的任务时的性能。
  • 避免误解:避免提问模型无法准确回答的问题,例如关于未来的预测、过于复杂或专业的主题。

3. 使用清晰、简洁的语言

  • 简洁性:避免冗长和复杂的句子结构。简洁的提示有助于模型更好地理解意图。
  • 无歧义:确保语言明确,避免可能产生歧义的表述。

4. 结构化提示

  • 逻辑流程:如果问题涉及多个步骤或要点,使用有逻辑顺序和清晰结构的提示。
  • 上下文信息:如果需要,提供足够的背景信息或上下文,帮助模型更好地理解和回应。

5. 迭代和调整

  • 试错法:可能需要多次尝试和调整提示,以获得最佳结果。
  • 分析响应:基于模型的响应对提示进行微调。

6. 利用范例和模板

  • 使用示例:提供具体示例可以帮助模型理解预期输出的格式和风格。
  • 模板化:对于常见任务,可以创建并复用有效的提示模板。

7. 考虑伦理和偏见

  • 避免偏见:设计提示时要意识到潜在的偏见和不准确性。
  • 伦理使用:确保使用模型的方式符合伦理标准,避免伤害和误导。

8. 实验和反馈

  • 持续测试:不断测试和优化提示,以提高响应的质量和相关性。
  • 学习和调整:根据实验结果和用户反馈调整策略。

9. 适应特定用途

  • 针对性:根据特定应用场景或行业需求定制提示。
  • 多样性应用:对于不同的任务和目标,采用不同的提示策略。

通过遵循这些原则,可以更有效地利用大型语言模型,提高其在各种任务和应用中的性能和准确性。

在这里插入图片描述

代码

  • https://github.com/zgpeace/pets-name-langchain/tree/feature/textAndChat
  • https://github.com/huangjia2019/langchain/tree/main/03_%E6%A8%A1%E5%9E%8BIO

参考

https://python.langchain.com/docs/modules/model_io/

参考

  • https://platform.openai.com/docs/guides/prompt-engineering

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/186350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【XSLVGL2.0】如何新增一种语言和词条

XSLVGL2.0 开发手册 【XSLVGL2.0】如何新增一种语言和词条 1、概述2、以外置资源的方式增加词条3、以内置资源的方式增加词条4、使用方法1、概述 本文件旨在介绍新增一种语言词条的方法 2、以外置资源的方式增加词条 假设项目需要增加一种英文的词条。一般地,我们采用国际…

关闭vscode打开的本地服务器端口

vscode开了本地的一个端口“8443”当本地服务器端口,然后随手把VScode一关,后来继续做发现8443端口已经被占用了。   原来,即便关闭了编译器VScode,服务器依然是被node.exe运行着的。那这个端口怎么才能关掉呢?   …

浅析linux中的信号

人们往往将信号称为“软件中断”,它提供了异步事件的处理机制,这些事件可以来自系统外部(如用户按下ctrlc产生中断符),也可能来自程序或者内核内部的执行动作(如进程除零操作)。进程收到信号&am…

CSS:浏览器设置placeholder样式 / 微信小程序设置placeholder样式

一、web 设置placeholder 设置浏览器的placeholder样式 ::-webkit-input-placeholder { /* WebKit browsers */color: #999; } :-moz-placeholder { /* Mozilla Firefox 4 to 18 */color: #999; } ::-moz-placeholder { /* Mozilla Firefox 19 */color: #999; } :-ms-input-p…

学习视频剪辑方法:AI智剪助力,批量处理短视频无忧

随着短视频的兴起,越来越多的人开始关注如何有效地制作和发布这些内容。但是,短视频的制作并不容易,要耗费大量的时间和精力。现在有很多AI智能剪辑工具可以快速、高效地制作短视频。其中,AI智剪是一款非常受欢迎的视频剪辑功能&a…

【Linux】fork()

文章目录 一、fork()是什么?二、fork()干了什么?三、fork()怎么用? 一、fork()是什么? fork()函数其实是在Linux系统中用于创建一个新的进程。让我们看看Linux中是怎么描述的?运行man fork。 RETURN VALUE On success…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于外部性理论的网侧储能成本疏导机制研究》

这个标题涉及到一个关于储能的研究,主要聚焦在基于外部性理论的网侧(电网侧)储能成本疏导机制上。 基于外部性理论: 这表明研究的框架或者理论基础是"外部性理论"。外部性是指某个经济活动的影响不仅限于直接参与者&…

golang学习笔记——接口和继承比较2

接口和继承 现在有一个需要要求大学生和足球运动员掌握英语技能,请问怎么实现? 给运动员和学生结构体添加studyEnglish方法显示是可以的,但是篮球动员和中学生也学习了英语,显示不行。这时,我们可以直接给足球运动员和大学生添加…

WebSocket 鉴权策略与技巧详解

WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应…

鼠标拖拽问题,不选中文本不触发单击事件

文章目录 1. 为什么鼠标单击的时候触发了mousemove事件?明明鼠标没有移动2. 鼠标拖拽元素怎么能不触发单击事件?怎么处理鼠标在元素内的相对定位,而不是每次定位到左上角?方式一:拖拽的元素没有注册click监听就不会触发…

Python报错:AttributeError(类属性、实例属性)

Python报错:AttributeError(类属性、实例属性) Python报错:AttributeError 这个错误就是说python找不到对应的对象的属性,百度后才发现竟然是初始化类的时候函数名写错了 __init__应该有2条下划线,如果只有…

北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 counter_24.v 1.2 divid…

【深度学习】CNN中pooling层的作用

1、pooling是在卷积网络(CNN)中一般在卷积层(conv)之后使用的特征提取层,使用pooling技术将卷积层后得到的小邻域内的特征点整合得到新的特征。一方面防止无用参数增加时间复杂度,一方面增加了特征的整合度…

2、用命令行编译Qt程序生成可执行文件exe

一、创建源文件 1、新建一个文件夹&#xff0c;并创建一个txt文件 2、重命名为main.cpp 3、在main.cpp中添加如下代码 #include <QApplication> #include <QDialog> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDi…

在Spring Boot中实现单文件,多文件上传

这篇文章算是一篇水文&#xff0c;因为也没啥好讲的&#xff0c;在Spring Boot中&#xff0c;上传文件是我们常常做的&#xff0c;包括我们在实际开发过程中&#xff0c;我们也经常碰到与文件上传有关的功能&#xff0c;这也算是我们常用的一个功能了&#xff0c;毕竟作为开发者…

分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?

hbasehive分布式存储数据恢复环境&#xff1a; 16台某品牌R730XD服务器节点&#xff0c;每台物理服务器节点上有数台虚拟机&#xff0c;虚拟机上配置的分布式&#xff0c;上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检&#xff1a; 数据库文件被误删除…

HarmonyOS应用开发实战—登录页面【ArkTS】

文章目录 本页面实战效果预览图一.HarmonyOS应用开发1.1HarmonyOS 详解1.2 ArkTS详解二.HarmonyOS应用开发实战—登录页面【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得本页面实战效果预览图 一.HarmonyOS应用开发 1.1HarmonyOS 详解 HarmonyOS(鸿蒙操作系统)是华为公司…

【unity实战】基于权重的随机事件(附项目源码)

文章目录 前言开始一、简单的使用二、完善各种事件1. 完善生成金币事件2. 完善生成敌人事件敌人3. 完善生成药水事件 最终效果参考源码完结 前言 随机功能和UnityEvent前面其实我们都已经做过了&#xff0c;但是随机UnityEvent事件要怎么使用呢&#xff1f;这里就来举一个例子…

Vue3+element-plus,打包报错:Cannot read properties of null (reading ‘insertBefore‘)

一、现象&#xff1a;vue3 element-plus项目&#xff0c;本地启动时&#xff0c;页面所有操作都正常&#xff1b;部署到生产环境后&#xff0c;el-dialog、el-drawer弹框报错。 这个弹框报错问题&#xff0c;困扰好几天&#xff0c;查阅资料&#xff0c;可能是如下几个问题。 …

白嫖CTG4.0

大家好&#xff0c;到点了我来给各位大佬献策CTG&#xff0c;不是花钱买不起&#xff0c;而是免费更有性价比&#xff0c;哈哈哈不调侃了我们自此开始正文&#xff0c;咱们主打的就是一个分享是一种态度 当然我更希望大家支持国产对国产有自己的信心&#xff08;文心一言&…