Skip to main content

Tagging

Open In Colab

文本分类

标记(Tagging)意味着使用类别对文档进行标记,例如:

  • 情感

  • 语言

  • 风格(正式、非正式等)

  • 涉及的主题

  • 政治倾向

图片描述

概述

标记有几个组成部分:

  • function:与提取类似,标记使用functions来指定模型如何标记文档

  • schema:定义我们希望如何标记文档

快速开始

让我们看一个非常简单的示例,演示如何在 LangChain 中使用 OpenAI 工具进行标记。我们将使用 OpenAI 模型支持的 with_structured_output 方法:

%pip install --upgrade --quiet langchain langchain-openai
# 设置环境变量 OPENAI_API_KEY 或从 .env 文件加载:
# import dotenv
# dotenv.load_dotenv()

让我们在我们的 schema 中指定一个 Pydantic 模型,包括一些属性及其在 schema 中的预期类型。

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
tagging_prompt = ChatPromptTemplate.from_template(
"""
从以下段落中提取所需的信息。
仅提取“Classification”功能中提到的属性。
段落:
{input}
"""
)
class Classification(BaseModel):
sentiment: str = Field(description="文本的情感")
aggressiveness: int = Field(
description="文本的攻击性,范围从1到10"
)
language: str = Field(description="文本所使用的语言")
# LLM
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0125").with_structured_output(
Classification
)
tagging_chain = tagging_prompt | llm
inp = "Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!"
tagging_chain.invoke({"input": inp})
Classification(sentiment='positive', aggressiveness=1, language='Spanish')

如果我们想要 JSON 输出,只需调用 .dict()

inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
res = tagging_chain.invoke({"input": inp})
res.dict()
{'sentiment': 'negative', 'aggressiveness': 8, 'language': 'Spanish'}

正如我们在示例中所看到的,它正确地解释了我们的意图。结果会有所不同,例如,不同语言的情感('positive','enojado' 等)。

我们将在下一节中看到如何控制这些结果。

更精细的控制

仔细的 schema 定义可以让我们更好地控制模型的输出。

具体来说,我们可以定义:

  • 每个属性的可能值

  • 描述以确保模型理解该属性

  • 要返回的必需属性

让我们重新声明我们的 Pydantic 模型,使用枚举来控制前面提到的每个方面:

class Classification(BaseModel):
sentiment: str = Field(..., enum=["happy", "neutral", "sad"])
aggressiveness: int = Field(
...,
description="描述陈述的攻击性,数字越高攻击性越强",
enum=[1, 2, 3, 4, 5],
)
language: str = Field(
..., enum=["spanish", "english", "french", "german", "italian"]
)
tagging_prompt = ChatPromptTemplate.from_template(
"""
从以下段落中提取所需的信息。
仅提取“Classification”功能中提到的属性。
段落:
{input}
"""
)
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0125").with_structured_output(
Classification
)
chain = tagging_prompt | llm

现在,答案将按我们期望的方式受限制:

inp = "Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!"
chain.invoke({"input": inp})
Classification(sentiment='happy', aggressiveness=1, language='spanish')
inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
chain.invoke({"input": inp})
Classification(sentiment='sad', aggressiveness=5, language='spanish')
inp = "Weather is ok here, I can go outside without much more than a coat"
chain.invoke({"input": inp})
Classification(sentiment='neutral', aggressiveness=2, language='english')

LangSmith追踪让我们能够深入了解其内部结构:

图片描述

深入了解

  • 您可以使用元数据标记器文档转换器从LangChain Document中提取元数据。

  • 这涵盖了与标记链相同的基本功能,只是应用于LangChain Document


Was this page helpful?


You can leave detailed feedback on GitHub.