在过去的几年里,大型语言模型(LLMs)以其强大的能力席卷了人工智能领域。
随着OpenAI在2020年发布了具有突破性意义的GPT-3,LLMs的受欢迎程度持续上升,并在近期的发展中更加加剧。
这些强大的AI模型为自然语言处理应用开辟了新的可能性,使开发人员能够创建更复杂、更接近人类的交互。
这难道不是令人兴奋的吗?
然而,当处理这种AI技术时,很难进行规模化和生成可靠的算法。
在这个快速发展的领域中,LangChain作为一个多用途的框架应运而生,旨在帮助开发人员充分利用LLMs在各种应用中的潜力。其中一个最重要的用例是处理大量的文本数据。
让我们深入了解并开始利用LLMs的力量吧!
LangChain可以用于聊天机器人、问答系统、摘要工具等等。然而,LangChain最有用、最常用的应用之一就是处理文本。
当今世界充斥着数据,其中最为众所周知的类型之一就是文本数据。
所有的网站和应用每天都被大量的文字轰炸。没有人可以处理这么多的信息…
但是计算机可以吗?
LLM技术与LangChain结合是减少文本量同时保持信息最重要部分的绝佳方式。这就是为什么今天我们将介绍LangChain处理文本的两个基本但非常有用的用例:摘要和提取。
- 摘要:表达文本或聊天交互的最重要事实。它可以减少数据量同时保持信息的重要部分。
- 提取:从文本或用户查询中提取结构化数据。它可以检测并提取文本中的关键词。
无论您是初次接触LLMs还是希望将语言生成项目提升到一个新的水平,本指南将为您提供有关LangChain处理文本的宝贵见解和实际示例。
⚠️ 如果您想基本了解一下,可以去查看👇🏻
LangChain 101: 构建您自己的GPT驱动应用 – VoAGI
请记住,要使用OpenAI和GPT模型,我们需要在本地计算机上安装OpenAI库并拥有有效的OpenAI密钥。如果您不知道如何做到这一点,可以点击此处查看。
1. 摘要
ChatGPT与LangChain结合起来可以快速而可靠地摘要信息。
LLM摘要技术是减少文本量同时保持信息最重要部分的绝佳方式。这就是为什么LLMs可以成为需要处理和分析大量文本数据的任何数字公司的最佳伙伴。
要执行以下示例,需要以下库:
# LangChain & LLM
from langchain.llms import OpenAI
from langchain import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter
#Wikipedia API
import wikipediaapi
1.1. 短文本摘要
对于短文本的摘要,方法非常简单,实际上,您不需要做任何花哨的事情,只需使用简单的提示即可。
这基本上意味着生成一个带有输入变量的模板。
我知道你可能会想…什么是prompt模板?
prompt模板指的是生成prompt的可复制的方式。它包含一个文本字符串-模板,可以从终端用户那里接收一组参数并生成一个prompt。
prompt模板包含:
- 给语言模型的指令 – 这样我们就可以为LLM标准化一些步骤。
- 一个输入变量 – 这样我们就可以将上述指令应用于任何输入文本。
让我们通过一个简单的例子来看看这个过程。我可以标准化一个prompt,生成一个生产特定产品的品牌名称。
如你在前面的例子中所看到的,LangChain的魔力在于我们可以定义一个带有可变输入变量的标准化prompt。
- 生成品牌名称的指令始终保持不变。
- 产品变量作为一个可变的输入。
这使我们能够定义多功能的prompt,可在不同的场景中使用。
现在我们知道了prompt模板是什么…
让我们想象一下,我们想定义一个使用超级易懂的词汇来总结任何文本的prompt。我们可以定义一个带有特定指令和一个文本变量的prompt模板,该变量根据我们定义的输入变量而变化。
# 创建我们的prompt字符串。
template = """
%INSTRUCTIONS:
请总结以下文本。
始终使用易于理解的词汇,以便小学生能够理解。
%TEXT:
{input_text}
"""
现在我们定义我们想要使用的LLM - 在我的例子中是OpenAI的GPT - 以及prompt模板。
# 默认模型已经是'text-davinci-003',但可以更改。
llm = OpenAI(temperature=0, model_name='text-davinci-003', openai_api_key=openai_api_key)
# 创建一个LangChain prompt模板,我们可以稍后插入值
prompt = PromptTemplate(
input_variables=["input_text"],
template=template,
)
那么让我们尝试一下这个prompt模板。使用维基百科API,我将获取美国国家的摘要,并以非常易懂的语气进行进一步总结。
现在我们知道了如何总结短文本…我可以稍微加一点料吗?
当然可以…
1.2. 长文本总结
处理长文本时,主要问题是我们不能直接通过prompt将其传递给AI模型,因为它们包含的标记太多。
现在你可能会想…什么是标记?
标记是模型对输入的理解方式-单个字符、单词、词的部分或文本的片段。正如你所看到的,这个定义并不是非常准确,它取决于每个模型。例如,OpenAI的GPT 1000个标记大约等于750个单词。
但最重要的是,我们的成本取决于标记的数量,我们不能在单个prompt中发送太多标记。为了有一个更长的文本,我们将重复之前的例子,但使用整个维基百科页面的文本。
如果我们检查一下它有多长…大约有17K个标记。
这是相当多的标记,直接发送到我们的API是不可能的。
那现在怎么办?
首先,我们需要将其拆分。这个过程被称为分块,或者将文本分成更小的片段。我通常使用RecursiveCharacterTextSplitter,因为它易于控制,但你可以尝试其他一些方法。
使用它后,我们不再只有一段文本,而是得到了23个片段,这样可以方便我们的GPT模型的工作。
接下来,我们需要加载一个链条,这将为我们进行连续调用LLM。
LangChain为这种链式应用程序提供了Chain接口。我们将Chain定义为对组件的一系列调用,其中可以包括其他链条。基本接口很简单:
class Chain(BaseModel, ABC):
"""所有链条都应该实现的基本接口。"""
memory: BaseMemory
callbacks: Callbacks
def __call__(
self,
inputs: Any,
return_only_outputs: bool = False,
callbacks: Callbacks = None,
) -> Dict[str, Any]:
...
如果您想了解更多关于链条的信息,可以直接查看LangChain文档。
因此,如果我们再次对分割的文本(称为文档)执行相同的过程,LLM可以轻松生成整个页面的摘要。
很有用,对吧?
现在我们知道了如何总结文本,我们可以转到第二个用例!
2. 提取
提取是从文本中解析数据的过程。这通常与输出解析一起使用,以结构化我们的数据。
提取关键数据非常有用,以便在文本中识别和解析关键词。常见的用例是从句子中提取结构化的行以插入数据库,或者从长文档中提取多个行以插入数据库。
假设我们经营一家数字电子商务公司,我们需要处理在我们网站上发布的所有评论。
我可以逐个阅读它们…这将是疯狂的。
或者我可以简单地从每个评论中提取我需要的信息,并分析所有数据。
听起来很简单,对吧?
让我们从一个非常简单的例子开始。首先,我们需要导入以下库:
# 用于构建我们的聊天消息
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# 我们将使用一个聊天模型,默认为gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# 用于解析输出并获取结构化数据
from langchain.output_parsers import StructuredOutputParser, ResponseSchema
chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)
2.1. 提取特定单词
我可以尝试在一些文本中寻找特定单词。在这种情况下,我想解析出文本中包含的所有水果。与之前一样,这很简单。我们可以很容易地定义一个提示,清楚地告诉我们的LLM识别文本中包含的所有水果,并返回一个类似JSON的结构,其中包含这些水果及其相应的颜色。
正如我们之前看到的,它完美地工作了!
那么,现在…让我们再多玩一会儿。虽然这次可以运行,但对于更高级的用例来说,这不是一个长期可靠的方法。而这正是一个了不起的LangChain概念发挥作用的地方…
2.2. 使用LangChain的响应模式
LangChain的响应模式将为我们做两件主要的事情:
- 生成具有合法格式指令的提示。这很棒,因为我不需要担心提示工程方面的事情,我将把它交给LangChain!
- 读取LLM的输出并将其转换为适合我的Python对象。这意味着始终生成一个有用的给定结构,我的系统可以解析。
而要做到这一点,我只需要定义我对模型期望的响应。
所以让我们来设想一下,我希望确定用户在评论中提到的产品和品牌。我可以像以前一样使用简单的提示进行操作 – 利用LangChain生成一个更可靠的方法。
因此,首先我需要定义一个response_schema,其中我用名称和描述定义我想要解析的每个关键字。
# 我想要的schema
response_schemas = [
ResponseSchema(name="product", description="要购买的产品名称"),
ResponseSchema(name="brand", description= "产品的品牌。")
]
然后,我生成一个output_parser对象,该对象以我的response_schema作为输入。
# output_parser将在我的schema中查找LLM输出并将其返回给我
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
在定义了我们的解析器之后,我们使用LangChain的.get_format_instructions()命令生成指令的格式,并使用ChatPromptTemplate定义最终的提示。现在只需使用此output_parser对象和我能想到的任何输入查询,它将自动生成一个包含我所需关键字的输出。
如您在下面的示例中所见,使用“我用完了Danone酸奶,无牌燕麦奶和由Heura制作的素食汉堡”作为输入,LLM给我返回了以下输出:
我的Jupyter Notebook截图。
主要要点
LangChain是一个多功能的Python库,帮助开发人员充分发挥LLM的潜力,特别是处理大量文本数据。它在处理文本的两个主要用例方面表现出色。LLM使开发人员能够在自然语言处理应用程序中创建更复杂和更接近人类的交互。
- 摘要:LangChain可以快速可靠地总结信息,减少文本量,同时保留最重要的部分。
- 提取:该库可以从文本中解析数据,实现结构化输出,并支持诸如将数据插入数据库或根据提取的参数进行API调用等任务。
- LangChain促进了提示工程,这是一种最大化ChatGPT等AI模型性能的关键技术。通过提示工程,开发人员可以设计可以在不同用例中重用的标准化提示,使AI应用更加多功能和高效。
总的来说,LangChain是增强AI使用的强大工具,特别是在处理文本数据时,而提示工程是在各种应用中有效利用ChatGPT等AI模型的关键技能。Josep Ferrer是来自巴塞罗那的分析工程师。他毕业于物理工程专业,目前从事应用于人类移动性的数据科学领域。他是一个兼职的数据科学和技术内容创作者。您可以通过LinkedIn,Twitter或VoAGI与他联系。