构建AI智能体:五十七、LangGraph + Gradio:构建可视化AI工作流的趣味指南

简介: 本文介绍了一个基于LangGraph和Qwen大模型的可视化智能工作流系统,旨在降低AI应用门槛,让非技术用户也能轻松组合各种AI能力。系统通过四层处理引擎(预处理、情感分析、关键词提取、智能回复)自动化处理用户反馈,相比传统人工方式可大幅提升效率和质量。文章详细展示了系统架构设计、代码实现和可视化交互界面,并提供了电商客服场景的应用案例。该系统将复杂的大模型能力封装成模块化工作流,支持实时流程监控和灵活配置,有效解决了传统用户反馈处理中效率低下、标准不一等痛点。

 一、让AI触手可及

       相信我们身边或多或少总是听到很多人在说大模型大模型,可大模型具体怎么用还是一道很深的门槛,我们博文也写了很多,但具体的用法和作用,使我们还面临着一个有趣的矛盾:大模型的能力越来越强,但真正能让普通用户直接使用的AI应用却少之又少。今天,我想分享我们如何用LangGraph和Gradio构建一个可视化、可配置的AI工作流系统,让非技术用户也能轻松组合各种AI能力。

57.2-工作流定制系统-超级演示.gif

       今天没有太多理论,从我经历的实际场景出发,在我们开始技术讨论之前,先看一个真实场景,也是我们工作种大都有经历过的,如同我们电商公司的客服团队每天收到数百条用户反馈:

  • "产品很好,但配送太慢了"
  • "这个新功能太难用了"
  • "界面复杂,操作繁琐"

传统处理方式下,客服人员需要:

  • 人工阅读并理解每条反馈(3-5分钟)
  • 判断情感倾向和问题类型(2-3分钟)
  • 查找回复模板或自行组织语言(1-2分钟)
  • 主管审核后发送(5-10分钟)

57.3-用户处理流程图 ScreenShot_2025-10-08_213505_203.png

总耗时:11-20分钟/条,且质量参差不齐

       正如以上的场景,很多企业平台每天都会收到海量的用户反馈、产品评价和客户咨询。传统的人工处理方式面临着效率低下、标准不一、洞察有限三大痛点。据开放的数据统计,在客户服务实践中发现:

  • 72% 的用户反馈因响应延迟而导致客户满意度下降
  • 45% 的产品改进机会在人工处理过程中被遗漏
  • 68% 的客服回复缺乏一致性和专业性

       当用户说“这个功能太难用了”,我们是选择简单回复“感谢反馈”,还是抓住这个让产品变得更好的黄金机,作为产品设计者的角度,我们认真听取客户意见是很有必要的,作为开发者的角度,我们天天研究大模型,学习AI知识,为的就是要结合实际场景来体现AI的价值,也正是基于这些真实痛点,我们考虑是否有一种可以应用AI又符合我们的业务,提高我们的效率的方案,于是基于LangGraph,我们探索的考虑并构建了这个基于LangGraph的智能工作流示例,旨在展示如何通过AI技术实现用户反馈处理的自动化、智能化和标准化。

# 
          

image.gif

更重要的是,整个过程对用户完全透明,每个步骤都可以实时观察和配置。

二、什么是智能工作流

       智能工作流是基于人工智能技术,将多个处理节点有机组合起来的自动化系统。它就像一条智能流水线,用户反馈作为原材料输入,经过各个节点的精细加工,最终产出有价值的成品。

核心技术架构

我们的系统基于以下技术栈构建:

  • LangGraph:工作流编排框架,负责协调各个处理节点
  • Qwen大模型:提供强大的自然语言理解能力
  • Gradio:构建友好的用户交互界面
  • NetworkX:生成可视化的执行流程图

效能提升对比

57.4-流程优化时效对比-deepseek_mermaid_20251008_4415b9.png

三、四层处理引擎

让我们通过一个具体案例,深入了解智能工作流如何运作。

1. 案例背景

用户李女士在使用某产品的新功能后,提交了如下反馈:

image.gif

2. 第一层:智能预处理引擎

功能:文本清洗与标准化

预处理引擎首先对原始文本进行清理:

  • 输入:"这个新功能太难用了!!!界面太复杂了!!"
  • 输出:"这个新功能太难用了 界面太复杂了"

这个过程去除了情绪化的标点符号,统一了文本格式,为后续分析打下坚实基础。

3. 第二层:情感雷达系统

功能:精准识别用户情感倾向

情感分析节点基于Qwen大模型的深度理解能力,识别出:

  • 情感标签:negative(负面)
  • 置信度:92%
  • 触发关键词:"太难用"、"复杂"、"繁琐"

更重要的是,系统能够理解这是建设性的负面反馈,而非单纯的抱怨,因此启动了高优先级处理流程。

4. 第三层:关键词挖掘机

功能:提取核心问题点

关键词提取节点从文本中抽取出最有价值的信息:

  • 问题关键词:["界面复杂", "操作繁琐"]
  • 期望关键词:["简化"]
  • 上下文关键词:["新功能"]

