大语言模型如何“读懂”情绪?LangChain+千问实现情感分析系统
情感分析作为NLP的重要应用之一,广泛应用于社交媒体分析、舆情监控、产品评价等领域。情感分析的目标是通过分析文本内容,判断其中的情感倾向(正向、负向或中性),并提供相应的置信度和推理依据。
本文将详细介绍如何利用LangChain框架和Ollama模型实现一个情感分析智能体。通过代码解析和功能分析,我们将深入探讨其实现原理,并结合实际案例展示其应用效果。
完整代码放在这里了>>👉 福利来袭
掘金大礼包:《2025最全AI大模型学习资源包》无偿分享,安全可点 👈
实现目标
构建一个基于LangChain框架的情感分析智能体,能够对输入文本进行情感分类,并返回结构化的分析结果。具体功能包括:
- • 情感分类:将输入文本的情感倾向分为“正向”、“负向”或“中性”。
- • 置信度评估:提供模型对分类结果的置信度评分,范围为0到1。
- • 推理过程:生成模型对文本情感的分析推理过程,帮助用户理解分类结果的依据。
实现这一目标的核心工具包括:
- • LangChain:一个模块化、可扩展的NLP框架,支持多种模型和功能的快速集成。
- • Ollama:一个轻量级的LLM(大语言模型)框架,支持本地部署和自定义模型。
- • Pydantic:用于数据结构化的库,确保输出结果的格式统一和可验证。
先看下效果
代码分析
导入库与模型初始化
from langchain_community.llms import Ollama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, PydanticOutputParser
from langchain_core.pydantic_v1 import BaseModel, Field
from typing import Literal
model = Ollama(model="qwen2.5:7b", base_url="http://192.168.1.1:11434")
Ollama:这里导入了Ollama模型,并指定模型名称为“qwen2.5:7b”。需要注意的是,base_url指向本地Ollama服务的地址,这意味着模型需要在本地运行。 LangChain组件:导入了ChatPromptTemplate用于构建提示模板,StrOutputParser和PydanticOutputParser用于处理模型输出。
数据结构定义
为了确保情感分析的结果能以统一且可验证的结构返回,我们使用Pydantic库定义了一个数据模型来存储情感分析的输出。
class SentimentAnalysisResult(BaseModel):
"""情感分析结果数据结构化定义"""
sentiment: Literal["正向", "负向", "中性"] = Field(
..., description="情感分类结果"
)
confidence: float = Field(
..., description="模型置信度,范围0-1", ge=0, le=1
)
reasoning: str = Field(
..., description="模型的分析推理过程"
)
SentimentAnalysisResult:这是一个基于Pydantic的模型类,用于定义情感分析结果的结构。
- • sentiment:情感分类结果,取值范围为“正向”、“负向”或“中性”。
- • confidence:模型对分类结果的置信度,范围为0到1。
- • reasoning:模型的推理过程,用于解释分类结果。
情感分析智能体类
我们定义了一个情感分析智能体类,负责初始化模型、处理用户输入并返回分析结果。
class SentimentAnalysisAgent:
def__init__(self, model_name="llama3"):
"""初始化情感分析智能体"""
self.model_name = model_name
self.parser = PydanticOutputParser(pydantic_object=SentimentAnalysisResult)
# 构建系统提示模板
self.prompt_template = ChatPromptTemplate.from_messages([
("system", """你是一个专业的情感分析AI助手。请严格遵循以下规则:
1. 分析用户输入的文本情感
2. 返回JSON格式:{{"sentiment":"正向/中性/负向", "confidence":0.0-1.0, "reasoning":"分析原因"}}
3. 置信度保留3位小数
4. 必须使用中文进行推理"""),
("user", "待分析文本:{input}")
])
# 构建处理链
self.chain = (
self.prompt_template
| model # 绑定Ollama模型
| StrOutputParser() # 获取原始字符串输出
)
在初始化情感分析智能体时,我们指定了模型的名称,并通过ChatPromptTemplate构建了一个聊天提示模板,用于向Ollama模型提供用户输入的文本。PydanticOutputParser用于将模型的输出解析成SentimentAnalysisResult数据结构。
分析方法
def analyze(self, text: str) -> SentimentAnalysisResult:
"""执行情感分析"""
# 执行处理链
raw_output = self.chain.invoke({"input": text})
try:
# 解析模型输出
return self.parser.parse(raw_output)
except Exception as e:
# 错误处理(可根据需要扩展)
raise ValueError(f"解析失败: {e}\n原始输出: {raw_output}")
在分析过程中,我们通过执行处理链来生成原始输出,并将其解析为结构化的情感分析结果。如果解析过程中出现错误,将抛出异常,供开发者排查。
使用示例
if __name__ == "__main__":
# 初始化智能体(首次使用需要加载模型,可能需要较长时间)
agent = SentimentAnalysisAgent(model_name="llama3")
# 测试用例
test_cases = [
"我刚刚拿到了梦寐以求的录取通知书了,太开心了!",
"这家餐厅的服务糟糕透顶,再也不会来了。",
"根据最新数据统计,本市人口达到1000万。",
"这个产品既有优点也有缺点,需要进一步评估。"
]
# 执行分析
for text in test_cases:
print(f"分析文本:{text}")
try:
result = agent.analyze(text)
print(f"情感:{result.sentiment}")
print(f"置信度:{result.confidence:.3f}")
print(f"推理:{result.reasoning}\n")
except Exception as e:
print(f"错误:{str(e)}\n")
在示例中,我们对几个测试用例执行情感分析,并输出分类结果、置信度和推理过程。
效果
分析文本:我刚刚拿到了梦寐以求的录取通知书了,太开心了! 情感:正向 置信度:0.985 推理:用户表达了获得梦寐以求的通知书后的极度开心情绪,因此可以判断为正向情感。
分析文本:这家餐厅的服务糟糕透顶,再也不会来了。 情感:负向 置信度:0.982 推理:用户对餐厅服务的评价非常负面,并明确表示不会再次光顾,这表明其情绪较为消极。
分析文本:根据最新数据统计,本市人口达到1000万。 情感:中性 置信度:0.987 推理:该陈述仅提供了统计数据,并未包含任何情感色彩或态度表达,因此属于中性情感。
分析文本:这个产品既有优点也有缺点,需要进一步评估。 情感:中性 置信度:0.856 推理:这句话表达了一个客观的观点,既提到了产品的正面和负面因素,但没有表现出明显的积极或消极情感倾向,因此判断为中性。
总结
通过本文的介绍,我们详细解析了如何利用LangChain框架和Ollama模型实现情感分析智能体。该实现不仅能够对文本进行情感分类,还能提供置信度和推理过程,为用户提供了全面的情感分析结果。
完整代码放在这里了>>👉 福利来袭
掘金大礼包:《2025最全AI大模型学习资源包》无偿分享,安全可点 👈