当前位置:   article > 正文

Python 中的结构化 LLM 输出存储和解析

python llm

介绍

生成式人工智能目前在世界各地得到广泛应用。大型语言模型能够理解用户所提供的文本并在此基础上生成文本,这导致了从聊天机器人到文本分析器的众多应用。

但这些大型语言模型通常以非结构化方式按原样生成文本。有时我们希望 LLM 生成的输出采用结构格式,例如 JSON(JavaScript 对象表示法)格式。假设我们正在使用 LLM 分析社交媒体帖子,并且我们需要代码本身中 LLM 生成的输出作为 JSON/python 变量来执行其他任务。

通过提示工程实现这一目标是可能的,但需要花费大量时间来修改提示。为了解决这个问题,LangChain 引入了输出解析,它可以用于将 LLM 输出存储转换为结构化格式。

f8be973c5b223c09535987040b96a9a1.jpeg
学习目标
  • 解释大型语言模型生成的输出

  • 使用 Pydantic 创建自定义数据结构

  • 了解提示模板的重要性并生成格式化 LLM 输出的提示模板

  • 了解如何使用 LangChain 创建 LLM 输出的格式指令

  • 了解如何将 JSON 数据解析为 Pydantic 对象

目录

  • 介绍

  • 什么是 LangChain 和输出解析?

  • 入门 – 设置模型

  • 创建 Pydantic 输出解析器和提示模板

  • 测试大型语言模型

  • 潜在应用和用例

  • 结论

  • 常见问题

什么是 LangChain 和输出解析?

LangChain 是一个 Python 库,可让你立即使用大型语言模型构建应用程序。它支持多种模型,包括 OpenAI GPT LLM、Google 的 PaLM,甚至 Hugging Face 中提供的开源模型,如 Falcon、Llama 等。

使用 LangChain 定制大型语言模型的提示变得轻而易举,而且它还附带了一个开箱即用的矢量存储,可以存储输入和输出的嵌入。因此,可以使用它来创建可以在几分钟内查询任何文档的应用程序。

LangChain使大型语言模型能够通过代理从互联网访问信息。它还提供输出解析器,使我们能够根据大型语言模型生成的输出来构建数据。

LangChain 带有不同的输出解析器,如列表解析器、日期时间解析器、枚举解析器等。

在本文中,我们将了解 JSON 解析器,它使我们能够将 LLM 生成的输出解析为 JSON 格式。下面我们可以观察如何将 LLM 输出解析为 Pydantic 对象的典型流程,从而在 Python 变量中创建可供使用的数据。

fe70b99599e9cde17650e3fa14cdf04d.jpeg

入门 – 设置模型

在本节中,我们将使用 LangChain 建立模型。在本文中,我们将使用 PaLM 作为我们的大型语言模型。我们将在我们的环境中使用 Google Colab。你可以用任何其他大型语言模型替换 PaLM。我们将首先导入所需的模块。

  • 这将下载 LangChain 库和 google-generativeai 库以使用 PaLM 模型。

  • 需要 langchain 库来创建自定义提示并解析大型语言模型生成的输出

  • google-generativeai 库将让我们与 Google 的 PaLM 模型进行交互。

PalLM API 密钥

要使用 PaLM,我们需要一个 API 密钥,可以通过注册 MakerSuite 网站来获取该密钥。接下来,我们将导入所有必需的库并传入 API 密钥来实例化 PaLM 模型。

  1. import os
  2. import google.generativeai as palm
  3. from langchain.embeddings import GooglePalmEmbeddings
  4. from langchain.llms import GooglePalm
  5. os.environ['GOOGLE_API_KEY']= 'YOUR API KEY'
  6. palm.configure(api_key=os.environ['GOOGLE_API_KEY'])
  7. llm = GooglePalm()
  8. llm.temperature = 0.1
  9. prompts = ["Name 5 planets and line about them"]
  10. llm_result = llm._generate(prompts)
  11. print(llm_result.generations[0][0].text)
  • 这里我们首先创建了一个Google PaLM(Pathways Language Model)的实例并将其赋给变量 llm

  • 在下一步中,我们将模型的temperature设置为 0.1,将其设置得很低,因为我们不希望模型产生幻觉

  • 然后我们创建一个 Prompt 作为列表并将其传递给变量prompts

  • 要将提示传递给 PaLM,我们调用 ._generate() 方法,然后将提示列表传递给它,结果存储在变量llm_result

  • 最后,我们通过调用. Generations打印上一步的结果,并通过调用.text方法将其转换为文本

此提示的输出如下所示

1fb8f17c5e164684dccfa6f2694048ec.jpeg

我们可以看到大型语言模型已经生成了一个公平的输出,并且LLM也尝试通过添加一些行来为其添加一些结构。但是如果我想将每个模型的信息存储在变量中怎么办?如果我想将行星名称、轨道周期和距太阳的距离全部存储在一个变量中怎么办?模型生成的输出无法直接用于实现此目的。因此就需要输出解析。

创建 Pydantic 输出解析器和提示模板