这四个关键词构成了完整的问题画像,为产品改进提供了明确方向。

5. 第四层:智能回复生成器

功能:生成策略性专业回复

基于前三层的分析结果,回复生成节点创建了这样的回复:

  • “感谢您对我们新功能的坦诚反馈。我们完全理解您在界面复杂性和操作便捷性方面遇到的挑战——这确实影响了使用体验。
  • 我们的产品团队已经将'界面简化'和'操作流程优化'列为优先改进项,正在制定具体的优化方案。
  • 为了更精准地解决您遇到的问题,能否与我们分享:
  • 哪个操作步骤让您感觉最繁琐?
  • 您期望的简化方式是什么?
  • 您的详细体验将直接指导我们的产品迭代方向。再次感谢您帮助我们变得更好!”

这个回复体现了情感共鸣、问题确认、行动展示、深度互动、价值肯定五个关键要素。

6. 案例展示

6.1 场景:情感分析

示例:今天天气真好,阳光明媚,心情特别愉快!

流程节点:【文本预处理】-> 【情感分析】

57.5-情感分析工作流定制.gif

57.6-情感分析工作流节点.png

6.2 场景:产品反馈

示例:这个新功能太难用了,界面复杂,操作繁琐,希望能简化一下。

流程节点:【文本预处理】-> 【情感分析】-> 【关键词提取】

57.7-产品反馈工作流节点.gif

57.8-产品反馈工作流节点.png

6.3 场景:内容总结

示例:人工智能是当今科技发展的重要方向,它正在改变我们的生活方式。机器学习、深度学习等技术在各个领域都有广泛应用,包括医疗、金融、教育等。未来,AI将继续推动社会进步。

流程节点:【文本预处理】-> 【关键词提取】-> 【摘要生成】

57.9-内容总结工作流.gif

57.10-内容总结工作流节点.png

四、示例详细说明

  • 核心主题:基于 LangGraph 和 Qwen 大模型的可视化智能工作流系统
  • 主要功能:通过模块化的工作流节点处理文本,提供情感分析、关键词提取、摘要生成等功能,并实时可视化执行过程。

1. 代码分解

1.1 环境配置

# 配置中文字体,确保图表中的中文能正常显示
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 配置 Qwen API 密钥
# 注意:在实际生产环境中,建议使用环境变量而不是硬编码
dashscope.api_key = "sk-b76381c**************"

image.gif

1.2 数据模型定义

class AgentState(TypedDict):
    """
    工作流状态数据模型
    定义在整个工作流执行过程中传递的数据结构
    """
    message: str                    # 原始用户输入消息
    processed_message: str          # 预处理后的消息
    sentiment: str                  # 情感分析结果 (positive/negative/neutral)
    response: str                   # 最终生成的回复
    keywords: str                   # 提取的关键词
    summary: str                    # 生成的摘要

image.gif

1.3 大模型服务层

class QwenModel:
    """
    Qwen 大模型调用封装类
    负责与通义千问API进行交互,提供统一的调用接口
    """
    
    def __init__(self, model_name="qwen-turbo"):
        """
        初始化模型配置
        
        Args:
            model_name: 使用的模型名称,默认为 qwen-turbo
        """
        self.model_name = model_name
    
    def invoke(self, prompt: str) -> str:
        """
        调用 Qwen API 生成回复
        
        Args:
            prompt: 输入的提示词文本
            
        Returns:
            str: 模型生成的回复文本,或错误信息
        """
        try:
            # 调用通义千问生成API
            response = Generation.call(
                model=self.model_name,      # 指定模型
                prompt=prompt,              # 输入提示词
                seed=1234,                  # 随机种子,保证结果可复现
                max_tokens=1500,            # 最大生成token数
                temperature=0.7,            # 温度参数,控制随机性
                top_p=0.8                   # 核采样参数
            )
            
            # 检查API调用是否成功
            if response.status_code == HTTPStatus.OK:
                return response.output.text  # 返回生成的文本
            else:
                # 返回具体的错误信息
                return f"Error: {response.code} - {response.message}"
                
        except Exception as e:
            # 捕获并返回异常信息
            return f"API调用错误: {str(e)}"

image.gif

1.4 工作流节点实现

