在这本书中,咱们将编写许多代码并测验许多不同的集成和东西。因而,在本章中,咱们将供给一切必要库的根本设置阐明,包括最常见的依靠办理东西,如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环境。它们装置依靠项并阻隔项目。以下是办理依靠联系的这些选项的概览:

运用LangChain的生成式AI——开端运用LangChain

关于开发人员,供给经过容器进行阻隔的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创立环境:

    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镜像:

    docker build -t langchain_ai .
    
  3. 以交互办法运转Docker容器:

    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的生成式AI——开端运用LangChain

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渠道上,这应该是这个姿态:

运用LangChain的生成式AI——开端运用LangChain

单击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/sdk/docs/in…

然后,您能够运用以下指令从终端进行身份验证并打印密钥令牌:

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”。

让咱们运转一个模型!

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)

咱们应该会看到这个呼应:

[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,这是初级软件开发人员面试的常见问题:

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。 您能够在chat.jina.ai/api上设置登录帐户。 在该渠道上,咱们能够为不同的用例设置API,例如图画描绘、文本嵌入、图画嵌入、视觉问题答复、视觉推理、图画扩大或中文文本嵌入。

在这儿,咱们正在设置一个运用推荐模型的视觉问答API:

运用LangChain的生成式AI——开端运用LangChain

咱们得到了在Python和cURL中进行客户端调用的示例以及一个演示,咱们能够在其间提问问题。这很帅,但不幸的是,这些API现在没有经过LangChain供给。咱们能够经过将LangChain中的LLM类子类化为自定义LLM接口,自己完结这样的调用。

让咱们设置另一个谈天机器人,这次由Jina AI供给支撑。咱们能够生成API令牌,将其设置为JINACHAT_API_KEY,网址为chat.jina.ai/api。

在这儿,让咱们进行英语到法语的翻译:

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)

咱们应该会看到:

AIMessage(content="J'adore l'IA gnrative !", additional_kwargs={}, example=False)

咱们能够设置不同的温度,其间低温度使呼应愈加可猜测。在这种情况下,它只会发生轻微的差异。咱们用一个体系音讯开端对话,澄清谈天机器人的目的。

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

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中得到了这个回应,你的答案或许会有所不同:

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。要运转更大的作业,您需求设置您的信用卡(在结算中心)。

这是一个创立图画的简单示例:

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")

我得到了这个图画:

运用LangChain的生成式AI——开端运用LangChain

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

您能够在项目网站上找到一切可用模型的列表,还能够在那里检查它们在重要基准测验中的成果:gpt4all.io/。

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

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

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")

让咱们看一下这个列表:

运用LangChain的生成式AI——开端运用LangChain

一般来说,咱们应该看到这些模型首要用于情感、心情、反讽或形式杰出等小范围的类别。让咱们运用一个情感模型来剖析客户的电子邮件,这应该是客户服务中的常见用例。 我现已要求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月):

运用LangChain的生成式AI——开端运用LangChain

一切这些模型都具有小的占用空间,这很好,但要仔细运用它们,咱们应该保证它们足够牢靠。 让咱们在服务器上远程履行摘要模型。请注意,为了使其正常作业,你需求设置 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的谈天机器人”中,咱们将更深化地讨论一些用例,例如经过东西和检索进行谈天机器人中的问答。