大型语言模型(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"。
提出多个问题
如果我们想提出多个问题,可以尝试两种方法:
- 使用generate方法逐一迭代所有问题并逐一回答它们。
- 将所有问题放入单个提示中供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可以做的远不止我们在这里展示的内容。我们将在接下来的文章中介绍这些其他功能。