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

在langchain中使用自定义example selector

在langchain中使用自定义example selector

简介

在之前的文章中,我们提到了可以在跟大模型交互的时候,给大模型提供一些具体的例子内容,方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。

如果例子内容少的话,其实无所谓,我们可以把所有的例子都发送给大语言模型进行处理。

但是如果例子太多的话,每次都发送如此多的内容,会让我们的钱包承受不住。毕竟那些第三方的大语言模型是按token收费的。

怎么办呢? 能不能找到一个经济又有效的方法来完成我们的工作呢?

答案就是使用example selector。

使用和自定义example selector

我们回想一下在使用FewShotPromptTemplate的时候,实际上是可以同时传入example_selector和examples。

prompt = FewShotPromptTemplate(example_selector=example_selector, example_prompt=example_prompt, suffix="Question: {input}", input_variables=["input"]
)

这里我们使用了一个example_selector,那么什么是example_selector呢?

从名字上看他的主要作用就是从给定的examples中选择需要的examples出来,提供给大模型使用,从而减少会话的token数目。

langchain中提供了这样的example_selector的实现,我们先来看下它的基础类的定义是怎么样的:

class BaseExampleSelector(ABC):"""Interface for selecting examples to include in prompts."""@abstractmethoddef add_example(self, example: Dict[str, str]) -> Any:"""Add new example to store for a key."""@abstractmethoddef select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""Select which examples to use based on the inputs."""

可以看到BaseExampleSelector继承自ABC,并且定义了两个需要实现的抽象方法。

一个方法叫做add_example。目的是向selector中添加一个example。

一个方法叫做select_examples,主要目的就是根据input,从examples中找出要select出来的内容。

那么什么是ABC呢?

ABC当然就是你了解到的ABC,但是他还有一些额外的含义。ABC的全称叫做Abstract Base Class,也叫做抽象基类。主要用于在Python程序中创建抽象基类。

他提供了一些@abstractmethod,@abstarctproperty这些装饰方法,来表明具体类的特征。

所以,如果我们想自定义一个ExampleSelector,只需要继承自BaseExampleSelector,然后实现这两个抽象方法即可。

langchain中的ExampleSelector实现

除了自定义实现之外,langchain已经为我们提供了几个常用的ExampleSelector实现,一起来看看吧。

LengthBasedExampleSelector

LengthBasedExampleSelector是根据example的长度来进行选择的选择器。

我们看下它的具体实现:

    def add_example(self, example: Dict[str, str]) -> None:"""Add new example to list."""self.examples.append(example)string_example = self.example_prompt.format(**example)self.example_text_lengths.append(self.get_text_length(string_example))

add_example的逻辑是先把example添加到examples这个list中。

然后使用example_prompt对example进行格式化,得到最终的输出。

最后再把最后输出的text长度添加到example_text_lengths数组中。

    def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""Select which examples to use based on the input lengths."""inputs = " ".join(input_variables.values())remaining_length = self.max_length - self.get_text_length(inputs)i = 0examples = []while remaining_length > 0 and i < len(self.examples):new_length = remaining_length - self.example_text_lengths[i]if new_length < 0:breakelse:examples.append(self.examples[i])remaining_length = new_lengthi += 1return examples

select_examples方法实际上就是用max_length减去输入text的长度,然后再去匹配example_text的长度,匹配一个减去一个,最终得到特定长度的examples。

这个selector的最主要作用就是防止耗尽context window。因为对于大多数大语言模型来说,用户的输入是有长度限制的。

如果超出了输入长度,会产生意想不到的结果。

这个selector使用起来很简单,下面是具体的例子:

examples = [{"input": "happy", "output": "sad"},{"input": "tall", "output": "short"},{"input": "energetic", "output": "lethargic"},{"input": "sunny", "output": "gloomy"},{"input": "windy", "output": "calm"},example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)
example_selector = LengthBasedExampleSelector(examples=examples, example_prompt=example_prompt, max_length=25,
)

SemanticSimilarityExampleSelector和MaxMarginalRelevanceExampleSelector

这两个selector是根据相似度来进行example的查找的。

其中MaxMarginalRelevanceExampleSelector是SemanticSimilarityExampleSelector的字类,他是对SemanticSimilarityExampleSelector进行了一些算法上的优化。所以这里我们把他们两个放在一起介绍。

这两个selector和之前介绍的selector有所不同。因为他们用到了向量数据库。

向量数据库是干什么用的呢?它的主要目的是把输入转换成各种向量然后存储起来。向量数据库可以方便的进行输入相识度的计算。