class WorkflowNodes:
    """
    工作流节点处理器
    包含所有可用的文本处理节点,每个节点负责特定的处理任务
    """
    
    def __init__(self):
        """初始化工作流节点,创建Qwen模型实例"""
        self.llm = QwenModel("qwen-turbo")  # 使用 Qwen-turbo 模型
    
    def preprocess_node(self, state: AgentState) -> Dict:
        """
        预处理节点 - 文本清洗和标准化
        
        Args:
            state: 当前工作流状态
            
        Returns:
            Dict: 包含预处理后消息的字典
        """
        message = state["message"]
        # 文本标准化处理:去除首尾空格并转为小写
        processed = message.strip().lower()
        return {"processed_message": processed}
    
    def sentiment_node(self, state: AgentState) -> Dict:
        """
        情感分析节点 - 识别文本情感倾向
        
        Args:
            state: 当前工作流状态
            
        Returns:
            Dict: 包含情感分析结果的字典
        """
        # 优先使用预处理后的消息,如果没有则使用原始消息
        processed_message = state.get("processed_message", state["message"])
        
        # 构建情感分析提示词
        prompt = f"""
        分析以下文本的情感倾向,只返回以下之一:positive, negative, neutral
        文本:{processed_message}
        
        请直接返回情感标签,不要添加其他内容。
        """
        
        # 调用大模型进行情感分析
        response = self.llm.invoke(prompt)
        sentiment = response.strip().lower()
        
        # 后处理:确保返回标准化的情感标签
        if sentiment not in ['positive', 'negative', 'neutral']:
            if '积极' in sentiment or 'positive' in sentiment:
                sentiment = 'positive'
            elif '消极' in sentiment or 'negative' in sentiment:
                sentiment = 'negative'
            else:
                sentiment = 'neutral'
                
        return {"sentiment": sentiment}
    
    def response_node(self, state: AgentState) -> Dict:
        """
        响应生成节点 - 基于分析结果生成回复
        
        Args:
            state: 当前工作流状态
            
        Returns:
            Dict: 包含生成回复的字典
        """
        processed_message = state.get("processed_message", state["message"])
        sentiment = state.get("sentiment", "unknown")  # 默认为unknown
        
        # 构建回复生成提示词
        prompt = f"""
        根据用户消息和情感分析结果生成回复。
        
        用户消息:{processed_message}
        情感分析:{sentiment}
        
        请生成一个友好、合适的回复,保持自然流畅。
        """
        
        response = self.llm.invoke(prompt)
        return {"response": response}
    
    def keyword_extraction_node(self, state: AgentState) -> Dict:
        """
        关键词提取节点 - 从文本中提取核心关键词
        
        Args:
            state: 当前工作流状态
            
        Returns:
            Dict: 包含提取关键词的字典
        """
        message = state.get("processed_message", state["message"])
        
        prompt = f"""
        从以下文本中提取3-5个最重要的关键词:
        文本:{message}
        
        请以逗号分隔的形式返回关键词,不要添加其他内容。
        """
        
        response = self.llm.invoke(prompt)
        keywords = response.strip()
        
        return {"keywords": keywords}
    
    def summary_node(self, state: AgentState) -> Dict:
        """
        摘要生成节点 - 生成文本的简洁摘要
        
        Args:
            state: 当前工作流状态
            
        Returns:
            Dict: 包含生成摘要的字典
        """
        message = state.get("processed_message", state["message"])
        
        prompt = f"""
        为以下文本生成一个简洁的摘要(不超过100字):
        文本:{message}
        
        请直接返回摘要内容,不要添加其他说明。
        """
        
        response = self.llm.invoke(prompt)
        summary = response.strip()
        
        return {"summary": summary}

image.gif

1.5 工作流管理部分

class WorkflowManager:
    """
    工作流管理器
    负责管理执行历史和工作流状态
    """
    
    def __init__(self):
        """初始化工作流管理器"""
        self.workflow_history = []  # 存储执行历史记录
    
    def get_execution_history(self):
        """
        获取执行历史记录
        
        Returns:
            list: 执行历史记录列表
        """
        return self.workflow_history
# 创建全局工作流管理器实例
workflow_manager = WorkflowManager()

image.gif

1.6 示例数据配置

EXAMPLES = {
    "客户服务": {
        "message": "你们的产品质量很好,但是配送速度有点慢,希望能改进一下。",
        "use_preprocess": True,      # 启用预处理
        "use_sentiment": True,       # 启用情感分析
        "use_keywords": True,        # 启用关键词提取
        "use_summary": True,         # 启用摘要生成
        "custom_prompt": "作为客服代表,针对用户的反馈生成专业、友好的回复,既要感谢正面评价,也要回应改进建议。"
    },
    "情感分析": {
        "message": "今天天气真好,阳光明媚,心情特别愉快!",
        "use_preprocess": True,
        "use_sentiment": True,
        "use_keywords": False,       # 不启用关键词提取
        "use_summary": False,        # 不启用摘要生成
        "custom_prompt": "根据情感分析结果,生成一个积极向上的回应。"
    },
    "内容总结": {
        "message": "人工智能是当今科技发展的重要方向,它正在改变我们的生活方式。机器学习、深度学习等技术在各个领域都有广泛应用,包括医疗、金融、教育等。未来,AI将继续推动社会进步。",
        "use_preprocess": True,
        "use_sentiment": False,      # 不启用情感分析
        "use_keywords": True,
        "use_summary": True,
        "custom_prompt": "基于摘要和关键词,生成一个关于AI发展的简短评论。"
    },
    "产品反馈": {
        "message": "这个新功能太难用了,界面复杂,操作繁琐,希望能简化一下。",
        "use_preprocess": True,
        "use_sentiment": True,
        "use_keywords": True,
        "use_summary": False,
        "custom_prompt": "作为产品经理,回应用户的负面反馈,表达改进的决心并邀请进一步交流。"
    }
}

