LangChain学习二:提示-实战(下半部分)

文章目录

  • 上一节内容:LangChain学习二:提示-实战(上半部分)
  • 学习目标:提示词中的示例选择器和输出解释器
  • 学习内容一:示例选择器
    • 1.1 LangChain自定义示例选择器
    • 1.2 实现自定义示例选择器
      • 1.2.1实战:定义一个类继BaseExampleSelector并且承实现方法
      • 1.2.2实战:使用示例选择器
    • 1.3 实现基于长度的选择器
    • 1.4 最大边际相关性示例选择器
    • 1.5 gram重叠
      • 1.5.1 创建示例集
      • 1.5.2 选择示例
        • 1.5.2.1 threshold=-1.0,示例排序、不排除任何示例
        • 1.5.2.2 threshold=0.0,`排除`具有与输入无ngram重叠的示例
        • 1.5.2.3 threshold大于0小于1意味着只有相似度大于 设置值的示例才会被选择
        • 1.5.2.4 threshold大于1,不会选择任何
    • 1.6 相似度
  • 学习内容二:输出解析器

上一节内容:LangChain学习二:提示-实战(上半部分)

LangChain学习二:提示-实战(上半部分)

学习目标:提示词中的示例选择器和输出解释器


  1. 示例选择器:在写提示词的时候给与少量的示例在前面,在上一节的最后提到,这一节细化说一下
  2. 输出解释器:语言模型输出文本。但是很多时候,你可能想要获得比文本更结构化的信息。这就是输出解析器的作用。

学习内容一:示例选择器

1.1 LangChain自定义示例选择器

自定义示例选择器它的英文名叫做few shot examples:就像我们教小朋友一样,比如教小朋友分类水果,先给他演示一下水果怎么分类的,红色的放哪一个框框,白色的放哪一个框框,然后在给它一个新的水果,小朋友根据你教的示范,就会自己去分类了

具体在上一节的2.5有介绍

在这里插入图片描述
在这里插入图片描述

1.2 实现自定义示例选择器

具体步骤如下

  • 定义一个类,继承BaseExampleSelector
  • 实现add_example方法,它接受一个示例并将其添加到该ExampleSelector中。
  • 实现select_examples方法,它接受输入变量(这些变量应为用户输入),并返回要在few-shot提示中使用的示例列表。

1.2.1实战:定义一个类继BaseExampleSelector并且承实现方法