我们先来看下他们的add_example方法:

    def add_example(self, example: Dict[str, str]) -> str:"""Add new example to vectorstore."""if self.input_keys:string_example = " ".join(sorted_values({key: example[key] for key in self.input_keys}))else:string_example = " ".join(sorted_values(example))ids = self.vectorstore.add_texts([string_example], metadatas=[example])return ids[0]

这个方法先把example的key加入到input_keys中,然后进行排序。最后通过调用vectorstore的add_texts,把key和value加入到向量数据库中。

这两个selector的add_example都是一样的。只有select_examples的方法不同。

其中SemanticSimilarityExampleSelector调用了vectorstore的similarity_search方法来实现相似度的搜索。

而MaxMarginalRelevanceExampleSelector则是调用vectorstore的max_marginal_relevance_search方法来实现搜索的。

两者的搜索算法不太一样。

因为使用了向量数据库,所以他们的调用方法和其他的也不太一样:

examples = [{"input": "happy", "output": "sad"},{"input": "tall", "output": "short"},{"input": "energetic", "output": "lethargic"},{"input": "sunny", "output": "gloomy"},{"input": "windy", "output": "calm"},
]example_selector = SemanticSimilarityExampleSelector.from_examples(examples, # 使用的ebeddingsOpenAIEmbeddings(), # 向量数据库Chroma, # 要返回的数目k=1
)

NGramOverlapExampleSelector

最后一个要介绍的是NGramOverlapExampleSelector。这个selector使用的是ngram 重叠矩阵来选择相似的输入。

具体的实现算法和原理这里就不介绍了。大家有兴趣的可以自行探索。

这个selector也不需要使用向量数据库。

使用起来是这样的:

example_selector = NGramOverlapExampleSelector(examples=examples,example_prompt=example_prompt,threshold=-1.0,
)

这里有个不太一样的参数叫做threshold。

对于负阈值:Selector按ngram重叠分数对示例进行排序,不排除任何示例。

对于大于1.0的阈值:选择器排除所有示例,并返回一个空列表。

对于等于0.0的阈值:选择器根据ngram重叠分数对示例进行排序,并且排除与输入没有ngram重叠的那些。

总结

有了这些selector我们就可以在提供的examples中进行特定的选择,然后再把选择的结果输入给大语言模型。

从而有效的减少token的浪费。

相关文章:

在langchain中使用自定义example selector

在langchain中使用自定义example selector 简介 在之前的文章中&#xff0c;我们提到了可以在跟大模型交互的时候&#xff0c;给大模型提供一些具体的例子内容&#xff0c;方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。 如…...

pytest常用执行参数详解

1. 查看pytest所有可用参数 我们可以通过pytest -h来查看所有可用参数。 从图中可以看出&#xff0c;pytest的参数有很多&#xff0c;下面是归纳一些常用的参数&#xff1a; -s&#xff1a;输出调试信息&#xff0c;包括print打印的信息。 -v&#xff1a;显示更详细的信息。 …...

本地项目如何连接git远程仓库

在本地新建项目后&#xff0c;如何连接git远程仓库呢&#xff1f;步骤如下&#xff1a; 第一步&#xff0c; 首先我们在git上新建仓库&#xff0c;设置模板可勾选Readme文件。&#xff08;readme文件的创建是为了介绍所写代码的一些详细信息,为了之后更好的维护。&#xff09;…...

力扣 494. 目标和

题目来源&#xff1a;https://leetcode.cn/problems/target-sum/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;将该问题转为01背包问题。 假设加法的总和为x&#xff0c;那么减法对应的总和就是sum - x。所以我们要求的是 x - (sum - x) target。x …...

Maven-搭建私有仓库

使用NEXUS REPOSITORY MANAGER 3在Windows上搭建私有仓库。 NEXUS REPOSITORY MANAGER 3 是一个仓库管理系统。 下载NEXUS3 官网上是无法下载的,所以网上搜nexus-3.18.1-01-win64就能搜到,下载即可。 安装NEXUS3 下载nexus-3.18.0-01-win64.zip至相应目录下(路径不要有中文)。 …...

PostgreSql 参数配置

一、访问控制参数配置 https://xiaosonggong.blog.csdn.net/article/details/124264877 二、数据库参数配置 2.1 概述 PostgreSQL 的参数配置参数是在 postgresql.conf 文件中集中管理的&#xff0c;类似于 Oracle 的 pfile 文件&#xff0c;除此之外&#xff0c;PostgreSQL…...

【BMC】OpenBMC开发基础2:修改原有程序

