LangChain系列教程:介绍和入门

836 阅读7分钟

大型语言模型(LLMs)在2020年OpenAI发布GPT-3后进入了世界舞台[1]。从那时起,它们在人气上稳步增长。

直到2022年底。对LLMs和更广泛的生成式人工智能学科的兴趣飙升。这可能是因为LLMs方面不断取得重大进展的持续上升势头。

我们看到了关于谷歌的“有思想”的LaMDA聊天机器人的戏剧性新闻。第一个高性能的开源LLM,名为BLOOM,被发布。OpenAI发布了他们的下一代文本嵌入模型以及“GPT-3.5”模型的下一代。

在LLM领域取得了这些巨大进展后,OpenAI发布了ChatGPT,将LLMs推上了舞台。

LangChain也在大约同一时间出现。它的创建者Harrison Chase于2022年10月底提交了第一个版本。在被卷入LLM浪潮之前,只有短短几个月的开发时间。

尽管该库仍处于早期阶段,但已经充满了围绕LLMs核心构建令人惊叹的工具所需的令人难以置信的功能。在本文中,我们将介绍该库,并从LangChain提供的最简单的组件开始——LLMs。

LangChain

在其核心,LangChain是围绕LLMs构建的框架。我们可以将其用于聊天机器人、生成式问答(GQA)、摘要等多种用途。

该库的核心思想是我们可以将不同的组件“链”在一起,以创建更高级的LLMs周围用例。链可以由来自多个模块的多个组件组成:

  • 提示模板:提示模板是不同类型提示的模板,如“聊天机器人”风格的模板,ELI5问答等。

  • LLMs:大型语言模型,如GPT-3、BLOOM等。

  • 代理:代理使用LLMs来决定应采取哪些操作。可以使用工具如Web搜索或计算器,所有这些都被封装成一个逻辑操作的循环。

  • 内存:短期内存,长期内存。

在LangChain手册的后续章节中,我们将更详细地深入探讨这些内容。

现在,我们将从提示模板和LLMs的基础开始。我们还将探索库中提供的两个LLM选项,使用Hugging Face Hub或OpenAI的模型。

我们的第一个提示模板

输入LLMs的提示通常以不同方式结构化,以便获得不同的结果。对于问答,我们可以采取用户的问题并将其重新格式化为不同的问答风格,如传统问答、答案的项目符号列表,甚至是与给定问题相关的问题摘要。

在LangChain中创建提示

让我们创建一个简单的问答提示模板。首先,我们需要安装langchain库。

!pip install langchain

从这里,我们导入PromptTemplate类并像这样初始化一个模板:

from langchain import PromptTemplate

template = """Question: {question}

Answer: """
prompt = PromptTemplate(
        template=template,
    input_variables=['question']
)

# user question
question = "Which NFL team won the Super Bowl in the 2010 season?"

使用给定的问题和这些提示模板,我们将得到:

问题:哪支NFL球队在2010赛季赢得了超级碗?答案:

目前,这就是我们需要的一切。我们将在Hugging Face Hub和OpenAI LLM生成中都使用相同的提示模板。

Hugging Face Hub LLM

LangChain中的Hugging Face Hub端点连接到Hugging Face Hub并通过其免费推理端点运行模型。我们需要一个Hugging Face账户和API密钥来使用这些端点。

一旦您获得了API密钥,我们将其添加到HUGGINGFACEHUB_API_TOKEN环境变量中。我们可以使用Python来完成这个步骤,如下所示:

import os

os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'HF_API_KEY'

接下来,我们必须通过Pip安装huggingface_hub库。

!pip install huggingface_hub

现在我们可以使用Hub模型生成文本。我们将使用google/flan-t5-x1模型。

默认的Hugging Face Hub推理API不使用专门的硬件,因此可能会较慢。它们也不适用于运行更大的模型,比如bigscience/bloom-560m或google/flan-t5-xxl(注意xxl与xl的区别)。

In[3]:

from langchain import HuggingFaceHub, LLMChain

# initialize Hub LLM
hub_llm = HuggingFaceHub(
        repo_id='google/flan-t5-xl',
    model_kwargs={'temperature':1e-10}
)

# create prompt template > LLM chain
llm_chain = LLMChain(
    prompt=prompt,
    llm=hub_llm
)

# ask the user question about NFL 2010
print(llm_chain.run(question))

Out[3]:

green bay packers

对于这个问题,我们得到了正确的答案是"green bay packers"。

提出多个问题

如果我们想提出多个问题,可以尝试两种方法:

  1. 使用generate方法逐一迭代所有问题并逐一回答它们。
  2. 将所有问题放入单个提示中供LLM使用;这只适用于更高级的LLMs。

从选项(1)开始,让我们看看如何使用generate方法:

In[4]:

