多智能体协作的自动化视频舆情分析报告生成器

1. 项目的意义与价值

从“非结构化视频”中挖掘“结构化洞察”的通用挑战

在当今的数字生态中,视频已成为信息传播、知识分享和消费者意见表达的核心媒介。从企业内部的会议录屏、技术培训,到外部的市场宣传、用户评测,海量视频内容正以前所未有的速度被创造出来。然而,对于绝大多数组织而言,这个庞大的视频库仍然是“暗数据”——蕴含着无尽的价值,却因其非结构化的特性,而难以被高效地检索、分析和利用。

人工观看并提炼视频信息的方法,成本高昂、效率低下且无法规模化,这构成了企业在智能化转型中面临的普遍瓶颈。

本项目旨在解决这一通用挑战。构建了一个由多个AI智能体(Agent)协作的自动化工作流,该系统如同一支永不疲倦的虚拟分析师团队,能够:

  • 规模化处理: 自动消化并理解海量的视频源。
  • 深度多模态理解: 同时“看懂”视频画面并“听懂”语音内容,实现跨模态的信息融合。
  • 智能提炼: 将线性的、非结构化的视频信息,转化为结构化的、可量化的数据资产。
以汽车行业为例:一个高价值的垂域应用场景

上述挑战在那些产品复杂、竞争激烈、且高度依赖市场反馈的行业中尤为突出。为了具体展示本系统的强大能力,我们将聚焦于一个典型的高价值应用场景——新款汽车的市场舆情分析。

当一家车企发布一款新车后,其成败往往在最初的“黄金72小时”就已初见端倪。市场的真实声音,就分散在YouTube、B站等平台上成百上千个KOL(关键意见领袖)的深度评-
测视频中。车企高层迫切需要知道:

  • 市场最关注我们新车的哪些核心特性
  • 在这些特性上,主流观点是正面还是负面
  • 评测中,大家都在拿我们的车和哪些竞品做对比?
  • 我们真正的优势和短板是什么?

本Jupyter Notebook将完整地、端到端地实现一个智能体系统来回答这些问题。我们将演示,这个系统如何自动处理多个关于同一款新车的评测视频,并通过“探索-分析-策略”的多阶段智能体协作,最终生成一份包含量化数据和深度洞察的专业级Markdown舆情洞察报告

这不仅是一个技术演示,更是一个未来商业智能工作模式的缩影——将AI智能体应用于垂直领域,从而在海量信息中赢得决策先机。

2. 环境准备:安装所有必需的库

# 运行此单元格以安装所有依赖项
!pip install agno baidu-aip openai opencv-python-headless moviepy pydub yt-dlp

3. 导入核心库

import os
import json
import base64
import re
import logging
from typing import Dict, List, Iterator
from concurrent.futures import ThreadPoolExecutor, as_completed# 框架与核心工具
from agno.agent import Agent, RunResponse
from agno.workflow import Workflow
from agno.models.openai import OpenAIChat
from aip import AipSpeech
import cv2
from moviepy.editor import VideoFileClip
from pydub import AudioSegment
import yt_dlp
from openai import OpenAI
from tqdm.notebook import tqdm
from IPython.display import display, Markdown

4. 🚀 配置中心

百度智能云的语音识别相关配置需登录/申请使用,文心多模态大模型在星河社区首页点击即送~

class Config:# --- 百度智能云 API 配置 ---BAIDU_APP_ID = "YOUR_BAIDU_APP_ID"BAIDU_API_KEY = "YOUR_BAIDU_API_KEY"BAIDU_SECRET_KEY = "YOUR_BAIDU_SECRET_KEY"# --- 文心多模态大模型 API 配置 ---# ERNIE_MODEL_NAME可选ernie-4.5-turbo-vl或ernie-4.5-vl-28b-a3bERNIE_API_KEY = "YOUR_ERNIE_API_KEY"ERNIE_BASE_URL = "https://aistudio.baidu.com/llm/lmapi/v3" ERNIE_MODEL_NAME = "ernie-4.5-turbo-vl" # --- 视频源配置 (请提供1个或多个YouTube评测视频链接) ---VIDEO_URLS = ["https://www.youtube.com/watch?v=l-SSk-fuNl8", "https://www.youtube.com/watch?v=YJ_Qs-zziMc"]# --- 工作目录与分析参数 ---WORKING_DIRECTORY = "./auto_market_research"CHUNK_DURATION_SECONDS = 30LANGUAGE_MAP = {"普通话": 1537, "英语": 1737, "粤语": 1637, "四川话": 1837}SELECTED_LANGUAGE = "普通话"# --- 并发与重试 ---MAX_CONCURRENCY = 4MAX_RETRIES = 3# --- 日志与环境设置 ---
os.makedirs(Config.WORKING_DIRECTORY, exist_ok=True)
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger("VideoAnalysisSystem")

