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

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

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

簡介

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

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

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

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

答案就是使用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數(shù)目。

langchain中提供了這樣的example_selector的實現(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,并且定義了兩個需要實現(xiàn)的抽象方法。

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

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

那么什么是ABC呢?

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

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

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

langchain中的ExampleSelector實現(xiàn)

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

LengthBasedExampleSelector

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

我們看下它的具體實現(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這個list中。

然后使用example_prompt對example進行格式化,得到最終的輸出。

最后再把最后輸出的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方法實際上就是用max_length減去輸入text的長度,然后再去匹配example_text的長度,匹配一個減去一個,最終得到特定長度的examples。

這個selector的最主要作用就是防止耗盡context window。因為對于大多數(shù)大語言模型來說,用戶的輸入是有長度限制的。

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

這個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是根據(jù)相似度來進行example的查找的。

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

這兩個selector和之前介紹的selector有所不同。因為他們用到了向量數(shù)據(jù)庫。

向量數(shù)據(jù)庫是干什么用的呢?它的主要目的是把輸入轉(zhuǎ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]

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

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

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

而MaxMarginalRelevanceExampleSelector則是調(diào)用vectorstore的max_marginal_relevance_search方法來實現(xià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

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

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

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

使用起來是這樣的:

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

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

對于負閾值:Selector按ngram重疊分數(shù)對示例進行排序,不排除任何示例。

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

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

總結(jié)

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

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

相關(guān)文章

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

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

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

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

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

    多個版本的python共存時使用pip的正確做法

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

    python中對信號的處理詳解

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

    python實現(xiàn)測試工具(二)——簡單的ui測試工具

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

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

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

    Python爬蟲——爬取豆瓣電影Top250代碼實例

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

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

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

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

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

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

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

最新評論

东乌珠穆沁旗| 乐清市| 通江县| 壤塘县| 静乐县| 东丰县| 大姚县| 随州市| 浏阳市| 仁怀市| 东港市| 南华县| 白水县| 昌乐县| 老河口市| 万全县| 宁乡县| 定安县| 萨迦县| 从江县| 西乡县| 罗江县| 自贡市| 博爱县| 孟津县| 苏尼特左旗| 长岭县| 盘山县| 南皮县| 建始县| 永清县| 九龙坡区| 禹城市| 萝北县| 来凤县| 黔东| 咸宁市| 寻甸| 阳信县| 曲麻莱县| 吴江市|