大语言模型如何“读懂”情绪?LangChain+千问实现情感分析系统

2 阅读6分钟

大语言模型如何“读懂”情绪?LangChain+千问实现情感分析系统

情感分析作为NLP的重要应用之一,广泛应用于社交媒体分析、舆情监控、产品评价等领域。情感分析的目标是通过分析文本内容,判断其中的情感倾向(正向、负向或中性),并提供相应的置信度和推理依据。

本文将详细介绍如何利用LangChain框架和Ollama模型实现一个情感分析智能体。通过代码解析和功能分析,我们将深入探讨其实现原理,并结合实际案例展示其应用效果。

完整代码放在这里了>>👉 福利来袭掘金大礼包:《2025最全AI大模型学习资源包》无偿分享,安全可点 👈

实现目标

构建一个基于LangChain框架的情感分析智能体,能够对输入文本进行情感分类,并返回结构化的分析结果。具体功能包括:

  • 情感分类:将输入文本的情感倾向分为“正向”、“负向”或“中性”。
  • 置信度评估:提供模型对分类结果的置信度评分,范围为0到1。
  • 推理过程:生成模型对文本情感的分析推理过程,帮助用户理解分类结果的依据。

实现这一目标的核心工具包括:

  • LangChain:一个模块化、可扩展的NLP框架,支持多种模型和功能的快速集成。
  • Ollama:一个轻量级的LLM(大语言模型)框架,支持本地部署和自定义模型。
  • Pydantic:用于数据结构化的库,确保输出结果的格式统一和可验证。

先看下效果

image-20250228171002158

代码分析

导入库与模型初始化

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大模型学习资源包》无偿分享,安全可点 👈