image.gif

1.7 可视化组件部分

def generate_workflow_diagram(steps, current_step=None):
    """
    生成工作流执行流程图
    
    Args:
        steps: 步骤列表,表示工作流的执行顺序
        current_step: 当前正在执行的步骤,用于高亮显示
        
    Returns:
        str: 生成的流程图临时文件路径
    """
    try:
        # 创建图形和网络图对象
        plt.figure(figsize=(12, 4))
        G = nx.DiGraph()
        
        # 定义节点位置和样式
        pos = {}
        node_colors = []
        node_labels = {}
        
        # 添加节点到图中
        for i, step in enumerate(steps):
            G.add_node(step)
            # 水平排列节点
            pos[step] = (i * 2, 0)
            
            # 简化的节点标签显示
            if step == "开始":
                label = "开始"
            elif step == "完成":
                label = "完成"
            else:
                label = step
            
            node_labels[step] = label
            
            # 当前执行到的节点用红色高亮,其他用青色
            if step == current_step:
                node_colors.append('#FF6B6B')  # 红色高亮
            else:
                node_colors.append('#4ECDC4')  # 青色
        
        # 添加边连接节点
        for i in range(len(steps) - 1):
            G.add_edge(steps[i], steps[i + 1])
        
        # 绘制图形
        plt.clf()  # 清除之前的图形
        plt.figure(figsize=(12, 4))
        
        # 绘制节点
        nx.draw_networkx_nodes(G, pos, 
                              node_color=node_colors,
                              node_size=3000,
                              alpha=0.9)
        
        # 绘制边
        nx.draw_networkx_edges(G, pos,
                              edge_color='#666666',
                              arrows=True,
                              arrowsize=30,
                              width=2,
                              alpha=0.7)
        
        # 绘制节点标签
        nx.draw_networkx_labels(G, pos, 
                               labels=node_labels,
                               font_size=10,
                               font_weight='bold')
        
        # 设置标题和坐标轴
        plt.title("工作流执行流程图", fontsize=14, fontweight='bold', pad=20)
        plt.axis('off')  # 隐藏坐标轴
        
        # 保存到临时文件
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp_file:
            plt.savefig(tmp_file.name, format='png', dpi=100, bbox_inches='tight', facecolor='white')
            plt.close()
            return tmp_file.name
            
    except Exception as e:
        # 错误处理:生成占位图
        print(f"生成流程图错误: {e}")
        with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as tmp_file:
            plt.figure(figsize=(8, 2))
            plt.text(0.5, 0.5, "流程图生成中...", ha='center', va='center', fontsize=16)
            plt.axis('off')
            plt.savefig(tmp_file.name, bbox_inches='tight', facecolor='white')
            plt.close()
            return tmp_file.name

image.gif

1.8 用户界面部分

