我用 Python 搭了一套知识管理系统:从零散笔记到结构化知识库,AI 帮我自动整理

我用 Python 搭了一套知识管理系统:从零散笔记到结构化知识库,AI 帮我自动整理 我用 Python 搭了一套知识管理系统从零散笔记到结构化知识库AI 帮我自动整理适合有大量零散笔记/文档/收藏想让 AI 帮忙整理成结构化知识库的人。本文提供完整的 Python 代码从文件扫描、分类、摘要到知识图谱全程自动化。问题笔记越来越多找东西越来越难我有 200 篇笔记分散在不同文件夹、不同格式Markdown、TXT、PDF、网页收藏。每次想找某个话题的资料要在 5 个地方搜索经常找不到。根本原因是笔记没有结构化。文件名不统一、没有标签、没有分类、没有关联。后来我用 Python AI 搭了一套知识管理系统自动完成这些事情扫描所有笔记文件AI 自动提取关键词和摘要自动分类到对应目录自动建立笔记之间的关联生成知识图谱可视化系统架构文件扫描 → 内容提取 → AI 分类 → 自动整理 → 知识图谱模块 1文件扫描与内容提取扫描指定目录下的所有文件提取文本内容。importosfrompathlibimportPathdefscan_files(root_dir,extensions(.md,.txt,.py,.json)):扫描目录下所有指定类型的文件files[]forextinextensions:files.extend(Path(root_dir).rglob(f*{ext}))print(f扫描完成找到{len(files)}个文件)returnfilesdefextract_content(file_path):提取文件内容pathPath(file_path)extpath.suffix.lower()ifextin(.md,.txt,.py,.json,.yaml):returnpath.read_text(encodingutf-8,errorsignore)elifext.pdf:# 需要 PyPDF2 或 pdfplumbertry:importPyPDF2 readerPyPDF2.PdfReader(str(path))return\n.join(page.extract_text()orforpageinreader.pages)exceptImportError:print(f需要安装 PyPDF2: pip install PyPDF2)returnelse:return模块 2AI 自动提取关键词和摘要fromopenaiimportOpenAI clientOpenAI()defextract_metadata(content,max_content2000):用 AI 提取关键词、摘要、分类# 截取前 max_content 字符truncatedcontent[:max_content]promptf分析以下文本返回 JSON 格式的元数据 文本{truncated}返回格式 {{ title: 文章标题如果没有明确标题就根据内容生成一个, summary: 50字以内的摘要, keywords: [关键词1, 关键词2, 关键词3], category: 分类技术/方法论/复盘/工具/其他, tags: [标签1, 标签2] }}responseclient.chat.completions.create(modelgpt-4,messages[{role:user,content:prompt}],temperature0.3)importjsontry:returnjson.loads(response.choices[0].message.content)exceptjson.JSONDecodeError:return{title:,summary:,keywords:[],category:其他,tags:[]}模块 3自动分类整理根据 AI 提取的分类自动移动文件到对应目录。importshutildefauto_organize(files,metadata_map,output_dir):根据 AI 分类自动整理文件category_dirs{技术:01_技术,方法论:02_方法论,复盘:03_复盘,工具:04_工具,其他:05_其他,}forfile_pathinfiles:metametadata_map.get(str(file_path),{})categorymeta.get(category,其他)target_dirPath(output_dir)/category_dirs.get(category,05_其他)target_dir.mkdir(parentsTrue,exist_okTrue)# 重命名标题_原文件名titlemeta.get(title,)iftitle:new_namef{title[:30]}_{Path(file_path).name}else:new_namePath(file_path).name targettarget_dir/new_name shutil.copy2(str(file_path),str(target))print(f整理:{Path(file_path).name}→{category}/{new_name})模块 4生成知识图谱分析笔记之间的关键词关联生成可视化知识图谱。defbuild_knowledge_graph(metadata_map):基于关键词关联构建知识图谱# 收集所有关键词keyword_to_docs{}fordoc_path,metainmetadata_map.items():forkwinmeta.get(keywords,[])meta.get(tags,[]):ifkwnotinkeyword_to_docs:keyword_to_docs[kw][]keyword_to_docs[kw].append(doc_path)# 找到共享关键词的文档对edges[]keywords_listlist(keyword_to_docs.keys())foriinrange(len(keywords_list)):forjinrange(i1,len(keywords_list)):kw1,kw2keywords_list[i],keywords_list[j]sharedset(keyword_to_docs[kw1])set(keyword_to_docs[kw2])iflen(shared)2:# 至少共享 2 篇文档edges.append((kw1,kw2,len(shared)))# 按关联强度排序edges.sort(keylambdax:x[2],reverseTrue)returnedges[:50]# 取 top 50 条关联模块 5生成 Markdown 索引defgenerate_index(metadata_map,output_path):生成知识库的 Markdown 索引文件lines[# 知识库索引\n]lines.append(f共{len(metadata_map)}篇文档\n\n)# 按分类分组by_category{}forpath,metainmetadata_map.items():catmeta.get(category,其他)ifcatnotinby_category:by_category[cat][]by_category[cat].append((path,meta))forcategory,docsinsorted(by_category.items()):lines.append(f##{category}{len(docs)}篇\n\n)forpath,metaindocs:titlemeta.get(title,Path(path).stem)summarymeta.get(summary,)keywords, .join(meta.get(keywords,[])[:5])lines.append(f###{title}\n)lines.append(f- **摘要**:{summary}\n)lines.append(f- **关键词**:{keywords}\n)lines.append(f- **文件**: {Path(path).name}\n\n)Path(output_path).write_text(.join(lines),encodingutf-8)print(f索引已生成:{output_path})完整运行defrun_knowledge_system(root_dir,output_dir):完整知识管理流程print( Step 1: 扫描文件...)filesscan_files(root_dir)print(\n Step 2: AI 提取元数据...)metadata_map{}fori,file_pathinenumerate(files):contentextract_content(file_path)ifcontent:metaextract_metadata(content)metadata_map[str(file_path)]metaprint(f [{i1}/{len(files)}]{file_path.name}→{meta.get(category,?)})print(\n Step 3: 自动分类整理...)auto_organize(files,metadata_map,output_dir)print(\n Step 4: 生成知识图谱...)graphbuild_knowledge_graph(metadata_map)print(f 找到{len(graph)}条关联)print(\n Step 5: 生成索引...)generate_index(metadata_map,os.path.join(output_dir,INDEX.md))print(\n✅ 知识库整理完成)# 运行run_knowledge_system(rC:\my_notes,rC:\knowledge_base)踩坑记录坑 1AI 分类不稳定症状同一篇笔记运行两次分类结果不一样一次是技术一次是方法论。原因temperature 太高AI 输出不确定。解决把 temperature 设为 0.3 以下保证输出稳定。坑 2大文件提取摘要超时症状50MB 的文件提取内容时 API 超时。原因文件太大截取后仍然很长。解决大文件只取前 2000 字符或者分段提取后合并。坑 3PDF 中文乱码症状提取 PDF 内容时中文全是乱码。原因PDF 是扫描件图片不是文本 PDF。解决扫描件 PDF 需要用 OCR如 pytesseract纯文本 PDF 用 PyPDF2。坑 4知识图谱太密症状关键词关联太多图谱变成一团乱麻。原因关联阈值太低任何两个关键词都有关联。解决提高阈值至少共享 3 篇文档或者只取 top 30 条关联。坑 5API 成本太高症状200 篇笔记每篇调一次 GPT-4费用超过预期。原因GPT-4 API 价格高。解决用 GPT-3.5-turbo 做初步分类只对不确定的用 GPT-4 二次确认。总结3 条核心经验先扫描再整理。不要一上来就改文件结构先扫描一遍看看有多少文件、什么类型、分布在哪再决定怎么整理。AI 分类要加约束。不限定分类类别AI 会给出几十种分类根本没法用。明确告诉它只有这 5 个类别。索引比分类更重要。文件放哪个目录其实不关键关键是能快速搜索到。生成 Markdown 索引 关键词标签比按目录分类更实用。你有多少零散笔记有没有遇到找资料困难的问题评论区聊聊。