TL;DR:本指南将带你使用Rig库在Rust中构建一个文本分类系统。只需几行代码,你就可以创建一个能够进行情感分析并按主题分类新闻文章的系统,利用OpenAI的GPT模型实现准确的文本分类。引言文本分类是自然语言处理中的一项基本任务,涉及将预定义的类别分配给文本文档。它广泛应用于情感分析
TL;DR: 本指南将带你使用Rig库在Rust中构建一个文本分类系统。只需几行代码,你就可以创建一个能够进行情感分析并按主题分类新闻文章的系统,利用OpenAI的GPT模型实现准确的文本分类。
文本分类是自然语言处理中的一项基本任务,涉及将预定义的类别分配给文本文档。它广泛应用于情感分析、内容分类和垃圾邮件检测等应用中。大型语言模型(LLMs)显著提高了文本分类任务的准确性和灵活性,但使用它们可能会很复杂。
Rig是一个开源的Rust库,简化了LLM驱动的应用程序的开发,包括文本分类系统。在本指南中,我将带你逐步构建一个功能性的文本分类系统。我们将创建一个能够进行情感分析并按主题分类新闻文章的系统,展示Rig在现实世界文本分类任务中的应用。
💡 提示:不熟悉Rig?
如果你不熟悉Rig或想全面了解其功能,请查看我们的介绍性博客文章:Rig:用于构建LLM驱动的应用程序的Rust库。它提供了Rig功能的概述以及它如何简化Rust中的LLM应用程序开发。
💡 提示:不熟悉Rust?
本指南假设你对Rust有一定的了解,并且已经设置好了编码环境。如果你刚刚开始或需要设置环境,请查看以下快速指南:
这些资源将帮助你快速上手!
让我们从设置Rust项目并安装必要的依赖项开始。
创建一个新的Rust项目:
cargo new text_classifier
cd text_classifier
将以下依赖项添加到你的Cargo.toml
中:
[dependencies]
rig-core = "0.0.6"
tokio = { version = "1.34.0", features = ["full"] }
anyhow = "1.0.75"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenv = "0.15.0"
这些依赖项提供了我们所需的核心功能:
rig-core
:用于LLM应用程序的主要Rig库tokio
:Rust的异步运行时anyhow
:灵活的错误处理serde
和serde_json
:JSON序列化和反序列化dotenv
:从文件中加载环境变量在编码之前,设置你的OpenAI API密钥:
export OPENAI_API_KEY=your_api_key_here
我们将从一个简单的情感分析分类器开始。这将展示使用Rig进行文本分类的基础知识。
首先,定义我们的数据结构:
// 导入必要的依赖项
use rig::providers::openai;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
// 定义一个枚举来表示情感类别
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
enum Sentiment {
Positive,
Negative,
Neutral,
}
// 定义一个结构体来保存情感分类结果
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
struct SentimentClassification {
sentiment: Sentiment,
confidence: f32,
}
fn pretty_print_result(text: &str, result: &SentimentClassification) {
println!("文本: \"{}\"", text);
println!("情感分析结果:");
println!(" 情感: {:?}", result.sentiment);
println!(" 置信度: {:.2}%", result.confidence * 100.0);
println!();
}
现在,实现我们的情感分类器:
#[tokio::main]
async fn main() {
// 初始化OpenAI客户端
let openai_client = openai::Client::from_env();
// 使用Rig的Extractor创建情感分类器
let sentiment_classifier = openai_client
.extractor::<SentimentClassification>("gpt-3.5-turbo")
.preamble("
你是一个情感分析AI。对给定的文本进行情感分类。
响应为Positive、Negative或Neutral,以及置信度分数(0-1)。
示例:
文本:'这部电影太糟糕了。我讨厌每一分钟。'
结果:Negative, 0.9
文本:'今天的天气还行,没什么特别的。'
结果:Neutral, 0.7
文本:'我对即将到来的假期感到非常兴奋!'
结果:Positive, 0.95
")
.build();
// 要分类的示例文本
let text = "我绝对喜欢这家新餐厅。食物太棒了!";
// 执行情感分类
match sentiment_classifier.extract(text).await {
Ok(result) => pretty_print_result(text, &result),
Err(e) => eprintln!("情感分类错误:{}", e),
}
}
这段代码使用OpenAI的GPT-3.5-turbo模型创建了一个情感分类器。Extractor
配置了一个前言,指示模型执行情感分析并提供示例以指导其输出。当我们使用输入文本调用extract
时,模型会对情感进行分类并返回一个SentimentClassification
结构体。
运行此代码时,你应该会看到类似以下的输出:
文本:我绝对喜欢这家新餐厅。食物太棒了!
情感分析结果:
情感:Positive
置信度:95.00%
输出表明我们的情感分类器正确识别了输入文本中的积极情感。高置信度分数(0.95)表明模型对其分类非常有信心。这与输入文本中使用的强烈积极语言非常吻合。
现在我们已经介绍了基础知识,让我们构建一个更复杂的系统:一个按主题分类新闻文章并进行情感分析的新闻文章分类器。
首先,定义我们的结构体:
// 导入必要的依赖项
use rig::providers::openai;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
// 定义情感分类的枚举
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
enum Sentiment {
Positive,
Negative,
Neutral,
}
// 定义情感置信度级别的结构体
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
struct SentimentClassification {
sentiment: Sentiment,
confidence: f32,
}
// 定义表示新闻文章主题的枚举
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
enum Topic {
Politics,
Technology,
Sports,
Entertainment,
Other(String),
}
// 定义保存新闻文章分类结果的结构体
#[derive(Debug, Deserialize, JsonSchema, Serialize)]
struct NewsArticleClassification {
topic: Topic,
sentiment: SentimentClassification,
summary: String,
}
fn pretty_print_result(article: &str, result: &NewsArticleClassification) {
println!("文章:\"{}...\"", &article[..100]); // 打印前100个字符
println!("分类结果:");
println!(" 主题:{:?}", result.topic);
println!(" 情感:{:?}", result.sentiment.sentiment);
println!(" 置信度:{:.2}%", result.sentiment.confidence * 100.0);
println!(" 摘要:{}", result.summary);
println!();
}
现在,实现我们的新闻文章分类器:
#[tokio::main]
async fn main() {
// 初始化OpenAI客户端
let openai_client = openai::Client::from_env();
// 使用Rig的Extractor创建新闻文章分类器
let news_classifier = openai_client
.extractor::<NewsArticleClassification>("gpt-4")
.preamble("
你是一个新闻文章分类AI。对于给定的新闻文章:
1. 分类主要主题(Politics、Technology、Sports、Entertainment或Other)。
2. 分析整体情感(Positive、Negative或Neutral)并给出置信度分数。
3. 提供文章的简要摘要。
")
.build();
// 要分类的示例新闻文章
let article = "
在进行了首次商业太空行走并比半个多世纪以来的任何人都走得更远之后,Polaris Dawn任务的宇航员于周日凌晨安全返回地球。
SpaceX的Crew Dragon太空舱在佛罗里达州Dry Tortugas附近的墨西哥湾溅落,载有亿万富翁企业家Jared Isaacman和他的三名私人宇航员,根据SpaceX的直播。
这次雄心勃勃的太空任务是Isaacman先生与Elon Musk的SpaceX之间的合作,在轨道上度过了五天,实现了私人太空飞行的几个里程碑,并进一步证明太空旅行和太空行走不再是像NASA这样的政府机构工作的专业宇航员的专属领域。
Crew Dragon太空舱于周二发射,此前由于氦气泄漏和恶劣天气而延迟。机上有任务指挥官Isaacman先生,支付服务公司Shift4的创始人;SpaceX员工Sarah Gillis和Anna Menon;以及退役的美国空军中校Scott Poteet。
周二晚些时候,其轨道达到了地球表面以上约870英里的高点。这打破了1966年Gemini XI任务设定的853英里的非月球任务宇航员记录,并使Gillis女士和Menon女士成为有史以来飞离地球最远的女性。
周四,Isaacman先生和Gillis女士成为首批成功完成太空行走的私人宇航员。操作涉及机组人员将太空舱内的空气全部排出,因为它没有气闸,而其他两名机组人员则在无空气的太空舱内穿着宇航服。Isaacman先生移动到外面并进行了几分钟的宇航服机动性测试,然后重新进入太空舱。Gillis女士随后移动到外面并执行了相同的测试。
这是旨在加速技术进步的三次Polaris任务中的第一次,以实现Musk先生有朝一日将人类送上火星的梦想。该任务的一个关键目标是进一步开发SpaceX未来尝试任何外星殖民所需的高级宇航服。
在发射前的新闻发布会上,Isaacman先生沉思道,有一天,有人可能会穿着为这次飞行开发的宇航服踏上火星。在地球附近,商业太空行走也带来了其他可能性,比如技术人员在轨道上修理私人卫星。
在太空飞行期间,四名宇航员进行了大约40项实验,主要是关于失重和辐射对人体的影响。他们还测试了Crew Dragon与SpaceX的Starlink互联网卫星星座之间的激光通信。\
";
// 执行新闻文章分类
match news_classifier.extract(article).await {
Ok(result) => pretty_print_result(article, &result),
Err(e) => eprintln!("文章分类错误:{}", e),
}
}
运行此代码时,你可能会看到类似以下的输出:
文章:"
在进行了首次商业太空行走并比半个多世纪以来的任何人都走得更远之后,Polaris Dawn任务的宇航员于周日凌晨安全返回地球..."
分类结果:
主题:Technology
情感:Positive
置信度:90.00%
摘要:SpaceX的Crew Dragon太空舱载有亿万富翁企业家Jared Isaacman和他的三名私人宇航员成功返回地球,进行了首次商业太空行走并创下了新的距离记录。这次任务是Isaacman与SpaceX之间的合作,是旨在加速太空殖民技术进步的三次Polaris任务的一部分。SpaceX还希望开发未来火星任务所需的高级宇航服。
此输出表明我们的新闻文章分类器成功将文章分类为Technology主题。情感被分类为Positive,置信度相对较高,为90%。
分类结果与文章内容相符:
此示例展示了我们的分类器如何处理复杂的现实世界新闻文章,准确提取主要主题和整体情感。它展示了Rig处理复杂内容并提供有洞察力的分类的能力。
在使用Rig进行文本分类时,请记住以下最佳实践:
注意以下常见陷阱:
在本指南中,我们使用Rig构建了一个文本分类系统,展示了其在Rust中简化LLM驱动应用程序的能力。通过创建一个情感分析器和新闻文章分类器,我们展示了Rig在处理多样化文本分类任务时的灵活性和强大功能。
要进一步探索Rig的功能:
更多资源和社区参与:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!