Skip to main content

标记

标记链使用OpenAI的functions参数来指定用于标记文档的模式。这帮助我们确保模型输出我们想要的准确标记及其适当的类型。

当我们想要给一段落打标签时,可以使用标记链来指定特定的属性(例如,这条信息的情感是什么?)

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

/Users/harrisonchase/.pyenv/versions/3.9.1/envs/langchain/lib/python3.9/site-packages/deeplake/util/check_latest_version.py:32: UserWarning: 有一个更新的deeplake版本(3.6.4)可用。建议使用pip install -U deeplake更新到最新版本。 warnings.warn(

llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")

最简单的方法,只指定类型

我们可以通过在模式中指定一些属性及其预期类型来开始

schema = {
"properties": {
"sentiment": {"type": "string"},
"aggressiveness": {"type": "integer"},
"language": {"type": "string"},
}
}
chain = create_tagging_chain(schema, llm)

正如我们在示例中看到的,它正确地解释了我们的需求,但结果可能会不同,例如不同语言的情感('positive'、'enojado'等)。

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

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': 'Spanish'}
inp = "Weather is ok here, I can go outside without much more than a coat"
chain.run(inp)
{'sentiment': 'positive', 'aggressiveness': 0, 'language': 'English'}

更多控制

通过明确定义模式,我们可以更好地控制模型输出。具体而言,我们可以定义以下内容:

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

以下是如何使用enumdescriptionrequired来控制每个方面的示例:

schema = {
"properties": {
"sentiment": {"type": "string", "enum": ["happy", "neutral", "sad"]},
"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)
{'sentiment': 'happy', 'aggressiveness': 0, 'language': 'spanish'}
inp = "Estoy muy enojado con vos! Te voy a dar tu merecido!"
chain.run(inp)
{'sentiment': 'sad', 'aggressiveness': 10, 'language': 'spanish'}
inp = "Weather is ok here, I can go outside without much more than a coat"
chain.run(inp)
{'sentiment': 'neutral', 'aggressiveness': 0, 'language': 'english'}

使用Pydantic指定模式

我们还可以使用Pydantic模式来指定所需的属性和类型。我们还可以发送其他参数,例如'enum'或'description',如下所示的示例中所示。

通过使用create_tagging_chain_pydantic函数,我们可以将Pydantic模式作为输入发送,并且输出将是符合我们期望的模式的实例化对象。

通过这种方式,我们可以像在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