知识库数据收集

本章节将介绍如何系统性地收集和整理个人知识库的数据源,包括内容类型的选择、数据收集的自动化脚本示例,以及在 Hugo 网站结构下的实际操作方法,帮助你高效构建适合数字分身的知识库基础。

数据源选择

对于个人数字分身,你可以收集以下类型的内容作为知识库:

  • 个人博客文章:技术总结、思考感悟、项目经验
  • 专业文档:工作中的技术文档、项目说明
  • 学习笔记:读书笔记、课程总结、知识整理
  • 演讲稿和简历:个人经历和专业背景
  • 常见问答:你经常回答的问题和标准答案

收集脚本示例

创建一个数据收集脚本来遍历你的 Hugo 网站目录:

// collect-content.ts
import { readdir, readFile, stat } from 'fs/promises';
import { join } from 'path';
import matter from 'gray-matter';

interface ContentFile {
  path: string;
  title: string;
  content: string;
  metadata: Record<string, any>;
}

async function collectMarkdownFiles(dir: string): Promise<ContentFile[]> {
  const files: ContentFile[] = [];
  
  async function traverse(currentDir: string) {
    const entries = await readdir(currentDir);
    
    for (const entry of entries) {
      const fullPath = join(currentDir, entry);
      const stats = await stat(fullPath);
      
      if (stats.isDirectory()) {
        // 跳过草稿和私有目录
        if (!entry.startsWith('.') && entry !== 'drafts') {
          await traverse(fullPath);
        }
      } else if (entry.endsWith('.md') && entry !== 'index.md') {
        const content = await readFile(fullPath, 'utf-8');
        const { data, content: markdownContent } = matter(content);
        
        // 只收集已发布的内容
        if (!data.draft) {
          files.push({
            path: fullPath,
            title: data.title || entry.replace('.md', ''),
            content: markdownContent,
            metadata: {
              ...data,
              relativePath: fullPath.replace(dir, ''),
              lastModified: stats.mtime
            }
          });
        }
      }
    }
  }
  
  await traverse(dir);
  return files;
}

在函数中,我们首先定义了一个名为 files 的空数组,用于存储遍历到的文件。然后,我们定义了一个名为 traverse 的递归函数,用于遍历指定目录下的所有文件。在 traverse 函数中,我们使用 readdir 方法读取当前目录下的所有条目,并使用 stat 方法获取每个条目的状态信息。对于每个条目,如果是目录且不是草稿或私有目录,则递归调用 traverse 继续遍历;如果是 Markdown 文件且不是 index.md,则读取文件内容并解析 front matter,最后将符合条件的文件信息存入 files 数组。

在处理知识库时,脚本应考虑以下事项:

  • 跳过草稿和私有内容:脚本应跳过 drafts 目录、以点(.)开头的隐藏目录,以及 front matter 中 draft: true 的文件,避免收集未发布或私有内容。
  • 跳过大段代码引用:如内容中包含大量代码块,可根据实际需求选择是否收集,或对代码块进行截断、摘要处理,防止知识库被无关代码淹没。
  • 文件结构与多语言支持:Hugo 多语言站点通常有 /zh//en/ 目录,收集时需分别处理,确保不同语言的内容都能纳入知识库。你也可以仅收录一种语言,大模型也可以仅根据一种语言构建,避免多语言内容混淆。
  • 元数据完整性:建议每个 Markdown 文件都包含 title 字段,并根据实际需要补充 descriptiondate 等元数据,便于后续检索和分析。
  • 自动化与可扩展性:脚本可根据内容类型、标签等条件灵活过滤,支持后续扩展(如同步到向量数据库、生成摘要等)。
  • 路径处理:建议统一使用相对路径,便于后续迁移和索引。

通过遵循上述注意事项,可以高效、规范地收集和管理个人知识库内容,为数字分身等下游应用打下坚实基础。

文章导航

独立页面

这是书籍中的独立页面。

书籍首页