langchain从非结构化文本中提取结构化信息

发布于:2025-03-19 ⋅ 阅读:(19) ⋅ 点赞:(0)

在自然语言处理(NLP)中,表格数据抽取是一个重要的任务,它涉及到从文本中提取结构化数据。

如何根据输出格式进行提取

我们需要描述我们想从文本中提取的信息。

我们将使用 Pydantic 定义一个示例模式来提取个人信息。


import os
from typing import Optional, List

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from pydantic.v1 import BaseModel, Field

# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f1f--dKxlr"
# 初始化智普 AI 模型
llm = ChatZhipuAI()

# 模版
prompt = ChatPromptTemplate.from_messages(
    [
        ("system",
         "你是一个专业的文档提取器,你可以从未结构化的文本中提取相关信息。如果你不知道要提取的属性的值,返回该属性的值为null。"),
        ("human", "{text}")
    ]
)


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="以米为单位测量的高度")


class PersonList(BaseModel):
    person_list: List[Person]


# 构建执行链
chain = {"text": RunnablePassthrough()} | prompt | llm.with_structured_output(schema=PersonList)
text = "马路上走来一个女生,长长的黑头发披在肩上,大概1米7左右。走在她旁边的是她的男朋友,叫:刘海;比她高10厘米。"
# text = "My name is Jeff, my hair is black and i am 6 feet tall. Anna has the same color hair as me."
resp = chain.invoke({"text":text})
print(resp)

结果:


E:\learn_work_spaces\PythonProject1\.venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\提取\demo1.py 
{'person_list': [{'hair_color': '黑色', 'height_in_meters': '1.7', 'name': '女生'}, {'hair_color': {}, 'height_in_meters': '1.8', 'name': '刘海'}]}

进程已结束,退出代码为 0


如何在提取时使用参考示例

通过向大型语言模型提供参考示例,提取的质量通常可以得到改善。

数据提取试图生成文本及其他非结构化或半结构化格式中信息的结构化表示。工具调用 大型语言模型特性通常在此上下文中使用。


import os

from langchain_community.chat_models import ChatZhipuAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f1f19--NRdKxlr"
# 初始化智普 AI 模型
llm = ChatZhipuAI()

# 模版
prompt = ChatPromptTemplate.from_template(
    """
    将输入的句子,按照这样的示例进行提取
    示例:苹果公司发布了新款 iPhone。提取:组织:苹果公司;产品:新款 iPhone
    输入的句子:{input}
    """
)

# 构建执行链
chain = {"input": RunnablePassthrough()} | prompt | llm

resp = chain.invoke({"input": "小米公司发布了小米15"})
print(resp)


结果:


E:\learn_work_spaces\PythonProject1\.venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\提取\demo2.py 
content='提取:组织:小米公司;产品:小米15' additional_kwargs={} response_metadata={'token_usage': {'completion_tokens': 13, 'prompt_tokens': 56, 'total_tokens': 69}, 'model_name': 'glm-4', 'finish_reason': 'stop'} id='run-1ee79d51-5960-47d9-9d34-ccc08c0030b4-0'

进程已结束,退出代码为 0


如何处理长文本以进行提取

在处理文件时,例如PDF,您可能会遇到超出语言模型上下文窗口的文本。要处理这些文本,请考虑以下策略:

  • 更换大型语言模型 :选择一个支持更大上下文窗口的不同大型语言模型。
  • 暴力法 :将文档分块,并从每个块中提取内容。
  • 检索增强生成 :将文档分块,索引这些块,并仅从看起来“相关”的子集块中提取内容。

这些策略有不同的权衡,最佳策略可能取决于您正在设计的应用程序!