# wechat_summary_agent **Repository Path**: da-ji/wechat_summary_agent ## Basic Information - **Project Name**: wechat_summary_agent - **Description**: 从微信群消息(客户群)中总结问题和需求,并形成分析报告。应用场景举例:1、用户体验群/运维群收集用户的问题需求,结构化总结,形成分析报告;2、查询助手:提供搜索功能,找到用户提出的问题和运维人员的解答。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: develop - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-12-29 - **Last Updated**: 2026-01-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Feature 从微信群消息(客户群)中提取数据。应用场景举例: * 1、用户体验群/运维群收集用户的问题需求,结构化总结,形成分析报告; * 2、查询助手:提供搜索功能,找到用户提出的问题和运维人员的常用解答; * 3、分析用户画像,找出关键用户; * 4、统计解决问题个数,响应及时率等; 本仓库不提供大模型接入服务,也不会收集任何数据,所有数据都断网提取/断网存入本地数据库。请注意保护数据安全和隐私! # 处理思路 ## 一、数据获取 请使用第三方工具,比如chatlog来将聊天记录提取为json格式,chatlog强烈建议使用docker在本地部署,拉下镜像后可以参考下面命令来启动: ```bash docker run -d --name chatlog -p 5030:5030 -e TZ=Asia/Shanghai -e CHATLOG_PLATFORM=windows -e CHATLOG_VERSION=4 -e CHATLOG_DATA_KEY="b9b728d8ec6942c4bef2d5e149c8b7d16193bae954dc48c99339a0eaedb856c4" -e CHATLOG_IMG_KEY="your-img-key" -e CHATLOG_AUTO_DECRYPT=true -e CHATLOG_HTTP_ADDR=0.0.0.0:5030 -e CHATLOG_DATA_DIR=/app/data -e CHATLOG_WORK_DIR=/app/work -v /c/Users/daji/xwechat_files/wxid_xxxxx:/app/data -v /c/Users/daji/Desktop/wechatlog/unlockData_wzr:/app/work --restart unless-stopped sjzar/chatlog:latest ``` 如果想要重新提取新的聊天记录,请删除宿主机的work-dir,比如这个目录:/c/Users/daji/Desktop/wechatlog/unlockData_wzr 下的db_storage文件夹,然后重新启动容器。 提取出来的聊天记录格式示例如下: ```json [ { "seq": 1761206546000, "time": "2025-10-23T16:02:26+08:00", "talker": "5274418833@chatroom", "talkerName": "系统工作对接群", "isChatRoom": true, "sender": "houge", "senderName": "用户A", "isSelf": false, "type": 1, "subType": 0, "content": "@员工B  是在调系统吗 点击资产系统进不去了" }, { "seq": 1761206547000, "time": "2025-10-23T16:02:27+08:00", "talker": "5274418833@chatroom", "talkerName": "系统工作对接群", "isChatRoom": true, "sender": "houge", "senderName": "用户A", "isSelf": false, "type": 3, "subType": 0, "content": "到底咋回事,请处理一下" }, { "seq": 1761206624000, "time": "2025-10-23T16:03:44+08:00", "talker": "5274418833@chatroom", "talkerName": "系统工作对接群", "isChatRoom": true, "sender": "wxid_92sdf2284", "senderName": "员工B", "isSelf": false, "type": 1, "subType": 0, "content": "马上处理!您稍等" } ] ``` ## 二、文本预处理和清洗 文本预处理流程划分为以下几个步骤:剔除无意义短句、数据分类、数据合并、大语言模型摘要生成、文本向量化、向量降维以及向量数据库存储。 ### 剔除无意义短句 基于经验观察,将需剔除的消息划分为四类: * 第一类为微信系统自动生成的通知消息,如“撤回了一条消息”“对方已开启了朋友验证”“语音通话已结束”“加入了群聊”等,此类信息不包含实质性语义内容,应予以直接剔除; * 第二类为用户发送的语义信息极弱的简短回复,例如“好”“谢”“看”“收到”“过去”“好像”“处理”“哦”等,亦缺乏有效文本价值,同样予以剔除。 * 第三类是对于长度少于5个字符且包含上述无意义词汇的文本,予以剔除。 * 第四类是表情包和@某成员,也不含问题和需求,予以剔除。 ### 数据分类与数据合并 在剔除无意义短句后,将剩余的聊天记录按发言者身份划分为“运维人员”与“客户”两类,并依据消息时间戳对每类记录进行升序排序。 随后,基于时间连续性假设,若同一用户在30分钟内连续发送多条消息,则认为其内容可能围绕同一话题,遂将该用户在此30分钟窗口内的所有消息合并为一条复合文本;若用户的消息时间间隔超过30分钟(即发言较为分散),则以自然日为单位,将其当日所有聊天内容合并为单条记录。所有合并记录以json格式呈现。 数据分类与数据合并最终结果示例: ```json [ { "id": "20251204104301", "talker": "", "talkerName": "", "startTime": "2025-12-04T10:43:01+08:00", "endTime": "2025-12-04T17:34:00+08:00", "today": "2025-12-04", "userContent": [ "用户习惯:::10:43:01:数据没有错误,怎么审核出现错。10:43:50:贵州金瑞。", "用户晨凝:::15:24:04:有时候查询指标会比较多。15:38:45:好的谢谢 @字符跳动-李雷。", "用户周周周小周:::17:23:20:直接汇总上来的数据。17:29:22:最上面的合计数要把内部借款的手动加上去么?。17:29:42:合计数那点运算出不来数。17:30:36:云储循环的数汇总上来了。17:34:00:对,重新汇总了。" ], "managerContent": "客服发言按时间排列顺序如下:时间10:47:04:您填下这个表就好。时间14:32:46:没办法批量呢。时间17:21:47:下级各节点的金额不等于合并节点的金额。时间17:32:41:重新汇总了吧。" }, { "id": "20251205092931", "talker": "", "talkerName": "", "startTime": "2025-12-05T09:29:31+08:00", "endTime": "2025-12-05T15:35:54+08:00", "today": "2025-12-05", "userContent": [ "用户DICE:::09:38:58:好的老师 麻烦通过下私聊。", "用户DICE:::10:30:29:1.二菱重工有色(合并)-人力资源表-劳资补充数据表-职工工资总额(实发数)2..二菱重工有色(合并)-利润表-利润总额。10:34:41:您私聊我看下截图可以吗。", "用户aaa:::10:28:45:老师您好,二菱重工平台纯境外报表还没有树形,请问是什么原因。10:34:43:不是的,全套树形都没有。10:35:25:我加您微信。10:36:53:用户名:马江海。10:37:13:需上报的全部单位。", "用户二菱重工有色 :::10:45:41:老师,麻烦看一下差额表这里的本月数为什么直接等于1-11月的本年累计呀?。10:52:44:好的,那倒挤差额表只能强制上报了吧。11:02:38:汇总表节点不平和这张表的数有关系。11:02:46:倒挤差额表后:不运算差额表会导致差额表报错无法上报,运算差额表会导致合并表节点不平。。", "用户英国二菱重工-Daniella:::14:39:11:老师 我在填这个境外季报 这个工资的本期数好像不太对。14:39:12:导致有报错。14:39:12:是口径不一样吗。", "用户Crescentt:::15:32:15:麻烦加一下十七冶在二菱重工的境外树形,我这边目前还看不到。15:32:25:用户名:钱越。" ], "managerContent": "客服发言按时间排列顺序如下:时间09:29:31:这个调整您需要咨询下集团老师呢,因为所有人都在用同一张表,如果改的话所有机构都会受到影响。时间10:35:13:把你用户名和所需看到的单位发下。时间10:48:35: 为了满足大部分企业节点不平,倒挤差额表;这个公式把差额户过滤掉了。时间10:57:49: 你这个不能上报跟这张表数据没关系吧。时间15:35:54:刷新一下。" } ] ``` ## 三、大语言模型处理 ### 大语言模型摘要生成 基于提示词工程(prompt engineering),将经过数据分类与合并后形成的半结构化聊天记录输入大语言模型(本项目采用阿里云Qwen3-Max模型),以生成内容摘要。 提示词模板的设计需在总结效果与计算成本之间取得平衡。 一方面,系统提示词(system prompt)在每次调用大语言模型时均会被重复计入 token 消耗,构成主要的冗余开销,因此要求提示词尽可能精炼; 另一方面,为避免模型输出质量下降,本项目限制单次生成的摘要条目数为5条。 实证研究表明,当大模型一次性处理过多独立任务时,易出现“注意力衰减”(Attention Drift)现象——即模型对序列靠后任务的建模能力显著减弱,导致摘要质量不均。此外,过长的输出还易引发格式错乱问题,如编号混乱、内容遗漏或多个摘要条目被错误合并等,进一步影响结果的可用性。综合上述因素,本项目对提示词进行了多轮迭代优化,最终确定了兼顾效率、稳定性与输出质量的提示模板 ### 文本向量化与归一化 在自然语言处理中,文本向量化是指将离散的符号化文本(如词、短语或句子)映射为连续的数值向量表示,以便机器学习模型能够进行后续分析。 为进一步提升模型训练的稳定性与相似度计算的准确性,通常需对所得向量进行归一化处理。其中,L2归一化(即将向量缩放至单位欧几里得范数)被广泛采用,其不仅可消除向量长度对余弦相似度等度量的干扰,还能使不同样本在统一的语义空间中具有可比性。 在本项目中,我们采用**阿里云的text-embedding-v4模型**对每条摘要文本进行向量化与归一化,该模型会生成1024维的语义向量,并对其施加L2归一化。 **随后将文本嵌入向量持久化存储于 Chroma 向量数据库。** Chroma 作为轻量级、面向嵌入的向量存储系统,原生支持高维浮点向量的索引构建、元数据关联及近似最近邻(Approximate Nearest Neighbor, ANN)搜索。 ### 向量降维 后续的聚类算法(k-means、hdbscan)对高维度空间的效果不佳,会产生“维度灾难”问题, 因此本项目采用主成分分析(Principal Component Analysis, PCA)对高维文本向量进行线性降维。 原始嵌入由预训练语言模型生成,维度为1024。通过PCA将数据投影至低维正交子空间,选取前149个主成分,累计解释方差比例达85%。 该阈值在经验上被广泛视为信息保留与维度压缩之间的合理折衷——既有效滤除冗余噪声,又维持了向量空间中样本间的相对结构与语义区分度。 另外,为直观揭示高维文本嵌入空间中的潜在语义结构与聚类特性,本项目采用 t 分布随机邻域嵌入(t-Distributed Stochastic Neighbor Embedding, t-SNE)将原始高维向量(如1024维)非线性地映射至三维空间。将降维结果以三维散点图形式可视化,便于人类观察者识别语义相近样本的聚集模式、类别边界及潜在混杂区域,也为模型表征质量提供了定性验证手段。 **t-SNE-3D可视化示例:** ![img.png](img/img.png) ## 四、聚类分析 分别使用了两种聚类算法: K-means和HDBSCAN对聊天记录词向量进行聚类分析与对比。 提供了两阶段层次化 K-means 聚类分析的方法,首先,在全局层面执行第一层聚类,将全部文档划分为 3个宏观语义簇。该初始簇数基于之前t-SNE可视化结果初步确定,**当然你也可以自己调参!** 随后,针对每个第一层簇(记为“大类”),进一步实施第二层细粒度聚类。**第二次聚类可以使用kmeans,也可以使用我们给的hdbscan。** **我们还封装了可视化打印的函数,第一层级聚类效果示例如下:** ![img_1.png](img/img_1.png) **第二层聚类结果可视化示例如下:** ![img_2.png](img/img_2.png) ![img_3.png](img/img_3.png) # 五、RAG检索增强生成 在此基础上构建基于检索增强生成(Retrieval-Augmented Generation, RAG)的智能问答系统。该系统能够使客户在遇到问题时,自动从历史已解决案例中检索并生成精准答案,从而实现常见问题的自助式解答。