推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景
在过去的几年里,大型语言模型?—?或LLM为朋友?—?风靡人工智能世界。
随着 OpenAI 的 GPT-3 在 2020 年的突破性发布,我们见证了 LLM 的受欢迎程度稳步上升,随着该领域的最新进展,这种受欢迎程度只会加剧。
这些强大的人工智能模型为自然语言处理应用程序开辟了新的可能性,使开发人员能够创建更复杂的、类似人类的交互。
不是吗?
但是,在处理这种AI技术时,很难扩展和生成可靠的算法。
在这个快速发展的格局中,LangChain已经成为一个多功能框架,旨在帮助开发人员在广泛的应用中充分利用LLM的潜力。最重要的用例之一是处理大量 文本数据。
让我们今天就开始利用LLM的力量吧!
LangChain 可用于聊天机器人、问答系统、摘要工具等。然而,LangChain最有用和最常用的应用程序之一是处理文本。
当今世界充斥着数据。最臭名昭著的类型之一是文本数据。
所有网站和应用程序每天都在被成吨的单词轰炸。没有人可以处理如此大量的信息...
但是计算机可以吗?
LLM技术与LangChain一起是减少文本量的好方法,同时保持消息的最重要部分。这就是为什么今天我们将介绍 LangChain 处理文本的两个基本但非常有用的用例。
- 综述: 表达有关文本正文或聊天交互的最重要事实。它可以减少数据量,同时保留最重要的部分。
- 萃取: 从文本正文或某些用户查询中提取结构化数据。它可以检测和提取文本中的关键字。
无论您是LLM世界的新手,还是希望将您的语言生成项目提升到一个新的水平,本指南将为您提供有价值的见解和实践示例,以释放LangChain处理文本的全部潜力。
⚠️ 如果你想有一些基本的掌握,你可以去检查
LangChain 101:构建自己的GPT驱动的应用程序 — KDnuggets
永远记住,要使用 OpenAI 和 GPT 模型,我们需要在本地计算机上安装 OpenAI 库并拥有一个有效的 OpenAI 密钥。如果您不知道该怎么做,可以去查看 这里.
1. 总结
ChatGPT与LangChain一起可以快速,可靠地汇总信息。
LLM摘要技术是减少文本量的好方法,同时保持消息的最重要部分。这就是为什么LLM可以成为任何需要处理和分析大量文本数据的数字公司的最佳盟友。
要执行以下示例,需要以下库:
# 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. 短文本摘要
对于短文本的摘要,该方法很简单,实际上,除了简单的提示说明之外,您不需要做任何花哨的事情。
这基本上意味着使用输入变量生成模板。
我知道你可能想知道...提示模板到底是什么?提示模板是指生成提示的可重现方式。它包含一个文本字符串 - 一个模板 - 可以从最终用户那里获取一组参数并生成提示。
- 提示模板包含:语言模型的说明 - 允许我们标准化LLM的一些步骤。
- 一个输入变量 - 允许我们将前面的指令应用于任何输入文本。
让我们在一个简单的例子中看到这一点。我可以标准化生成生产特定产品的品牌名称的提示。
我的Jupyter Notebook的屏幕截图。
正如您在前面的例子中观察到的那样,LangChain 的魔力在于我们可以使用不断变化的输入变量定义一个标准化提示。
- 为品牌生成名称的说明始终保持不变。
- 产品变量用作可以更改的输入。
这使我们能够定义可用于不同场景的通用提示。所以现在我们知道什么是提示模板...假设我们要定义一个提示,使用超级易于理解的词汇来总结任何文本。
我们可以定义一个带有一些特定指令的提示模板和一个根据我们定义的输入变量而变化的文本变量。
# Create our prompt string.
template = """
%INSTRUCTIONS:
Please summarize the following text.
Always use easy-to-understand vocabulary so an elementary school student can understand.
%TEXT:
{input_text}
"""
Now we define the LLM we want to work with - OpenAI’s GPT in my case - and the prompt template.
# The default model is already 'text-davinci-003', but it can be changed.
llm = OpenAI(temperature=0, model_name='text-davinci-003', openai_api_key=openai_api_key)
# Create a LangChain prompt template that we can insert values to later
prompt = PromptTemplate(
input_variables=["input_text"],
template=template,
)
因此,让我们尝试此提示模板。使用维基百科API,我将获得美国国家的摘要,并以非常易于理解的语气进一步总结。
我的Jupyter Notebook的屏幕截图。所以现在我们知道了如何总结一篇简短的文本......我可以给这个调味一点吗?当然我们可以...
1.2. 长文本摘要
在处理长文本时,主要问题是我们无法通过提示直接将它们传达给我们的 AI 模型,因为它们包含太多的令牌。
现在你可能想知道...什么是代币?
标记是模型查看输入的方式 - 单个字符、单词、单词的一部分或文本片段。如您所见,定义并不十分精确,它取决于每个模型。例如,OpenAI 的 GPT 1000 代币大约有 750 个单词。
但要了解的最重要的事情是,我们的成本取决于代币的数量,我们不能在单个提示中发送任意数量的代币。为了获得更长的文本,我们将重复与以前相同的示例,但使用整个维基百科页面文本。
我的Jupyter Notebook的屏幕截图。
如果我们检查它有多长...它大约是 17K 代币。
直接发送到我们的API有很多东西。那现在怎么办?首先,我们需要将其拆分。此过程称为分块或将文本拆分为较小的部分。我通常使用RecursiveCharacterTextSplitter,因为它很容易控制,但你可以尝试一堆。
使用它后,我们得到的不仅仅是一条文本,而是 23 条,这有助于我们的 GPT 模型的工作。接下来,我们需要加载一个链,该链将为我们连续调用LLM。LangChain为此类链式应用程序提供了链接口。我们非常笼统地将链定义为对组件的一系列调用,其中可以包括其他链。基本界面很简单:
class Chain(BaseModel, ABC):
"""Base interface that all chains should implement."""
memory: BaseMemory
callbacks: Callbacks
def __call__(
self,
inputs: Any,
return_only_outputs: bool = False,
callbacks: Callbacks = None,
) -> Dict[str, Any]:
...
如果你想了解更多关于链的信息,你可以直接去 LangChain 文档中查看。因此,如果我们再次对拆分的文本(称为文档)重复相同的过程,LLM可以轻松生成整个页面的摘要。
我的Jupyter Notebook的屏幕截图。有用吧?因此,现在我们知道了如何总结文本,我们可以转到第二个用例!
2. 提取
提取是从一段文本中解析数据的过程。这通常与输出解析一起使用,以构建我们的数据。
提取关键数据对于识别和解析文本中的关键字非常有用。常见用例是从句子中提取结构化行以插入到数据库中,或者从长文档中提取多行以插入到数据库中。
假设我们正在经营一家数字电子商务公司,我们需要处理我们网站上的所有评论。我可以一一读完...这太疯狂了。或者我可以简单地从他们每个人中提取我需要的信息并分析所有数据。听起来很简单...右?让我们从一个非常简单的例子开始。首先,我们需要导入以下库:
# To help construct our Chat Messages
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate
# We will be using a chat model, defaults to gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI
# To parse outputs and get structured data back
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的结构。
我的Jupyter Notebook的屏幕截图。正如我们之前看到的,它运行完美!所以现在...让我们多玩一点。虽然这一次奏效了,但对于更高级的用例来说,这不是一种长期可靠的方法。这就是一个奇妙的LangChain概念发挥作用的地方......
2.2. 使用 LangChain 的响应模式
LangChain 的响应模式将为我们做两件主要的事情:
- 生成带有真实格式说明的提示。这很棒,因为我不需要担心提示工程方面,我会把它留给 LangChain!
- 阅读LLM的输出并将其转换为适合我的python对象。这意味着,始终生成一个有用的给定结构,并且我的系统可以解析。
为此,我只需要定义除模型之外的响应。因此,假设我想确定用户在评论中陈述的产品和品牌。我可以通过简单的提示轻松执行像以前一样 - 利用 LangChain 生成更可靠的方法。
因此,首先我需要定义一个response_schema,在其中定义要解析的每个关键字,其中包含名称和描述。
# The schema I want out
response_schemas = [
ResponseSchema(name="product", description="The name of the product to be bought"),
ResponseSchema(name="brand", description= "The brand of the product.")
]
And then I generate an output_parser object that takes as an input my response_schema.
# The parser that will look for the LLM output in my schema and return it back to me
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)
定义解析器后,我们使用 LangChain 的 .get_format_instructions() 命令生成指令的格式,并使用 ChatPromptTemplate 定义最终提示。现在,就像将这个output_parser对象与我能想到的任何输入查询一起使用一样简单,它将自动生成带有我所需关键字的输出。
我的Jupyter Notebook的屏幕截图。正如您在下面的示例中观察到的那样,输入“我用完了酸奶达能、无品牌燕麦奶和 Heura 制作的那些纯素虫子”,LLM 给了我以下输出:
我的Jupyter Notebook的屏幕截图。
主要要点
LangChain是一个多功能的Python库,可帮助开发人员充分利用LLM的潜力,特别是在处理大量文本数据时。它擅长处理文本的两个主要用例。LLM使开发人员能够在自然语言处理应用程序中创建更复杂和类似人类的交互。
摘要:
- LangChain可以快速可靠地汇总信息,减少文本量,同时保留消息中最重要的部分。
- 提取:该库可以从一段文本中解析数据,允许结构化输出并启用将数据插入数据库或基于提取的参数进行 API 调用等任务。
- LangChain促进了快速工程,这是最大化ChatGPT等AI模型性能的关键技术。通过提示工程,开发人员可以设计可在不同用例中重复使用的标准化提示,从而使 AI 应用程序更加通用和有效。
总体而言,LangChain 是增强 AI 使用的强大工具,尤其是在处理文本数据时,而提示工程是在各种应用程序中有效利用 ChatGPT 等 AI 模型的关键技能。