Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

释放双眼,带上耳机,听听看~!
本文介绍了Python环境管理工具Docker、Conda、pip和Poetry的安装说明,以及它们在项目中的应用。通过简要介绍每个工具的使用,建立一个可复制的环境,用于运行实际示例。

在这本书中,我们将编写大量代码并测试许多不同的集成和工具。因此,在本章中,我们将提供所有必要库的基本设置说明,涵盖最常见的依赖管理工具,如Docker、Conda、pip和Poetry。这将确保您能够运行本书中的所有实际示例。

接下来,我们将介绍可以使用的模型集成,例如OpenAI的ChatGPT、Hugging Face上的模型、Jina AI等。此外,我们将逐个介绍、设置并使用一些提供者。对于每一个,我们将展示如何获取API密钥令牌。

最后,作为一个实际示例,我们将通过一个真实世界应用的例子,一个可能帮助客服代理的LLM应用,这是LLMs可能改变游戏规则的主要领域之一。这将为我们提供更多关于使用LangChain的背景,并且我们可以介绍有效使用它的技巧和诀窍。

主要章节如下:

  1. 为本书设置依赖关系
  2. 模型集成
  3. 为客户服务构建应用程序

我们将通过在计算机上为本书设置环境来开始本章。

如何设置本书的依赖关系

在本书中,我们假设您至少具备基本的Python、Jupyter和环境知识,但让我们一起快速浏览一下。如果您对自己的设置感到自信,或者计划为每个章节或应用程序单独安装库,可以安全地跳过本节。

请确保您已安装Python版本为3.10或更高版本。您可以从python.org或您平台的包管理器安装它。如果您使用Docker、Conda或Poetry,适当的Python版本应作为说明的一部分自动安装。您还应安装Jupyter Notebook或JupyterLab以交互式运行示例笔记本。

像Docker、Conda、Pip和Poetry这样的环境管理工具有助于为项目创建可复制的Python环境。它们安装依赖项并隔离项目。以下是管理依赖关系的这些选项的概览:

Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

对于开发人员,提供通过容器进行隔离的Docker是一个不错的选择。缺点是它使用大量磁盘空间,比其他选项更复杂。对于数据科学家,我建议使用Conda或Poetry。

Conda可以高效地处理复杂的依赖关系,尽管在大型环境中可能非常慢。Poetry很好地解决了依赖关系并管理环境;然而,它不能捕获系统依赖关系。

所有工具都允许从配置文件分享和复制依赖项。您可以在书的存储库 github.com/benman1/gen… 中找到一组说明和相应的配置文件。

这包括以下文件:

  • requirements.txt 用于pip
  • pyproject.toml 用于Poetry
  • langchain_ai.yaml 用于Conda
  • Dockerfile 用于Docker

根据是否管理系统依赖关系,它们可能需要更多的设置,如在pip和poetry的情况下。我的偏好是Conda,因为它在复杂性与隔离之间取得了适当的平衡。

正如前面提到的,我们不会在安装过程中花费太多时间,而是依次简要介绍每个不同的工具。对于所有说明,请确保您已经下载了书的存储库(使用GitHub用户界面)或在计算机上克隆了它,并且已经切换到项目的根目录。

如果在安装过程中遇到问题,请查阅相应的文档,或在该书的GitHub存储库上提出问题。在发布本书时已经测试了不同的安装过程;然而,事物可能会发生变化,我们将在线更新GitHub README以包含可能出现的问题的解决方法。

对于每个工具,关键步骤包括安装工具、使用存储库中的配置文件以及激活环境。这将建立一个可复制的环境,用于运行本书中的所有示例(除了极少数例外,这将在文中指出)。

让我们从最简单的开始,逐步过渡到最复杂的。我们将从pip开始!

pip

pip是默认的Python包管理器。要使用pip:

  1. 如果它尚未包含在您的Python分发中,请按照此处的说明安装pip:python-poetry.org/ 上的说明安装Poetry。
  2. 运行 poetry install 来安装依赖项。

Conda

