使用Python、OpenAI和Langchain对客户服务聊天进行分类与标注

具有结构化输出的LLM使得文本分类和标记变得极其简单。今天,我们将编写一个脚本来实现这一点——对客户服务聊天进行分类。

我们将从聊天中提取并标记关键细节,包括用户的姓名、情感、语言以及他们与客户服务代表的对话主题。

在进入代码之前,让我们回顾一下工具和要求:

  1. 本地安装Python
  2. OpenAI API密钥
  3. 一个包含代表与客户之间对话的文本文件

创建项目目录

现在,让我们创建项目目录并使用cd命令进入该目录。

mkdir text_classification && cd text_classification

 

让我们确保准备好工具和项目。因此,让我们在根目录中创建项目的入口文件

touch main.py

 

现在,创建一个虚拟环境以保持我们的依赖项被隔离,这样它们就不会干扰系统范围的Python包,然后激活它。

python -m venv .venv
source .venv/bin/activate

安装依赖项

在我们的虚拟环境设置好后,接下来安装我们的依赖项。我将使用pip,因此我将在我的项目终端中运行以下命令:

  • pydantic,一个广泛使用的Python验证库。它将允许我们声明我们期望从LLM获得的结构化输出响应的模式。
  • langchain 是一个框架和包,使得在 Python 中使用 LLM(大语言模型)变得更加简单。
  • langchain-openai 是一个 Langchain 包,提供与 OpenAI 模型的无缝集成。

我使用 pip 来安装这些依赖项,因此我将在我的项目终端运行以下命令:

pip install pydantic langchain langchain-openai

环境变量与聊天文本文件

太好了!现在我们已经安装了依赖项,让我们创建一个 .env 文件来存储我们的 OpenAI API 密钥。

OPENAI_API_KEY=sk….
在我们开始动手之前,别忘了聊天数据!

将一段客服代表与客户之间的对话从WhatsApp导出到一个文本文件中。

你可以使用我的示例聊天文件,或者使用你自己的文件。

我会把这个文本文件放在项目的根目录中,以便稍后将该文件的内容传递给LLM。

 

开始使用

现在一切都已设置好,是时候打开main.py并开始编码了。

首先,我们需要确保 OpenAI API 密钥已正确设置——否则我们将无法获得 LLM 的响应。

import os

if not os.getenv("OPENAI_API_KEY"):
   raise ValueError("OPENAI_API_KEY is not set")
接下来,让我们在终端中运行以下命令:
python main.py
如果没有出现错误,你就可以继续了。

但如果出现错误,请尝试关闭并重新打开你的终端。新的终端将加载你在 .env 文件中的变量。

接下来,让我们导入这个脚本所需的其他模块

from pydantic import BaseModel, Field
from langchain.chat_models import init_chat_model

分类架构

现在让我们来看一下这个分类和标记脚本的核心内容。

我们将使用 Pydantic 来定义一个 Classification 类,这个类将作为我们稍后传递给 LLM 的架构,以便它知道从聊天中提取和标记哪些信息。

class Classification(BaseModel):
   name: str = Field(description=The name of the user)
   sentiment: str = Field(
       description="The sentiment of the user",
       enum=["positive", "negative", "neutral"],
     )
   language: str = Field(
       description="The language of the user",
       enum=["spanish", "english"],
   )
   issue: str = Field(
       description="The issue of the user",
       enum=["technical", "billing", "account", "other"],
   )

如您所见,模式的 name 字段仅具有一个 description 属性,用于指定获取客户的名称。然而,其他字段也包含一个 enum

在某些字段中添加 enum 的原因是确保模型仅在预定义类别内进行分类,从而减少歧义并使数据更易于存储和分析。

 

结构化输出

现在,让我们创建一个聊天模型。我们将使用 with_structured_output 来传递我们的 Classification 模式。

在底层,Langchain 的 with_structured_output 方法确保 LLM 启用了结构化输出。


llm = init_chat_model(
"gpt-4o-mini", model_provider="openai").with_structured_output(Classification)

 

接下来,我们将保存来自 `chat.txt` 的聊天内容,并为 LLM 创建一个完整的提示。

with open("chat.txt", "r") as f:
   chat_text = f.read()

prompt = """Extract the desired information from the following chat.
Only extract the properties mentioned in the 'Classification' function.
Conversation:\n"""

最后,让我们使用我们的提示和聊天文本内容调用LLM,并打印结果

response = llm.invoke(prompt + chat_text)
print(response)

 

在我们的终端中,运行脚本

> python main.py
name='Andres Urdaneta' sentiment='neutral' language='spanish' issue='other'

总结与下一步

这就是我们所需的——一个使用Python、OpenAI API和Langchain对客户服务聊天进行分类和标记的完整脚本!

只需几行代码,我们就将一段杂乱的对话结构化为清晰、可操作的数据。

这个设置可以作为自动化客户洞察、构建更智能的聊天机器人,或甚至将AI驱动的分析集成到您的工作流程中的基础。

尝试调整分类方案,添加更多类别,或者将多个提示串联在一起,尽情享受吧!


如果您有任何问题,欢迎留言

更多