像 OpenAI 的 GPT-3、Google 的 BERT 和 Meta 的 LLaMA 这样的大型语言模型(Large Language Models, LLM)通过生成从市场营销文案、数据科学代码到诗歌等多样化文本,正在改变着各个行业。尽管 ChatGPT 因其用户友好的聊天界面而备受关注,但通过将 LLM 集成到不同的软件应用中,仍有大量未被发掘的潜力。
如果您对生成式 AI 和 LLM 的变革力量充满好奇,本教程将是您的不二之选。在这里,我们将探索 LangChain——一个用于构建基于大型语言模型(如 GPT)应用的开源 Python 框架。
提示
想要深入了解使用 LangChain 构建 AI 应用?可以参加我们的 使用 LangChain 和 OpenAI API 构建多模态 AI 应用 编程实战,您将学习如何使用 Whisper 语音转文本 AI 来转录 YouTube 视频内容,然后使用 GPT 对内容进行提问。
什么是大语言模型(LLM)?
大型语言模型(LLM)是指为理解和生成类人文本而设计的高级人工智能系统。这些模型在海量数据上进行训练,使其能够掌握复杂的模式、理解语言的细微差别并生成连贯的回应。LLM 能够执行各种与语言相关的任务,包括语言翻译、文本补全、摘要生成,甚至参与对话式交互。GPT 就是 LLM 的一个例子。
LLM 是生成式 AI 的一种。如果您想了解更多关于生成式 AI 的知识,可以参考我们的相关文章和播客。
LangChain 简介
LangChain 是一个开源框架,旨在简化由大型语言模型(LLM)驱动的应用程序开发。它提供了一套工具、组件和接口,极大地简化了构建以 LLM 为核心的应用的过程。借助 LangChain,开发者可以轻松地管理与语言模型的交互,无缝地连接不同组件,并整合 API 和数据库等资源。
LangChain 平台附带一系列 API,开发者可以将其嵌入到自己的应用中,从而无需从头开始构建所有内容即可赋予应用强大的语言处理能力。因此,LangChain 有效地简化了构建基于 LLM 的应用流程,使其适用于不同专业水平的开发者。
聊天机器人、虚拟助手、语言翻译工具和情感分析工具等都是由 LLM 驱动的应用实例。开发者利用 LangChain 可以创建满足特定需求的定制化语言模型应用。
随着自然语言处理技术的不断进步和广泛应用,这项技术的潜在应用几乎是无限的。以下是 LangChain 的几个显著特点:
- 可定制的提示:根据您的具体需求量身定制提示。
- 构建链式组件:为高级应用场景链接各个组件。
- 模型集成:用于数据增强,并可接入如 GPT 和 HuggingFace Hub 等顶级语言模型。
- 多功能组件:允许根据特定需求混合和匹配组件。
- 上下文管理:建立和引导上下文,以提高精确度和用户满意度。
在 Python 中设置 LangChain
在 Python 中安装 LangChain 非常简单,您可以使用 pip 或 conda 进行安装。
使用 pip 安装
pip install langchain
使用 conda 安装
conda install langchain -c conda-forge
这将安装 LangChain 的基本依赖。当 LangChain 与不同的模型提供商、数据存储等集成时,其大部分功能才能得以体现。默认情况下,这些集成所需的依赖项不包含在基础安装中。要安装所有依赖项,可以运行以下命令:
pip install langchain[all]
您也可以选择从源码构建库,从其 GitHub 仓库 克隆项目即可。
环境设置
使用 LangChain 通常需要与各种模型提供商、数据存储、API 等进行集成。与任何集成一样,我们必须提供相应且有效的 API 密钥,LangChain 才能正常工作。有两种方法可以实现:
1. 将密钥设置为环境变量
export OPENAI_API_KEY="..."
2. 在代码中直接设置
如果您不想设置环境变量,可以在初始化 OpenAI LLM 类时,通过 openai_api_key 命名参数直接传入密钥:
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")
LangChain 的核心组件
LangChain 因其强调灵活性和模块化而脱颖而出。它将自然语言处理流程分解为独立的组件,使开发者能够根据需要定制工作流。这种适应性使得 LangChain 成为构建跨越各种场景和行业的 AI 应用的理想选择。
组件与链 (Chains)
在 LangChain 中,组件是执行语言处理流程中特定功能的模块。这些组件可以连接成“链”(Chains),以创建定制化的工作流,例如一个包含情感分析、意图识别和响应生成模块的客户服务聊天机器人链。
提示模板 (Prompt Templates)
提示模板是可在多个链中重复使用的预定义提示。通过插入特定的“值”,这些模板可以变得动态和自适应。例如,一个询问用户姓名的提示可以通过插入具体值进行个性化。此功能对于根据动态资源生成提示非常有用。
向量存储 (Vector Stores)
向量存储用于通过嵌入(embeddings)来存储和搜索信息,嵌入本质上是文档意义的数值表示。VectorStore 作为这些嵌入的存储设施,允许基于语义相似性进行高效搜索。
索引与检索器 (Indexes and Retrievers)
索引(Indexes)充当数据库,存储模型训练数据的详细信息和元数据,而检索器(Retrievers)则可以快速搜索此索引以获取特定信息。这通过提供上下文和相关信息来改善模型的响应。
输出解析器 (Output Parsers)
输出解析器(Output parsers)用于管理和优化模型生成的响应。它们可以消除不需要的内容、定制输出格式或为响应补充额外数据。因此,输出解析器有助于从语言模型的响应中提取结构化结果,如 JSON 对象。
示例选择器 (Example Selectors)
LangChain 中的示例选择器用于从模型的训练数据中识别合适的实例,从而提高生成响应的准确性和相关性。可以调整这些选择器以偏好某些类型的示例或过滤掉不相关的示例,从而根据用户输入提供量身定制的 AI 响应。
代理 (Agents)
代理(Agents)是独特的 LangChain 实例,每个实例都具有针对特定用例的提示、内存和链。它们可以部署在各种平台上,包括 Web、移动设备和聊天机器人,以服务于广泛的受众。
如何使用 LangChain 构建语言模型应用
LangChain 提供了一个 LLM 类,旨在与各种语言模型提供商(如 OpenAI、Cohere 和 Hugging Face)进行交互。LLM 最基本的功能是生成文本。使用 LangChain 构建一个接收字符串提示并返回输出的应用非常直接。
API_KEY = "..."
from langchain.llms import OpenAI
llm = OpenAI(model_name="text-ada-001", openai_api_key=API_KEY)
print(llm("Tell me a joke about data scientist"))
输出:
Why did the data scientist break up with the statistician?
Because he felt like he was being treated like a p-value.
在上面的示例中,我们使用了 OpenAI 的 text-ada-001 模型。如果您想换成 HuggingFace 的任何开源模型,只需简单修改即可:
API_KEY = "..."
from langchain import HuggingFaceHub
llm = HuggingFaceHub(repo_id = "google/flan-t5-xl", huggingfacehub_api_token = API_KEY)
print(llm("Tell me a joke about data scientist"))
你可以从你的 Hugging Face 账户中获取
huggingfacehub_api_token。
如果你有多个提示,可以使用 generate 方法一次性发送一个提示列表:
llm_response = llm.generate(['Tell me a joke about data scientist',
'Tell me a joke about recruiter',
'Tell me a joke about psychologist'])
输出:

这是使用 LangChain 可以创建的最简单的应用。它接收一个提示,发送给你选择的语言模型,并返回答案。你可以控制许多参数,例如 temperature。temperature 参数调整输出的随机性,默认设置为 0.7。
在 LangChain 中管理 LLM 的提示模板
LLM 的 API 很独特。虽然直接用自然语言输入提示看起来很直观,但实际上需要对提示进行一些调整才能从 LLM 获得期望的输出。这个调整过程被称为提示工程 (prompt engineering)。一旦你有了一个好的提示,你可能想把它用作其他用途的模板。
LangChain 中的 PromptTemplate 允许你使用模板来生成提示。当你想在多个地方使用相同的提示结构但更改某些特定值时,这非常有用。
USER_INPUT = 'Paris'
from langchain.llms import OpenAI
from langchain import PromptTemplate
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
template = """ I am travelling to {location}. What are the top 3 things I can do while I am there. Be very specific and respond as three bullet points """
prompt = PromptTemplate(
input_variables=["location"],
template=template,
)
final_prompt = prompt.format(location=USER_INPUT)
print(f"LLM Output: {llm(final_prompt)}")
输出:
* Visit the Eiffel Tower: Take in the breathtaking views of the city from the top of the iconic Eiffel Tower. Be sure to book your tickets in advance to avoid long queues.
* Explore the Louvre Museum: Home to some of the world's most famous works of art, including the Mona Lisa, the Louvre is a must-see for any art lover.
* Take a stroll along the Seine River: Enjoy a leisurely walk along the picturesque Seine River, taking in the sights of the city's beautiful bridges and architecture.
现在如果你想为另一个城市重用这个提示,你只需要改变 USER_INPUT 变量。我已经把它从 Paris 改成了 Cancun, Mexico。看看输出是如何变化的:
输出:
* Explore the ancient Mayan ruins of Chichen Itza, a UNESCO World Heritage Site, and marvel at the iconic El Castillo pyramid.
* Relax on the stunning white-sand beaches of the Hotel Zone, swim in the turquoise Caribbean Sea, and soak up the tropical sun.
* Take a day trip to the nearby island of Isla Mujeres, where you can snorkel or dive in the vibrant coral reefs, visit a sea turtle sanctuary, and enjoy the laid-back island atmosphere.
在多步工作流中组合 LLM 和提示(Chains)
在 LangChain 的语境中,链 (Chaining) 指的是将 LLM 与其他元素集成以构建应用程序的行为。一些例子包括:
- 通过将第一个 LLM 的输出用作第二个 LLM 的输入,顺序组合多个 LLM。
- 将 LLM 与提示模板集成。
- 将 LLM 与外部数据(如用于问答)合并。
- 将 LLM 与长期记忆(如聊天记录)结合。
让我们看一个第一种情况的例子,我们将使用第一个 LLM 的输出作为第二个 LLM 的输入。
from langchain.llms import OpenAI
from langchain.chains import LLMChain, SimpleSequentialChain
from langchain import PromptTemplate
llm = OpenAI(model_name="text-davinci-003", openai_api_key=API_KEY)
# 链中的第一步
template = "What is the most popular city in {country} for tourists? Just return the name of the city"
first_prompt = PromptTemplate(
input_variables=["country"],
template=template
)
chain_one = LLMChain(llm=llm, prompt=first_prompt)
# 链中的第二步
second_prompt = PromptTemplate(
input_variables=["city"],
template="What are the top three things to do in this: {city} for tourists. Just return the answer as three bullet points.",
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 合并第一和第二链
overall_chain = SimpleSequentialChain(chains=[chain_one, chain_two], verbose=True)
final_answer = overall_chain.run("Canada")
输出:

在这个特定的例子中,我们创建了一个包含两个组件的链。第一个组件负责识别用户输入的特定国家最受游客欢迎的城市。而第二个组件则专注于提供访问该特定城市的游客可以做的三件最热门的事情或景点的信息。
总结与进阶学习
不久前,我们都对 ChatGPT 的强大功能印象深刻。然而,技术格局已迅速演变,现在我们拥有像 LangChain 这样的新开发者工具,使我们能够在几个小时内在个人笔记本电脑上创建同样出色的原型。
LangChain 是一个开源 Python 框架,使个人能够创建由 LLM 驱动的应用程序。该框架为众多基础模型提供了通用的接口,简化了提示管理,并作为其他组件(如提示模板、其他 LLM、外部数据和通过代理(agents)实现的其他工具)的中心枢纽。
如果你想跟上生成式 AI 和 LLM 的所有进展,可以查看我们关于使用 LangChain 和 GPT 构建 AI 应用的网络研讨会。在这里,你将学习使用 LangChain 开发 AI 应用的基础知识,以及如何构建 AI 应用和嵌入文本数据以实现高性能。
常见问题 (FAQ)
什么是 LangChain?
LangChain 是一个开源框架,旨在促进由大型语言模型(LLM)驱动的应用开发。它通过提供工具、组件和接口来简化以 LLM 为核心的应用构建。
LangChain 是免费的吗?
是的,LangChain 是一个免费的开源框架,但使用某些 LLM 可能需要订阅。
LangChain 能否与不同的模型提供商合作?
是的,LangChain 与 OpenAI、Cohere 和 Hugging Face 等多家语言模型提供商兼容,为应用开发提供了灵活性。
如何将 LangChain 与 OpenAI 模型一起使用?
安装 LangChain 后,你可以通过设置你的 OpenAI API 密钥并使用提供的接口与模型进行交互,从而将其与 OpenAI 模型集成。
如何在 LangChain 中管理提示模板?
LangChain 使用 PromptTemplate 来管理提示模板,从而实现动态和可复用的提示,可以通过更改输入变量来为特定用例量身定制。
LangChain 中的“链(Chaining)”是什么?
“链”指的是将 LLM 与其他元素集成以构建应用程序,例如顺序组合多个 LLM、将 LLM 与提示模板集成或合并外部数据。
LangChain 能处理来自各种来源的文档数据吗?
是的,LangChain 支持用于多种数据源的文档加载器,包括文本、CSV、PDF 文件以及像 Slack 和 Figma 这样的平台,以便整合到 LLM 应用中。
关于
关注我获取更多资讯