修改原有程序 通常情况下我们会需要修改OpenBMC原有的程序来适配我们的项目&#xff0c;本节将介绍一般的流程。 为此首先我们需要了解devtool这个工具&#xff0c;注意它不是前端开发用的那个devtool&#xff0c;而是由OE&#xff08;或者Yocto&#xff1f;&#xff09;提供…...

2012年数学建模竞赛脑卒中发病环境因素分析及干预日期数据处理代码

因四个表格日期数据处理有些复杂&#xff0c;故作此代码一次性处理四组数据&#xff1a; import datetime import pandas as pddef check(string, df, i, num, error_list):if is_valid(pd.to_datetime(string, errorscoerce, format%Y/%m/%d), error_list, i):df.iloc[i, nu…...

Merge和Rebase的区别

Merge 和 Rebase 是 Git 中常用的两种分支整合方式&#xff0c;它们具有不同的工作原理和效果&#xff1a; Merge&#xff08;合并&#xff09; 合并是将两个或多个分支的提交历史合并为一个新的提交。在合并时&#xff0c;Git 会创建一个新的合并提交&#xff0c;将两个分支…...

[RTKLIB]模糊度固定相关问题(二)

文章目录 一、固定模糊度的前置工作1. 做好固定模糊度的准备2. 建立双差模糊度3. 问题与总结 版权声明&#xff1a;本文为原创文章&#xff0c;版权归 Winston Qu 所有&#xff0c;转载请注明出处。 在上一篇文章中&#xff0c;介绍了RTKLIB中manage_amb_LAMBDA()函数&#xff…...

QtAV for ubuntu16.04

下载ubuntu https://releases.ubuntu.com/16.04/ubuntu-16.04.7-desktop-amd64.iso 下载ffmpeg https://ffmpeg.org/download.html 下载QtAV https://github.com/wang-bin/QtAV/releases 更新 sudo apt update 安装库 sudo apt-get install libglu1-mesa-dev freeglut3-dev…...

MFC 文件读写包括字符串的结构体