def create_custom_workflow_interface():
    """
    创建 Gradio 用户界面
    构建完整的工作流定制和可视化界面
    """
    
    def load_example(example_name):
        """
        加载示例数据到界面
        
        Args:
            example_name: 示例名称
            
        Returns:
            list: 示例数据的各个字段值
        """
        if example_name in EXAMPLES:
            example = EXAMPLES[example_name]
            return [
                example["message"],
                example["use_preprocess"],
                example["use_sentiment"],
                example["use_keywords"],
                example["use_summary"],
                example["custom_prompt"]
            ]
        # 如果示例不存在,返回空值
        return ["", True, True, True, True, ""]
    
    def execute_custom_workflow(message, use_preprocess, use_sentiment, use_keywords, use_summary, custom_prompt):
        """
        执行自定义工作流的核心函数
        
        Args:
            message: 用户输入的文本消息
            use_preprocess: 是否启用预处理
            use_sentiment: 是否启用情感分析
            use_keywords: 是否启用关键词提取
            use_summary: 是否启用摘要生成
            custom_prompt: 自定义提示词
            
        Yields:
            tuple: (执行结果文本, 流程图文件路径) 的元组
        """
        try:
            # 输入验证
            if not message.strip():
                yield " 请输入消息内容", generate_workflow_diagram(["开始"], "开始")
                return
                
            # 初始化工作流组件
            nodes = WorkflowNodes()
            current_state = {"message": message}
            execution_steps = []      # 记录执行的步骤
            detailed_results = {}     # 存储每个步骤的详细结果
            
            # 构建步骤列表用于流程图显示
            workflow_steps = ["开始"]
            current_active_step = "开始"
            
            # 生成初始流程图
            initial_diagram = generate_workflow_diagram(workflow_steps, current_active_step)
            
            # ==================== 预处理步骤 ====================
            if use_preprocess:
                workflow_steps.append("预处理")
                current_active_step = "预处理"
                # 实时更新界面显示
                yield " 正在执行预处理...", generate_workflow_diagram(workflow_steps, current_active_step)
                
                # 执行预处理节点
                preprocess_result = nodes.preprocess_node(current_state)
                current_state.update(preprocess_result)  # 更新状态
                execution_steps.append(" 预处理")
                detailed_results["预处理结果"] = preprocess_result.get("processed_message", "")
            
            # ==================== 情感分析步骤 ====================
            if use_sentiment:
                workflow_steps.append("情感分析")
                current_active_step = "情感分析"
                yield " 正在执行情感分析...", generate_workflow_diagram(workflow_steps, current_active_step)
                
                sentiment_result = nodes.sentiment_node(current_state)
                current_state.update(sentiment_result)
                execution_steps.append(" 情感分析")
                detailed_results["情感分析"] = sentiment_result.get("sentiment", "")
            
            # ==================== 关键词提取步骤 ====================
            if use_keywords:
                workflow_steps.append("关键词提取")
                current_active_step = "关键词提取"
                yield " 正在提取关键词...", generate_workflow_diagram(workflow_steps, current_active_step)
                
                keyword_result = nodes.keyword_extraction_node(current_state)
                current_state.update(keyword_result)
                execution_steps.append(" 关键词提取")
                detailed_results["关键词"] = keyword_result.get("keywords", "")
            
            # ==================== 摘要生成步骤 ====================
            if use_summary:
                workflow_steps.append("摘要生成")
                current_active_step = "摘要生成"
                yield " 正在生成摘要...", generate_workflow_diagram(workflow_steps, current_active_step)
                
                summary_result = nodes.summary_node(current_state)
                current_state.update(summary_result)
                execution_steps.append(" 摘要生成")
                detailed_results["摘要"] = summary_result.get("summary", "")
            
            # ==================== 响应生成步骤 ====================
            workflow_steps.append("生成回复")
            current_active_step = "生成回复"
            yield " 正在生成回复...", generate_workflow_diagram(workflow_steps, current_active_step)
            
            def custom_response_node(state):
                """
                自定义响应生成节点
                根据是否提供自定义提示词来选择生成策略
                """
                if custom_prompt:
                    # 使用用户提供的自定义提示词
                    prompt = custom_prompt
                else:
                    # 构建默认提示词,包含所有可用信息
                    base_message = state.get("processed_message", state["message"])
                    sentiment = state.get("sentiment", "")
                    keywords = state.get("keywords", "")
                    summary = state.get("summary", "")
                    
                    prompt = f"""基于以下信息生成回复:
用户原始消息: {base_message}
"""
                    # 动态添加可用信息
                    if sentiment:
                        prompt += f"情感倾向: {sentiment}\n"
                    if keywords:
                        prompt += f"关键词: {keywords}\n"
                    if summary:
                        prompt += f"内容摘要: {summary}\n"
                    
                    prompt += "\n请生成一个友好、专业的回复。"
                
                response = nodes.llm.invoke(prompt)
                return {"response": response}
            
            # 执行响应生成
            response_result = custom_response_node(current_state)
            current_state.update(response_result)
            execution_steps.append(" 生成回复")
            detailed_results["最终回复"] = response_result.get("response", "")
            
            # ==================== 完成阶段 ====================
            workflow_steps.append("完成")
            current_active_step = "完成"
            final_diagram = generate_workflow_diagram(workflow_steps, current_active_step)
            
            # 构建执行历史记录
            execution_record = {
                "input": message,
                "output": response_result["response"],
                "steps": execution_steps,
                "custom_prompt": custom_prompt,
                "detailed_results": detailed_results
            }
            workflow_manager.workflow_history.append(execution_record)
            
            # 格式化最终输出结果
            result_text = "##  执行完成!\n\n"
            
            # 显示每个步骤的详细结果
            for step_name, step_result in detailed_results.items():
                result_text += f"**{step_name}:**\n{step_result}\n\n"
            
            # 显示完整的执行流程
            result_text += f"**执行流程:** {' → '.join(execution_steps)}"
            
            # 返回最终结果
            yield result_text, final_diagram
            
        except Exception as e:
            # 错误处理
            error_text = f" 执行错误: {str(e)}"
            yield error_text, generate_workflow_diagram(["开始"], "开始")
    
    def show_execution_history():
        """
        显示执行历史记录
        
        Returns:
            str: 格式化后的历史记录文本
        """
        history = workflow_manager.get_execution_history()
        if not history:
            return " 暂无执行历史"
        
        # 构建历史记录显示文本
        history_text = "##  最近执行历史\n\n"
        # 只显示最近5条记录
        for i, record in enumerate(history[-5:], 1):
            history_text += f"###  执行记录 {i}\n"
            history_text += f"**输入:** {record['input']}\n\n"
            # 长文本截断处理
            if len(record['output']) > 200:
                history_text += f"**输出:** {record['output'][:200]}...\n\n"
            else:
                history_text += f"**输出:** {record['output']}\n\n"
            history_text += f"**步骤:** {' → '.join(record['steps'])}\n\n"
            if record.get('custom_prompt'):
                history_text += f"**自定义提示:** {record['custom_prompt']}\n\n"
            history_text += "---\n\n"
        
        return history_text
    
    def show_workflow_visualization():
        """
        显示工作流可视化说明
        
        Returns:
            str: 工作流说明文档
        """
        visualization = """
##  工作流结构
###  可用节点说明:
- **📝 预处理**: 文本清理和标准化
- **😊 情感分析**: 分析文本情感倾向 (positive/negative/neutral)
- **🔑 关键词提取**: 提取3-5个核心关键词
- **📋 摘要生成**: 生成简洁的内容摘要
- **💬 生成响应**: 基于所有信息生成最终回复
###  示例场景:
1. **客户服务**: 完整流程处理用户反馈
2. **情感分析**: 专注于情感识别和回应
3. **内容总结**: 提取关键信息和生成摘要
4. **产品反馈**: 处理负面反馈并生成改进回应
###  使用流程:
1. 选择示例或输入自定义文本
2. 配置需要启用的处理节点
3. 可选: 提供自定义提示词
4. 点击执行,观察实时流程图
5. 查看详细执行结果
"""
        return visualization

