问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/wangjiansui/article/details/139503293

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。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号