使用LangChain的生成式AI——开始使用LangChain

在这本书中,我们将编写大量代码并测试许多不同的集成和工具。因此,在本章中,我们将提供所有必要库的基本设置说明,涵盖最常见的依赖管理工具,如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环境。它们安装依赖项并隔离项目。以下是管理依赖关系的这些选项的概览:

对于开发人员,提供通过容器进行隔离的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:pip.pypa.io/。

  2. 使用虚拟环境进行隔离(例如,venv)。

  3. 从requirements.txt中安装依赖项:

    pip install -r requirements.txt

Poetry

Poetry相对较新,但由于其便利性,它在Python开发人员和数据科学家中很受欢迎。它管理依赖项和虚拟环境。要使用Poetry:

  1. 按照 python-poetry.org/ 上的说明安装Poetry。
  2. 运行 poetry install 来安装依赖项。

Conda

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

  1. 按照此链接的说明安装Miniconda或Anaconda:docs.continuum.io/anaconda/in...

  2. 从langchain_ai.yml创建环境:

    lua 复制代码
    conda env create --file langchain_ai.yaml
  3. 激活环境:

    conda activate langchain_ai
    

Docker

Docker使用容器提供隔离的、可复制的环境。要使用Docker:

  1. 安装Docker Engine;请按照此处的安装说明进行:docs.docker.com/get-docker/...

  2. 从此存储库中的Dockerfile构建Docker镜像:

    erlang 复制代码
    docker build -t langchain_ai .
  3. 以交互方式运行Docker容器:

    arduino 复制代码
    docker run -it langchain_ai

让我们继续并了解一些您可以在LangChain中使用的模型! 有许多模型的云提供商,您可以通过接口使用这些模型;其他来源允许您将模型下载到计算机上。 借助LangChain的帮助,我们可以与所有这些进行交互------例如,通过应用程序编程接口(API),或者我们可以调用已在计算机上下载的模型。让我们从通过云提供商的API访问的模型开始。

探索API模型集成

在正式开始生成式人工智能之前,我们需要设置访问诸如LLMs或文本到图像模型之类的模型,以便将它们集成到我们的应用程序中。正如在第1章"生成式人工智能是什么?"中讨论的那样,有许多技术巨头推出的LLMs,如OpenAI的GPT-4,Google的BERT和PaLM-2,Meta的LLaMA等等。

对于LLMs,LangChain支持的提供商包括OpenAI、Hugging Face、Cohere、Anthropic、Azure、Google Cloud Platform的Vertex AI(PaLM-2)以及Jina AI,但这个列表正在不断增长。您可以在 integrations.langchain.com/llms 查看支持的LLMs的完整列表。

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

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中,我们可以执行以下行:

lua 复制代码
import os
os.environ["OPENAI_API_KEY"] = "<your token>"

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

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

ini 复制代码
export OPENAI_API_KEY=<your token>

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

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

ini 复制代码
set OPENAI_API_KEY=<your token>

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

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

vbnet 复制代码
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()函数将所有密钥加载到环境中,就像前面提到的那样。每当您想要运行一个应用程序时,您导入该函数并像这样运行它:

arduino 复制代码
from config import set_environment
set_environment()

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

虚构的LLM

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

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

css 复制代码
from langchain.llms import FakeLLM
fake_llm = FakeLLM(responses=["Hello"])

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

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

ini 复制代码
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_REPL\nAction 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_REPL\nAction Input: print(2 + 2)"和"Final Answer: 4"),不会根据输入而改变。

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

python 复制代码
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平台上,这应该是这个样子:

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

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

ini 复制代码
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")

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

vbnet 复制代码
> 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:

ini 复制代码
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/sdk/docs/in...

然后,您可以使用以下命令从终端进行身份验证并打印密钥令牌:

arduino 复制代码
gcloud auth application-default login

您还需要为项目启用Vertex AI。要启用Vertex AI,请使用pip install google-cloud-aiplatform命令安装Google Vertex AI SDK。如果您按照前一部分中的GitHub上的说明操作,那么您应该已经安装了这个。

然后,我们需要设置Google Cloud项目ID。您有不同的选项:

  • 使用 gcloud config set project my-project
  • 在初始化LLM时传递构造函数参数
  • 使用 aiplatform.init()
  • 设置GCP环境变量

