在langchain中使用自定义example selector

这篇具有很好参考价值的文章主要介绍了在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."""

    @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,并且定义了两个需要实现的抽象方法。

一个方法叫做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 = 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。因为对于大多数大语言模型来说,用户的输入是有长度限制的。

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

这个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, 
    # 使用的ebeddings
    OpenAIEmbeddings(), 
    # 向量数据库
    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的浪费。文章来源地址https://www.toymoban.com/news/detail-641238.html

到了这里,关于在langchain中使用自定义example selector的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LangChain大模型应用落地实践(二):使用LLMs模块接入自定义大模型,以ChatGLM为例

    angChain版本:0.0.147 ;(没想到第二更LangChain已经更新到147了) 图1 大模型时间线(2023-arxiv-A Survey of Large Language Models) 模型名称 企业/高校 发布时间 ERNIE Bot(文心一言) 百度 2023年3月 ChatGLM 清华大学 2023年3月 通义千问 阿里 2023年4月 MOSS 复旦大学 2023年4月 从图1中可以看出,

    2024年02月09日
    浏览(43)
  • 使用langchain打造自己的大型语言模型(LLMs)

    我们知道Openai的聊天机器人可以回答用户提出的绝大多数问题,它几乎无所不知,无所不能,但是由于有机器人所学习到的是截止到2021年9月以前的知识,所以当用户询问机器人关于2021年9月以后发送的事情时,它无法给出正确的答案,另外用户向机器人提问的字符串(prompt)长度

    2024年02月02日
    浏览(48)
  • 使用 LangChain 搭建基于 Amazon DynamoDB 的大语言模型应用

    LangChain 是一个旨在简化使用大型语言模型创建应用程序的框架。作为语言模型集成框架,在这个应用场景中,LangChain 将与 Amazon DynamoDB 紧密结合,构建一个完整的基于大语言模型的聊天应用。 本次活动,我们特意邀请了亚马逊云科技数据库产品专家李君为大家线上讲解: 云

    2024年02月14日
    浏览(44)
  • LangChain 完整指南:使用大语言模型构建强大的应用程序

    LangChain 是一个强大的框架,可以简化构建高级语言模型应用程序的过程。 LangChain 是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChai

    2024年01月20日
    浏览(53)
  • 使用大语言模型集成工具 LangChain 创建自己的论文汇总和查询工具

    Langchain可以帮助开发人员构建由大型语言模型(llm)支持的应用程序。它提供一个框架将LLM与其他数据源(如互联网或个人文件)连接起来。这允许开发人员将多个命令链接在一起,以创建更复杂的应用程序。包括最近比较火爆的AutoGPT等都是使用了Langchain框架进行开发的。所以本

    2024年02月05日
    浏览(42)
  • Langchain-Chatchat大语言模型本地知识库的踩坑、部署、使用

    Langchain-Chatchat是一个基于ChatGLM大语言模型与Langchain应用框架实现,开源、可离线部署的检索增强生成(RAG)大模型的本地知识库问答应用项目。 GitHub: https://github.com/chatchat-space/Langchain-Chatchat 本项目实现原理如下图所示,过程包括加载文件 - 读取文本 - 文本分割 - 文本向量化

    2024年02月04日
    浏览(70)
  • LangChain 本地化方案 - 使用 ChatYuan-large-v2 作为 LLM 大语言模型

    ChatYuan-large-v2 是一个开源的支持中英双语的功能型对话语言大模型,与其他 LLM 不同的是模型十分轻量化,并且在轻量化的同时效果相对还不错,仅仅通过 0.7B 参数量就可以实现 10B 模型的基础效果,正是其如此的轻量级,使其可以在普通显卡、 CPU 、甚至手机上进行推理,而

    2024年02月16日
    浏览(47)
  • 自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):使用少量示例和响应流式传输]

    分类目录:《大模型从入门到应用》总目录 LangChain系列文章: 基础知识 快速入门 安装与环境配置 链(Chains)、代理(Agent:)和记忆(Memory) 快速开发聊天模型 模型(Models) 基础知识 大型语言模型(LLMs) 基础知识 LLM的异步API、自定义LLM包装器、虚假LLM和人类输入LLM(

    2024年02月15日
    浏览(56)
  • 大语言模型的开发利器langchain

    最近随着chatgpt的兴起,人工智能和大语言模型又再次进入了人们的视野,不同的是这一次像是来真的,各大公司都在拼命投入,希望能在未来的AI赛道上占有一席之地。因为AI需要大规模的算力,尤其是对于大语言模型来说。大规模的算力就意味着需要大量金钱的投入。那么

    2024年02月11日
    浏览(60)
  • 用LangChain构建大语言模型应用

    自 ChatGPT 发布以来,大型语言模型 (LLM) 广受欢迎。尽管您可能没有足够的资金和计算资源从头开始训练自己的大语言模型,但您仍然可以使用预训练的大语言模型来构建一些很酷的东西,例如: 可以根据您的数据与外界互动的个人助理 为您的目的定制的聊天机器人 分析或总

    2024年02月06日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包