构建惊艳的文本分析管道!LangGraph的奇妙能力揭秘!
在本文中,我将向您介绍 LangGraph,这是一个用于构建基于图的工作流的应用程序的令人难以置信的框架,这些工作流在其他情况下将是不可行的。我将分享我对 LangGraph 的经验,它的重要特性,并最终创建一个文本分析管道,以展示 LangGraph 的能力。
理解 LangGraph
本质上,LangGraph 是围绕图形工作流程的概念构建的,其中每个节点作为特定的过程或计算步骤,边缘在特定条件下确定这些节点之间的数据流。这为应用程序设计提供了高度的灵活性和模块化,使其非常适合复杂任务,例如自然语言处理 (NLP) 中的任务。
关键特性
- 状态管理: 超越边界 - LangGraph 的状态管理:它可能是最特别的,因为它具有在不同节点之间维护状态的最佳能力之一,从而使应用程序保持上下文,因此能够适当地响应用户的操作或输入。
- 灵活路由: 该框架支持节点之间的动态数据路由,允许在工作流中进行复杂的决策过程。这种灵活性对于需要根据不同输入进行适应的应用程序至关重要。
- 持久性: LangGraph 包含内置的持久性功能,使工作流能够在每个步骤后保存其状态。此功能对于需要从中断中恢复或支持人机交互的应用程序至关重要。
- 可视化: 基于图的结构使开发人员能够轻松可视化工作流,这有助于理解不同组件如何交互以及应用程序内数据的整体流动。
我们这个项目的模型:文本分析管道
在本教程中,我们将使用 LangGraph 构建一个多阶段的文本分析管道。该管道将通过三个主要步骤处理给定的文本:
1. 文本分类
在初始阶段,我们将输入文本分类为定义的类别,如新闻、博客、研究、其他或类似类别。通过在此节点使用分类模型,我们可以确定文本的性质,并根据需要进行进一步的处理步骤。
2. 实体提取
接下来要做的是识别和提取文本中的关键实体。在这种识别中,文本中出现重要的组成部分,如人、组织和地点。实体提取有助于理解文本,并为进一步的详细分析奠定基础。
3. 文本摘要
最后,我们将创建输入文本的简要摘要。在此步骤中涉及摘要技术,以更压缩的形式向用户提供所有重要的必要信息。摘要节点将从分类和实体提取阶段收集输入,以便提供更连贯的概述。
构建管道
为了在 LangGraph 中构建这个管道,我们将为每个处理阶段创建节点,然后建立定义数据流动的边。
- 定义节点:分类、提取、摘要 - 每个这样的功能将在我们的图中以节点的形式表达。
- 建立边:我们将根据一个节点的输出作为另一个节点的输入,创建连接这些节点的边。
- 实现逻辑:可能需要定义条件逻辑,以确定根据分类结果或提取的实体采取的路径。
这个过程可以引导我们构建一个模块化和可扩展的工作流程,以便进一步轻松修改或扩展与文本分析需求相关的内容。
导入所需库
此单元导入我们 LangGraph 教程所需的所有模块和类。
import os
from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain_core.runnables.graph import MermaidDrawMethod
from IPython.display import display, Image
from dotenv import load_dotenv
设置 API 密钥
此单元将加载环境变量并配置 OpenAI API 密钥。您需要有一个包含您的 OPENAI_API_KEY 的 .env 文件。
## Load environment variables
load_dotenv()
## Set OpenAI API key
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')
构建文本处理管道
定义状态并设置LLM在这里,我们定义State类来管理我们的工作流数据,然后初始化ChatOpenAI模型。
class State(TypedDict):
text: str
classification: str
entities: List[str]
summary: str
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
定义节点函数
好吧,指定我们图中每个节点执行的操作的函数包括分类、实体提取和摘要。
def classification_node(state: State):
''' Classify the text into one of the categories: News, Blog, Research, or Other '''
prompt = PromptTemplate(
input_variables=["text"],
template="Classify the following text into one of the categories: News, Blog, Research, or Other.\n\nText:{text}\n\nCategory:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
classification = llm.invoke([message]).content.strip()
return {"classification": classification}
def entity_extraction_node(state: State):
''' Extract all the entities (Person, Organization, Location) from the text '''
prompt = PromptTemplate(
input_variables=["text"],
template="Extract all the entities (Person, Organization, Location) from the following text. Provide the result as a comma-separated list.\n\nText:{text}\n\nEntities:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
entities = llm.invoke([message]).content.strip().split(", ")
return {"entities": entities}
def summarization_node(state: State):
''' Summarize the text in one short sentence '''
prompt = PromptTemplate(
input_variables=["text"],
template="Summarize the following text in one short sentence.\n\nText:{text}\n\nSummary:"
)
message = HumanMessage(content=prompt.format(text=state["text"]))
summary = llm.invoke([message]).content.strip()
return {"summary": summary}
创建工具和构建工作流
此单元构建 StateGraph 工作流。
workflow = StateGraph(State)
## Add nodes to the graph
workflow.add_node("classification_node", classification_node)
workflow.add_node("entity_extraction", entity_extraction_node)
workflow.add_node("summarization", summarization_node)
## Add edges to the graph
workflow.set_entry_point("classification_node") # Set the entry point of the graph
workflow.add_edge("classification_node", "entity_extraction")
workflow.add_edge("entity_extraction", "summarization")
workflow.add_edge("summarization", END)
## Compile the graph
app = workflow.compile()
可视化工作流程
这有助于我们通过 Mermaid 展示我们在这个单元中的工作流程。
display(
Image(
app.get_graph().draw_mermaid_png(
draw_method=MermaidDrawMethod.API,
)
)
)
测试管道
该单元运行样本文本并显示结果。
sample_text = """
OpenAI has announced the GPT-4 model, which is a large multimodal model that exhibits human-level performance on various professional benchmarks. It is developed to improve the alignment and safety of AI systems.
additionally, the model is designed to be more efficient and scalable than its predecessor, GPT-3. The GPT-4 model is expected to be released in the coming months and will be available to the public for research and development purposes.
"""
state_input = {"text": sample_text}
result = app.invoke(state_input)
print("Classification:", result["classification"])
print("\nEntities:", result["entities"])
print("\nSummary:", result["summary"])
#response
Classification: 新闻
Entities: ['OpenAI', 'GPT-4', 'GPT-3']
Summary: OpenAI即将推出的GPT-4模型是一种多模态AI,旨在实现人类水平的表现,改善安全性,并比GPT-3具有更高的效率。
结论
在本教程中,我们已经:
- 学习了 LangGraph 的概念
- 构建了一个文本处理管道
- 展示了 LangGraph 在数据处理工作流中的应用
- 使用 Mermaid 可视化了这个工作流
在对话代理之外的应用示例是 LangGraph 作为通用框架可以用于的:构建非常复杂的基于图的工作流。