跳到主要内容

将文本分类为标签

Tagging 意味着使用类别标记文档,例如

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

Image description

概述

Tagging 包含几个组件

  • function: 像 extraction 一样,tagging 使用 functions 来指定模型应如何标记文档
  • schema: 定义我们想要如何标记文档

快速入门

让我们看一个非常简单的示例,了解如何在 LangChain 中使用工具调用进行 tagging。我们将使用 .withStructuredOutput(),它在 选定的聊天模型 上受支持。

选择您的聊天模型

安装依赖项

yarn add @langchain/groq 

添加环境变量

GROQ_API_KEY=your-api-key

实例化模型

import { ChatGroq } from "@langchain/groq";

const llm = new ChatGroq({
model: "llama-3.3-70b-versatile",
temperature: 0
});

让我们指定一个 Zod 模式,其中包含一些属性以及我们在模式中期望的类型。

import { ChatPromptTemplate } from "@langchain/core/prompts";
import { z } from "zod";

const taggingPrompt = ChatPromptTemplate.fromTemplate(
`Extract the desired information from the following passage.

Only extract the properties mentioned in the 'Classification' function.

Passage:
{input}
`
);

const classificationSchema = z.object({
sentiment: z.string().describe("The sentiment of the text"),
aggressiveness: z
.number()
.int()
.describe("How aggressive the text is on a scale from 1 to 10"),
language: z.string().describe("The language the text is written in"),
});

// Name is optional, but gives the models more clues as to what your schema represents
const llmWihStructuredOutput = llm.withStructuredOutput(classificationSchema, {
name: "extractor",
});
const prompt1 = await taggingPrompt.invoke({
input:
"Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!",
});
await llmWihStructuredOutput.invoke(prompt1);
{ sentiment: 'positive', aggressiveness: 1, language: 'Spanish' }

正如我们在示例中看到的,它正确地解释了我们想要的内容。

结果各不相同,因此我们可能会得到例如不同语言的情感(“positive”、“enojado”等)。

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

更精细的控制

仔细的模式定义使我们能够更好地控制模型的输出。

具体来说,我们可以定义

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

让我们重新声明我们的 Zod 模式,以使用枚举控制先前提到的每个方面

import { z } from "zod";

const classificationSchema2 = z.object({
sentiment: z
.enum(["happy", "neutral", "sad"])
.describe("The sentiment of the text"),
aggressiveness: z
.number()
.int()
.describe(
"describes how aggressive the statement is on a scale from 1 to 5. The higher the number the more aggressive"
),
language: z
.enum(["spanish", "english", "french", "german", "italian"])
.describe("The language the text is written in"),
});
const taggingPrompt2 = ChatPromptTemplate.fromTemplate(
`Extract the desired information from the following passage.

Only extract the properties mentioned in the 'Classification' function.

Passage:
{input}
`
);

const llmWithStructuredOutput2 = llm.withStructuredOutput(
classificationSchema2,
{ name: "extractor" }
);

现在答案将以我们期望的方式受到限制!

const prompt2 = await taggingPrompt2.invoke({
input:
"Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!",
});
await llmWithStructuredOutput2.invoke(prompt2);
{ sentiment: 'happy', aggressiveness: 1, language: 'spanish' }
const prompt3 = await taggingPrompt2.invoke({
input: "Estoy muy enojado con vos! Te voy a dar tu merecido!",
});
await llmWithStructuredOutput2.invoke(prompt3);
{ sentiment: 'sad', aggressiveness: 5, language: 'spanish' }
const prompt4 = await taggingPrompt2.invoke({
input: "Weather is ok here, I can go outside without much more than a coat",
});
await llmWithStructuredOutput2.invoke(prompt4);
{ sentiment: 'neutral', aggressiveness: 1, language: 'english' }

LangSmith 追踪 让我们深入了解内部运作


此页面是否有帮助?


您也可以留下详细的反馈 在 GitHub 上.