跳至主要内容

如何使用 LangChain 构建 LLM 应用(教程)

借助 LangChain(用于构建高级 AI 应用的开源 Python 框架),探索大型语言模型的潜力。
· 12分钟 阅读

使用 AI 探索

大型语言模型(LLM),如 OpenAI 的 GPT-3、Google 的 BERT 和 Meta 的 LLaMA,正在通过生成多种类型的文本(从营销内容、数据科学代码到诗歌)来重塑各行各业。尽管 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 及其如何提升您的创造力,请查看我们的博客如何使用生成式 AI 提升创造力以及播客走进生成式 AI 革命。您也可以报名我们的即将上线课程:大型语言模型概念。

LangChain 简介

LangChain 是一个开源框架,旨在简化由大型语言模型(LLM)驱动的应用的开发。它提供一套工具、组件和接口,帮助更轻松地构建以 LLM 为中心的应用。借助 LangChain,您可以轻松管理与语言模型的交互、顺畅连接不同组件,并集成 API、数据库等资源。您可以在另一篇文章中阅读更多关于面向数据工程与数据应用的 LangChain 入门。

LangChain 平台包含一组可供开发者嵌入到其应用中的 API,使其无需从零开始即可赋予应用语言处理能力。因此,LangChain 高效地简化了基于 LLM 的应用构建过程,适用于不同经验水平的开发者。

聊天机器人、虚拟助理、机器翻译工具、情感分析工具等,都是由 LLM 驱动的应用实例。开发者利用 LangChain 创建定制的语言模型应用,以满足特定需求。

随着自然语言处理的不断进步和更广泛的普及,这项技术的潜在应用将几乎无限。以下是 LangChain 的几个显著特性:

1. 可根据特定需求定制的提示词

2. 构建可串联的组件以应对高级用例

3. 集成模型进行数据增强,并访问一流的语言模型能力,如 GPT 和 HuggingFace Hub

4. 组件多样,可按需自由组合

5. 操控上下文,以建立并引导上下文,从而提升准确性与用户满意度

在 Python 中设置 LangChain

在 Python 中安装 LangChain 非常简单。您可以使用 pip 或 conda。

使用 pip 安装

pip install langchain

使用 conda 安装

install langchain -c conda-forge

这将完成 LangChain 的基本配置。LangChain 的很多价值在于它与各类模型提供商、数据存储等的集成。

默认情况下,这些集成所需的依赖并不会随安装一同包含。要安装所有依赖,您可以运行以下命令:

pip install langchain[all]

最后一种方式是从源码构建该库。在这种情况下,您可以从其GitHub 仓库克隆项目。

环境配置

使用 LangChain 通常需要与不同的模型提供商、数据存储、API 等进行集成。与任何集成一样,我们必须提供合适且相关的 API 密钥,LangChain 才能正常工作。实现这一点有两种方式:

1. 将密钥设置为环境变量

OPENAI_API_KEY="..."

如果您不想设置环境变量,也可以在初始化 OpenAI LLM 类时,通过名为 openai_api_key 的参数直接传入密钥:

2. 在相关类中直接设置密钥

from langchain.llms import OpenAI

llm = OpenAI(openai_api_key="...")

LangChain 的关键组件

LangChain 的突出之处在于其对灵活性和模块化的强调。它将自然语言处理流水线拆解为独立组件,使开发者能够按需定制工作流。这种适应性使 LangChain 成为在各类场景和行业中构建 AI 应用的理想选择。

组件与链

在 LangChain 中,组件是执行语言处理流水线中特定功能的模块。这些组件可以链接成“链”,以构建定制工作流,例如用于客户服务的聊天机器人链,可包含情感分析、意图识别和响应生成等模块。

提示模板

提示模板是在多条链之间可复用的预定义提示。通过插入特定“值”,这些模板可以变得动态且可适配。例如,询问用户姓名的提示可以通过插入具体值实现个性化。该特性对于基于动态资源生成提示非常有用。

向量存储

