技术点滴 · 2024年5月3日 0

使用 LangChain 构建 LLM 应用程序

OpenAI 的 GPT-3、Google 的 BERT 和 Meta 的 LLaMA 等大型语言模型 (LLM) 的功能正在改变各个行业,因为它们能够生成各种类型的文本,从营销内容和数据科学代码到诗歌。尽管 ChatGPT 因其用户友好的聊天界面而备受关注,但通过将 LLM 集成到不同的软件应用程序中,仍存在许多尚未开发的可能性。在本文中您可以了解有关使用 LangChain 构建 AI 应用程序的更多信息,您将在其中了解如何使用 Whisper 语音到文本 AI 转录 YouTube 视频内容,然后使用 GPT 询问有关内容的问题。

什么是大型语言模型 (LLM)?

大型语言模型 (LLM) 是指旨在理解和生成类似人类的文本的高级人工智能系统。这些模型经过大量数据的训练,使其能够掌握复杂的模式、理解语言的细微差别并生成连贯的响应。LLM 能够执行各种与语言相关的任务,包括语言翻译、文本完成、摘要,甚至参与对话互动。GPT 就是 LLM 的一个例子。

LangChain简介

LangChain 是一个开源框架,旨在促进由大型语言模型 (LLM) 支持的应用程序的开发。它提供了一套工具、组件和接口,简化了以 LLM 为中心的应用程序的构建。使用 LangChain,可以轻松管理与语言模型的交互、无缝链接不同的组件以及整合 API 和数据库等资源。 

LangChain 平台附带一系列 API,开发人员可以将其嵌入到他们的应用程序中,使他们能够注入语言处理功能,而无需从头开始构建一切。因此,LangChain 有效地简化了基于 LLM 的应用程序的编写过程,使其适合各个专业领域的开发人员。

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

随着自然语言处理的不断进步和广泛应用,这项技术的潜在应用预计将是无限的。以下是 LangChain 的几个值得注意的特点:

1. 可定制提示,满足您的特定要求

2. 构建链式组件,用于高级使用场景

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

4. 多功能组件,可根据特定需求进行混合搭配

5. 操纵情境来建立和引导情境,以提高准确率和用户满意度

使用 Python 设置 LangChain

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

安装 LangChain

使用 pip 安装

pip install langchain

使用 conda 安装

install langchain -c conda-forge

这将设置 LangChain 的基本组件。LangChain 的大部分实用性是在与各种模型提供商、数据存储等集成时实现的。

默认情况下,这些集成所需的依赖项不包含在安装中。要安装所有依赖项,您可以运行以下命令:

pip install langchain[all]

最后一种选择是从源代码构建库。在这种情况下,你可以从其GitHub repo克隆该项目。

环境设置

使用 LangChain 通常需要与各种模型提供程序、数据存储、API 和类似组件集成。与任何集成一样,我们必须提供适当且相关的 API 密钥才能使 LangChain 正常运行。有两种方法可以实现这一点:

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

OPENAI_API_KEY="..."

如果您不想设置环境变量,您可以在启动 OpenAI LLM 类时直接通过 openai_api_key 命名参数传入密钥:

2.直接在相关类中设置key

from langchain.llms import OpenAI

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

LangChain 的关键组件

LangChain 的突出之处在于其对灵活性和模块化的重视。它将自然语言处理流程分解为单独的组件,使开发人员能够根据自己的需求定制工作流程。这种适应性使 LangChain 成为构建跨各种场景和行业的 AI 应用程序的理想选择。

组件(Component)和链(Chain)

在 LangChain 中,组件是语言处理管道中执行特定功能的模块。这些组件可以链接成“链”,以实现定制的工作流程,例如带有情绪分析、意图识别和响应生成模块的客户服务聊天机器人链。

提示模板 (prompt template)

提示模板是跨链可重复使用的预定义提示。这些模板可以通过插入特定“值”而变得动态且具有适应性。例如,询问用户姓名的提示可以通过插入特定值来个性化。此功能有利于根据动态资源生成提示。

向量存储(vector store)

它们用于通过嵌入来存储和搜索信息,本质上是分析文档含义的数字表示。VectorStore 用作这些嵌入的存储设施,允许基于语义相似性进行高效搜索。

索引(indexes)和检索器(retrievers)

索引充当数据库,存储有关模型训练数据的详细信息和元数据,而检索器则快速搜索此索引以获取特定信息。通过提供上下文和相关信息,这可以改善模型的响应。

输出解析器(output parsers)

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

示例选择器(example selectors)

LangChain 中的示例选择器用于从模型的训练数据中识别合适的实例,从而提高生成响应的准确性和针对性。这些选择器可以调整为偏向某些类型的示例或过滤掉不相关的示例,从而根据用户输入提供量身定制的 AI 响应。

代理(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"))

输出

>>> "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 中心令牌 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 中的APromptTemplate允许您使用模板来生成提示。当您想在多个地方使用相同的提示大纲但更改某些值时,这很有用。

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

输出

在这个特定的例子中,我们创建了一个包含两个组件的链。第一个组件负责识别用户输入的特定国家/地区对应的最受欢迎的城市。相比之下,第二个组件则专注于提供有关前往该特定城市的游客可参加的前三项活动或景点的信息。

结论和进一步学习

不久前,ChatGPT 的强大功能还给我们留下了深刻印象。然而,形势已迅速发生变化,现在我们可以使用 LangChain 等新开发工具,只需几个小时,我们便可以在个人笔记本电脑上创建同样出色的原型。

LangChain 是一个开源 Python 框架,它使个人能够创建由 LLM(语言模型模型)驱动的应用程序。该框架为众多基础模型提供了多功能接口,促进了提示管理,并通过代理充当其他组件(如提示模板、其他 LLM、外部数据和其他工具)的中央枢纽(撰写本文时)。