公司动态

把全网社保问答爬下来:RAG知识库的前传

📅 2026/8/8 14:23:15
把全网社保问答爬下来:RAG知识库的前传
把全网社保问答爬下来RAG 知识库的前传文章目录把全网社保问答爬下来RAG 知识库的前传一、问题二、爬搜出所有问答链接三、解析以问为刀切开一页里的多轮问答四、存入库 本地文件双保险五、Clean去掉机构名称噪音六、为什么不用 AI 解析七、环节补全八、亮点总结九、适用场景十、扩展方向十一、总结你问 RAG 的知识从哪来不是买的数据集是一个一个问题从网页上扒下来的。一、问题上篇搭好了 RAG 智能客服——Milvus BGE-M3 DeepSeek。但知识库是空的。你需要社保问答数据结构化、一问一答的那种。正常做法找现成的数据集、买数据、或者人工整理。最省的办法政府网站上有公开的在线问答页面爬下来。二、爬搜出所有问答链接某网站的社保问答入口是一个搜索结果页分页显示。先翻页遍历importrequestsfrompyqueryimportPyQueryaspq i1327# 文件编号起点forjinrange(7,0,-1):# 从第 7 页倒着爬到第 1 页urlfhttps://sou.example.com/?q关于社保那些事title2type1page{j}responserequests.get(url)docpq(response.text)为什么倒着爬旧数据排在前面先归档。然后从搜索结果页提取所有链接过滤出.shtml结尾的——问答详情页linksdoc(a)forlinkinlinks.items():hreflink.attr(href)ifhrefand.shtmlinhref:# 打开详情页开始解析三、解析以问为刀切开一页里的多轮问答一个.shtml页面里可能包含多组问答。页面格式是每一组以问开头后面跟若干行回答文本直到下一组问或页面结束。解析规则流程图读一行 ├── 这行以问开头 │ ├── 之前有问答 → 保存上一组问答清空答案当前行新问题 │ └── 之前没有 → 当前行新问题 ├── 这行包含结束标记您还可以通过以下渠道反映 │ └── 保存最后一组结束 └── 其他行 → 追加到当前答案代码psdoc2(p)q# 当前问题answer# 当前答案fileNoneforpinps.items():textp.text()iftext.startswith(问):# 上一组问答保存iffile:file.close()myodbc.insert(q,answer,conn)answer# 新问题开始pathnamefd:\\q2\\{i}.txti1fileopen(pathname,w,encodingutf-8)qtextfile.write(text\n)elif您还可以通过以下渠道反映关于intext:# 页面结束file.close()myodbc.insert(q,answer,conn)breakelse:# 追加答案行texttext.replace(海南省社会保险服务中心医疗保险服务中心,)answertextfile.write(text\n)四、存入库 本地文件双保险两条通路数据库入库myodbc.insert(q, answer, conn)— 结构化存储后续直接导进 Milvus本地文件备份d:\q2\{编号}.txt— 爬的时候备份一份入库出问题了有源文件可回溯五、Clean去掉机构名称噪音答案里经常出现海南省社会保险服务中心医疗保险服务中心这种全称每个回答都带。直接replace去掉留下的文本更干净。texttext.replace(海南省社会保险服务中心医疗保险服务中心,)六、为什么不用 AI 解析现在做知识抽取最主流的方式是让 LLM 直接从网页里提取问答对。但在这个场景下规则比 AI 好用格式高度统一所有页面都是同一个 CMS 生成的结构完全一致边界标记明确问字就是天然切分符零推理成本不需要理解上下文不需要处理歧义可审查规则解析不会漏也不会编造LLM 可能漏也可能编这不是反 AI。是在规则能解决的时候用规则——简单、可控、零 API 费用。七、环节补全回顾整个 RAG 系统的数据链路网上公开的政务问答页面 → 爬虫遍历搜索结果页提取所有 .shtml 链接 → 逐页解析以问为边界切分出问题—答案对 → 清洗噪声去掉机构名称、页面尾注 → 存入数据库 本地文件备份 → 向量化Ollama BGE-M3入库 Milvus → RAG 检索 DeepSeek 生成回答这篇文章补上了 RAG 系列缺失的第一环——知识从哪来。八、亮点总结✅ 零成本——pyquery十几年前的库零API费用✅ 规则解析——if text.startswith(问)一条规则切分全部问答比LLM更可靠✅ 双保险——数据库入库本地文件备份入库出问题有源文件可回溯✅ 人工Clean——一行replace去掉机构名称噪音✅ 完整数据链路——从爬取到解析到清洗到入库到向量化一环不缺✅ 简单可控——规则不会漏也不会编造LLM可能漏也可能编九、适用场景政府网站公开的问答页面——CMS统一生成格式高度一致需要构建领域知识库但没有现成数据集的场景结构化的QA页面爬取——边界标记明确规则优于AI十、扩展方向增量爬取——定时检测新页面只爬增量的问答去重处理——多个页面可能包含相同问题入库前做语义去重分类标签——根据问答内容自动打标签养老/医疗/工伤/失业质量过滤——排除答案过短或含请咨询当地社保局等无效回答十一、总结不是什么高深技术。pyquery 十几年前的库解析规则就一条if text.startswith(问)。但就是这条简单的规则把散落在网上的几千条政务问答变成了结构化数据喂进了向量数据库最终变成了那个能自动回答职工缴费年限不够怎么办的智能客服。写这个脚本的时候LLM 还没进入大众视野。但思路是一样的找到规律用最简方案把它变成数据。