qs = [
    {'question': "Which NFL team won the Super Bowl in the 2010 season?"},
    {'question': "If I am 6 ft 4 inches, how tall am I in centimeters?"},
    {'question': "Who was the 12th person on the moon?"},
    {'question': "How many eyes does a blade of grass have?"}
]
res = llm_chain.generate(qs)
res

Out[4]:

LLMResult(generations=[[Generation(text='green bay packers', generation_info=None)], [Generation(text='184', generation_info=None)], [Generation(text='john glenn', generation_info=None)], [Generation(text='one', generation_info=None)]], llm_output=None)

在这里,除了第一个问题之外,我们得到的结果都不好。这只是所使用的LLM的一个限制。

如果模型不能准确回答单个问题,将所有查询都分组到单个提示中不太可能奏效。然而,出于实验的目的,让我们尝试一下。

In[6]:

multi_template = """Answer the following questions one at a time.

Questions:
{questions}

Answers:
"""
long_prompt = PromptTemplate(template=multi_template, input_variables=["questions"])

llm_chain = LLMChain(
    prompt=long_prompt,
    llm=flan_t5
)

qs_str = (
    "Which NFL team won the Super Bowl in the 2010 season?\n" +
    "If I am 6 ft 4 inches, how tall am I in centimeters?\n" +
    "Who was the 12th person on the moon?" +
    "How many eyes does a blade of grass have?"
)

print(llm_chain.run(qs_str))

Out[6]:

If I am 6 ft 4 inches, how tall am I in centimeters

如预期的那样,这些结果并不有帮助。我们稍后会看到,更强大的LLMs可以做到这一点。

OpenAI LLMs

LangChain中的OpenAI端点可以直接连接到OpenAI,也可以通过Azure连接。我们需要一个OpenAI账户和API密钥来使用这些端点。

一旦您拥有API密钥,我们可以将其添加到OPENAI_API_TOKEN环境变量中。我们可以使用Python来完成这个操作,如下所示:

import os

os.environ['OPENAI_API_TOKEN'] = 'OPENAI_API_KEY'

接下来,我们必须通过Pip安装openai库。

!pip install openai

现在我们可以使用OpenAI的GPT-3生成(或完成)模型来生成文本。我们将使用text-davinci-003模型。

from langchain.llms import OpenAI

davinci = OpenAI(model_name='text-davinci-003')

或者,如果您正在通过Azure使用OpenAI,您可以执行以下操作:

from langchain.llms import AzureOpenAI

llm = AzureOpenAI(
    deployment_name="your-azure-deployment", 
    model_name="text-davinci-003"
)

我们将继续使用与之前Hugging Face示例相同的简单问答提示模板。唯一的变化是现在我们传递给OpenAI的LLM是davinci:

In[15]:

llm_chain = LLMChain(
    prompt=prompt,
    llm=davinci
)

print(llm_chain.run(question))

Out[15]:

 The Green Bay Packers won the Super Bowl in the 2010 season.

不出所料,我们得到了正确的答案。我们可以使用generate方法来处理多个问题,方法如下:

In[16]:

qs = [
    {'question': "Which NFL team won the Super Bowl in the 2010 season?"},
    {'question': "If I am 6 ft 4 inches, how tall am I in centimeters?"},
    {'question': "Who was the 12th person on the moon?"},
    {'question': "How many eyes does a blade of grass have?"}
]
llm_chain.generate(qs)

Out[16]:

LLMResult(generations=[[Generation(text=' The Green Bay Packer

我们的大部分结果是正确的或具有一定的真实度。该模型无疑比google/flan-t5-xl模型表现得更好。与之前一样,让我们尝试一次性将所有问题输入模型。

In[17]:

llm_chain = LLMChain(
    prompt=long_prompt,
    llm=davinci
)

qs_str = (
    "Which NFL team won the Super Bowl in the 2010 season?\n" +
    "If I am 6 ft 4 inches, how tall am I in centimeters?\n" +
    "Who was the 12th person on the moon?" +
    "How many eyes does a blade of grass have?"
)

print(llm_chain.run(qs_str))

Out[17]:

The New Orleans Saints won the Super Bowl in the 2010 season.
6 ft 4 inches is 193 centimeters.
The 12th person on the moon was Harrison Schmitt.
A blade of grass does not have eyes.

当我们不断重新运行查询时,模型偶尔会出错,但在其他时候也会成功全部正确回答。

这就是我们对LangChain的介绍的全部内容——这是一个允许我们构建更高级应用程序的库,这些应用程序围绕着像OpenAI的GPT-3模型或通过Hugging Face提供的开源替代品等LLM展开。

正如前面提到的,LangChain可以做的远不止我们在这里展示的内容。我们将在接下来的文章中介绍这些其他功能。