最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

langchain使用自定義example?selector示例解析

 更新時(shí)間:2023年08月09日 14:35:29   作者:flydean  
這篇文章主要為大家介紹了langchain使用自定義example?selector示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

簡(jiǎn)介

在之前的文章中,我們提到了可以在跟大模型交互的時(shí)候,給大模型提供一些具體的例子內(nèi)容,方便大模型從這些內(nèi)容中獲取想要的答案。這種方便的機(jī)制在langchain中叫做FewShotPromptTemplate。

如果例子內(nèi)容少的話,其實(shí)無所謂,我們可以把所有的例子都發(fā)送給大語言模型進(jìn)行處理。

但是如果例子太多的話,每次都發(fā)送如此多的內(nèi)容,會(huì)讓我們的錢包承受不住。畢竟那些第三方的大語言模型是按token收費(fèi)的。

怎么辦呢? 能不能找到一個(gè)經(jīng)濟(jì)又有效的方法來完成我們的工作呢?

答案就是使用example selector。

使用和自定義example selector

我們回想一下在使用FewShotPromptTemplate的時(shí)候,實(shí)際上是可以同時(shí)傳入example_selector和examples。

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

這里我們使用了一個(gè)example_selector,那么什么是example_selector呢?

從名字上看他的主要作用就是從給定的examples中選擇需要的examples出來,提供給大模型使用,從而減少會(huì)話的token數(shù)目。

langchain中提供了這樣的example_selector的實(shí)現(xiàn),我們先來看下它的基礎(chǔ)類的定義是怎么樣的:

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

可以看到BaseExampleSelector繼承自ABC,并且定義了兩個(gè)需要實(shí)現(xiàn)的抽象方法。

一個(gè)方法叫做add_example。目的是向selector中添加一個(gè)example。

一個(gè)方法叫做select_examples,主要目的就是根據(jù)input,從examples中找出要select出來的內(nèi)容。

那么什么是ABC呢?

ABC當(dāng)然就是你了解到的ABC,但是他還有一些額外的含義。ABC的全稱叫做Abstract Base Class,也叫做抽象基類。主要用于在Python程序中創(chuàng)建抽象基類。

他提供了一些@abstractmethod,@abstarctproperty這些裝飾方法,來表明具體類的特征。

所以,如果我們想自定義一個(gè)ExampleSelector,只需要繼承自BaseExampleSelector,然后實(shí)現(xiàn)這兩個(gè)抽象方法即可。

langchain中的ExampleSelector實(shí)現(xiàn)

除了自定義實(shí)現(xiàn)之外,langchain已經(jīng)為我們提供了幾個(gè)常用的ExampleSelector實(shí)現(xiàn),一起來看看吧。

LengthBasedExampleSelector

LengthBasedExampleSelector是根據(jù)example的長度來進(jìn)行選擇的選擇器。

我們看下它的具體實(shí)現(xiàn):

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這個(gè)list中。

然后使用example_prompt對(duì)example進(jìn)行格式化,得到最終的輸出。

最后再把最后輸出的text長度添加到example_text_lengths數(shù)組中。

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 = 0
        examples = []
        while remaining_length > 0 and i < len(self.examples):
            new_length = remaining_length - self.example_text_lengths[i]
            if new_length < 0:
                break
            else:
                examples.append(self.examples[i])
                remaining_length = new_length
            i += 1
        return examples

select_examples方法實(shí)際上就是用max_length減去輸入text的長度,然后再去匹配example_text的長度,匹配一個(gè)減去一個(gè),最終得到特定長度的examples。

這個(gè)selector的最主要作用就是防止耗盡context window。因?yàn)閷?duì)于大多數(shù)大語言模型來說,用戶的輸入是有長度限制的。

如果超出了輸入長度,會(huì)產(chǎn)生意想不到的結(jié)果。

這個(gè)selector使用起來很簡(jiǎn)單,下面是具體的例子:

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

這兩個(gè)selector是根據(jù)相似度來進(jìn)行example的查找的。

其中MaxMarginalRelevanceExampleSelector是SemanticSimilarityExampleSelector的字類,他是對(duì)SemanticSimilarityExampleSelector進(jìn)行了一些算法上的優(yōu)化。所以這里我們把他們兩個(gè)放在一起介紹。

這兩個(gè)selector和之前介紹的selector有所不同。因?yàn)樗麄冇玫搅讼蛄繑?shù)據(jù)庫。

向量數(shù)據(jù)庫是干什么用的呢?它的主要目的是把輸入轉(zhuǎn)換成各種向量然后存儲(chǔ)起來。向量數(shù)據(jù)庫可以方便的進(jìn)行輸入相識(shí)度的計(jì)算。

我們先來看下他們的add_example方法:

def add_example(self, example: Dict[str, str]) -&gt; 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]

這個(gè)方法先把example的key加入到input_keys中,然后進(jìn)行排序。最后通過調(diào)用vectorstore的add_texts,把key和value加入到向量數(shù)據(jù)庫中。

這兩個(gè)selector的add_example都是一樣的。只有select_examples的方法不同。

其中SemanticSimilarityExampleSelector調(diào)用了vectorstore的similarity_search方法來實(shí)現(xiàn)相似度的搜索。

而MaxMarginalRelevanceExampleSelector則是調(diào)用vectorstore的max_marginal_relevance_search方法來實(shí)現(xiàn)搜索的。

兩者的搜索算法不太一樣。

