简介

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

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

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

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

答案就是使用 。

使用和自定义

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

= e(

=,

=,

=”: {input}”,

=[“input”]

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

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

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

class (ABC):

“”” for to in .”””

@

def (self, : Dict[str, str]) -> Any:

“””Add new to store for a key.”””

@

def (self, : Dict[str, str]) -> List[dict]:

“”” which to use based on the .”””

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

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

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

那么什么是ABC呢?

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

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

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

中的实现

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

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

我们看下它的具体实现:

def (self, : Dict[str, str]) -> None:

“””Add new to list.”””

self..()

= self..(**)

self..(self.())

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

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

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

def (self, : Dict[str, str]) -> List[dict]:

“”” which to use based on the input .”””

= ” “.join(.())

= self. – self.()

i = 0

= []

while > 0 and i < len(self.):

= – self.[i]

if < 0:

break

else:

.(self.[i])

=

i += 1

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

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

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

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

= [

{“input”: “happy”, “”: “sad”},

{“input”: “tall”, “”: “short”},

{“input”: “”, “”: “”},

{“input”: “sunny”, “”: “”},

{“input”: “windy”, “”: “calm”},

= (

=[“input”, “”],

=”Input: {input}: {}”,

= (

=,

=,

=25,

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

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

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

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

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

def (self, : Dict[str, str]) -> str:

“””Add new to .”””

if self.:

= ” “.join(

({key: [key] for key in self.})

else:

= ” “.join(())

ids = self..([], =[])

ids[0]

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

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

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

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

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

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

= [

{“input”: “happy”, “”: “sad”},

{“input”: “tall”, “”: “short”},

{“input”: “”, “”: “”},

{“input”: “sunny”, “”: “”},

{“input”: “windy”, “”: “calm”},

= .(

,

# 使用的

(),

# 向量数据库

,

# 要返回的数目

k=1

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

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

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

使用起来是这样的:

= (

=,

=,

=-1.0,

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

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

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

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

总结

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

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

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666

声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!