Skip to main content

标记 Tagging

在Collab中打开

用例

标记意味着为文档打上类别标签,例如:

  • 情感
  • 语言
  • 风格(正式、非正式等)
  • 涉及的主题
  • 政治倾向

图像描述

概述

标记有几个组成部分:

  • function:与提取类似,标记使用functions来指定模型如何标记文档
  • schema:定义我们想要标记文档的方式

快速入门

让我们看一个非常简单的例子,演示如何在LangChain中使用OpenAI函数进行标记。

pip install langchain openai   

# 设置环境变量OPENAI_API_KEY或从.env文件加载:
# import dotenv
# dotenv.load_env()



from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.chains import create_tagging_chain, create_tagging_chain_pydantic

API参考:

我们在模式中指定了一些属性及其预期类型。

# 模式  
schema = {
"properties": {
"sentiment": {"type": "string"},
"aggressiveness": {"type": "integer"},
"language": {"type": "string"},
}
}

# LLM
llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")
chain = create_tagging_chain(schema, llm)



inp = "Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!"
chain.run(inp)



{'sentiment': 'positive', 'language': 'Spanish'}



inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
chain.run(inp)



{'sentiment': 'enojado', 'aggressiveness': 1, 'language': 'es'}

正如我们在示例中看到的,它正确解释了我们的意图。

结果会有所不同,例如,不同语言的情感('positive','enojado'等)。

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

更精细的控制

仔细定义模式可以更好地控制模型的输出。

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

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

以下是如何使用 _enum__description__required_ 控制前面提到的每个方面的示例:

schema = {  
"properties": {
"aggressiveness": {
"type": "integer",
"enum": [1, 2, 3, 4, 5],
"description": "描述陈述的侵略性,数字越高,侵略性越大",
},
"language": {
"type": "string",
"enum": ["spanish", "english", "french", "german", "italian"],
},
},
"required": ["language", "sentiment", "aggressiveness"],
}



chain = create_tagging_chain(schema, llm)

现在答案更好了!

inp = "Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!"  
chain.run(inp)



{'aggressiveness': 0, 'language': 'spanish'}



inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
chain.run(inp)



{'aggressiveness': 5, 'language': 'spanish'}



inp = "Weather is ok here, I can go outside without much more than a coat"
chain.run(inp)



{'aggressiveness': 0, 'language': 'english'}

LangSmith trace让我们可以窥探内部情况:

  • 提取一样,我们在此处调用information_extraction函数here来处理输入字符串。
  • 这个OpenAI函数根据提供的模式提取信息。

图像描述

Pydantic

我们还可以使用Pydantic模式来指定所需的属性和类型。

我们还可以向每个字段发送其他参数,例如enumdescription

这使我们可以以与在Python中定义新类或函数相同的方式指定模式,纯粹使用Python类型。

from enum import Enum  
from pydantic import BaseModel, Field



class Tags(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"]
)



chain = create_tagging_chain_pydantic(Tags, llm)



inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
res = chain.run(inp)



res



Tags(sentiment='sad', aggressiveness=5, language='spanish')

深入了解

  • 您可以使用metadata tagger文档转换器从LangChain Document中提取元数据。
  • 这与标记链具有相同的基本功能,只是应用于LangChain Document