5. 辅助工具与预处理模块

包含为Agent工作流准备数据的所有底层函数。它是一个确定性的数据处理管道,负责将视频URL转换为结构化的分析日志。

def extract_json_from_response(text: str) -> dict or list:"""从LLM的返回文本中稳健地提取JSON对象或列表。"""if not text or not isinstance(text, str): return {}match = re.search(r'```(?:json)?\s*(\{.*\}|\[.*\])\s*```', text, re.DOTALL)if match: json_str = match.group(1)else:match = re.search(r'(\{.*\}|\[.*\])', text, re.DOTALL)if not match: return {}json_str = match.group(0)try:return json.loads(json_str)except json.JSONDecodeError: return {}def download_video_with_yt_dlp(video_url: str, output_dir: str, video_id: str) -> str:"""使用 yt-dlp 下载视频,限制分辨率为最高720p以加快处理速度。"""full_video_path = os.path.join(output_dir, f"{video_id}.mp4")ydl_opts = {'format': 'bestvideo[ext=mp4][height<=720]+bestaudio[ext=m4a]/best[ext=mp4][height<=720]/best','outtmpl': full_video_path, 'quiet': True, 'noplaylist': True, 'retries': 3,}try:with yt_dlp.YoutubeDL(ydl_opts) as ydl:ydl.download([video_url])return full_video_path if os.path.exists(full_video_path) else Noneexcept Exception as e:logger.error(f"yt-dlp 下载出错 for {video_url}: {e}")return Nonedef run_audio_transcription(video_path: str, config: Config) -> List[Dict]:"""从视频中提取音频并进行转录。"""temp_audio_path = os.path.join(config.WORKING_DIRECTORY, f"temp_audio_{os.path.basename(video_path)}.wav")try:with VideoFileClip(video_path) as video:video.audio.write_audiofile(temp_audio_path, codec='pcm_s16le', fps=16000, logger=None)full_audio = AudioSegment.from_wav(temp_audio_path).set_channels(1)asr_client = AipSpeech(config.BAIDU_APP_ID, config.BAIDU_API_KEY, config.BAIDU_SECRET_KEY)dev_pid = config.LANGUAGE_MAP.get(config.SELECTED_LANGUAGE, 1537)tasks = [{"start_time": i / 1000.0, "data": full_audio[i:i + config.CHUNK_DURATION_SECONDS * 1000].raw_data}for i in range(0, len(full_audio), config.CHUNK_DURATION_SECONDS * 1000)if len(full_audio[i:i + config.CHUNK_DURATION_SECONDS * 1000].raw_data) > 1000]transcripts = []with ThreadPoolExecutor(max_workers=config.MAX_CONCURRENCY) as executor:future_to_task = {executor.submit(asr_client.asr, task["data"], 'pcm', 16000, {'dev_pid': dev_pid}): task for task in tasks}for future in tqdm(as_completed(future_to_task), total=len(tasks), desc=f"音频转录 ({os.path.basename(video_path)})"):result = future.result()if result and result.get("err_no") == 0 and result.get("result"):task_info = future_to_task[future]transcripts.append({"start_time": task_info["start_time"], "end_time": task_info["start_time"] + config.CHUNK_DURATION_SECONDS, "text": "".join(result["result"])})return sorted(transcripts, key=lambda x: x['start_time'])finally:if os.path.exists(temp_audio_path): os.remove(temp_audio_path)def run_vision_analysis(video_path: str, transcripts: List[Dict], config: Config) -> List[Dict]:"""对视频帧进行分块分析。"""vision_client = OpenAI(api_key=config.ERNIE_API_KEY, base_url=config.ERNIE_BASE_URL)cap = cv2.VideoCapture(video_path)duration = cap.get(cv2.CAP_PROP_FRAME_COUNT) / cap.get(cv2.CAP_PROP_FPS)tasks = []for start_s in range(0, int(duration), config.CHUNK_DURATION_SECONDS):end_s = min(start_s + config.CHUNK_DURATION_SECONDS, duration)frames_b64 = []for i in range(int(end_s - start_s)):cap.set(cv2.CAP_PROP_POS_MSEC, (start_s + i) * 1000)ret, frame = cap.read()if ret:_, buffer = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 70])frames_b64.append(base64.b64encode(buffer).decode('utf-8'))if frames_b64:context_transcript = " ".join([t['text'] for t in transcripts if max(start_s, t['start_time']) < min(end_s, t['end_time'])])tasks.append({"start_time": start_s, "end_time": end_s, "frames": frames_b64, "transcript": context_transcript})cap.release()vision_analysis = []with ThreadPoolExecutor(max_workers=config.MAX_CONCURRENCY) as executor:future_to_task = {}for task in tasks:prompt = f"你是一个视频分析AI。请结合语音内容“{task['transcript']}”和以下图像帧,用一段话详细描述从{int(task['start_time'])}秒到{int(task['end_time'])}秒的视频场景和核心事件。"content_list = [{"type": "text", "text": prompt}] + [{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{f}"}} for f in task['frames']]messages = [{"role": "user", "content": content_list}]future = executor.submit(vision_client.chat.completions.create, model=config.ERNIE_MODEL_NAME, messages=messages, temperature=0.1, max_tokens=2048)future_to_task[future] = taskfor future in tqdm(as_completed(future_to_task), total=len(tasks), desc=f"视觉分析 ({os.path.basename(video_path)})"):response = future.result()task_info = future_to_task[future]vision_analysis.append({"start_time": task_info['start_time'], "end_time": task_info['end_time'], "description": response.choices[0].message.content.strip()})return sorted(vision_analysis, key=lambda x: x['start_time'])def batch_preprocess_videos(config: Config) -> Dict[str, str]:"""批量预处理视频,并增加缓存机制,跳过已处理的视频。"""video_log_paths = {}for url in config.VIDEO_URLS:try:video_id = url.split("=")[-1].split("&")[0]log_path = os.path.join(config.WORKING_DIRECTORY, f"log_{video_id}.json")if os.path.exists(log_path):logger.info(f"✅ [缓存] 发现已处理的日志,跳过预处理: {video_id}")video_log_paths[video_id] = log_pathcontinuelogger.info(f"--- 开始预处理新视频: {video_id} ---")video_path = download_video_with_yt_dlp(url, config.WORKING_DIRECTORY, video_id)if not video_path: continuetranscripts = run_audio_transcription(video_path, config)vision_analysis = run_vision_analysis(video_path, transcripts, config)analysis_log = [{"start_time": v['start_time'], "end_time": v['end_time'], "transcript": " ".join([t['text'] for t in transcripts if max(v['start_time'], t['start_time']) < min(v['end_time'], t['end_time'])]), "vision_description": v['description']} for v in vision_analysis]with open(log_path, 'w', encoding='utf-8') as f:json.dump(analysis_log, f, indent=2, ensure_ascii=False)video_log_paths[video_id] = log_pathlogger.info(f"✅ 视频 {video_id} 预处理完成 -> {log_path}")except Exception as e:logger.error(f"❌ 视频 {url} 预处理失败: {e}", exc_info=True)return video_log_paths

6. 🤖 Agent 工作流定义

这是项目的核心大脑,定义了三个智能体角色(探索者、分析师、策略师)以及驱动它们的agno工作流。

def create_llm(config: Config, temperature: float = 0.2):"""创建配置好的LLM实例"""return OpenAIChat(id=config.ERNIE_MODEL_NAME, api_key=config.ERNIE_API_KEY, base_url=config.ERNIE_BASE_URL,temperature=temperature)class AutoMarketResearchWorkflow(Workflow):def __init__(self, config: Config, video_log_paths: Dict[str, str]):super().__init__()self.config = configself.video_logs = {vid: json.load(open(path, 'r', encoding='utf-8')) for vid, path in video_log_paths.items()}def run(self) -> Iterator[RunResponse]:# --- 阶段1: 探索 Agent (自动发现关键维度) ---yield RunResponse(content="--- **阶段1: 探索Agent** 正在自动发现核心分析维度 ---\n")explorer_agent = Agent(model=create_llm(self.config, temperature=0.0),instructions=["你是一个市场洞察专家,任务是从多个视频的分析日志中,自动归纳出被反复讨论的【产品核心特性】和被明确提及的【竞争对手】。你的输出必须是一个格式正确的JSON对象,包含`key_features`和`competitors`两个列表。"])all_logs_text = json.dumps(self.video_logs, ensure_ascii=False, indent=2)response = explorer_agent.run(f"请分析以下来自多个视频的日志,归纳出核心特性和竞争对手。\n```json\n{all_logs_text}\n```")discovered_dims = extract_json_from_response(response.content)self.session_state['key_features'] = discovered_dims.get('key_features', [])self.session_state['competitors'] = discovered_dims.get('competitors', [])yield RunResponse(content=f"✅ **探索完成!**\n   - **发现特性**: {self.session_state['key_features']}\n   - **发现竞品**: {self.session_state['competitors']}\n")# --- 阶段2: 分析师 Agent (基于发现的维度进行标注) ---yield RunResponse(content="\n--- **阶段2: 分析师Agent** 正在对视频进行聚焦分析和情感标注 ---\n")analyst_agent = Agent(model=create_llm(self.config),instructions=["你是一位严谨的分析师,任务是精读一份视频日志,抽取出所有关于指定【分析维度】的观点,并标注情感。你的输出必须是一个格式正确的JSON列表,每个对象包含`dimension`, `sentiment` ('positive', 'negative', 'neutral'), `quote`, 和 `timestamp`。"])tagged_reports = {}analysis_dims = self.session_state['key_features'] + self.session_state['competitors']for video_id, log_data in self.video_logs.items():prompt = f"分析以下视频日志,抽取出所有关于【分析维度: {analysis_dims}】的观点。\n日志:\n```json\n{json.dumps(log_data, ensure_ascii=False, indent=2)}\n```"response = analyst_agent.run(prompt)tagged_reports[video_id] = extract_json_from_response(response.content)self.session_state['tagged_reports'] = tagged_reportsyield RunResponse(content=f"✅ **观点标注完成**,已处理所有视频。\n")# --- 阶段3: 策略师 Agent (整合数据并撰写报告) ---yield RunResponse(content="\n--- **阶段3: 市场策略师Agent** 正在撰写最终洞察报告 ---\n")consolidated_db = {}for video_id, report in tagged_reports.items():if isinstance(report, list):for item in report:if isinstance(item, dict) and 'dimension' in item:dim = item['dimension']if dim not in consolidated_db: consolidated_db[dim] = []consolidated_db[dim].append({**item, "source_video": video_id})strategist_agent = Agent(model=create_llm(self.config, temperature=0.4),instructions=["你是一位高级市场策略师,任务是基于一份聚合后的舆情数据库,撰写一份给公司高层看的、专业的Markdown市场洞察报告。报告必须包含:1. 核心特性正负面评价统计分析。2. 主要优缺点总结(引用原话)。3. 竞品对比分析。4. 结论与建议。"])prompt = f"这是关于新款汽车的聚合舆情数据。请基于此数据撰写一份深入的Markdown洞察报告。\n聚合舆情数据库:\n```json\n{json.dumps(consolidated_db, ensure_ascii=False, indent=2)}\n```"response = strategist_agent.run(prompt)final_report = response.contentself.session_state['final_report'] = final_reportyield RunResponse(content="\n--- **工作流成功结束** ---")yield RunResponse(content="\n\n" + "="*80 + "\n            最终舆情洞察报告\n" + "="*80 + "\n\n")yield RunResponse(content=final_report)

7. 🎬 主程序执行

运行此单元格将启动整个流程,并最终在下方渲染出完整的Markdown报告。

def main():"""主执行入口"""# 检查配置是否填写if not Config.BAIDU_APP_ID or "YOUR_" in Config.BAIDU_APP_ID or \not Config.ERNIE_API_KEY or "YOUR_" in Config.ERNIE_API_KEY:logger.error("❌ 致命错误: 请在第4步的 Config 类中填入您真实的百度智能云和文心模型的 API Keys。")return# 步骤1: 批量预处理,带有缓存机制logger.info(">>> 开始批量视频预处理...")video_log_paths = batch_preprocess_videos(Config)if not video_log_paths:logger.error("所有视频均预处理失败,工作流终止。请检查视频链接或网络连接。")return# 步骤2: 初始化并运行Agent工作流logger.info("\n>>> 预处理完成,开始运行Agent工作流...")workflow = AutoMarketResearchWorkflow(Config, video_log_paths)final_report_content = ""# 流式打印工作流的每一步输出for response in workflow.run():print(response.content, end="")# 持续捕获最终报告的完整内容if "最终舆情洞察报告" in response.content:final_report_content = "" # 报告开始,清空内容else:final_report_content += response.content# 步骤3: 使用Markdown格式优雅地展示最终报告logger.info("\n\n>>> 工作流执行完毕,正在渲染最终报告...")final_report_from_state = workflow.session_state.get('final_report')if final_report_from_state:# 使用Markdown格式优雅地展示最终报告display(Markdown(final_report_from_state))else:# 如果因为某些原因 state 中没有报告,再给出一个明确的失败提示error_message = "# 未能生成最终报告\n工作流已结束,但在 session_state 中未找到 'final_report'。请检查策略师Agent的运行日志。"display(Markdown(error_message))# --- 运行! ---
if __name__ == "__main__":main()

最终输出:

新款汽车市场洞察报告

1. 核心特性正负面评价统计分析

根据聚合舆情数据库,我们对新款汽车的核心特性进行了正负面评价的统计分析。以下是主要特性的情感分布:

  • 3.0T直列六缸发动机: 正面评价: 100%
  • 48伏轻混系统: 正面评价: 100%
  • 采埃孚变速箱: 正面评价: 100%
  • 前置适时四驱和多片离合器: 正面评价: 100%
  • 华为ADS 2.0智驾系统: 正面评价: 100%
  • CDC可变阻尼减震器和单腔空气悬挂: 正面评价: 100%
  • 竞品对比(奔驰、宝马、奥迪): 负面评价较多
2. 主要优缺点总结

优点

  • 3.0T直列六缸发动机:

    • 用户评价:“3.0t,直接最大马力381匹,最大扭矩520牛米,百公里加速仅需4.8秒。”
  • 48伏轻混系统:

    • 用户评价:“车加入了48伏轻混系统,当速度起来之后,发动机介入,动力采用了直列六缸布局,可以做到动力输出更强劲,更平稳。”
  • 采埃孚变速箱:

    • 用户评价:“变速箱的换挡逻辑清晰,仿佛它能读懂你的心思,迅速降低到合适的档位,既满足了动力需求,同时也尽量减少了更多的顿挫感。”
  • 前置适时四驱和多片离合器:

    • 用户评价:“在非铺装路面上,它才会自动切换到四驱,可以提供更好的驾驶体验和稳定性。”
  • 华为ADS 2.0智驾系统:

    • 用户评价:“它搭载了华为研发的ADS 2.0智驾系统,基本上哪里都能开。”
  • CDC可变阻尼减震器和单腔空气悬挂:

    • 用户评价:“底盘采用了电动四驱,领先全系标配的CDC可变阻尼减震器和单腔空气悬挂,不论是配置还是用料都属于上乘。”

缺点

  • 竞品对比中的负面评价:
    • 用户评价(奔驰、宝马、奥迪): “呆个两三年哪有BBA(奔驰、宝马、奥迪)有面子,甚至不如奥迪A6L有面子,一个小康出品的车吧,就是个杂牌货被你吹得像个豪车。”
3. 竞品对比分析
  • 奔驰:

    • 负面评价集中在品牌价值方面,认为新款汽车不如奔驰有面子。
    • 用户评价:“你你却还停留在70、80后的BBA(奔驰、宝马、奥迪)时代,问界M9提鞋都不配。”
  • 宝马:

    • 正面评价:宝马的驾驶体验仍然受到认可。
    • 负面评价:认为新款汽车在某些方面已经超越宝马。
    • 用户评价:“论舒适豪华都说奔驰舒适豪华,但问界M9比奔驰还要舒适,内饰要比奔驰E还豪华,高档,加速也比宝马快。”
  • 奥迪:

    • 负面评价:与奔驰、宝马类似,认为新款汽车在某些方面已经超越奥迪。
    • 用户评价:“满大街的BBA,眼下国内很多款车型已经超越了我们一代人过时的梦想了。”
  • 问界M9:

    • 正面评价:在多个方面(舒适性、内饰豪华度、加速性能、智能化和辅助驾驶)都得到了高度评价。
    • 用户评价:“买问界M9的车主,那都是真大哥,家里都是已经有两部三部车子的了,都是家里已经有奔驰、宝马、奥迪的了,再买问界M9是为了提高享受生活,提升出行的品质。”
4. 结论与建议

结论

  • 新款汽车在动力性能、驾驶体验、智能化和辅助驾驶方面得到了用户的高度评价。
  • 竞品对比中,奔驰、宝马和奥迪在品牌价值方面仍然有一定优势,但新款汽车在多个方面已经表现出超越竞品的潜力。
  • 问界M9作为新款汽车的竞品,在舒适性、内饰豪华度、加速性能、智能化和辅助驾驶方面都得到了用户的认可。

建议

  • 品牌建设:加强品牌宣传,提升品牌价值和知名度,以更好地与奔驰、宝马和奥迪等竞品竞争。
  • 产品优化:继续优化产品性能,特别是在智能化和辅助驾驶方面,以保持领先地位。
  • 市场定位:明确市场定位,针对已有豪车(如奔驰、宝马、奥迪)的车主进行精准营销,强调新款汽车在提升生活品质和出行体验方面的优势。

通过以上分析和建议,我们相信新款汽车在市场上将有更大的发展潜力和竞争力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920215.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920215.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920215.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java全栈开发面试实录:从基础到实战的深度解析

Java全栈开发面试实录&#xff1a;从基础到实战的深度解析 面试官与应聘者的对话记录 第一轮&#xff1a;基础问题与项目背景 面试官&#xff08;中年男性&#xff0c;穿着整洁&#xff09;&#xff1a; 你好&#xff0c;欢迎来到我们公司。我是今天的面试官&#xff0c;可以先…

如何清除webview138、139版本软键盘占用的区域

好的&#xff0c;这个问题非常具体且关键。在 Android System WebView 的 138 和 139 版本&#xff08;基于 Chromium 113&#xff09;的上下文中&#xff0c;“清除软键盘占用的区域”通常意味着&#xff1a;在软键盘收起后&#xff0c;WebView 的布局或视口没有正确恢复&…

深度学习:卷积神经网络(CNN)

文章目录一、CNN 基础认知1.1 图像在计算机中的存储形式1.2 图像识别的核心需求&#xff1a;画面不变性1.3 传统神经网络的局限二、CNN 核心原理&#xff1a;三大核心层与关键操作2.1 卷积层&#xff08;1&#xff09;什么是卷积操作&#xff1f;&#xff08;2&#xff09;卷积…

iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持

在之前的 《Flutter 又双叒叕可以在 iOS 26 的真机上 hotload》 和 《Flutter 在 iOS 真机 Debug 运行出现 Timed out *** to update》 我们聊过&#xff0c;由于 iOS 26 开始&#xff0c;Apple 正式禁止了 Debug 时 mprotect 的 RX 权限&#xff0c;导致了 Flutter 在 Debug 运…

机器学习全流程拆解 _ 从数据到模型的科学之道

-—— 避开80%项目失败的隐形成本&#xff0c;掌握高效建模方法论*&#x1f4cc; 一、明确目标&#xff1a;成败的起点 1. 问题定位 分类任务&#xff1a;区分二分类/多分类/多标签分类预测任务&#xff1a;标量预测&#xff08;如房价&#xff09;vs 向量预测&#xff08;如股…

Android 广告轮播全实现:图片与视频混合展示的完整方案

广告轮播是移动应用中提升用户转化率的核心组件&#xff0c;尤其在电商、资讯类应用中应用广泛。传统轮播仅支持图片展示&#xff0c;而现代应用需要兼顾图片和视频内容以增强吸引力。本文将详细讲解如何实现一个支持图片与视频混合播放的高性能广告轮播&#xff0c;涵盖布局设…

AI大模型企业落地指南-笔记01

前言AI技术的发展趋势必然是越来越普及&#xff0c;越来越“技术平权”的。在未来10年内&#xff0c;AI将以各种方式“融入”人类世界&#xff0c;与人类乃至世界深度融合。一. 概念第1章 AI与大模型概述1.1 什么是AI人工智能&#xff08;全称Artificial Intelligence&#xff…

Linux-孤儿进程和僵死进程

文章目录孤儿进程概述僵死进程概述孤儿进程 概述 父进程运行结束&#xff0c;子进程还在运行&#xff0c;此时&#xff0c;子进程就成了孤儿进程&#xff08;Orphan Process&#xff09;每当出现一个孤儿进程的时候&#xff0c;内核就把孤儿进程的父进程设置为 init &#xf…

【Redis 进阶】----主从复制(重点理解流程和原理)

在分布式系统中为了解决单点问题&#xff08;某个服务器程序只有一个节点&#xff08;只搞一个物理服务器来部署这个服务器程序&#xff09;。可用性不高&#xff1a;如果这个机器挂了意味着服务就中断了&#xff1b;性能 / 支持的并发量比较有限&#xff09;。通常会把数据复制…

【Redisson】redis最佳实践-RedissonUtils+Caffeine

RedissonUtils - 企业级 Redis 缓存工具库 - 二级缓存 项目地址: hhttps://gitee.com/chen934298133/redisson-utils问题反馈: Issues邮箱: chen934298133163.com &#x1f4d6; 项目简介 RedissonUtils 是一个基于 Redisson 的企业级 Redis 缓存工具库&#xff0c;提供了完…

QT(QTableWidget)

QT6QTableWidget QTableWidget是一种Item Widget组件&#xff0c;它以表格形式和管理数据&#xff0c;表格的每个单元格关联一个QTableWidgetItem对象&#xff0c;可以设置每个单元格的文字内容、字体、文字颜色、背景色、图标等&#xff0c;还可以有复选框。每个单元格还可以存…

Sentinel相关记录

系列文章目录 draft Sentinel 是阿里巴巴开源的 轻量级服务防护组件&#xff0c;主要用于实现以下功能&#xff1a;流量控制FlowRule&#xff08;Rate Limiting&#xff09;&#xff1a;限制单位时间内的请求量&#xff0c;防止系统过载。 熔断降级DegradeRule&#xff08;Ci…

2025年渗透测试面试题总结-29(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 二百四十一、XSS 设置Http-Only如何绕过 二百四十二、XSS攻击手段分类 二百四十三、高杀软覆盖工作组的渗…

如何用Wireshark捕获当前房间路由器和主机的数据包

一、前期工作 在我的这篇文章中&#xff1a; Wireshark USRP联合波形捕获&#xff08;上&#xff09;-CSDN博客 通过192.168.1.103这个主机ip筛选Wireshark捕获的数据包&#xff0c;认为Source和Direction中至少一个包含192.168.1.103才能代表路由器和主机之间的WiFi信号。 …

深度解析游戏引擎中的相机:视图矩阵

在现代游戏引擎中&#xff0c;相机系统是不可或缺的一部分。它决定了玩家在游戏中看到的视角和场景。而视图矩阵作为相机系统的核心组件之一&#xff0c;起到了至关重要的作用。本文将深入探讨视图矩阵的原理、计算方法及其在游戏引擎中的应用。 视图矩阵的基本概念 视图矩阵…

96、23种设计模式之原型模式(5/23)

原型模式&#xff08;Prototype Pattern&#xff09;是创建型设计模式的一种&#xff0c;其核心思想是通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非通过构造函数或工厂方法从头构建。该模式将对象的创建过程从构造逻辑转移到复制操作&#xff0c…

【python与生活】如何用Python写一个简单的自动整理文件的脚本?

用 Python 写一个自动整理文件的脚本很简单&#xff0c;核心思路是&#xff1a;按文件后缀&#xff08;如 .jpg、.pdf&#xff09;将文件分类&#xff0c;移动到对应的文件夹&#xff08;如「图片」「文档」&#xff09;中。以下是一个实用的实现方案&#xff0c;新手也能轻松修…

SELinux相关介绍

目录 1.SELinux 概述 2.SELinux 的执行模式 3.SELinux 的使用 1.SELinux 概述 SELinux&#xff08; Security Enhanced Linux 安全性增强的Linux&#xff09;&#xff0c;由美国国家安全局 NSA&#xff08;National Security Agency&#xff09;开发&#xff0c;构建与 Kernel …

【C语言练习】汉诺塔

一、题目 介绍&#xff1a;汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆…

随机森林实战:在鸢尾花数据集上与决策树和逻辑斯蒂回归进行对比

前言 集成学习通过组合多个模型的优势&#xff0c;常能获得比单一模型更优的性能&#xff0c;随机森林便是其中的典型代表。它基于 Bagging 思想&#xff0c;通过对样本和特征的双重随机采样&#xff0c;构建多棵决策树并综合其结果&#xff0c;在降低过拟合风险的同时&#xf…