LangChain-v0.2文档翻译:2.13、教程-将文本分类为标签

  1. 介绍
  2. 教程
    2.1. 构建一个简单的 LLM 应用程序
    2.2. 构建一个聊天机器人
    2.3. 构建向量存储库和检索器
    2.4. 构建一个代理
    2.5. 构建检索增强生成 (RAG) 应用程序
    2.6. 构建一个会话式RAG应用程序
    2.7. 在SQL数据上构建一个问答系统
    2.8. 构建查询分析系统
    2.9. 基于查询分析系统构建一个本地RAG应用程序
    2.10. 基于图形数据库构建问答应用程序
    2.11. 构建一个提取链
    2.12. 生成合成数据
    2.13. 将文本分类为标签(点击查看原文

将文本分类到标签中

标记意味着用以下类别标记文档:

  • 情绪

  • 语言

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

  • 涵盖的主题

  • 政治倾向
    在这里插入图片描述
    标记有几个组成部分:

  • function:与提取一样,标记使用函数来指定模型应如何标记文档

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

快速入门

让我们来看一个非常直接的例子,展示如何使用LangChain中的OpenAI工具调用进行标记(tagging)。我们将使用OpenAI模型支持的with_structured_output方法:

%pip install --upgrade --quiet langchain langchain-openai

# Set env var OPENAI_API_KEY or load from a .env file:
# import dotenv
# dotenv.load_dotenv()

让我们在我们的模式中指定一个具有几个属性及其预期类型的Pydantic模型。

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}
"""
)

# 定义一个Pydantic模型,用于分类
class Classification(BaseModel):
    # 文本的情感倾向,预期为字符串类型
    sentiment: str = Field(description="文本的情感")
    # 文本的攻击性,预期为1到10的整数
    aggressiveness: int = Field(
        description="描述文本的攻击性,数字越大表示越攻击性"
    )
    # 文本使用的语言,预期为字符串类型
    language: str = Field(description="文本使用的语言")

# 初始化一个OpenAI语言模型,设置温度为0,模型为gpt-3.5-turbo-0125,并指定结构化输出的模型为Classification
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’)

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’等)。

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

更精细的控制

仔细的模式定义让我们对模型的输出有更多的控制。

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

  • 每个属性的可能值
  • 描述以确保模型理解该属性
  • 需要返回的属性

让我们重新声明我们的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}
"""
)

# 初始化一个OpenAI语言模型,设置温度为0,模型为gpt-3.5-turbo-0125,并指定结构化输出的模型为Classification
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值