自 ChatGPT 发布败兴,大型语言模型 (LLM) 得到了广泛的欢迎。 尽管您可能无足够的资金和计算资源来在地下室从头起始训练法学硕士,但您仍然能够运用预先训练的法学硕士来构建有些很酷的东西,例如:
能够按照您的数据与外界互动的个人助理
按照您的目的定制的聊天设备人
对您的文档或代码的分析或总结
法学硕士正在改变咱们构建人工智能制品的方式
凭借其奇怪的 API 和快速的工程,法学硕士正在改变咱们构建人工智能制品的方式。 这便是为何新的研发工具以“LLMOps”一词随处可见。
LangChain便是这些新工具之一。
什么是LangChain?
LangChain 是一个框架,旨在帮忙您更容易地构建 LLM 支持的应用程序,为您供给以下功能:
各样区别基本模型的通用接口(参见模型),
帮忙您管理提示的框架(请参阅提示),以及
长时间记忆(参见内存)、外边数据(参见索引)、其他法学硕士(参见链)和其他代理的中央接口,用于处理法学硕士没法处理的任务(例如,计算或搜索)(参见代理) 。
它是由于 Harrison Chase 创建的开源项目(GitHub 存储库)。
因为 LangChain 拥有许多区别的功能,因此呢一起始理解它的功能可能会很困难。 因此呢,咱们将在本文中间商绍 LangChain(日前)的六个关键模块,以便您更好地认识其功能。
先决要求
要根据本教程进行操作,您必须安装 langchain Python 包并准备好运用所有关联的 API 密钥。
安装LangChain
在安装 langchain 包之前,请保证您的 Python 版本≥ 3.8.1 且 <4.0。
要安装 langchain Python 包,您能够 pip install 它。 pip install langchain在本教程中,咱们使用版本 0.0.147。 GitHub 存储库非常活跃; 因此呢,请保证您持有最新版本。
完成所有设置后,导入 langchain Python 包。 import langchainAPI 密钥
运用法学硕士构建应用程序必须您想要运用的某些服务的 API 密钥,并且某些 API 拥有关联成本。
LLM 供给商(必需)— 您首要必须您想要运用的 LLM 供给商的 API 密钥。 咱们日前正在经历“AI 的 Linux 时刻”,研发人员必要重点基于性能和成本之间的权衡,在专有或开源基本模型之间进行选取。
专有模型是闭源基本模型,由持有大型专家团队和海量人工智能预算的机构持有。 它们一般比开源模型更大,因此呢拥有更好的性能,但它们亦有昂贵的 API。 专有模型供给商的示例包含 OpenAI、co:here、AI21 Labs 或 Anthropic。
大都数可用的 LangChain 教程都运用 OpenAI,但请重视,OpenAI API(针对实验来讲并不昂贵,但它)不是免费的。 要获取 OpenAI API 密钥,您必须一个 OpenAI 帐户,而后在 API 密钥下“创建新密钥”。 import os
os.environ["OPENAI_API_KEY"] = ... # insert your API_TOKEN here
开源模型一般是较小的模型,其功能比专有模型低,但它们比专有模型更具成本效益。 开源模型的示例有:
BLOOM 由 BigScience 供给
Meta AI 的 LLaMA
Google 的果馅饼 T5
Eleuther AI 的 GPT-J
许多开源模型都在 Hugging Face 上做为社区中心进行组织和托管。 要获取 Hugging Face API 密钥,您必须一个 Hugging Face 帐户并在拜访令牌下创建一个“新令牌”。 import os
os.environ["HUGGINGFACEHUB_API_TOKEN"] = ... # insert your API_TOKEN here
您可以避免费为开源LLM运用 Hugging Face,但您将仅限于性能较低的小型LLM。
个人说明 - 让咱们老实说:当然,您能够在这儿尝试开源基本模型。 我尝试仅运用 Hugging Face 上托管的开源模型(可经过常规帐户(google/flan-t5-xl 和句子转换器/all-MiniLM-L6-v2)运用本教程)。 它适用于大都数示例,但让某些示例发挥功效亦很痛苦。 最后,我扣动扳机并为 OpenAI 设置了一个付费帐户,由于 LangChain 的大都数示例似乎都针对 OpenAI 的 API 进行了优化。 为本教程运行有些实验总共花费了我大约 1 美元。
矢量数据库(可选)- 倘若您想运用特定的矢量数据库,例如 Pinecone、Weaviate 或 Milvus,您必须向她们注册以得到 API 密钥并检测其定价。 在本教程中,咱们运用 Faiss,它不必须注册。
工具(可选)- 按照您期盼 LLM 与之交互的工具(例如 OpenWeatherMap 或 SerpAPI),您可能必须向它们注册以得到 API 密钥并检测其定价。 在本教程中,咱们仅运用不必须 API 密钥的工具。
LangChain能够做什么?
该包为许多基本模型供给了通用接口,支持提示管理,并经过代理充当其他组件(如提示模板、其他 LLM、外边数据和其他工具)的中央接口。
截止撰写本文时,LangChain(版本0.0.147)涵盖六个模块:
模型:从区别的法学硕士和嵌入模型中进行选取
提示:管理 LLM 输入
链:将LLM与其他组件相结合
索引:拜访外边数据
记忆:记住以前的对话
代理:拜访其他工具
以下部分的代码示例是从 LangChain 文档中复制和修改的。
模型:从区别的LLM和嵌入模型中进行选取
日前,许多区别的法学硕士正在涌现。 LangChain 供给了与多种模型的集成以及所有模型的简化界面。
LangChain 区分了三种类型的模型,它们的输入和输出有所区别:
LLM 将字符串做为输入(提示)并输出字符串(完成)。 # Proprietary LLM from e.g. OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# Alternatively, open-source LLM hosted on Hugging Face
# pip install huggingface_hub
fromlangchainimport HuggingFaceHub
llm = HuggingFaceHub(repo_id = "google/flan-t5-xl")
# The LLM takes a prompt as an input and outputs a completion
prompt = "Alice has a parrot. What animal is Alices pet?"
completion = llm(prompt)聊天模型与LLM类似。 她们将聊天信息列表做为输入并返回聊天信息。
文本嵌入模型接受文本输入并返回浮点数(嵌入)列表,它们是输入文本的数字暗示形式。 嵌入有助于从文本中提取信息。 而后能够稍后运用该信息,例如,用于计算文本之间的类似性(例如,电影摘要)。 # Proprietary text embedding model from e.g. OpenAI
# pip install tiktoken
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# Alternatively, open-source text embedding model hosted on Hugging Face
# pip install sentence_transformers
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name = "sentence-transformers/all-MiniLM-L6-v2")
# The embeddings model takes a text as an input and outputs a list of floats
text = "Alice has a parrot. What animal is Alices pet?"
text_embedding = embeddings.embed_query(text)
提示:管理 LLM 输入
LLM 有奇怪的 API。 尽管用自然语言向法学硕士输入提示应该很直观,但必须对提示进行海量调节才可从法学硕士得到所需的输出。 这个过程叫作为即时工程。
一旦有了好的提示,您可能想将其用作其他目的的模板。 因此呢,LangChain 为您供给了所说的 PromptTemplates,它能够帮忙您从多个组件构建提示。 from langchain import PromptTemplate
template = "What is a good name for a company that makes {product}?"prompt = PromptTemplate(
input_variables=["product"],
template=template,
)
prompt.format(product="colorful socks")以上提示能够被视为零样本问题设置,您期盼法学硕士接受足够关联数据的培训以供给令人满意的响应。
加强 LLM 输出的另一个技巧是在提示中添加有些示例,并使其作为少许问题设置。 from langchain import PromptTemplate, FewShotPromptTemplate
examples = [
{"word": "happy", "antonym": "sad"},
{"word": "tall", "antonym": "short"},
]
example_template = """
Word: {word}
Antonym: {antonym}\n
"""example_prompt = PromptTemplate(
input_variables=["word", "antonym"],
template=example_template,
)
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix="Give the antonym of every input",
suffix="Word: {input}\nAntonym:",
input_variables=["input"],
example_separator="\n",
)
few_shot_prompt.format(input="big")上面的代码将生成一个提示模板,并按照供给的示例和输入构成以下提示: Give the antonym of every input
Word: happy
Antonym: sad
Word: tall
Antonym: short
Word: big
Antonym:链:将LLM与其他组件相结合
LangChain中的链接简单地描述了将LLM与其他组件结合起来创建应用程序的过程。 有些例子是:
将 LLM 与提示模板相结合(请参阅本节)
经过将第一个 LLM 的输出做为第二个 LLM 的输入,按次序组合多个 LLM(请参阅本节)
将LLM与外边数据相结合,例如用于回答问题(参见索引)
将LLM与长时间记忆相结合,例如聊天记录(请参阅记忆)
在上一节中,咱们创建了一个提示模板。 当咱们想将其与 LLM 一块运用时,咱们能够运用 LLMChain,如下所示: from langchain.chains import LLMChain
chain = LLMChain(llm = llm,
prompt = prompt)
# Run the chain only specifying the input variable.chain.run("colorful socks")倘若咱们想运用第1个 LLM 的输出做为第二个 LLM 的输入,咱们能够运用 SimpleSequentialChain: from langchain.chains import LLMChain, SimpleSequentialChain
# Define the first chain as in the previous code example
# ...
# Create a second chain with a prompt template and an LLMsecond_prompt = PromptTemplate(
input_variables=["company_name"],
template="Write a catchphrase for the following company: {company_name}",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)# Combine the first and the second chain
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
# Run the chain specifying only the input variable for the first chain.
catchphrase = overall_chain.run("colorful socks")
索引:拜访外边数据
LLM的局限性之一是缺乏上下文信息(例如,拜访某些特定文档或电子邮件)。 您能够经过让LLM拜访特定的外边数据来处理这个问题。
为此,您首要必须运用文档加载器加载外边数据。 LangChain 为区别类型的文档供给了多种加载器,从 PDF 和电子邮件到网站和 YouTube 视频。
让咱们从 YouTube 视频加载有些外边数据。 倘若你想加载一个大文本文档并运用文本分割器分割它,能够参考官方文档。 # pip install youtube-transcript-api
# pip install pytube
from langchain.document_loaders importYoutubeLoader
loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
documents = loader.load()此刻您已准备好将外边数据做为文档运用,您能够运用矢量数据库(VectorStore)中的文本嵌入模型(请参阅模型)对其进行索引。 流行的载体数据库包含 Pinecone、Weaviate 和 Milvus。 在本文中,咱们运用 Faiss,由于它不必须 API 密钥。 # pip install faiss-cpu
from langchain.vectorstores import FAISS
# create the vectorestore to use as the index
db = FAISS.from_documents(documents, embeddings)您的文档(在本例中为视频)此刻做为嵌入存储在矢量存储中。
此刻您能够运用这些外边数据执行多种操作。 让咱们将它用于信息检索器的问答任务: from langchain.chains import RetrievalQA
retriever = db.as_retriever()
qa = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True)
query = "What am I never going to do?"
result = qa({"query": query})
print(result[result])
RetrievalQA 的输出
等一下——你刚才被滚了吗? 是的,你做到了。
记忆:记住以前的对话
针对聊天设备人等应用程序来讲,它们能够记住之前的对话至关重要。 但默认状况下,LLM无任何长时间记忆,除非你输入聊天记录。
LangChain 经过供给几种区别的选项来处理聊天记录来处理这个问题:
保存所有对话,
保存最新的k条对话,
总结谈话内容。
这里示例中,咱们将运用 ConversationChain 为该应用程序供给会话内存。 from langchain import ConversationChain
conversation = ConversationChain(llm=llm, verbose=True)
conversation.predict(input="Alice has a parrot.")
conversation.predict(input="Bob has two cats.")
conversation.predict(input="How many pets do Alice and Bob have?")这将引起上图中右侧的对话。 倘若无 ConversationChain 来保留对话记忆,对话将类似于上图左侧的对话。
代理:拜访其他工具
尽管LLM非常强大,但亦有有些局限性:它们缺乏上下文信息(例如,没法拜访训练数据中未包括的特定知识),它们可能火速就会过时(例如,GPT-4 在 2021 年 9 月之前接受过数据训练),并且它们可能会火速过时。 数学欠好。
因为LLM可能会幻想自己没法完成的任务,因此呢咱们必须为她们供给弥补工具,例如搜索(例如 Google 搜索)、计算器(例如 Python REPL 或 Wolfram Alpha)和查询(例如, 维基百科)。
另外,咱们必须代理按照LLM的输出来决定运用那些工具来完成任务。
请重视,某些法学硕士(例如 google/flan-t5-xl)不适合以下示例,由于它们不遵循 conversational-react-description 模板。 对我来讲,这便是我在 OpenAI 上设置付费帐户并切换到 OpenAI API 的时刻。
下面是一个例子,代理首先在维基百科上查询巴拉克·奥巴马的出生日期,而后用计算器计算出他在 2022 年的年龄。 # pip install wikipedia
from langchain.agents import load_tools
from langchain.agents import initialize_agent
fromlangchain.agentsimport AgentType
tools = load_tools(["wikipedia", "llm-math"], llm=llm)
agent = initialize_agent(tools,
llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True)
agent.run("When was Barack Obama born? How old was he in 2022?")
概括
就在几个月前,咱们所有人(或最少咱们大都数人)都对 ChatGPT 的功能印象深刻。 此刻,像 LangChain 这般的新研发工具使咱们能够在几个小时内在笔记本电脑上构建一样令人印象深刻的原型 - 这是有些真正令人兴奋的时刻!
LangChain 是一个开源 Python 库,任何人都能够编写代码来构建由 LLM 驱动的应用程序。 该包为许多基本模型供给了通用接口,支持提示管理,并充当其他组件(如提示模板、其他 LLM、外边数据和经过代理的其他工具)的中央接口(在撰写本文时)。
该库供给的功能比本文说到的要多得多。 以日前的发展速度,这篇文案亦可能在一月内就过时了。
|