试过CString char* 写入的都是地址 struct Param{int ID;int index;char val[128]; };vector<Param>ans; UINT count 17; ans.resize(count); FILE* fp; fopen_s(&fp,_T("my.txt"),_T("rb")); if(count ! fread(&ans[0],sizeof(Param),cou…...

在家构建您的迷你聊天Chat gpt

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是指令遵循模型&#xff1f; 语言模型是机器学习模型&#xff0c;可以根据句子的前一个单词预测单词概率。如果我们向模型请求下一个单词&#xff0c;并将其递减地反馈给模型以请求更多单词&#xff…...

pytest自动化测试框架之断言

前言 断言是完整的测试用例中不可或缺的因素&#xff0c;用例只有加入断言&#xff0c;将实际结果与预期结果进行比对&#xff0c;才能判断它的通过与否。 unittest 框架提供了其特有的断言方式&#xff0c;如&#xff1a;assertEqual、assertTrue、assertIn等&#xff0c;py…...

C++模板的用法

目录 模板的概念 函数模板&#xff08;Function Templates&#xff09; 基本用法 函数模板的实例化 匹配原则 类模板&#xff08;Class Templates&#xff09; 模板的概念 C中的模板&#xff08;Templates&#xff09;实际上是一种泛型编程&#xff08;Generic Programm…...

ESP 32 蓝牙虚拟键盘链接笔记本电脑的键值问题

由于打算利用esp32 通过蓝牙链接电脑后实现一些特俗的键盘功能&#xff0c;所以就折腾了一下&#xff0c;折腾最耗费时间的却是键值问题&#xff0c;让一个20多年的老司机重新补充了知识 过程曲折就不说了&#xff0c;直接说结果。 我们通过网络搜索获取的键值和蓝牙模拟键盘传…...

128.【Maven】

Maven仓库 (一)、Maven 简介1.传统项目管理的缺点2.Maven是什么3.Maven的作用 (二)、Maven 的下载与安装1.下载与认识目录2.配置Maven的全局环境 (三)、Maven 的基础概念1.Maven 仓库(1).仓库分类 2. Maven 坐标3.Maven 本地仓库配置(1).改变默认的仓库地址(2).改变远程仓库地址…...

嵌入式虚拟仿真实验教学平台之串口发送数据

嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器&#xff0c;串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…...

Android Studio 屏幕适配

Android开发屏幕适配流程 首先studio中没有ScreenMatch这个插件的&#xff0c;下去现在这个插件 点击File->settings->Plugins->(搜索ScreenMatch插件)&#xff0c;点击下载&#xff0c;应用重启Studio即可&#xff0c;如下图 在values下 创建dimens.xml&#xff0c…...

【C++】C++11--- 线程库及详解lock_guard与unique_lock

目录 一、thread类的介绍二、线程函数参数三、 原子性操作库四、lock_guard与unique_lock4.1、mutex的种类4.2 lock_guard4.3 unique_lock 一、thread类的介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如**windows和linux下各有自己…...

如何用AI CoverGen在5分钟内将音频转换为专业级音乐封面

如何用AI CoverGen在5分钟内将音频转换为专业级音乐封面 【免费下载链接】AICoverGen A WebUI to create song covers with any RVC v2 trained AI voice from YouTube videos or audio files. 项目地址: https://gitcode.com/gh_mirrors/ai/AICoverGen AICoverGen是一款…...

* LangChain4j中的会话记忆ChatMemory

在构建 AI 志愿填报顾问时&#xff0c;一个很自然的期望是它能记住我们之前聊过什么&#xff0c;而不是每次都像第一次见面一样。大模型本身是无状态的&#xff0c;每次调用都是独立的&#xff0c;要实现“记忆”&#xff0c;唯一的方法就是把聊天历史连同新问题一起发给模型。…...

从零玩转 Linux:网络配置、软件安装及 Docker 实战

下载镜像地址 一、基础命令篇 显示网络状态工具 netstat -nltup #显示当前服务以及端口信息等 查看某个端口是否开启 1.2.1、使用 netstat 命令 sudo netstat -tuln | grep 80 1.2.2、使用 ss 命令 sudo ss -tuln | grep 80 1.2.3、使用 lsof 命令 sudo lsof -i :80 1.2.4、使用…...

glTF-Transform:现代3D应用中的glTF模型优化与处理实战指南

glTF-Transform&#xff1a;现代3D应用中的glTF模型优化与处理实战指南 【免费下载链接】glTF-Transform glTF 2.0 SDK for JavaScript and TypeScript, on Web and Node.js. 项目地址: https://gitcode.com/gh_mirrors/gl/glTF-Transform 在当今的3D应用开发中&#xf…...

Sub-Zero性能优化:7个技巧让你的Plex字幕运行如飞

Sub-Zero性能优化&#xff1a;7个技巧让你的Plex字幕运行如飞 【免费下载链接】Sub-Zero.bundle Subtitles for Plex, as good you would expect them to be. 项目地址: https://gitcode.com/gh_mirrors/su/Sub-Zero.bundle Sub-Zero是Plex媒体服务器最强大的字幕插件之…...

Windows系统Btrfs驱动终极指南:免费解锁Linux文件系统的强大功能

Windows系统Btrfs驱动终极指南&#xff1a;免费解锁Linux文件系统的强大功能 【免费下载链接】btrfs WinBtrfs - an open-source btrfs driver for Windows 项目地址: https://gitcode.com/gh_mirrors/bt/btrfs 想在Windows上体验Linux下一代文件系统的强大功能吗&#…...

Midjourney拍立得风格失效预警:当--stylize值>800时,胶片颗粒算法将触发不可逆失真(附修复补丁)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney拍立得风格失效的本质洞察 当用户在 Midjourney 中反复使用 --style raw 或添加 Polaroid、 Instax、 instant film 等关键词却无法稳定生成具有真实拍立得质感的图像时&#xff0c;问题并…...

GPT-5.5不只是能写代码——ChatGPT Image 2模块“语义-结构-纹理“三级解耦机制详解

引言&#xff1a;图像生成能力的范式迁移过去两年&#xff0c;大模型的图像生成能力经历了从"能画"到"画对"的跃迁。早期的文生图模型普遍存在一个核心矛盾&#xff1a;用户想控制"画什么"&#xff0c;模型却同时处理"画什么""怎…...

3分钟掌握PlantUML Editor:用代码思维绘制专业UML图表的终极指南

3分钟掌握PlantUML Editor&#xff1a;用代码思维绘制专业UML图表的终极指南 【免费下载链接】plantuml-editor PlantUML online demo client 项目地址: https://gitcode.com/gh_mirrors/pl/plantuml-editor 还在为复杂的UML图表绘制而烦恼吗&#xff1f;传统的拖拽式绘…...

从RSSI走向信道探测,蓝牙设备的“距离感知”能力已至“厘米级”

长期以来&#xff0c;物联网&#xff08;IoT&#xff09;无线连接技术的发展重心主要聚焦于通信性能、通信功耗与组网效率等方面&#xff1b;然而&#xff0c;随着智能家居、数字车钥匙、工业自动化、智慧门禁、资产管理以及地理围栏等应用的快速扩张&#xff0c;行业正在提出一…...