自从ChatGPT发布以来,大语言模型(LLM)得到极大普及。虽然大多数人没有足够资金和计算资源从头开始训练LLM,但仍然可以基于预训练的LLM来构建一些很酷的东西,例如:
- 可以根据个人数据与外界互动的个人助理
- 为特定目的定制的聊天机器人
- 对文档或代码进行分析或总结
LLM正在改变构建人工智能产品的方式
凭借其奇怪的API和提示工程,LLM正在改变我们构建人工智能产品的方式。这就是为什么出现大量冠以"LLMOps"名义的新开发工具的原因。
其中一个新工具就是LangChain。
什么是LangChain?
LangChain是一个帮助我们轻松构建LLM驱动的应用程序的框架,提供以下功能:
- 各种不同基础模型的通用接口
- 帮助管理提示的框架,以及
- 连接长期内存、外部数据、其他LLM,以及LLM无法处理的任务(例如,计算或搜索)的其他代理的中心化接口。
LangChain是由Harrison Chase创建的开源项目。
因为LangChain有很多不同功能,所以从头开始理解其功能可能会很有挑战性。这就是为什么我们将在本文中介绍LangChain(目前)的六个关键模块,从而帮助读者更好理解它的功能。
前提条件
要继续学习本教程,需要安装langchain
Python包并准备好使用所有相关API的密钥。
安装LangChain
在安装langchain
包之前,请确保Python版本≥3.8.1且<4.0。
可以通过pip
安装langchain
包。
bash
复制代码
pip install langchain
本文使用0.0.147版本,由于LangChainb的GitHub非常活跃,因此请确保安装当前版本。
完成所有设置后,导入langchain
Python包。
python
复制代码
import langchain
API密钥
基于LLM构建应用需要使用某些服务的API密钥,有些API是收费的。
LLM服务商(必需的) - 首先需要LLM服务商的API密钥。我们目前正在经历"人工智能的Linux时刻",开发人员必须在专有或开源基础模型之间做出选择,而这主要基于性能和成本的权衡。
专有模型是由拥有大型专家团队和大量AI预算的公司拥有的闭源基础模型,通常比开源模型大,因此具有更好的性能,但API开销也更昂贵。专有模型服务商有OpenAI、co:here、AI21 Labs或Anthropic。
大多数LangChain教程都使用OpenAI,但请注意,OpenAI API(用于实验目的并不太贵)不是免费的。要获得OpenAI API Key,需要创建OpenAI帐户,然后在API keys下单击"Create new secret Key"。
python
复制代码
import os
os.environ["OPENAI_API_KEY"] = ... # 设置API_TOKEN
开源模型通常比专有模型更小,功能更少,但比专有模型更具成本效益。开源模型有:
- BigScience的[BLOOM]huggingface.co/bigscience/…)
- Meta AI的LLaMA
- Google的Flan-T5
- Eleuther AI的GPT-J
许多开源模型被组织和托管在Hugging Face上,要获得Hugging Face API密钥,需要开通Hugging Face帐户并在Access Tokens下创建"New token"。
python
复制代码
import os
os.environ["HUGGINGFACEHUB_API_TOKEN"] = ... # 设置API_TOKEN
可以免费使用Hugging Face的开源LLM,但仅限于性能较差的小型LLM。
个人提示 —— 实话实话,我们当然可以尝试开源模型。我试图在本文里只使用托管在Hugging Face上的开源模型,并提供常规帐户(google/flan-t5-xl和sentence-transformers/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)涵盖了六个模块:
- 模型(Models): 从不同LLM和嵌入模型中选择
- 提示(Prompts): 管理LLM输入
- 链接(Chains): 将LLM与其他组件相结合
- 索引(Indexes): 访问外部数据
- 存储(Memory): 记住以前的对话
- 代理(Agents): 访问其他工具
下面几节中的代码示例是从LangChain文档中复制和修改的。
模型(Models): 从不同LLM和嵌入模型中选择
目前,许多不同的LLM正在兴起。LangChain提供了对各种模型的集成和简化界面。
LangChain区分了三种输入和输出不同的模型:
- LLM接受字符串作为输入(提示)并输出字符串(补全)。
python
复制代码
# 专有LLM,例如OpenAI
# pip install openai
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-davinci-003")
# 或者使用托管在Hugging Face上的开源LLM
# pip install huggingface_hub
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id = "google/flan-t5-xl")
# LLM以提示词作为输入并输出补全
prompt = "Alice has a parrot. What animal is Alice's pet?"
completion = llm(prompt)
- 聊天模型类似于LLM,将聊天消息列表作为输入并返回聊天消息。
- 文本嵌入模型接受文本输入并返回浮点数(嵌入)列表,浮点数是输入文本的数字表示形式。嵌入有助于从文本中提取信息,这些信息可以稍后使用,例如,用于计算文本之间的相似性(例如,电影摘要)。
python
复制代码
# 专有文本嵌入模型,例如OpenAI
# pip install tiktoken
from langchain.embeddings import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
# 或者使用托管在Hugging Face上的开源文本嵌入模型
# pip install sentence_transformers
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(model_name = "sentence-transformers/all-MiniLM-L6-v2")
# 文本嵌入模型以文本作为输入,输出浮点数列表
text = "Alice has a parrot. What animal is Alice's pet?"
text_embedding = embeddings.embed_query(text)
提示(Prompts): 管理LLM输入
LLM的API很奇怪,虽然用自然语言向LLM输入提示感觉很直观,但需要对提示进行相当多的调整,直到从LLM获得所需输出。这个过程被称为提示工程。
有了好的提示后,可能希望将其用作其他用途的模板。因此,LangChain提供了所谓的PromptTemplates
,帮助我们从多个组件构造提示。
python
复制代码
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")
上面的提示可以看作是一个零样本问题设置(zero-shot problem setting) ,我们希望LLM在足够的相关数据上进行了训练,以提供令人满意的响应。
改进LLM输出的另一个技巧是在提示中添加一些示例,使其成为多样本问题设置(few-shot problem setting) 。
python
复制代码
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")
以上代码将生成一个提示模板,并根据提供的示例和输入组成以下提示:
vbnet
复制代码
Give the antonym of every input
Word: happy
Antonym: sad
Word: tall
Antonym: short
Word: big
Antonym:
链接(Chains): 将LLM与其他组件相结合
LangChain中的链接简单描述了将LLM与其他组件组合在一起创建应用的过程。例如:
- 结合LLM和提示模板(参见本节)
- 通过将第一个LLM的输出作为第二个LLM的输入,顺序组合多个LLM(参见本节)
- 将LLM与外部数据相结合,例如用于问答(参见索引章节)
- 将LLM与长期存储相结合,例如用于聊天记录(参见存储章节)
前一节创建了一个提示模板,当我们想在LLM中使用时,可以使用LLMChain
,如下所示:
python
复制代码
from langchain.chains import LLMChain
chain = LLMChain(llm = llm,
prompt = prompt)
# 通过输入特定参数执行该链
chain.run("colorful socks")
如果我们想使用第一个LLM的输出作为第二个LLM的输入,可以使用SimpleSequentialChain
:
python
复制代码
from langchain.chains import LLMChain, SimpleSequentialChain
# 像前面的代码示例一样定义第一个链
# ...
# 基于提示词模板和LLM创建第二个链
second_prompt = PromptTemplate(
input_variables=["company_name"],
template="Write a catchphrase for the following company: {company_name}",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 结合第一和第二链
overall_chain = SimpleSequentialChain(chains=[chain, chain_two], verbose=True)
# 只指定第一个链的输入并运行该链。
catchphrase = overall_chain.run("colorful socks")
索引(Indexes): 访问外部数据
LLM的一个限制是缺乏上下文信息(例如访问特定文档或电子邮件),可以通过允许LLM访问特定外部数据来解决这个问题。
为此,首先需要使用文档加载器加载外部数据。LangChain为不同类型文档提供了各种加载器,从pdf和电子邮件到网站和YouTube视频不等。
我们从YouTube视频中加载一些外部数据。如果你想加载大型文本文档并使用Text Splitter来拆分,可以参考官方文档。
python
复制代码
# pip install youtube-transcript-api
# pip install pytube
from langchain.document_loaders import YoutubeLoader
loader = YoutubeLoader.from_youtube_url("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
documents = loader.load()
现在已经准备好了外部数据作为documents
,可以使用矢量数据库(VectorStore) 中的文本嵌入模型对其进行索引。流行的矢量数据库包括Pinecone、Weaviate和Milvus。本文使用Faiss,因为它不需要API密钥。
python
复制代码
# pip install faiss-cpu
from langchain.vectorstores import FAISS
# 创建矢量数据库作为索引
db = FAISS.from_documents(documents, embeddings)
文档(在本例中是视频)现在作为嵌入存储在矢量存储中。
现在可以用这些外部数据做很多事情,我们来做一个带有信息检索器的问答任务:
python
复制代码
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'])
等等,你是不是被忽悠了?是的,确实是。
存储(Memory): 记住以前的对话
对于像聊天机器人这样的应用来说,能够记住以前的对话至关重要。但默认情况下LLM没有任何长期记忆,除非显式输入聊天记录。
LangChain通过提供几个不同的选项来处理聊天记录,从而解决了这个问题:
- 保留所有对话,
- 保留最新的k次对话,
- 总结对话内容。
本例将使用ConversationChain
为应用提供会话存储。
python
复制代码
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
来保存会话记录,那么会话将看起来像上图中左侧的对话。
代理(Agents): 访问其他工具
LLM有强大的能力,但也有很多限制:缺乏上下文信息(例如训练数据没有覆盖的特定领域知识),信息会快速过时(例如GPT-4是基于2021年9月份之前的数据训练的),以及不擅长数学。
因为LLM可能会对自己无法完成的任务产生幻觉,所以需要使用辅助工具,例如搜索(例如,Google搜索)、计算器(例如,Python REPL或Wolfram Alpha)和查找(例如,Wikipedia)。
此外,需要代理根据LLM的输出决定使用哪些工具来完成任务。
请注意,某些LLM(如google/flan-t5-xl)不适合以下示例,因为它们不遵循对话-反应-描述模板,这就是我在OpenAI上建立付费账户并切换到OpenAI API的原因。
在下面的示例中,代理首先在维基百科上查找巴拉克·奥巴马的出生日期,然后用计算器计算出他在2022年的年龄。
python
复制代码
# pip install wikipedia
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import 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、外部数据以及支持代理的其他工具)的中心化接口。
该库提供了比本文提到的更多特性。以目前的发展速度,这篇文章也可能会很快过时。
在撰写本文时,我注意到库和文档都围绕OpenAI的API。虽然许多例子都使用开源模型google/flan-t5-xl,但我还是切换到了OpenAI API。尽管不是免费的,但本文中的OpenAI API实验只花了大约1美元。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