如何构建一个高效的文本信息提取链

90 阅读2分钟

引言

在自然语言处理中,从非结构化文本中提取结构化信息是一项常见且重要的任务。本文将指导您如何使用LangChain构建一个信息提取链。通过本教程,您将了解如何定义提取架构、使用合适的模型以及处理多实体提取等关键步骤。

主要内容

设置环境

本文建议在Jupyter Notebook中进行操作,因为这能直观地理解步骤和调试代码。有关Jupyter安装的详细信息,请参考这里

安装LangChain

您可以通过以下命令安装LangChain:

pip install langchain

或者使用Conda安装:

conda install langchain -c conda-forge

更多安装信息请查看我们的安装指南

使用LangSmith监控链条

为了更好地监控您的应用,建议使用LangSmith进行链条追踪。通过以下命令设置您的环境变量:

import getpass
import os

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()  # 输入您的API密钥

定义提取架构

我们使用Pydantic来定义信息提取的架构。以下是一个示例,用于提取个人信息:

from typing import Optional
from langchain_core.pydantic_v1 import BaseModel, Field

class Person(BaseModel):
    """Information about a person."""
    name: Optional[str] = Field(default=None, description="The name of the person")
    hair_color: Optional[str] = Field(default=None, description="The color of the person's hair if known")
    height_in_meters: Optional[str] = Field(default=None, description="Height measured in meters")

提取器构建

接下来,使用定义的架构创建信息提取器:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are an expert extraction algorithm. Only extract relevant information from the text."),
        ("human", "{text}"),
    ]
)

from langchain_mistralai import ChatMistralAI

llm = ChatMistralAI(model="mistral-large-latest", temperature=0)
runnable = prompt | llm.with_structured_output(schema=Person)

代码示例

下面是一个完整的代码示例,展示如何提取信息:

text = "Alan Smith is 6 feet tall and has blond hair."
result = runnable.invoke({"text": text})
print(result)
# 输出: Person(name='Alan Smith', hair_color='blond', height_in_meters='1.83')

常见问题和解决方案

  • 提取不正确的信息:确保定义的架构字段是可选的(使用Optional),这样模型可以在不确定时返回None。
  • 多实体提取:使用嵌套模型来提取多个人或实体的信息。
from typing import List

class Data(BaseModel):
    people: List[Person]

runnable = prompt | llm.with_structured_output(schema=Data)
text = "My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me."
result = runnable.invoke({"text": text})
print(result)
# 输出: Data(people=[Person(name='Jeff', hair_color=None, height_in_meters=None), Person(name='Anna', hair_color=None, height_in_meters=None)])

总结和进一步学习资源

通过本指南,您已经了解了如何使用LangChain进行信息提取。接下来,您可以学习如何使用参考示例提高提取质量,或探索处理长文本的方法。

参考资料

  1. LangChain官方文档
  2. Jupyter Notebook安装指南

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---