LangChain-v0.2文档翻译:2.13、教程-将文本分类为标签
LangChain-v0.2文档翻译:2.13、教程-将文本分类为标签
LangChain是一个用于构建AI应用程序的开源库,它提供了许多实用的工具和组件,可以帮助开发者快速构建和部署基于LLM的应用程序。本文将介绍如何使用LangChain库中的OpenAI工具调用进行文本标记(tagging),包括快速入门和更精细的控制两个部分。
标记意味着用以下类别标记文档:
- 情绪
- 语言
- 风格(正式、非正式等)
- 涵盖的主题
- 政治倾向
标记有几个组成部分:
- 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。
- 这涵盖了与标记链相同的基本功能,仅适用于 LangChainDocument。