Skip to main content

OpenAI函数元数据标记器 (OpenAI Functions Metadata Tagger)

通常,给摄入的文档打上结构化的元数据标签(如标题、语调或长度)可以方便后续进行更有针对性的相似性搜索。然而,对于大量的文档来说,手动执行这个标记过程可能会很繁琐。

OpenAIMetadataTagger 文档转换器通过根据提供的模式从每个提供的文档中提取元数据来自动化这个过程。它在内部使用一个可配置的 OpenAI Functions 链,因此如果传递一个自定义的 LLM 实例,它必须是一个支持函数的 OpenAI 模型。

注意: 这个文档转换器最适合处理完整的文档,所以最好在进行任何其他拆分或处理之前先对整个文档运行它!

例如,假设你想索引一组电影评论。你可以使用有效的 JSON 模式对象初始化文档转换器,如下所示:

from langchain.schema import Document
from langchain.chat_models import ChatOpenAI
from langchain.document_transformers.openai_functions import create_metadata_tagger
schema = {
"properties": {
"movie_title": {"type": "string"},
"critic": {"type": "string"},
"tone": {"type": "string", "enum": ["positive", "negative"]},
"rating": {
"type": "integer",
"description": "评论家对电影的评分(星级)",
},
},
"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)

然后,你只需要将一组文档传递给文档转换器,它将从内容中提取元数据:

original_documents = [
Document(
page_content="The Bee Movie 的评论\nBy Roger Ebert\n\n这是有史以来最棒的电影。5颗星中的4颗。"
),
Document(
page_content="The Godfather 的评论\nBy Anonymous\n\n这部电影超级无聊。5颗星中的1颗。",
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"
)
    The Bee Movie 的评论
By Roger Ebert

这是有史以来最棒的电影。5颗星中的4颗。

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

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

The Godfather 的评论
By Anonymous

这部电影超级无聊。5颗星中的1颗。

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

然后,新的文档可以在加载到向量存储之前经过文本拆分的进一步处理。提取的字段不会覆盖现有的元数据。

你还可以使用 Pydantic 模式初始化文档转换器:

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="评分(星级),最高为5颗星")


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"
)
    The Bee Movie 的评论
By Roger Ebert

这是有史以来最棒的电影。5颗星中的4颗。

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

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

The Godfather 的评论
By Anonymous

这部电影超级无聊。5颗星中的1颗。

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

自定义

你可以在文档转换器构造函数中传递标记链的标准 LLMChain 参数。例如,如果你想要求 LLM 关注输入文档中的特定细节,或以某种风格提取元数据,你可以传递一个自定义提示:

from langchain.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template(
"""从以下文本中提取相关信息。
匿名评论家实际上是 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"
)
    The Bee Movie 的评论
By Roger Ebert

这是有史以来最棒的电影。5颗星中的4颗。

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

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

The Godfather 的评论
By Anonymous

这部电影超级无聊。5颗星中的1颗。

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