用于通过嵌入来存储与检索信息,本质上是分析文档语义的数值表示。VectorStore 作为这些嵌入的存储设施,支持基于语义相似度的高效检索。

索引与检索器

索引类似于数据库,存储模型训练数据的细节与元数据;检索器可快速在该索引中搜索特定信息。通过提供上下文和相关信息,这能改进模型的回应质量。

输出解析器

输出解析器用于管理与优化模型生成的响应。它们可以去除不需要的内容、定制输出格式,或为响应补充额外数据。由此,输出解析器有助于从语言模型的响应中提取结构化结果,如 JSON 对象。

示例选择器

LangChain 中的示例选择器用于从模型训练数据中识别合适的示例,从而提高生成响应的准确性和相关性。可以调节这些选择器以偏好某些类型的示例,或过滤无关示例,从而基于用户输入提供更契合的 AI 回答。

智能体

智能体是独特的 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"))

输出:

>>> "What do you get when you tinker with data? A data scientist!"

在上述示例中,我们使用的是 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"))

您可以在自己的 HF 账户中获取 Hugging Face Hub 的令牌 ID。

如果您有多个提示词,可以使用 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 获取理想的输出。这个调整过程称为提示工程。一旦您有了一个良好的提示,可能会希望将其作为模板在其他场景复用。

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)}")

输出:

1. Climb the Eiffel Tower and take in the breathtaking views of the city

2. Enjoy a romantic cruise along the River Seine and admire the beautiful architecture along the riverbanks

3. Explore the Louvre and admire the world-renowned works of art on display

如果您现在想将该提示复用于另一个城市,您只需更改 USER_INPUT 变量。我已将其从 Paris 改为 Cancun, Mexico。请看输出如何变化:

输出:

1. Relax on the Beach: Enjoy the white sand beaches and crystal-clear waters of the Caribbean Sea.

2. Explore the Mayan Ruins: Visit ancient archaeological sites such as Chichen Itza, Tulum, and Coba to learn about the history and culture of the Mayans.

3. Take a Food Tour: Taste the traditional flavors and learn about the local cuisine by taking a food tour of Cancun.

在多步工作流中组合 LLM 与提示

在 LangChain 语境中,链指的是将 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)

# first step in chain

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 step in chain

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)

# Combine the first and the second chain

overall_chain = SimpleSequentialChain(chains=[chain_one, chain_two], verbose=True)

final_answer = overall_chain.run("Canada")

输出:

在这个示例中,我们创建了一个包含两个组件的链。第一个组件负责根据用户输入的国家识别最受游客欢迎的城市;第二个组件则提供该城市面向游客的三项热门活动或景点信息。

如果您想进一步学习在 LangChain 中构建应用的高级概念,请查看 DataCamp 的直播课程:使用 LangChain 和 GPT 构建 AI 应用。

结语与延伸学习

就在不久之前,ChatGPT 的惊人能力让我们叹为观止。而如今,形势快速演进,我们已能使用 LangChain 等新的开发者工具,只需数小时,便可在个人电脑上打造同样令人惊艳的原型。

LangChain 是一个开源 Python 框架,使个人能够创建由 LLM(大型语言模型)驱动的应用。该框架提供了对众多基础模型的通用接口,便于管理提示,并(在撰写时)通过智能体将提示模板、其他 LLM、外部数据和其他工具整合在一起,充当这些组件的中枢。

如果您希望跟上生成式 AI 与 LLM 的最新进展,请查看我们的网络研讨会:使用 LangChain 和 GPT 构建 AI 应用。您将在此学习使用 LangChain 开发 AI 应用的基础知识、如何构建 AI 应用的整体结构,以及如何嵌入文本数据以获得高性能。您还可以查看我们的生成式 AI 工具版图速查表,了解不同类别的生成式 AI 工具、其应用及在各行业的影响。最后,欢迎查看我们的顶级开源 LLM 清单,了解更多强大的工具。

Moez Ali

作者

Moez Ali

数据科学家,PyCaret 的创始人兼作者

常见问题

什么是 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 应用。

主题