我发现所有这些选项都能正常工作。您可以在Vertex文档中找到有关这些选项的更多详细信息。GCP环境变量与我之前提到的config.py文件很好地配合使用。不过,我发现gcloud命令非常方便,所以我选择了这个。请确保在继续之前设置项目ID。

如果您还没有启用它,您应该会收到一个有用的错误消息,指向正确的网站,在那里您可以点击"Enable"。

让我们运行一个模型!

ini 复制代码
from langchain.llms import VertexAI
from langchain import PromptTemplate, LLMChain

template = """Question: {question}
Answer: Let's think step by step."""
prompt = PromptTemplate(template=template, input_variables=["question"])
llm = VertexAI()
llm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)

question = "What NFL team won the Super Bowl in the year Justin Beiber was born?"
llm_chain.run(question)

我们应该会看到这个响应:

vbnet 复制代码
[1m> Entering new chain...[0m
Prompt after formatting:
[[Question: What NFL team won the Super Bowl in the year Justin Beiber was born?
Answer: Let's think step by step.[0m
[1m> Finished chain.[0m
Justin Beiber was born on March 1, 1994. The Super Bowl in 1994 was won by the San Francisco 49ers.

我将verbose设置为True,以查看模型的推理过程。令人印象深刻的是,即使在名字拼写错误的情况下,它也能产生正确的响应。逐步提示说明是得出正确答案的关键。

Vertex AI提供了一系列专为任务定制的模型,如按照说明执行、会话和代码生成/辅助:

  • text-bison经过微调,可执行自然语言说明,最大输入为8,192个标记,输出为1,024个。
  • chat-bison经过优化,适用于多轮会话,最大输入为4,096个标记,输出为1,024个标记,最多2,500轮。
  • code-bison从自然语言描述中生成代码,最大输入为4,096个标记,输出为2,048个标记。
  • codechat-bison是一个聊天机器人,经过微调,可帮助解决与代码相关的问题。其输入限制为4,096个标记,输出限制为2,048个标记。
  • code-gecko建议代码完成。其最大输入长度为2,048个标记,输出为64个标记。

这些模型还具有不同的输入/输出限制和训练数据,并经常进行更新。有关模型的更详细和最新信息,包括模型何时已更新,您可以在 cloud.google.com/vertex-ai/d... 上查看文档。

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

ini 复制代码
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))

我们得到了这个响应:

scss 复制代码
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。 您可以在chat.jina.ai/api上设置登录帐户。 在该平台上,我们可以为不同的用例设置API,例如图像描述、文本嵌入、图像嵌入、视觉问题回答、视觉推理、图像放大或中文文本嵌入。

在这里,我们正在设置一个使用推荐模型的视觉问答API:

我们得到了在Python和cURL中进行客户端调用的示例以及一个演示,我们可以在其中提问问题。这很酷,但不幸的是,这些API目前尚未通过LangChain提供。我们可以通过将LangChain中的LLM类子类化为自定义LLM接口,自己实现这样的调用。

让我们设置另一个聊天机器人,这次由Jina AI提供支持。我们可以生成API令牌,将其设置为JINACHAT_API_KEY,网址为chat.jina.ai/api。

在这里,让我们进行英语到法语的翻译:

scss 复制代码
from langchain.chat_models import JinaChat
from langchain.schema import HumanMessage

chat = JinaChat(temperature=0.)
messages = [    HumanMessage(        content="Translate this sentence from English to French: I love generative AI!"    )]
chat(messages)

我们应该会看到:

ini 复制代码
AIMessage(content="J'adore l'IA générative !", additional_kwargs={}, example=False)

我们可以设置不同的温度,其中低温度使响应更加可预测。在这种情况下,它只会产生轻微的差异。我们用一个系统消息开始对话,澄清聊天机器人的目的。

让我们询问一些食物推荐:

scss 复制代码
from langchain.schema import SystemMessage

chat = JinaChat(temperature=0.)
chat(
    [
        SystemMessage(
            content="You help a user find a nutritious and tasty food to eat in one word."
        ),
        HumanMessage(
            content="I like pasta with cheese, but I need to eat more vegetables, what should I eat?"
        )
    ]
)

我在Jupyter中得到了这个回应,你的答案可能会有所不同:

vbnet 复制代码
AIMessage(content='A tasty and nutritious option could be a vegetable pasta dish. Depending on your taste, you can choose a sauce that complements the vegetables. Try adding broccoli, spinach, bell peppers, and zucchini to your pasta with some grated parmesan cheese on top. This way, you get to enjoy your pasta with cheese while incorporating some veggies into your meal.', additional_kwargs={}, example=False)

它忽略了一个字的指示,但我喜欢阅读这些建议。我想我应该尝试为我儿子做这道菜。在其他聊天机器人中,我得到了Ratatouille的建议。

在LangChain中了解LLM和聊天模型之间的区别很重要。LLM是文本完成模型,它以字符串提示作为输入,并输出字符串完成。如前所述,聊天模型类似于LLM,但专门设计用于对话。它们以带有发言者标签的聊天消息列表作为输入,并返回聊天消息作为输出。

LLM和聊天模型都实现了基本语言模型接口,其中包括predict()和predict_messages()等方法。这个共享接口允许在应用程序中和聊天和LLM模型之间进行多样化类型的模型的互换。

Replicate

成立于2019年的Replicate Inc.是一家总部位于旧金山的初创公司,为AI开发人员提供了一种简化的流程,通过利用云技术,他们可以使用最少的代码输入实施和发布AI模型。该平台适用于私有和公共模型,并支持模型推断和微调。该公司最近一轮融资是一轮A轮融资,总投资额为1250万美元,由Andreessen Horowitz领导,并有Y Combinator、Sequoia以及其他各类独立投资者参与。

Ben Firshman在Docker公司负责开源产品工作,Andreas Jansson是Spotify的前机器学习工程师,两人共同创立了Replicate Inc.,他们的共同愿望是消除妨碍AI大规模接受的技术障碍。因此,他们创建了Cog,这是一个开源工具,将机器学习模型打包成标准的适用于生产的容器,可以在任何当前操作系统上运行,并自动生成API。这些容器还可以通过Replicate平台部署在GPU集群上。因此,开发人员可以专注于其他重要任务,从而提高其生产力。

您可以在replicate.com/使用GitHub凭据进行身份验证。然后,如果您点击左上角的用户图标,您会找到API令牌 - 只需复制API密钥并将其在您的环境中设置为REPLICATE_API_TOKEN。要运行更大的作业,您需要设置您的信用卡(在结算中心)。

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

ini 复制代码
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")

我得到了这个图像:

我认为这是一张不错的图片 - 那是一个创造艺术的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

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

ini 复制代码
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代理或链中,我们可以使用与本章其他示例中看到的相同的方式:

ini 复制代码
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命令,如下所示:

bash 复制代码
git clone https://github.com/ggerganov/llama.cpp.git

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

bash 复制代码
cd llama.cpp
pip install -r requirements.txt

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

arduino 复制代码
pip install 'blosc2==2.0.0' cython FuzzyTM

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

go 复制代码
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

css 复制代码
python3 convert.py models/3B/ --ctx 2048

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

bash 复制代码
./quantize ./models/3B/ggml-model-f16.gguf ./models/3B/ggml-model-q4_0.bin q4_0

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

ini 复制代码
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

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

以下是使用GPT4All进行文本生成的快速示例:

ini 复制代码
from langchain.llms import GPT4All
model = GPT4All(model="mistral-7b-openorca.Q4_0.gguf", n_ctx=512, n_threads=8)
response = model(
    "We can run large language models locally for all kinds of applications, "
)

执行此操作应该首先下载(如果尚未下载)该模型,该模型是通过GPT4All提供的最佳聊天模型之一,由法国初创公司Mistral AI进行预训练,并由OpenOrca AI倡议进行了微调。此模型需要3.83 GB 的硬盘空间存储和8 GB 的RAM 运行。然后,我们应该能够看到有关在本地运行LLMs的令人信服的论点。

这应该作为与本地模型集成的初步介绍。在下一节中,我们将讨论在LangChain中构建文本分类应用程序,以协助客服代理。目标是根据意图对客户电子邮件进行分类,提取情感,并生成摘要,以帮助代理更快地理解和回复。

构建一个客户服务应用程序

客户服务代理负责回答客户的查询、解决问题和处理投诉。他们的工作对于维护客户满意度和忠诚度至关重要,这直接影响公司的声誉和财务成功。

生成式人工智能可以在以下几个方面帮助客户服务代理:

  1. 情感分类: 这有助于识别客户的情感,使代理能够个性化其回应。
  2. 摘要生成: 这使代理能够理解冗长客户消息的要点,并节省时间。
  3. 意图分类: 类似于摘要生成,这有助于预测客户的目的,从而实现更快速的问题解决。
  4. 答案建议: 这为代理提供了对常见查询的建议响应,确保提供准确且一致的消息。

这些方法的结合可以帮助客户服务代理更准确、及时地回应,提高客户满意度。客户服务对于维护客户满意度和忠诚度至关重要。生成式人工智能可以通过情感分析来帮助代理识别情感,通过摘要生成来识别关键点,通过意图分类来确定目的。这些方法的结合可以实现更准确、及时的响应。

LangChain提供了灵活性,可以利用不同的模型。LangChain具有许多集成,可以帮助我们解决各种文本问题。我们可以在执行这些任务时在许多不同的集成之间进行选择。

我们可以访问各种用于开放领域分类和情感分析以及通过Hugging Face提供的专注任务的较小的变压器模型。我们将构建一个原型,使用情感分析将电子邮件情感分类,使用摘要生成压缩长文本,使用意图分类对问题进行分类。

给定文档,如电子邮件,我们希望将其分类为与意图相关的不同类别,提取情感并提供摘要。在第5章《构建类似ChatGPT的聊天机器人》中,我们将处理其他问题回答项目。

我们可以要求任何LLM为我们提供开放领域(任何类别)分类或在多个类别之间进行选择。特别是由于其庞大的训练规模,LLM是非常强大的模型,尤其是在给定少量样本提示的情感分析任务中,不需要任何额外的训练。这是在2023年4月的一项研究中分析的,该研究的题目是《ChatGPT是否是一种良好的情感分析器?初步研究》。

用于LLM情感分析的提示可以是这样的:

给定这段文字,传达了什么情感?是积极的、中性的还是负面的?
文本:{sentence}
情感:

LLM在摘要生成方面也可以非常有效,远远优于以前的任何模型。但缺点是这些模型调用比传统的机器学习模型慢,而且成本更高。

如果我们想尝试更传统或更小的模型,我们可以依赖于诸如spaCy之类的库,或通过专业提供商访问它们。 Cohere和其他提供商在其功能中包含了文本分类和情感分析。例如,NLP Cloud的模型列表包括spaCy和许多其他模型:模型列表

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个模型:

python 复制代码
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")

让我们看一下这个列表:

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

ini 复制代码
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 -- 正面 请确保按照说明安装了所有依赖项以便执行此操作。我得到的结果是:
css 复制代码
[{'label': 'LABEL_0', 'score': 0.5822020173072815}]
并不是一个高兴的人。

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

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

python 复制代码
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)

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

vbnet 复制代码
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项目。

ini 复制代码
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的聊天机器人"中,我们将更深入地探讨一些用例,例如通过工具和检索进行聊天机器人中的问答。

相关推荐
数据智能老司机20 小时前
LLM工程师手册——监督微调
深度学习·架构·llm
知来者逆1 天前
使用 GPT-4V 全面评估泛化情绪识别 (GER)
人工智能·gpt·语言模型·自然语言处理·gpt-4v
github_czy1 天前
使用GPT-SoVITS训练语音模型
人工智能·gpt
AI_小站1 天前
LLM——10个大型语言模型(LLM)常见面试题以及答案解析
人工智能·程序人生·语言模型·自然语言处理·大模型·llm·大模型面试
Yeats_Liao1 天前
昇思大模型平台打卡体验活动:基于MindSpore实现GPT1影评分类
gpt·分类·数据挖掘
龙的爹23331 天前
论文 | Evaluating the Robustness of Discrete Prompts
人工智能·gpt·自然语言处理·nlp·prompt·agi
waiting不是违停1 天前
LangChain Ollama实战文献检索助手(二)少样本提示FewShotPromptTemplate示例选择器
langchain·llm·ollama
我爱学Python!1 天前
AI Prompt如何帮你提升论文中的逻辑推理部分?
人工智能·程序人生·自然语言处理·chatgpt·llm·prompt·提示词
大数据面试宝典2 天前
【Ai测评】GPT Search偷偷上线,向Google和微软发起挑战!
人工智能·gpt·ai测评·ai之家
灰哥数据智能2 天前
DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)
python·gpt·语言模型·数据分析