image.gif

1.9 构建 Gradio 界面

# 创建主界面块
    with gr.Blocks(title="LangGraph + Qwen 工作流定制", theme=gr.themes.Soft()) as interface:
        # 界面标题
        gr.Markdown("#  LangGraph + Qwen 工作流定制系统")
        gr.Markdown("使用通义千问大模型和可视化工作流处理文本")
        
        # ==================== 工作流执行标签页 ====================
        with gr.Tab(" 工作流执行"):
            with gr.Row():
                # 左侧配置面板
                with gr.Column(scale=1):
                    gr.Markdown("### ⚙️ 工作流配置")
                    
                    # 示例选择区域
                    gr.Markdown("####快速示例")
                    example_selector = gr.Dropdown(
                        choices=list(EXAMPLES.keys()),  # 示例选项
                        label="选择示例场景",
                        value=None,
                        interactive=True
                    )
                    
                    # 消息输入框
                    message_input = gr.Textbox(
                        label="输入消息",
                        placeholder="请输入您想要处理的消息...",
                        lines=3
                    )
                    
                    # 节点配置区域
                    with gr.Group():
                        gr.Markdown("**选择处理节点:**")
                        use_preprocess = gr.Checkbox(
                            label="文本预处理", 
                            value=True  # 默认启用
                        )
                        use_sentiment = gr.Checkbox(
                            label="情感分析", 
                            value=True
                        )
                        use_keywords = gr.Checkbox(
                            label="关键词提取", 
                            value=True
                        )
                        use_summary = gr.Checkbox(
                            label="摘要生成", 
                            value=True
                        )
                    
                    # 自定义提示词输入
                    custom_prompt = gr.Textbox(
                        label="自定义提示词 (可选)",
                        placeholder="输入自定义的提示词,用于控制最终回复的生成...",
                        lines=3
                    )
                    
                    # 执行按钮
                    execute_btn = gr.Button(" 执行工作流", variant="primary", size="lg")
                
                # 右侧结果显示面板
                with gr.Column(scale=2):
                    gr.Markdown("###  执行结果")
                    output_result = gr.Markdown(
                        label="执行结果",
                        value="等待执行工作流..."  # 初始提示
                    )
                    
                    # 流程图显示区域
                    gr.Markdown("###  实时流程图")
                    workflow_diagram = gr.Image(
                        label="工作流执行状态",
                        value=generate_workflow_diagram(["开始"], "开始"),  # 初始流程图
                        height=300  # 固定高度
                    )
        
        # ==================== 执行历史标签页 ====================
        with gr.Tab(" 执行历史"):
            with gr.Row():
                history_display = gr.Markdown(
                    label="执行历史"
                )
            with gr.Row():
                # 历史记录操作按钮
                refresh_btn = gr.Button(" 刷新历史", variant="secondary")
                clear_btn = gr.Button(" 清空历史", variant="stop")
        
        # ==================== 工作流说明标签页 ====================
        with gr.Tab(" 工作流说明"):
            visualization_display = gr.Markdown(
                label="工作流可视化说明"
            )
        
        # ==================== 事件绑定 ====================
        
        # 示例选择事件:选择示例后自动填充表单
        example_selector.change(
            fn=load_example,
            inputs=[example_selector],
            outputs=[message_input, use_preprocess, use_sentiment, use_keywords, use_summary, custom_prompt]
        )
        
        # 执行按钮事件:点击后执行工作流
        execute_btn.click(
            fn=execute_custom_workflow,
            inputs=[message_input, use_preprocess, use_sentiment, use_keywords, use_summary, custom_prompt],
            outputs=[output_result, workflow_diagram]
        )
        
        # 刷新历史事件
        refresh_btn.click(
            fn=show_execution_history,
            outputs=history_display
        )
        
        # 清空历史事件
        clear_btn.click(
            fn=lambda: "历史记录已清空",
            outputs=history_display
        )
        
        # ==================== 界面初始化 ====================
        
        # 界面加载时自动显示历史记录和工作流说明
        interface.load(
            fn=show_execution_history,
            outputs=history_display
        ).then(
            fn=show_workflow_visualization,
            outputs=visualization_display
        )
    
    return interface

image.gif

1.10 应用启动部分