Conda管理Python环境和依赖项。要使用Conda:

  1. 按照此链接的说明安装Miniconda或Anaconda:integrations.langchain.com/llms 查看支持的LLMs的完整列表。

    以下是撰写本文时(2023年10月)的此页面的截图,其中包括云提供商和本地模型的接口:

    Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

    LangChain实现了三种不同的接口——我们可以使用聊天模型、LLMs和嵌入模型。聊天模型和LLMs在处理文本输入并生成文本输出方面相似。然而,在它们处理的输入和输出类型上有一些差异。聊天模型专门设计用于处理聊天消息列表作为输入,并生成聊天消息作为输出。它们通常用于聊天机器人应用程序,其中会话被交换。您可以在 python.langchain.com/docs/integr… 找到聊天模型。

    最后,文本嵌入模型用于将文本输入转换为称为嵌入的数字表示。在本章中,我们将专注于文本生成,并在第5章“构建像ChatGPT的聊天机器人”中讨论嵌入、向量数据库和神经搜索。在这里只需说一下,这些嵌入是一种从输入文本中捕获和提取信息的方式。它们广泛用于自然语言处理任务,如情感分析、文本分类和信息检索。嵌入模型在 python.langchain.com/docs/integr… 中列出。

    至于图像模型,大型开发者包括OpenAI(DALL-E)、Midjourney, Inc.(Midjourney)和Stability AI(Stable Diffusion)。LangChain目前没有直接处理非文本模型的功能;然而,它的文档描述了如何使用Replicate,该工具还提供了与Stable Diffusion模型进行交互的接口。

    对于这些提供商的每一个,为了调用其API,您首先需要创建一个帐户并获得一个API密钥。所有提供商都是免费的,而且对于其中一些提供商,您甚至不需要提供信用卡详细信息。

    要在环境中设置API密钥,在Python中,我们可以执行以下行:

    import os
    os.environ["OPENAI_API_KEY"] = "<your token>"
    

    这里,OPENAI_API_KEY是适用于OpenAI的环境键。在环境中设置密钥的优点是在每次使用模型或服务集成时无需将其作为参数包含在代码中。

    您还可以从终端在系统环境中公开这些变量。在Linux和macOS中,您可以使用export命令从终端设置系统环境变量:

    export OPENAI_API_KEY=<your token>
    

    要在Linux或macOS中永久设置环境变量,您需要将上述行添加到~/.bashrc或~/.bash_profile文件中,然后使用命令source ~/.bashrc或source ~/.bash_profile重新加载shell。

    在Windows中,您可以使用set命令从命令提示符中设置系统环境变量:

    set OPENAI_API_KEY=<your token>
    

    要在Windows中永久设置环境变量,您可以将上述行添加到批处理脚本中。

    我个人的选择是创建一个config.py文件,其中存储了所有的密钥。然后,我从该模块中导入一个函数,该函数将所有这些密钥加载到环境中。如果您在GitHub存储库中寻找此文件,您会注意到它是缺失的。这是有意为之的(实际上,我已经禁用了对此文件的Git跟踪),因为出于安全原因(以及我不想为其他人的使用支付费用),我不想与其他人分享我的密钥。我的config.py文件看起来像这样:

    import os
    OPENAI_API_KEY = "... "
    # I'm omitting all other keys
    def set_environment():
        variable_dict = globals().items()
        for key, value in variable_dict:
            if "API" in key or "ID" in key:
                os.environ[key] = value
    

    您可以在config.py文件中设置所有您的密钥。这个set_environment()函数将所有密钥加载到环境中,就像前面提到的那样。每当您想要运行一个应用程序时,您导入该函数并像这样运行它:

    from config import set_environment
    set_environment()
    

    现在,让我们依次介绍一些知名的模型提供商。我们将为每个提供商提供一个使用示例。让我们从一个虚构的LLM开始,我们可以用于测试目的。这将有助于说明在LangChain中调用语言模型的一般思想。

    虚构的LLM

    虚构的LLM允许您在测试过程中模拟LLM的响应,而无需实际进行API调用。这对于快速原型设计和单元测试代理非常有用。使用FakeLLM可以避免在测试过程中触发速率限制。它还允许您模拟各种响应,以验证您的代理是否正确处理它们。总体而言,它在无需真实LLM的情况下实现了快速代理迭代。

    例如,您可以初始化一个返回”Hello”的FakeLLM如下:

    from langchain.llms import FakeLLM
    fake_llm = FakeLLM(responses=["Hello"])
    

    您可以在Python中直接执行此示例,也可以在笔记本中执行。

    虚构的LLM仅用于测试目的。LangChain文档中有一个与LLMs一起使用工具的示例。这比前面的示例复杂一些,但提供了我们可以利用的功能的一些提示:

    from langchain.llms.fake import FakeListLLM
    from langchain.agents import load_tools
    from langchain.agents import initialize_agent
    from langchain.agents import AgentType
    
    tools = load_tools(["python_repl"])
    responses = ["Action: Python_REPLnAction Input: print(2 + 2)", "Final Answer: 4"]
    llm = FakeListLLM(responses=responses)
    agent = initialize_agent(
        tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
    )
    agent.run("whats 2 + 2")
    

    我们设置了一个基于我们在第2章“LangChain用于LLM应用”中解释的React策略的代理(AgentType.ZERO_SHOT_REACT_DESCRIPTION)。我们用一个文本运行代理:问题是2 + 2是多少。

    正如您所看到的,我们连接了一个工具,即Python Read-Eval-Print Loop (REPL),它将根据LLM的输出进行调用。FakeListLLM将给出两个响应(”Action: Python_REPLnAction Input: print(2 + 2)”和”Final Answer: 4″),不会根据输入而改变。

    我们还可以观察到,虚构的LLM输出导致调用Python解释器,返回4。请注意,操作必须与工具的name属性匹配,而该工具的name属性如下所示:

    class PythonREPLTool(BaseTool):
        """A tool for running python code in a REPL."""
        name = "Python_REPL"
        description = (
            "A Python shell. Use this to execute python commands. "
            "Input should be a valid python command. "
            "If you want to see the output of a value, you should print it out "
            "with `print(...)`."
        )
    

    正如您在上述代码块中看到的那样,工具的名称和描述被传递给LLM,然后LLM根据提供的信息决定操作。操作可以是执行工具或规划。

    Python解释器的输出被传递给虚构的LLM,后者忽略了观察结果并返回4。显然,如果我们将第二个响应更改为”Final Answer: 5″,代理的输出将不对应于问题。

    在接下来的部分中,我们将通过使用真实的LLM而不是虚构的LLM,使我们的示例更有意义。任何人首先想到的提供商之一是OpenAI。

    OpenAI

    正如在第1章“生成式人工智能是什么?”中解释的那样,OpenAI是一家美国人工智能研究实验室,是生成式人工智能模型(尤其是LLMs)方面的当前市场领导者。他们提供一系列不同功率级别的模型,适用于不同的任务。在本章中,我们将看到如何使用LangChain和OpenAI Python客户端库与OpenAI模型进行交互。OpenAI还为文本嵌入模型提供了一个Embedding类。

    我们将在我们的应用程序中使用OpenAI,但也会尝试来自其他组织的LLMs。当您将提示发送到LLM API时,它会逐字处理提示,将文本分解(标记化)为单个标记。标记的数量直接与文本量相关。

    在使用像GPT-3和GPT-4这样的商业LLMs时,通过API,每个标记都有与其相关的成本,这取决于LLM模型和API价格层。标记使用指的是为生成响应而消耗了模型配额中的多少个标记。使用较小的模型、总结输出和预处理输入等策略有助于减少获取有用结果所需的标记数。在利用商业LLMs时,了解标记使用情况对于在预算限制内优化生产力至关重要。

    首先,我们需要获取OpenAI API密钥。要创建API密钥,请按照以下步骤操作:

    1. platform.openai.com/ 创建登录。
    2. 设置您的计费信息。
    3. 在Personal | View API Keys下,您可以看到API密钥。
    4. 单击Create new secret key并为其命名。

    在OpenAI平台上,这应该是这个样子:

    Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

    单击Create secret key后,您应该会看到消息“API key generated”。您需要复制密钥到剪贴板并保存。我们可以将密钥设置为环境变量(OPENAI_API_KEY)或每次构造OpenAI调用的类时将其作为参数传递。

    我们可以使用OpenAI语言模型类来设置一个LLM以进行交互。让我们创建一个使用这个模型进行计算的代理——我省略了前面示例中的导入:

    from langchain.llms import OpenAI
    llm = OpenAI(temperature=0., model="text-davinci-003")
    agent = initialize_agent(
        tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True
    )
    agent.run("whats 4 + 4")
    

    我们应该会看到以下输出:

    > Entering new  chain...
     I need to add two numbers
    Action: Python_REPL
    Action Input: print(4 + 4)
    Observation: 8
    Thought: I now know the final answer
    Final Answer: 4 + 4 = 8
    > Finished chain.
    '4 + 4 = 8'
    

    代理提供了正确的解决方案。这是一个简单的问题,但我仍然发现能够用自然语言提出问题很有趣。在本书的过程中,我们将尝试提出更复杂问题的解决方案。但现在,让我们继续下一个提供商和更多的示例!

    Hugging Face

    Hugging Face是NLP领域中非常显著的参与者,在开源和托管解决方案方面有着相当大的影响力。该公司是一家美国公司,致力于开发用于构建机器学习应用程序的工具。其员工开发并维护Transformers Python库,该库用于NLP任务,包括了Mistral 7B、BERT和GPT-2等最先进和热门模型的实现,并与PyTorch、TensorFlow和JAX兼容。

    Hugging Face还提供Hugging Face Hub,这是一个用于托管基于Git的代码存储库、机器学习模型、数据集和Web应用程序的平台,提供了超过12万个模型、2万个数据集和5万个机器学习演示应用程序(spaces)。这是一个在线平台,人们可以在其中进行协作并促进机器学习开发。

    这些工具允许用户加载和使用来自Hugging Face的模型、嵌入和数据集。例如,HuggingFaceHub集成提供了访问不同模型的途径,用于文本生成和文本分类等任务。HuggingFaceEmbeddings集成允许用户使用sentence-transformer模型。

    Hugging Face在其生态系统中还提供了其他各种库,包括用于数据集处理的Datasets,用于模型评估的Evaluate,用于模拟的Simulate以及用于机器学习演示的Gradio。

    除了他们的产品外,Hugging Face还参与了一些倡议,例如BigScience Research Workshop,他们在该倡议中发布了一个名为BLOOM的开放LLM,具有1760亿个参数。他们获得了重要的融资,包括4,000万美元的B轮融资和最近的C轮融资,由Coatue和Sequoia领投,估值为20亿美元。Hugging Face还与Graphcore和Amazon Web Services等公司合作,以优化他们的产品并使其面向更广泛的客户群体。

    要将Hugging Face用作模型提供商,您可以在 huggingface.co/settings/pr… 创建帐户和API密钥。此外,您可以将令牌在环境中命名为HUGGINGFACEHUB_API_TOKEN。

    让我们看一个例子,其中我们使用由Google开发的开源模型Flan-T5-XXL:

    from langchain.llms import HuggingFaceHub
    llm = HuggingFaceHub(
        model_kwargs={"temperature": 0.5, "max_length": 64},
        repo_id="google/flan-t5-xxl"
    )
    prompt = "In which country is Tokyo?"
    completion = llm(prompt)
    print(completion)
    

    我们得到了响应”japan”。

    LLM接受文本输入,本例中是一个问题,并返回一个完整的答案。该模型拥有丰富的知识,可以回答知识性问题。

    Google云平台

    通过Google Cloud Platform(GCP)和Vertex AI(GCP的机器学习平台),提供了许多模型和功能。GCP提供了对LLMs(如LaMDA、T5和PaLM)的访问。Google还通过新的基于LLM的模型更新了Google Cloud Natural Language(NL)API,用于内容分类。这个更新的版本提供了一个广泛的预训练分类分类法,用于广告定位和基于内容的过滤。NL API的改进版本v2的分类模型增加了1000多个标签,并支持11种语言,具有更高的准确性(然而,不清楚在底层使用的是哪个模型)。

    对于使用GCP的模型,您需要安装gcloud命令行界面(CLI)。您可以在此处找到说明:cloud.google.com/vertex-ai/d… 上查看文档。

    我们还可以生成代码。让我们看看code-bison模型是否能解决FizzBuzz,这是初级软件开发人员面试的常见问题:

    question = """
    Given an integer n, return a string array answer (1-indexed) where:
    answer[i] == "FizzBuzz" if i is divisible by 3 and 5.
    answer[i] == "Fizz" if i is divisible by 3.
    answer[i] == "Buzz" if i is divisible by 5.
    answer[i] == i (as a string) if none of the above conditions are true.
    """
    llm = VertexAI(model_name="code-bison")
    llm_chain = LLMChain(prompt=prompt, llm=llm)
    print(llm_chain.run(question))
    

    我们得到了这个响应:

    answer = []
    for i in range(1, n + 1):
        if i % 3 == 0 and i % 5 == 0:
            answer.append("FizzBuzz")
        elif i % 3 == 0:
            answer.append("Fizz")
        elif i % 5 == 0:
            answer.append("Buzz")
        else:
            answer.append(str(i))
    return answer
    

    您会雇佣code-bison加入您的团队吗?

    Jina AI

    Jina AI成立于2020年2月,由Han Xiao和Xuanbin He创立,是一家总部位于柏林的德国人工智能公司,专注于提供面向文本、图像、音频和视频的云原生神经搜索解决方案。他们的开源神经搜索生态系统使企业和开发人员能够轻松构建可扩展且高可用的神经搜索解决方案,实现高效的信息检索。最近,Jina AI推出了Finetuner,这是一种工具,可以对任何深度神经网络进行特定用途和要求的精细调整。

    该公司通过三轮融资筹集了3750万美元,最近的一轮融资是在2021年11月进行的A轮融资。Jina AI的知名投资者包括GGV Capital和Canaan Partners。 您可以在replicate.com/使用GitHub凭据进行身份验证。然后,如果您点击左上角的用户图标,您会找到API令牌 – 只需复制API密钥并将其在您的环境中设置为REPLICATE_API_TOKEN。要运行更大的作业,您需要设置您的信用卡(在结算中心)。

    这是一个创建图像的简单示例:

    from langchain.llms import Replicate
    text2image = Replicate(
        model="stability-ai/stable-diffusion:db21e45d3f7023abc2a46ee38a23973f6dce16bb082a930b0c49861f96d1e5bf",
        input={"image_dimensions": "512x512"},
    )
    image_url = text2image("a book cover for a book about creating generative ai applications in Python")
    

    我得到了这个图像:

    Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

    我认为这是一张不错的图片 – 那是一个创造艺术的AI芯片吗?

    其他

    还有很多其他提供者,我们将在整本书中遇到不少。不幸的是,正如您将看到的,我在Azure和Anthropic这两个主要提供商那里遇到了问题。让我们还是快速看一下它们吧!

    Azure

    Azure是由微软运营的云计算平台,与OpenAI集成,提供强大的语言模型,如GPT-3、Codex和Embeddings。它通过其全球数据中心提供对应用程序和服务的访问、管理和开发,适用于写作辅助、摘要、代码生成和语义搜索等用例。它提供软件即服务(SaaS)、平台即服务(PaaS)和基础设施即服务(IaaS)等功能。

    通过通过GitHub或Microsoft凭据进行身份验证,我们可以在azure.microsoft.com/上创建Azure帐户。

    然后我们可以在Cognitive Services | Azure OpenAI下创建新的API密钥。涉及到一些步骤,而我个人发现这个过程很令人沮丧。在经历了几次帐户验证,被拒绝,试图联系微软客户服务后,我放弃了。因此,出于这个原因,我没有使用Azure的实际示例。您的体验可能会有所不同 – 如果您已经在使用Microsoft服务,这个过程可能对您来说是无痛的。

    设置完成后,模型应通过LangChain中的AzureOpenAI()类接口访问。

    Anthropic

    Anthropic是一家总部位于美国的AI初创公司和公益公司,成立于2021年,由OpenAI的前成员创立,包括Daniela Amodei和Dario Amodei兄妹。该公司专注于开发通用AI系统和以负责任的AI使用为重点的语言模型。截至2023年7月,Anthropic已筹集到15亿美元的资金。他们还致力于项目,如Claude,这是一个类似于OpenAI的ChatGPT的AI聊天机器人,并研究了机器学习系统的可解释性,特别是Transformer架构。

    不幸的是,Claude尚未对普通公众开放。您需要申请访问Claude并设置ANTHROPIC_API_KEY环境变量。

    接下来,让我们看看如何在本地运行模型。

    探索本地模型

    我们还可以在LangChain中运行本地模型。在本地运行模型的优势是完全掌控模型,不会通过互联网共享任何数据。

    让我们先说一句小心:一个LLM很大,这意味着它会占用大量磁盘空间或系统内存。本节中介绍的用例应该能够在旧硬件上运行,比如旧的MacBook;然而,如果选择一个大型模型,运行时间可能异常长,或者可能导致Jupyter笔记本崩溃。其中一个主要瓶颈是内存需求。粗略地说,如果模型被量化(粗略地说,压缩;我们将在第8章“自定义LLMs及其输出”中讨论量化),10亿个参数对应1 GB的RAM(请注意,并非所有模型都会被量化)。

    您还可以在托管的资源或服务上运行这些模型,如Kubernetes或Google Colab。这些将允许您在具有大量内存和不同硬件(包括Tensor Processing Units(TPUs)或图形处理单元(GPUs))的计算机上运行。

    我们将在这里看看Hugging Face的transformers、llama.cpp和GPT4All。这些工具提供了巨大的功能,并且包含了太多无法在本章中详细介绍的优秀功能。让我们首先展示如何使用Hugging Face的transformers库运行一个模型。

    Hugging Face Transformers

    我将快速展示设置和运行管道的一般步骤:

    from transformers import pipeline
    import torch
    generate_text = pipeline(
        model="aisquared/dlite-v1-355m",
        torch_dtype=torch.bfloat16,
        trust_remote_code=True,
        device_map="auto",
        framework="pt"
    )
    generate_text("In this chapter, we'll discuss first steps with generative AI in Python.")
    

    运行上述代码将从Hugging Face下载模型所需的所有内容,如分词器和模型权重。该模型相对较小(3.55亿个参数),但性能相对较好,经过指令调整,适用于对话。然后,我们可以运行文本完成,以获取本章的一些灵感。

    我没有在主要的要求中包含accelerate,但我已经包含了transformers库。如果您没有安装所有库,请确保执行以下命令:

    pip install transformers accelerate torch
    

    为了将此管道插入LangChain代理或链中,我们可以使用与本章其他示例中看到的相同的方式:

    from langchain import PromptTemplate, LLMChain
    template = """Question: {question}
    Answer: Let's think step by step."""
    prompt = PromptTemplate(template=template, input_variables=["question"])
    llm_chain = LLMChain(prompt=prompt, llm=generate_text)
    question = "What is electroencephalography?"
    print(llm_chain.run(question))
    

    在这个例子中,我们还看到了使用PromptTemplate的特定任务说明。llama.cpp是Facebook的LLaMA、LLaMA 2和其他具有类似架构的衍生模型的C++移植。让我们来看看这个。

    llama.cpp

    由Georgi Gerganov编写和维护,llama.cpp是一个C++工具包,用于执行基于LLaMA或类似LLaMA的架构的模型。LLaMA是最早的大型开源模型之一,由Meta发布,催生了许多其他模型的开发。llama.cpp的一个主要用例是在CPU上高效运行模型;但是,也有一些针对GPU的选项。

    请注意,您需要安装MD5校验工具。这在一些Linux发行版(如Ubuntu)中默认包含。在macOS上,您可以使用brew安装它,如下所示:

    brew install md5sha1sum
    

    我们需要从GitHub下载llama.cpp存储库。您可以通过在GitHub上选择下载选项之一在线执行此操作,也可以使用终端中的git命令,如下所示:

    git clone https://github.com/ggerganov/llama.cpp.git
    

    然后,我们需要安装Python依赖项,可以使用pip软件包安装器执行此操作 – 为方便起见,让我们也切换到llama.cpp项目的根目录:

    cd llama.cpp
    pip install -r requirements.txt
    

    在安装要求之前,您可能希望创建一个Python环境,但这取决于您。在我的情况下,我在最后收到了一条错误消息,缺少一些库,因此我必须执行此命令:

    pip install 'blosc2==2.0.0' cython FuzzyTM
    

    现在,我们需要编译llama.cpp。我们可以使用4个进程并行构建:

    make -C . -j4 #在具有4个进程的子目录中运行make
    

    要获取Llama模型权重,您需要遵循T&C并等待Meta发送的注册电子邮件。有一些工具,如pyllama项目中的llama模型下载器,但请注意,它们可能不符合Meta的许可规定。

    还有许多其他模型,如Falcon、Mistral、Vicuna、OpenLLaMA或Alpaca,具有更宽松的许可证。假设您使用llama.cpp GitHub页面上的链接下载了OpenLLaMA 3B模型的模型权重和分词器模型。模型文件大小约为6.8 GB,分词器要小得多。您可以将这两个文件移到models/3B目录中。

    您可以下载更大尺寸的模型,如13B、30B和65B;但是,在这里需要谨慎:这些模型在内存和磁盘空间方面都很大。我们必须使用转换脚本将模型转换为llama.cpp格式,称为ggml

    python3 convert.py models/3B/ --ctx 2048
    

    然后,我们可以选择对模型进行量化,以在进行推理时节省内存。量化是指减少用于存储权重的位数:

    ./quantize ./models/3B/ggml-model-f16.gguf ./models/3B/ggml-model-q4_0.bin q4_0
    

    最后一个文件比之前的文件小得多,并且在内存中占用的空间也少得多,这意味着您可以在较小的机器上运行它。一旦选择了要运行的模型,我们可以将其集成到代理或链中,例如:

    llm = LlamaCpp(
        model_path="./ggml-model-q4_0.bin",
        verbose=True
    )
    

    GPT4All是一个奇妙的工具,不仅包括运行模型,还包括提供和定制模型。

    GPT4All

    这个工具与llama.cpp密切相关,它基于与llama.cpp的接口。然而,与llama.cpp相比,它使用起来更加方便,安装也更加容易。本书的设置说明已经包括了所需的gpt4all库。

    关于模型支持,GPT4All支持大量的Transformer架构:

    • GPT-J
    • LLaMA(通过llama.cpp
    • Mosaic ML的MPT架构
    • Replit
    • Falcon
    • BigCode的StarCoder

    您可以在项目网站上找到所有可用模型的列表,还可以在那里查看它们在重要基准测试中的结果:模型列表

    Hugging Face为这些任务支持许多模型,包括:

    • 文档问答
    • 摘要生成
    • 文本分类
    • 文本问答
    • 翻译

    我们可以通过在transformer中运行管道在本地执行这些模型,远程在Hugging Face Hub服务器上运行(HuggingFaceHub),或通过load_huggingface_tool()加载器作为工具。

    Hugging Face包含数千个模型,其中许多模型经过专门领域的精细调整。例如,ProsusAI/finbert是一个在称为Financial PhraseBank的数据集上训练的BERT模型,可以分析财务文本的情感。我们还可以使用任何本地模型。对于文本分类,模型往往要小得多,因此这在资源上的负担较小。最后,文本分类也可能是嵌入的一种情况,我们将在第5章《构建类似ChatGPT的聊天机器人》中讨论。

    我决定尝试尽量使用我可以在Hugging Face上找到的较小模型进行这个练习。

    我们可以通过Hugging Face API列出Hugging Face Hub上用于文本分类的下载量最多的5个模型:

    from huggingface_hub import list_models
    
    def list_most_popular(task: str):
        for rank, model in enumerate(
            list_models(filter=task, sort="downloads", direction=-1)
        ):
            if rank == 5:
                break
            print(f"{model.id}, {model.downloads}n")
    
    list_most_popular("text-classification")
    

    让我们看一下这个列表:

    Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

    一般来说,我们应该看到这些模型主要用于情感、情绪、反讽或形式良好等小范围的类别。让我们使用一个情感模型来分析客户的电子邮件,这应该是客户服务中的常见用例。 我已经要求GPT-3.5编写一封关于咖啡机投诉的冗长客户电子邮件,这里我简化了一下。你可以在GitHub上找到完整的电子邮件。让我们看看我们的情感模型有什么要说:

    from transformers import pipeline
    customer_email = """
    我写信是为了倾诉我最近与你们咖啡机有关的不幸经历。我焦急地打开包裹着我期待已久的咖啡机的盒子。然而,我在里面发现的不仅打破了我的心,还摧毁了我对你们品牌的信任。
    它曾经优雅的外表被旅途中的伤痕玷污,就像一名在浓缩咖啡战场上英勇作战的战士。这让我梦想中每天都能享受完美咖啡的愿望破灭,让我情感崩溃,无法安慰。
    """
    sentiment_model = pipeline(
        task="sentiment-analysis",
        model="cardiffnlp/twitter-roberta-base-sentiment"
    )
    print(sentiment_model(customer_email))
    

    我们在这里使用的情感模型是Twitter-roBERTa-base,它是在推特上训练的,所以可能不是最合适的用例。除了情感情感分析,这个模型还可以执行其他任务,比如情感识别(愤怒、喜悦、悲伤或乐观)、表情符号预测、反讽检测、仇恨言论检测、冒犯性语言识别以及立场检测(支持、中立或反对)。 对于情感分析,我们将得到一个评分和一个数值分数,表示对标签的置信度。这些标签是:

    • 0 – 负面
    • 1 – 中性
    • 2 – 正面 请确保按照说明安装了所有依赖项以便执行此操作。我得到的结果是:
    [{'label': 'LABEL_0', 'score': 0.5822020173072815}]
    并不是一个高兴的人。
    

    作为对比,如果电子邮件中说:“我很生气和难过,我想自杀”,我们应该得到接近0.98的相同标签的分数。一旦我们建立了可对比的度量标准,我们可以尝试其他模型或训练更好的模型。 让我们继续吧!以下是摘要的5个最受欢迎的模型(截至撰写本文的时间,2023年10月):

    Python环境管理工具及安装说明:Docker、Conda、pip和Poetry

    所有这些模型都具有小的占用空间,这很好,但要认真应用它们,我们应该确保它们足够可靠。 让我们在服务器上远程执行摘要模型。请注意,为了使其正常工作,你需要设置 HUGGINGFACEHUB_API_TOKEN:

    from langchain import HuggingFaceHub
    summarizer = HuggingFaceHub(
        repo_id="facebook/bart-large-cnn",
        model_kwargs={"temperature": 0, "max_length": 180}
    )
    def summarize(llm, text) -> str:
        return llm(f"Summarize this: {text}!")
    
    summarize(summarizer, customer_email)
    

    执行完毕后,我看到了这个摘要:

    A customer's coffee machine arrived ominously broken, evoking a profound sense of disbelief and despair. "This heartbreaking display of negligence shattered my dreams of indulging in daily coffee perfection, leaving me emotionally distraught and inconsolable," the customer writes. "I hope this email finds you amidst an aura of understanding, despite the tangled mess of emotions swirling within me as I write to you," he adds.
    

    这个摘要还可以,但不是很令人信服。摘要中仍然有很多冗长之处。我们可以尝试其他模型,或者直接使用带有摘要请求的LLM。我们将在第4章“构建功能强大的助手”中更详细地讨论摘要。让我们继续吧。 了解客户写的是什么样的问题可能非常有用。让我们询问Vertex AI: 在执行以下代码之前,请确保你已经在GCP进行了身份验证,并根据关于Vertex AI的部分的说明设置了GCP项目。

    from langchain.llms import VertexAI
    from langchain import PromptTemplate, LLMChain
    template = """Given this text, decide what is the issue the customer is concerned about. Valid categories are these:
    * product issues
    * delivery problems
    * missing or late orders
    * wrong product
    * cancellation request
    * refund or exchange
    * bad support experience
    * no clear reason to be upset
    Text: {email}
    Category:
    """
    prompt = PromptTemplate(template=template, input_variables=["email"])
    llm = VertexAI()
    llm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)
    print(llm_chain.run(customer_email))
    

    我们得到了产品问题,这对我在这里使用的长电子邮件示例是正确的。

    希望看到如何快速地将几个模型和工具组合在LangChain中,以获取看起来实际有用的东西是令人兴奋的。通过深思熟虑的实施,这种人工智能自动化可以辅助人工代理,处理频繁的问题,使其能够专注于复杂的问题。总体而言,这展示了生成式人工智能提升客户服务工作流程的潜力。 我们可以很容易地在图形界面中展示给客户服务代理,并与之互动。这是我们将在下一章中做的事情。

    让我们总结吧!

    总结

    在本章中,我们通过四种不同的方式介绍了如何安装LangChain和本书中所需的其他库作为环境。然后,我们介绍了几个文本和图像模型提供者。对于每一个,我们解释了如何获取API令牌,并演示了如何调用模型。

    最后,我们针对客户服务的一个用例,开发了一个用于文本分类(意图分类)和情感分析的LLM应用。这展示了LangChain在编排多个模型以创建有用应用方面的简易性。通过在LangChain中连接各种功能,我们可以帮助减少客户服务中的响应时间,并确保回答准确而简洁。

    在第4章“构建功能强大的助手”和第5章“构建类似ChatGPT的聊天机器人”中,我们将更深入地探讨一些用例,例如通过工具和检索进行聊天机器人中的问答。

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

算力不足是制约通用人工智能发展的重要因素,无问芯穹的解决方案值得关注

2023-12-26 11:20:00

AI教程

Fairy:新一代视频合成新框架,AI技术创新突破

2023-12-26 11:34:00

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索