从无结构文本中提取结构化信息的终极指南

56 阅读3分钟
# 从无结构文本中提取结构化信息的终极指南

## 引言
在现代数据驱动的世界中,从无结构文本中提取有用的信息变得日益重要。无论是将文本输入到机器学习模型中,还是自动化数据分析,提取结构化信息都是关键步骤。这篇文章将带您构建一个链,利用大语言模型(LLM)从无结构文本中提取结构化信息。

## 主要内容
### 先决条件
该指南假定您已熟悉以下概念:
- 聊天模型
- 工具
- 工具调用

### 环境设置
使用Jupyter Notebook的交互式环境,可以轻松学习和调试。您可以在[这里](https://jupyter.org/install)找到安装说明。

### 安装LangChain
使用以下命令安装LangChain:
```sh
pip install langchain

或者如果您使用Conda:

conda install langchain -c conda-forge

详细信息参考安装指南

使用LangSmith进行调试

LangSmith提供了可视化追踪功能,帮助您查看链或代理中的内在运行情况。注册LangSmith后,配置环境变量以启用日志记录:

import getpass
import os

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

定义信息架构

我们将使用Pydantic定义一个信息架构来提取个人信息:

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

class Person(BaseModel):
    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")

确保架构有良好的文档,并允许LLM在没有信息时返回None。

信息提取器

创建一个信息提取器来使用上述架构:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", "You are an expert extraction algorithm. [...] return null for the attribute's value."),
        ("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)

此示例展示了如何从文本中提取信息,并自动转换单位。

代码示例

以下代码示例演示了如何提取多个实体:

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

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)

此代码提供了从文本中提取多个实体的能力,并且在无信息时返回空列表。

常见问题和解决方案

  • 如何提高提取质量? 使用参考示例和文档化的架构描述可以显著提高提取性能。
  • 如何处理长文本? 将文本分块或使用具有更大上下文窗口的模型。

总结和进一步学习资源

您现在已经掌握了使用LangChain进行文本信息提取的基础知识。探索以下资源进一步提升您的技能:

参考资料

  1. LangChain官方文档
  2. Pydantic用户指南
  3. Jupyter Notebook安装指南

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