1. LangChain: 简介与入门

随着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”

询问多个问题

如果我们要问多个问题,我们可以尝试两种方式:

  1. 使用生成方法遍历所有问题,一次回答一个问题。
  2. 将所有问题放在一个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可以做比我们在这里提及的事情更多的内容。我们将覆盖这些内容在后面的章节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值