if __name__ == "__main__":
    """
    应用主入口点
    启动 Gradio  web 服务器
    """
    
    # 注意:在生产环境中建议使用环境变量配置API密钥
    # os.environ["DASHSCOPE_API_KEY"] = "your-api-key-here"
    
    # 启动日志
    print(" 启动 LangGraph + Qwen 工作流定制系统...")
    print(" 请确保已设置正确的 DASHSCOPE_API_KEY")
    
    # 创建并启动界面
    interface = create_custom_workflow_interface()
    interface.launch(
        server_name="0.0.0.0",    # 允许外部访问
        server_port=7862,         # 服务端口
        share=True                # 生成公共链接
    )

image.gif

2. 代码结构说明

这个代码实现了一个完整的智能工作流系统,主要特点包括:

2.1 架构分层

  • 数据层:AgentState 定义数据流
  • 服务层:QwenModel 封装大模型调用
  • 业务层:WorkflowNodes 实现具体处理逻辑
  • 管理层:WorkflowManager 管理执行状态
  • 界面层:Gradio 构建用户界面

2.2 工作流特点

  • 模块化设计:每个节点独立,易于扩展
  • 实时可视化:动态生成执行流程图
  • 灵活配置:支持自定义节点组合
  • 历史管理:完整的执行记录追踪

2.3 核心价值

  • 将复杂的大模型能力封装成易用工具
  • 提供直观的可视化反馈
  • 支持多种文本处理场景
  • 具备良好的错误处理机制

3. 系统执行流程图

57.11-系统执行流程图-deepseek_mermaid_20251008_62baf6.png

4. 工作流程图

57.12-详细数据流图-deepseek_mermaid_20251008_4f5697.png

5. 核心处理流程

5.1 文本预处理流程

      

image.gif

技术要点:简单的文本规范化,为后续NLP处理做准备

5.2 情感分析流程

输入文本 → 构造提示词 → Qwen API调用 → 情感标签提取 → 结果标准化

image.gif

技术要点:使用提示词工程确保输出格式统一

5.3 关键词提取流程

    API    

image.gif

技术要点:限定输出格式,便于后续处理

5.4 动态可视化流程

          

image.gif

技术要点:使用NetworkX实时生成流程图,提供执行反馈

五、总结

       在传统的用户反馈处理中,大多数用户声音就像投入大海的石子,激不起什么涟漪。但通过智能工作流,我们能够让每个声音都被认真倾听、深度理解、有效回应。

       更重要的是,我们能够将看似普通的用户抱怨,转化为产品进步的催化剂,将成本中心转化为增长引擎。以前我们是在处理用户反馈,现在我们在与用户共同创造更好的产品。这不仅是技术的进步,更是产品理念的革新。不管是作为产品体验者的我们,还是产品开发者的我们,每个声音都值得被认真对待。

57.13-LangGraph2.jpg