在本节中,讨论 langchain 的 pydantic 输出解析器。前面的示例中,输出采用非结构化格式。看看我们如何以结构化格式存储大型语言模型生成的信息。

代码实现

让我们首先看下面的代码:

  1. from pydantic import BaseModel, Field, validator
  2. from langchain.output_parsers import PydanticOutputParser
  3. class PlanetData(BaseModel):
  4.     planet: str = Field(description="This is the name of the planet")
  5.     orbital_period: float = Field(description="This is the orbital period 
  6.     in the number of earth days")
  7.     distance_from_sun: float = Field(description="This is a float indicating distance 
  8.     from sun in million kilometers")
  9.     interesting_fact: str = Field(description="This is about an interesting fact of 
  10.     the planet")
  • 这里我们导入 Pydantic 包来创建数据结构。在此数据结构中,我们将通过解析 LLM 的输出来存储输出。

  • 这里我们使用 Pydantic 创建了一个名为PlanetData的数据结构,它存储以下数据

  • 行星:这是我们将作为模型输入提供的行星名称

  • 轨道周期:这是一个浮点值,包含特定行星的地球日轨道周期。

  • 距太阳的距离:这是一个浮点数,表示行星到太阳的距离

  • 有趣的事实:这是一个字符串,其中包含有关所询问的星球的一个有趣的事实

现在,我们的目标是查询大型语言模型以获取有关行星的信息,并通过解析 LLM 输出将所有这些数据存储在 PlanetData 数据结构中。

为了将 LLM 输出解析为 Pydantic 数据结构,LangChain 提供了一个名为 PydanticOutputParser 的解析器。我们将 PlanetData 类传递给这个解析器,它可以定义如下:

planet_parser = PydanticOutputParser(pydantic_object=PlanetData)

我们将解析器存储在名为planet_parser的变量中。解析器对象有一个名为get_format_instructions()的方法,它告诉 LLM 如何生成输出。我们来尝试打印一下

  1. from pprint import pp
  2. pp(planet_parser.get_format_instructions())
ac98d97b61dcf1fb79b4ed4878983997.jpeg

在上面,我们看到格式指令包含有关如何格式化 LLM 生成的输出的信息。它告诉 LLM 以 JSON 模式输出数据,因此该 JSON 可以解析为 Pydantic 数据结构。它还提供了输出模式的示例。接下来,我们将创建一个提示模板。

提示模板
  1. from langchain import PromptTemplate, LLMChain
  2. template_string = """You are an expert when it comes to answering questions 
  3. about planets \
  4. You will be given a planet name and you will output the name of the planet, 
  5. it's orbital period in days \
  6. Also it's distance from sun in million kilometers and an interesting fact
  7. ```{planet_name}```
  8. {format_instructions}
  9. """
  10. planet_prompt = PromptTemplate(
  11.     template=template_string,
  12.     input_variables=["planet_name"],
  13.     partial_variables={"format_instructions": planet_parser
  14. .get_format_instructions()}
  15. )
  • 在我们的提示模板中,我们将给出一个行星名称作为输入,LLM必须生成输出,其中包括轨道周期、距太阳的距离以及有关该行星的有趣事实等信息

  • 然后我们将此模板分配给PrompTemplate(),然后将输入变量名称提供给input_variables参数,在我们的例子中是planet_name

  • 我们还提供了之前见过的格式说明,告诉 LLM 如何生成 JSON 格式的输出

让我们尝试输入行星名称,并在发送到大型语言模型之前观察提示的外观

  1. input_prompt = planet_prompt.format_prompt(planet_name='mercury')
  2. pp(input_prompt.to_string())
16816a0f9714f41510dd4c71e8ed74d8.jpeg

在输出中,我们看到我们定义的模板首先出现,并带有输入“mercury”。接下来是格式说明。这些格式指令包含 LLM 可用于生成 JSON 数据的指令。

测试大型语言模型

在本节中,我们将把我们的输入发送给LLM并观察生成的数据。在上一节中,了解我们的输入字符串发送到 LLM 时的情况。

  1. input_prompt = planet_prompt.format_prompt(planet_name='mercury')
  2. output = llm(input_prompt.to_string())
  3. pp(output)
e8e8c9bd2b1c137a135287b31e69bf94.jpeg

我们可以看到大语言模型生成的输出。输出确实以 JSON 格式生成。JSON 数据包含我们在 PlanetData 数据结构中定义的所有键。每个键都有一个我们期望它具有的值。

现在我们必须将此 JSON 数据解析为我们已经完成的数据结构。这可以使用我们之前定义的 PydanticOutputParser 轻松完成。让我们看一下该代码:

  1. parsed_output = planet_parser.parse(output)
  2. print("Planet: ",parsed_output.planet)
  3. print("Orbital period: ",parsed_output.orbital_period)
  4. print("Distance From the Sun(in Million KM): ",parsed_output.distance_from_sun)
  5. print("Interesting Fact: ",parsed_output.interesting_fact)

调用 Planet_parser 的 parse() 方法将获取输出,然后解析并将其转换为 Pydantic 对象,在我们的例子中是 PlanetData 的对象。

因此,输出(即大型语言模型生成的 JSON)被解析为 PlannetData 数据结构,我们现在可以从中访问各个数据。上述的输出将是:

9118212220cee3ee4ed2b2be6bcefba8.jpeg

我们看到 JSON 数据中的键值对已正确解析为 Pydantic 数据。让我们尝试另一个并观察输出

  1. input_prompt = planet_prompt.format_prompt(planet_name='venus')
  2. output = llm(input_prompt.to_string())
  3. parsed_output = planet_parser.parse(output)
  4. print("Planet: ",parsed_output.planet)
  5. print("Orbital period: ",parsed_output.orbital_period)
  6. print("Distance From the Sun: ",parsed_output.distance_from_sun)
  7. print("Interesting Fact: ",parsed_output.interesting_fact)
1cf494abf31d8e3361e4afc9b1bed9b9.jpeg

我们看到,对于输入“Venus”,LLM 能够生成 JSON 作为输出,并成功解析为 Pydantic 数据。这样,通过输出解析,我们可以直接利用大语言模型生成的信息

潜在应用和用例

在本节中,我们将介绍一些潜在的实际应用程序/用例,在这些应用程序/用例中我们可以采用这些输出解析技术。在提取中/提取后使用解析,即当我们提取任何类型的数据时,我们要对其进行解析,以便提取的信息可以被其他应用程序使用。一些应用包括:

  • 产品投诉提取与分析:当一个新品牌进入市场并发布新产品时,它要做的第一件事就是检查产品的表现如何,而评估这一点的最佳方法之一就是分析社交媒体帖子使用这些产品的消费者。输出解析器和LLM可以提取信息,例如品牌和产品名称,甚至来自消费者社交媒体帖子的投诉。这些大型语言模型通过输出解析将此数据存储在 Pythonic 变量中,允许你将其用于数据可视化。

  • 客户支持:当与LLM创建聊天机器人以提供客户支持时,一项重要任务是从客户的聊天历史记录中提取信息。该信息包含关键细节,例如消费者在产品/服务方面面临哪些问题。你可以使用 LangChain 输出解析器轻松提取这些详细信息,而不是创建自定义代码来提取此信息。

  • 职位发布信息:在开发 Indeed、LinkedIn 等职位搜索平台时,我们可以使用 LLM 从职位发布中提取详细信息,包括职位名称、公司名称、工作经验年限和职位描述。输出解析可以将此信息保存为结构化 JSON 数据,用于职位匹配和推荐。直接通过 LangChain 输出解析器解析 LLM 输出中的此信息,消除了执行此单独解析操作所需的大量冗余代码。

结论

大型语言模型很棒,因为它们具有非凡的文本生成功能,可以真正适合每个用例。但大多数情况下,它们在实际使用生成的输出时表现不佳,我们必须花费大量时间来解析输出。

在本文中,我们研究了这个问题,以及如何使用 LangChain 的输出解析器解决它,特别是 JSON 解析器,它可以解析 LLM 生成的 JSON 数据并将其转换为 Pydantic 对象。

要点

本文的一些关键要点包括:

  • LangChain是一个Python库,可以使用现有的大型语言模型创建应用程序。

  • LangChain 提供了输出解析器,让我们可以解析大型语言模型生成的输出。

  • Pydantic 允许我们定义自定义数据结构,可以在解析 LLM 的输出时使用。

  • 除了 Pydantic JSON 解析器之外,LangChain 还提供了不同的输出解析器,如列表解析器、日期时间解析器、枚举解析器等。

常见问题

Q1. 什么是 JSON?

答:JSON 是 JavaScript Object Notation 的缩写,是一种结构化数据格式。它包含键值对形式的数据。

Q2. 什么是派丹提克?

答:Pydantic 是一个 Python 库,可创建自定义数据结构并执行数据验证。它验证每条数据是否与分配的类型匹配,从而验证所提供的数据。

Q3. 我们如何从大型语言模型生成 JSON 格式的数据?

答:使用 Prompt Engineering 来完成此操作,修改 Prompt 可能会导致我们使 LLM 生成 JSON 数据作为输出。为了简化这个过程,LangChain 有输出解析器,你可以使用它来完成此任务。

Q4. LangChain 中的输出解析器是什么?

答:LangChain 中的输出解析器允许我们以结构化方式格式化大型语言模型生成的输出。这使我们可以轻松访问大型语言模型中的信息以执行其他任务。

Q5. LangChain 有哪些不同的输出解析?

答:LangChain 带有不同的输出解析器,如 Pydantic Parser、List Parsr、Enum Parser、Datetime Parser 等。

☆ END ☆

如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「uncle_pn」,欢迎添加小编微信「 woshicver」,每日朋友圈更新一篇高质量博文。

扫描二维码添加小编↓

b2b6a07d689fbe076bbaf6397dd2e9ec.jpeg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/200145
推荐阅读
相关标签
  

闽ICP备14008679号