因?yàn)槭褂昧讼蛄繑?shù)據(jù)庫,所以他們的調(diào)用方法和其他的也不太一樣:

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, 
    # 使用的ebeddings
    OpenAIEmbeddings(), 
    # 向量數(shù)據(jù)庫
    Chroma, 
    # 要返回的數(shù)目
    k=1
)

NGramOverlapExampleSelector

最后一個(gè)要介紹的是NGramOverlapExampleSelector。這個(gè)selector使用的是ngram 重疊矩陣來選擇相似的輸入。

具體的實(shí)現(xiàn)算法和原理這里就不介紹了。大家有興趣的可以自行探索。

這個(gè)selector也不需要使用向量數(shù)據(jù)庫。

使用起來是這樣的:

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

這里有個(gè)不太一樣的參數(shù)叫做threshold。

對(duì)于負(fù)閾值:Selector按ngram重疊分?jǐn)?shù)對(duì)示例進(jìn)行排序,不排除任何示例。

對(duì)于大于1.0的閾值:選擇器排除所有示例,并返回一個(gè)空列表。

對(duì)于等于0.0的閾值:選擇器根據(jù)ngram重疊分?jǐn)?shù)對(duì)示例進(jìn)行排序,并且排除與輸入沒有ngram重疊的那些。

總結(jié)

有了這些selector我們就可以在提供的examples中進(jìn)行特定的選擇,然后再把選擇的結(jié)果輸入給大語言模型。從而有效的減少token的浪費(fèi)。

以上就是langchain使用自定義example selector示例解析的詳細(xì)內(nèi)容,更多關(guān)于langchain自定義example selector的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python中實(shí)現(xiàn)三目運(yùn)算的方法

    Python中實(shí)現(xiàn)三目運(yùn)算的方法

    這篇文章主要介紹了Python中實(shí)現(xiàn)三目運(yùn)算的方法,本文用and/or 運(yùn)算符模擬實(shí)現(xiàn)三目運(yùn)算,需要的朋友可以參考下
    2015-06-06
  • 手把手教你利用Python創(chuàng)建一個(gè)游戲窗口

    手把手教你利用Python創(chuàng)建一個(gè)游戲窗口

    pygame是python用來寫游戲的擴(kuò)展包,用這個(gè)擴(kuò)展包,可以比較容易的構(gòu)造一個(gè)游戲窗口,這篇文章主要給大家介紹了關(guān)于如何利用Python創(chuàng)建一個(gè)游戲窗口的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 多個(gè)版本的python共存時(shí)使用pip的正確做法

    多個(gè)版本的python共存時(shí)使用pip的正確做法

    這篇文章主要介紹了多版本python共存時(shí)使用pip的正確做法,幫助有多個(gè)python版本需求的人可以正確的導(dǎo)包,感興趣的朋友可以了解下
    2020-10-10
  • python中對(duì)信號(hào)的處理詳解

    python中對(duì)信號(hào)的處理詳解

    這篇文章主要給大家介紹了關(guān)于python中對(duì)信號(hào)處理的相關(guān)資料, 計(jì)算機(jī)借助信號(hào)來接收和發(fā)送各種命令,操作系統(tǒng)針對(duì)其編程要接收或生成的每種命令列出了至少一個(gè)信號(hào),需要的朋友可以參考下
    2021-07-07
  • python實(shí)現(xiàn)測(cè)試工具(二)——簡(jiǎn)單的ui測(cè)試工具

    python實(shí)現(xiàn)測(cè)試工具(二)——簡(jiǎn)單的ui測(cè)試工具

    這篇文章主要介紹了python如何實(shí)現(xiàn)簡(jiǎn)單的ui測(cè)試工具,幫助大家更好的利用python進(jìn)行測(cè)試工作,感興趣的朋友可以了解下
    2020-10-10
  • pycharm中django框架連接mysql數(shù)據(jù)庫的方法

    pycharm中django框架連接mysql數(shù)據(jù)庫的方法

    這篇文章主要介紹了pycharm中django框架連接mysql數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Python爬蟲——爬取豆瓣電影Top250代碼實(shí)例

    Python爬蟲——爬取豆瓣電影Top250代碼實(shí)例

    這篇文章主要介紹了Python爬取豆瓣電影Top250實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • No module named ‘win32gui‘ 的解決方法(踩坑之旅)

    No module named ‘win32gui‘ 的解決方法(踩坑之旅)

    這篇文章主要介紹了No module named ‘win32gui‘ 的解決方法(踩坑之旅),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Django如何實(shí)現(xiàn)上傳圖片功能

    Django如何實(shí)現(xiàn)上傳圖片功能

    這篇文章主要介紹了Django如何實(shí)現(xiàn)上傳圖片功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • python爬蟲lxml庫解析xpath網(wǎng)頁過程示例

    python爬蟲lxml庫解析xpath網(wǎng)頁過程示例

    這篇文章主要為大家介紹了python爬蟲lxml庫解析xpath網(wǎng)頁的過程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

奈曼旗| 天全县| 合肥市| 定西市| 霍林郭勒市| 南汇区| 新河县| 泽州县| 绥滨县| 潞城市| 慈溪市| 东方市| 通州市| 开封县| 连平县| 积石山| 赤壁市| 汶上县| 金昌市| 平和县| 郯城县| 商水县| 酒泉市| 徐汇区| 城步| 泰来县| 什邡市| 阆中市| 泉州市| 新巴尔虎左旗| 巴林右旗| 百色市| 德江县| 凤城市| 岐山县| 登封市| 康乐县| 厦门市| 吉首市| 沁水县| 永安市|