相关文章
|
2月前
|
人工智能 自然语言处理 数据可视化
构建AI智能体:五十八、智能工作流引擎:基于LangGraph的模块化内容创作系统
本文介绍了一个基于LangGraph工作流引擎、Qwen大模型和Gradio界面的智能内容创作系统。该系统采用模块化设计,将内容创作过程分解为8个可配置节点(主题分析、大纲生成、内容创作等),通过工作流驱动实现从主题输入到完整内容(文字+配图)的全自动化生成。系统特点包括:1)灵活可配置的工作流模板;2)强类型状态管理确保数据安全;3)多重容错机制(重试/降级方案);4)实时可视化流程监控。该方案适用于营销、教育等多个场景,展示了现代AI系统中架构设计、工程实现与用户体验的有机结合。
377 3
|
2月前
|
人工智能 自然语言处理 数据可视化
构建AI智能体:五十六、从链到图:LangGraph解析--构建智能AI工作流的艺术工具
本文介绍了LangGraph这一基于LangChain的库,它突破了传统线性链式开发的局限,通过图计算模型实现复杂AI应用的构建。LangGraph的核心优势在于:1)支持动态图结构,实现循环和条件路由;2)内置状态管理,维护应用数据流;3)天然支持多智能体协作。与传统开发方式相比,LangGraph通过节点、边和状态的抽象,提供了更清晰的业务逻辑表达、更健壮的错误处理、更好的可观测性,以及更便捷的团队协作和功能扩展能力。
550 10
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
构建AI智能体:七十一、模型评估指南:准确率、精确率、F1分数与ROC/AUC的深度解析
本文系统介绍了机器学习模型评估的核心指标与方法。首先阐述了混淆矩阵的构成(TP/FP/FN/TN),并基于此详细讲解了准确率、精确率、召回率和F1分数的计算原理和适用场景。特别指出准确率在不平衡数据中的局限性,强调精确率(减少误报)和召回率(减少漏报)的权衡关系。然后介绍了ROC曲线和AUC值的解读方法,说明如何通过调整分类阈值来优化模型性能。最后总结了不同业务场景下的指标选择策略:高精度场景侧重精确率,高召回场景关注召回率,平衡场景优选F1分数,不平衡数据则推荐使用AUC评估。
366 20
|
2月前
|
人工智能 自然语言处理 API
构建AI智能体:四十二、使用 Qwen-Agent Assistant 调用高德 API 实现天气查询
本文介绍了如何将Qwen-Agent智能助手与高德天气API集成,构建一个能响应自然语言查询的天气服务系统。主要内容包括:高德天气API的注册、参数配置及数据解析方法;Qwen-Agent框架中Assistant类的核心功能和使用方式;通过FunctionCall和Assistant两种实现方式的对比;完整示例展示了从工具定义、API集成到交互界面开发的实现过程。该系统支持终端和Web两种交互模式,可扩展为智能客服、物联网控制等场景,为开发者提供了大模型与实际API服务结合的典型范例。
499 7
|
2月前
|
机器学习/深度学习 人工智能 搜索推荐
构建AI智能体:六十、特征工程行业实践录:金融、电商、医疗的智能化转型
本文通过金融风控、电商推荐和医疗诊断三个行业案例,系统阐述了特征工程的实践价值与技术方法。在金融领域,通过构建稳定性评分等特征,将贷款审批坏账率从8.2%显著降低;电商行业通过实时兴趣向量等特征,使推荐点击率提升3倍;医疗领域则利用病变严重度评分等特征,将筛查效率提升5倍。研究揭示了特征工程作为连接业务需求与技术实现的关键桥梁,其核心在于将原始数据转化为机器可理解的业务语言。
211 3
|
2月前
|
人工智能 缓存 自然语言处理
构建AI智能体:三十九、中文新闻智能分类:K-Means聚类与Qwen主题生成的融合应用
K-Means作为最经典和广泛使用的聚类算法,以其简单性和效率在数据科学中占据重要地位。尽管有其局限性,但通过合理的初始化方法、参数调优和与大模型的结合,K-Means仍然能够解决许多实际聚类问题。与大型语言模型的结合代表了现代AI应用的一个重要方向,其中K-Means负责高效处理和大规模模式识别,而大模型负责深度的语义理解和内容生成,二者优势互补,构建出更加智能和高效的AI系统。
261 12
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
构建AI智能体:三十八、告别“冷启动”:看大模型如何解决推荐系统的世纪难题
协同过滤是推荐系统中广泛使用的技术,其核心思想是利用用户行为数据发现相似用户或物品进行推荐。摘要包括:1)协同过滤基于用户历史行为数据,通过计算相似度(如余弦相似度、皮尔逊相关系数)预测用户偏好;2)主要分为基于用户(寻找相似用户群体)和基于物品(发现相似物品)两种方法;3)面临冷启动、数据稀疏性等挑战,可通过混合推荐(结合内容特征)和矩阵分解等技术解决;4)典型应用包括电商猜你喜欢和流媒体推荐;5)结合大语言模型可增强语义理解能力,提升推荐准确性。
437 9
|
3月前
|
存储 人工智能 自然语言处理
构建AI智能体:三十七、从非结构化文本到结构化知识:基于AI的医疗知识图谱构建与探索
知识图谱是一种用图结构表示实体及其关系的技术,通过三元组(主体-关系-客体)构建语义网络。文章以医疗领域为例,详细介绍了知识图谱的构建流程:数据预处理、实体识别、关系抽取、知识融合、存储与可视化等步骤。知识图谱可应用于智能问答、辅助诊断、药物研发等场景,其结构化特性可弥补大语言模型的不足,二者结合能提升AI系统的准确性和可解释性。文章还展示了基于大模型的医疗知识图谱构建代码示例,涵盖实体识别、关系抽取、图谱存储和智能问答等核心功能,体现了知识图谱在专业领域的实用价值。
713 12
|
3月前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:十、开箱即见 Gradio:大模型的“魔法画布”,让每一个想法清晰可见
Gradio是一个快速构建机器学习演示界面的Python库,能够将需要数天开发工作的模型展示缩短为几分钟的脚本编写。它通过简单的Python代码即可生成完整的Web应用界面,支持文本、图像、音频等多种交互组件,适用于模型展示、教学演示和原型测试等场景。文章详细介绍了Gradio的核心功能、基础语法和组件使用方法,并通过情感分析和聊天机器人两个实际案例展示了如何快速部署AI模型交互界面。Gradio大幅降低了将模型转化为可交互应用的门槛,使开发者能更专注于模型本身而非界面开发。
791 7
|
3月前
|
SQL 存储 自然语言处理
构建AI智能体:三十四、LangChain SQLDatabaseToolkit终极指南:架构、优势与最佳实践
SQLDatabaseToolkit 是 LangChain 框架中的一个核心组件,它不属于一个独立的软件,而是一个工具箱或工具集。它的核心目的是为大语言模型提供与 SQL 数据库进行交互的能力,将大模型的自然语言理解能力与数据库的精准数据存储和检索能力结合起来。它极大地降低了通过自然语言访问和操作 SQL 数据库的门槛,是构建基于 LLM 的数据驱动应用的关键组件之一。
481 10

热门文章

最新文章