标记 Tagging
用例
标记意味着为文档打上类别标签,例如:
- 情感
- 语言
- 风格(正式、非正式等)
- 涉及的主题
- 政治倾向
概述
标记有几个组成部分:
快速入门
让我们看一个非常简单的例子,演示如何在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参考:
- ChatOpenAI 来自
langchain.chat_models
- ChatPromptTemplate 来自
langchain.prompts
- create_tagging_chain 来自
langchain.chains
- create_tagging_chain_pydantic 来自
langchain.chains
我们在模式中指定了一些属性及其预期类型。
# 模式
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让我们可以窥探内部情况:
Pydantic
我们还可以使用Pydantic模式来指定所需的属性和类型。
我们还可以向每个字段发送其他参数,例如enum
或description
。
这使我们可以以与在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
。