from langchain.prompts.example_selector.base import BaseExampleSelector
from typing import Dict, List
import numpy as npclass CustomExampleSelector(BaseExampleSelector):def __init__(self, examples: List[Dict[str, str]]):self.examples = examplesdef add_example(self, example: Dict[str, str]) -> None:"""为密钥添加要存储的新示例。"""self.examples.append(example)def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""根据输入选择要使用的示例。 你可以在这里写你自己的算法,我这里就表示随机从examples里拿两个示例,replace表示不会重复"""return np.random.choice(self.examples, size=2, replace=False)

1.2.2实战:使用示例选择器

 
examples = [{"foo": "1"},{"foo": "2"},{"foo": "3"}
]# 初始化示例选择器。
example_selector = CustomExampleSelector(examples)#选择示例
example_selector.select_examples({"foo": "foo"})
# -> array([{'foo': '2'}, {'foo': '3'}], dtype=object)# 将新示例添加到示例集
example_selector.add_example({"foo": "4"})
print(f"======查看现在有哪些示例\n{example_selector.examples}\n")
# -> [{'foo': '1'}, {'foo': '2'}, {'foo': '3'}, {'foo': '4'}]# 选择示例
llm_example=example_selector.select_examples({"foo": "foo"})
print(f"======选择示例\n{llm_example}\n")

在这里插入图片描述
在这里插入图片描述
因为这里选择写的是随机的,所以这里就是随机的找两条

1.3 实现基于长度的选择器

总长度是由max_length控制的,如果我们输入的长一些,就会少从examples 拿一些,输入短,则反之

from langchain import PromptTemplate, FewShotPromptTemplate# 首先,创建少数快照示例的列表。
from langchain.prompts import LengthBasedExampleSelectorexamples = [{"word": "开心", "antonym": "悲伤"},{"word": "高", "antonym": "低"},
]# 接下来,我们指定模板来格式化我们提供的示例。
# 为此,我们使用“PromptTemplate”类。
example_formatter_template = """
单词: {word}
反义词: {antonym}\n
"""
example_prompt = PromptTemplate(input_variables=["word", "antonym"],template=example_formatter_template,
)
#我们将使用' LengthBasedExampleSelector '来选择示例。
example_selector = LengthBasedExampleSelector(# 这些是可供选择的例子。examples=examples,#这是用于格式化示例的PromptTemplate。example_prompt=example_prompt,# 这是格式化示例的最大长度。# 长度由下面的get_text_length函数测量。max_length=25,
)
# 我们现在可以使用' example_selector '来创建' FewShotPromptTemplate '。
dynamic_prompt = FewShotPromptTemplate(# We provide an ExampleSelector instead of examples.example_selector=example_selector,example_prompt=example_prompt,prefix="给出每个输入的反义词",suffix="单词: {input}\n反义词:",input_variables=["input"],example_separator="",
)# We can now generate a prompt using the `format` method.
print(dynamic_prompt.format(input="大"))

在这里插入图片描述
这个是上一节举的例子,当然上一节没有提到现在的示例添加新的示例方法

#您也可以将示例添加到示例选择器中。
new_example = {"word": "大", "antonym": "小"}
dynamic_prompt.example_selector.add_example(new_example)
print(dynamic_prompt.format(input="多"))

在这里插入图片描述

1.4 最大边际相关性示例选择器

这种示例选择器基于与输入之间的边际相关性来选择示例。它计算每个示例与输入之间的相关性,并选择具有最高相关性的示例作为回答。

这种方法适用于输入和示例之间有很强相关性的情况,例如问答系统中的问题和答案。

这里我们要借助一个类MaxMarginalRelevanceExampleSelector

MaxMarginalRelevanceExampleSelector:基于哪些示例与输入最相似以及优化多样性的组合选择示例。

这里我们用m3e-base作为向量化引擎
下载

from modelscope.hub.snapshot_download import snapshot_downloadlocal_dir_root = "/root/autodl-tmp/models_from_modelscope"
snapshot_download('Jerry0/m3e-base', cache_dir=local_dir_root)
from langchain.prompts.example_selector import MaxMarginalRelevanceExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
embeddings = HuggingFaceEmbeddings(
model_name = "/root/autodl-tmp/models_from_modelscope/Jerry0/m3e-base",
model_kwargs = {'device': 'cuda'})
example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)#这是许多创建反义词的假装任务的例子。
examples = [{"input": "开心", "output": "悲伤"},{"input": "发呆", "output": "兴奋"},{"input": "高", "output": "底"},{"input": "精力充沛的", "output": "无精打采"},{"input": "晴天", "output": "雨天"},{"input": "天上", "output": "地下"},
]example_selector = MaxMarginalRelevanceExampleSelector.from_examples(#这是可供选择的示例列表。examples, #这是用于生成用于测量语义相似性的嵌入的嵌入类。embeddings, #这是VectorStore类,用于存储嵌入并进行相似性搜索。FAISS, #这是要生成的示例数。k=2
)
mmr_prompt = FewShotPromptTemplate(#我们提供了ExampleSelector而不是示例。example_selector=example_selector,example_prompt=example_prompt,prefix="给出每个输入的反义词",suffix="Input: {adjective}\nOutput:", input_variables=["adjective"],
)# 输入是一种感觉,所以应该选择快乐/悲伤的例子作为第一个
print(mmr_prompt.format(adjective="快乐"))

在这里插入图片描述

1.5 gram重叠

其实是对1.4的补充和优化

我们需要借助一个NGramOverlapExampleSelector的类,然后根据ngram重叠得分选择排序示例.

该得分表示示例与输入的相似程度

ngram重叠得分是一个介于0.01.0之间的浮点数

  • 选择器允许设置阈值得分。 ngram重叠得分小于或等于阈值的示例将被排除。默认情况下,阈值设置为-1.0,因此不会排除任何示例,只会对它们进行重新排序。

  • 将阈值设置为0.0将排除具有与输入无ngram重叠的示例

1.5.1 创建示例集

pip install nltk

from langchain.prompts import PromptTemplate
from langchain.prompts.example_selector.ngram_overlap import NGramOverlapExampleSelector
from langchain.prompts import FewShotPromptTemplate, PromptTemplate# 创建模板
example_prompt = PromptTemplate(input_variables=["input", "output"],template="输入: {input}\n输出: {output}",
)
#示例集合:这些是虚构翻译任务的例子:英语转化为葡萄牙语examples = [{"input": "See Spot run.", "output": "Ver correr a Spot."},{"input": "My dog barks.", "output": "Mi perro ladra."},{"input": "Spot can run.", "output": "Spot puede correr."},
]

1.5.2 选择示例

1.5.2.1 threshold=-1.0,示例排序、不排除任何示例
example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)
example_selector = NGramOverlapExampleSelector(# 以下是可供选择的示例。examples=examples, # 这是用于格式化示例的PromptTemplate。example_prompt=example_prompt, # 这是选择器停止的阈值。# 默认情况下,它设置为-1.0。threshold=-1.0,#对于负阈值:#Selector按ngram重叠分数对示例进行排序,不排除任何示例。#对于大于1.0的阈值:#选择器排除所有示例,并返回一个空列表。#对于等于0.0的阈值:#Selector根据ngram重叠分数对示例进行排序,#并且排除与输入没有ngram重叠的那些。
)
dynamic_prompt = FewShotPromptTemplate(# We provide an ExampleSelector instead of examples.example_selector=example_selector,example_prompt=example_prompt,prefix="提供每个Input的西班牙语翻译",suffix="Input: {sentence}\nOutput:", input_variables=["sentence"],
)
#一个与“Spot can run”有较大ngram重叠的示例输入
#与“我的狗叫”没有重叠
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述
让我们添加示例,再来一次

new_example = {"input": "Spot plays fetch.", "output": "Spot juega a buscar."}example_selector.add_example(new_example)
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述

我们可以看到 他确实进行了排序,我们的问题是,Spot跑的飞快

而且第一个是Spot可以跑,第二个看见Spot跑,第三个Spot在玩游戏
第四个:我的狗再叫

第三第四个很明显不符合,所以在最后

1.5.2.2 threshold=0.0,排除具有与输入无ngram重叠的示例
example_selector.threshold=0.0
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述
这里就把第三第四给排除了

1.5.2.3 threshold大于0小于1意味着只有相似度大于 设置值的示例才会被选择

example_selector.threshold=0.09
print(dynamic_prompt.format(sentence="Spot can play fetch."))

在这里插入图片描述

1.5.2.4 threshold大于1,不会选择任何

1.0 + 1e-9 的结果是 1.000000001,即在 1.0 的基础上增加了一个非常小的数 1e-9。这种写法通常是为了解决在计算机中浮点数运算可能产生的精度问题。

在这段代码中,将 example_selector.threshold 的值设为 1.0+1e-9,其实就是设置一个非常接近于 1.0,但又比它略大一点点的阈值。这样做可能会使得更多的示例被选择,因为在相似度计算中可能存在一些舍入误差或计算误差,导致某些本来应该被选择的示例未能被选中。

example_selector.threshold=1.0+1e-9
print(dynamic_prompt.format(sentence="Spot can play fetch."))

在这里插入图片描述
这里只会显示我们输入的,不会选择任何示例

1.6 相似度

  最大边际相关性 ExampleSelector 和 相似度 ExampleSelector 都是示例选择器,它们的区别在于选择示例的方法不同。

  相似度 ExampleSelector 则使用文本相似度度量来选择最相关的示例。它不仅考虑了输入和示例之间的相关性,还考虑了它们之间的相似度。具体而言,它计算输入和示例之间的相似度,然后选择与输入最相似的示例作为回答。这种方法适用于输入和示例之间没有直接的相关性,但它们在语义或形式上非常相似的情况,例如聊天机器人对话中的语句。

最大边际相关性 ExampleSelector:

  • 基于输入与示例之间的边际相关性来选择示例。
  • 计算每个示例与输入之间的相关性,并选择具有最高相关性的示例作为回答。
  • 适用于输入和示例之间有明显相关性的情况,例如问答系统中的问题和答案。

相似度 ExampleSelector:

  • 使用文本相似度度量来选择最相关的示例。
  • 不仅考虑输入和示例之间的相关性,还考虑它们之间的相似度。
  • 计算输入和示例之间的相似度,然后选择与输入最相似的示例作为回答。
  • 适用于输入和示例之间没有直接的相关性,但在语义或形式上非常相似的情况,例如聊天机器人对话中的语句。

总结:
最大边际相关性 ExampleSelector 关注输入与示例之间的相关性,而相似度 ExampleSelector 则重点考虑它们之间的相似度。两种选择器在选择示例时的侧重点不同,适用于不同的应用场景和数据特征。

说白了就是通过找到嵌入输入具有最大余弦相似度的示例,然后迭代地添加它们,同时筛选它们与已选择示例的接近程度来实现这一目的。

其实这里《LangChain学习一:模型-实战》中文本嵌入有介绍,这里我们在复习一下

  就是说从很多的示例集中,我们通过向量的方式去找到示例里和我们提的问题语义相近的内容作为示例,然后在给大模型,这里就不啰嗦介绍了,那一节里介绍的比较全

学习内容二:输出解析器

未完成待续,明晚继续,睡觉

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态路由的原理和配置

一.路由器的工作原理 首先我们知道路由器是工作在网络层的,那就是三层设备。网络层的功能主要为:不同网段之间通信、最佳路径选择也就是逻辑地址(ip地址)寻址、转发数据。 1.路由器是什么 路由器是能将数据包转发到正确的目的地…

【QT 5 调试软件+(Linux下验证>>>>串口相关初试串口)+Windows下qt代码在Linux下运行+参考win下历程+基础样例】

【QT 5 调试软件Linux下验证>>>>串口相关初试串口参考win下历程基础样例】 1、前言2、实验环境3、先行了解4、自我总结-win下工程切到Linux下1、平台无关的代码:2、依赖的库:3、文件路径和换行符:4、编译器差异:5、构…

什么是防抖与节流?应用场景举例

防抖节流如何处理防抖与节流 防抖节流防抖例子节流例子Vue Axios全局接口防抖、节流封装实现 小结 防抖 防抖:触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间 应用场景: 提交按钮、用户注册…

QEMU源码全解析 —— virtio(2)

接前一篇文章: 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一回对于virtio进行了简介,并说明了其基本原理以及框架。对…

【JVM入门到实战】(三) 查看字节码文件的工具

一、 javap -v命令 javap是JDK自带的反编译工具,可以通过控制台查看字节码文件的内容。适合在服务器上查看字节码文件内容。直接输入javap查看所有参数。输入javap -v 字节码文件名称 查看具体的字节码信息。(如果jar包需要先使用 jar –xvf 命令解压&a…

mmyolo的bbox_loss和检测bbox都是空

最近用mmyolo训练自己的数据集的时候发现训练的时候loss_bbox0,测试和eval的时候结果也全是空的,排除了数据集读取的问题,最后发现是config中自定义了自己的类别但是没有传给dataset。。。 简而言之,在自定义了数据集里的metainf…

【C语言】一个RDMACM、Verbs API与epoll一起使用的例子

一、epoll介绍 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 以下是epoll的主要使用方法和优点: epo…

2023-12-05 Qt学习总结10

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十六 学生信息管理系统插入介绍: QTableView和QSqlTableModelQTableViewQSqlTableModel 程序所用数据库表格程序组成以及界面学生端源码:管理员端源码: 总结 前言 要解决问题: 学习qt最核心知识, 多一个都不…

Android : BottomNavigation底部导航_简单应用

示例图&#xff1a; 1.先创建底部导航需要的图片 res → New → Vector Asset 创建三个矢量图 图片1 baseline_home.xml <vector android:height"24dp" android:tint"#000000"android:viewportHeight"24" android:viewportWidth"24…

nrm 的使用 可以快速切换下载(npm)镜像,解决资源下载慢和运行失败

nrm是什么&#xff1f; 介绍 nrm(npm registry manager) 是 npm 的镜像源管理工具. 有时候国外资源太慢,使用 nrm 可以快速的在 npm 源之间切换 安装 npm install -g nrm 基本使用 查看可选择的源 nrm ls 切换到对应的镜像源 nrm use 对应的镜像 删除镜像源 nrm del 名字 …

深入理解 SVG:开启向量图形的大门(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

ArcGIS pro与SuperMap根据属性自动填充颜色步骤

GIS项目经常会接触到控规CAD数据&#xff0c;想要把数据转换成GIS图层并发布&#xff0c;需要进行专题配图。研究了一下ArcGIS pro和SuperMap iDesktop的配图&#xff0c;整理一下用到的一些技术思路。 1、Excel表格根据RGB值添加单元格填充颜色 要实现如上效果图&#xff0c;…

【C语言程序设计】循环结构程序设计

目录 前言 一、程序设计第一题 二、程序设计第二题 三、程序设计第三题 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da…

Armv8/Armv9从入门到精通-课程介绍

通知&#xff0c;Arm二期&#xff0c;咱们也有大合集PDF了&#xff0c;共计1587页&#xff0c;还未完成&#xff0c;后续持续更新和优化中。为了方便大家阅读、探讨、做笔记&#xff0c;特意整了此合集PPT&#xff0c;为了增加标签目录&#xff0c;还特意开了福兮阅读器会员。 …

宇视科技视频监控 main-cgi 文件信息泄露漏洞

宇视科技视频监控 main-cgi 文件信息泄露漏洞 一、产品简介二、漏概述三、复现环境四、漏洞检测手工抓包自动化检测 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#…

【C语言程序设计】选择结构程序设计

目录 前言 一、程序阅读 二、程序改错 三、程序设计 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如…

[Linux] Tomcat

一、Tomcat相关知识 1.1 Tomcat的简介 Tomcat 是 Java 语言开发的&#xff0c;Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器&#xff0c;是 Apache 软件基金会的 Jakarta 项目中的一个核心项目&#xff0c;由 Apache、Sun 和其他一些公司及个人共同开发而成。Tomc…

19.java绘图

A.Graphics类 Graphics类是java.awt包中的一个类&#xff0c;它用于在图形用户界面&#xff08;GUI&#xff09;或其他图形应用程序中进行绘制。该类通常与Component的paint方法一起使用&#xff0c;以在组件上进行绘制操作。 一些Graphics类的常见用法和方法&#xff1a; 在组…

Flask维护者:李辉

Flask维护者&#xff1a;李辉&#xff0c; 最近看b站的flask相关&#xff0c;发现了这个视频&#xff1a;[PyCon China 2023] 濒危 Flask 扩展拯救计划 - 李辉_哔哩哔哩_bilibili 李辉讲他在维护flask之余&#xff0c;开发了apiflask这个依托flask的框架。GitHub - apiflask/a…

如何通过 SSH 访问 VirtualBox 的虚机

VirtualBox 是一款免费虚机软件。在用户使用它安装了 linux 以后&#xff0c;它默认只提供了控制台的管理画面。 直接使用控制台管理 Linux 没有使用诸如 putty 或者 vscode 这样的 ssh 远程管理工具方便。那么可不可以直接使用 ssh 访问 VirtualBox 上的 Linux 呢&#xff1f…