随着2020年OpenAi公司的GPT-3发布,LLM开始进入世界舞台。从那时起,他们的受欢迎程度稳步增长。
这种情况已知持续到2022年末。人们对LLM以及更广泛的生成式AI领域的兴趣急剧飙升。造成这种情况的原因可能是LLM的重大进展持续向好。
我们看到了有关谷歌“有感知能力的”LaMDA聊天机器人的戏剧性新闻。BLOOM第一个高性能开源LLM发布了。OpenAI发布了他们的下一代文本嵌入模型和下一代“GPT-3.5”模型。
在LLM领域取得了这些巨大的进步之后,OpenAI发布了ChatGPT--是LLM成为了人们关注的焦点。
LangChain在同一时间出现。他的创建者Harrison Chase于2022年10月底进行了第一次提交。在经历了短短几个月的开发之后,就赶上了LLM的浪潮。
尽管这个库还处在早期阶段,但它已经具备了许多令人惊叹的功能,可以围绕LLM的核心构建出色的工具。在本文中,我们将介绍这个库,并从LangChain提供的最直接的组件--LLM开始。
LangChain
从本质上将,LangChain是一个围绕LLM构建的框架。我们可以把他用于聊天机器人、生成式问答、文本摘要等诸多方面。
这个库的核心思想是,我们可以将不同的组件“链接(chain)”在一起,围绕LLM创建更高级的使用案例。(推理)链可以由来自多个模块的多个组件组成:
- Prompt模版:提示词模版是不同提示词类型的模版。比如:聊天机器人类型的模版,ELI5问答,等等
- LLMs:大语言模型,譬如GPT-3,BLOOM,等等
- Agent:Agent使用LLM来决策可以采取哪些行动。像web搜索或者计算器这类工具会被使用,并且所有这些(工具)都会被打包到一个操作的逻辑循环中。
- Memory:短期记忆,长期记忆。
在《LangChain操作手册》后续的章节中,我们将更详细的深入的探讨这些内容中的每一项。
现在,我们将从提示模版和LLM背后的基础知识开始。我们还将探索该库中可用的两种LLM选项,使用来自Hugging Face Hub或者OpenAI的模型。
第一个Prompt模版
输入到LLM中的提示词通常以不同的方式构建,这样我们可以得到不同的结果。对于Q&A来说,我们可以提取用户的问题,并针对不同的问答风格对其进行重新格式化,比如传统的问答形式、以要点列表形式给出答案,甚至是与给定问题相关的问题总结。
在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?"
当将这些提示词模版与给定的问题一起使用时,我们将会得到:
Question: Which NFL team won the Super Bowl in the 2010 season? Answer:
截止目前,这些就是我们所需全部。
Hugging Face Hub LLM
LangChain中的 Hugging Face Hub端点连接到 Hugging Face Hub(抱抱脸平台),并通过其免费的推理(inference)端点来运行模型。我们需要一个 Hugging Face 账号和 API 密钥来使用这些端点。
当有了一个API密钥,我们将他添加到HUGGINGFACEHUB_API_TOKEN
环境变量中。我们通过下面的代码来做这件事情:
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'HF_API_KEY'
接下来,我们通过pip安装huggingface_hub
库。
!pip install huggingface_hub
现在我们可以使用仓库中的一个模型生成文本。我们将使用google/flan-t5-x1
。
默认的抱抱脸平台接口的API不适用特定的硬件,因此,会比较慢。他们也不适合跑更大一点的模型bigscience/bloom-560m
或者google/flan-t5-xxl
(注意是xxl
,而不是xl
)。
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))
green bay packers
对于这个问题,我们得到了正确的答案“green bay packers”
询问多个问题
如果我们要问多个问题,我们可以尝试两种方式:
- 使用生成方法遍历所有问题,一次回答一个问题。
- 将所有问题放在一个prompt;这只适用于更高级的LLM。
使用方式1开始,让我们看看如何使用generate
方法:
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
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)
在这里除了第一个问题我们得到的都是不好的结果。这仅仅是所使用的大模型语言的一个局限性。
如果模型无法回答单个问题,那么将所有的查询合并到一个单独的prompt中不大可能有效。然而,为了实验的目的,让我们来试试他:
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))
If I am 6 ft 4 inches, how tall am I in centimeters
正如所料,结果并没有什么帮助。我们之后会看到更强大的LLM可以做到这一点。
OpenAI LLM
LangChain中的OpenAI接入点可以直接或者通过Azure来连接到OpenAi。我们需要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的大语言模型davinci:
llm_chain = LLMChain(
prompt=prompt,
llm=davinci
)
print(llm_chain.run(question))
The Green Bay Packers won the Super Bowl in the 2010 season.
跟预期一致,我们得到了正确的答案。我们可以使用generate
对多个问题执行相同的操作:
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))
LLMResult(generations=[[Generation(text=' The Green Bay Packers won the Super Bowl in the 2010 season.', generation_info={'finish_reason': 'stop', 'logprobs': None})], [Generation(text=' 193.04 centimeters', generation_info={'finish_reason': 'stop', 'logprobs': None})], [Generation(text=' Charles Duke was the 12th person on the moon. He was part of the Apollo 16 mission in 1972.', generation_info={'finish_reason': 'stop', 'logprobs': None})], [Generation(text=' A blade of grass does not have any eyes.', generation_info={'finish_reason': 'stop', 'logprobs': None})]], llm_output={'token_usage': {'total_tokens': 124, 'prompt_tokens': 75, 'completion_tokens': 49}})
结果的绝大多数是正确的,或者具有一定的真实性。这个模型无疑比google/flan-t5-xl模型表现的更好。和之前一致,让我们尝试一次将所有问题都输入到模型中。
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))
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的介绍--一个允许我们构建围绕LLM(譬如OpenAI的GPT-3,或者通过HuggingFace提供的开源替代品)构建更加高级的APP的库。
如前所述,LangChain可以做比我们在这里提及的事情更多的内容。我们将覆盖这些内容在后面的章节。