個人サイト群アーカイブとRAGデータベース化設計メモ

ozy's labo.


1 はじめに

本書は,複数の個人サイトをミラー取得し,正規化・本文抽出を行い,最終的にRAG(Retrieval-Augmented Generation)用データベースへ投入するための設計および実装方針をまとめたものです.

単なるHTML保存ではなく,

  • 意味のある本文抽出
  • メタ情報付与
  • 再利用可能な構造化
  • 将来の検索・再構築対応

を目的としています.

2 設計方針の転換

2.1 旧設計(段階中心)

sites/
 └ rock/
    ├ mirror/
    ├ normalized/
    ├ corpus/
    ├ logs/

この構造では,サイトが増えると混在しやすく,サイト単位での更新や管理が煩雑になります.

2.2 新設計(サイト中心)

data/
 ├ mirror/
 │   ├ site1/
 │   ├ site2/
 │   └ site3/
 ├ normalized/
 │   ├ site1/
 │   ├ site2/
 │   └ site3/
 ├ corpus/
 │   ├ site1/
 │   ├ site2/
 │   └ site3/
 └ logs/
     ├ site1/
     ├ site2/
     └ site3/

この構造により,

  • サイト単位の更新が容易
  • RAGベクトルDBのサイト別管理が容易
  • サイト別設定変更が容易

となります.

3 HTML正規化処理

3.1 文字コード問題

HTML内のmetaタグに含まれる charset が,実際にnkfでUTF-8へ変換された内容と不整合を起こすことがあります.

そのため,meta内の charset を一律 UTF-8 に書き換えます.

sed -E 's/(charset=)["'\'']?[^"'\'' >]+/\1UTF-8/I'

nkfの自動検出に任せ,metaのみ整合性を取ります.

4 バイナリファイルの除去

ミラー取得時に画像やバイナリが混入するため,事前に除去します.

find "$TARGET_DIR" -type f -print0 \
| xargs -0 grep -IL . \
| xargs -r rm -f

これにより,テキストとして扱えないファイルを削除できます.

5 本文抽出戦略

HTMLはサイトごとに構造が一定ではないため,正規表現による固定抽出は困難です.

そのため,

  • HTML → Markdown(gfm)
  • LLMによる意味的本文抽出

を採用しました.

LLMには以下を削除させます.

  • ナビゲーション
  • フッタ
  • サイドバー
  • CPU表示
  • 装飾のみの画像
  • メニュー一覧

保持対象は以下です.

  • 本文段落
  • 本文内リンク
  • 本文内画像
  • 本文中の表
  • コードブロック

6 メタ情報付与方針(RAG最適化)

JSONではなく,YAMLフロントマター+Markdown本文形式を採用します.

この形式は,例えば

  • Hugo
  • Jekyll

などの静的サイト生成系とも親和性があります.

6.1 機械抽出+LLM補完

機械で確実に取得できる情報はLLMに任せません.

6.1.1 機械抽出

  • source(元ファイル名)
  • path(相対パス)
  • processed_at
  • filenameからの日付抽出(YYYY-MM-DD)

6.1.2 LLM補完

  • title
  • category
  • tags(3〜8個)
  • summary(2〜3行)

6.2 出力例

---
source: "chari_2009-05-20.html"
path: "site1/chari/2009-05/"
processed_at: 2026-03-01
date: 2009-05-20
title: 夜装備で続行した紀美野方面ライド
category: diary
tags:
  - cycling
  - night ride
  - wakayama
summary: >
  紀美野方面へのサイクリング記録.
  休憩後,夜装備で走行を継続した.
---

(Markdown本文)

7 品質監視

LLMは稀に本文をほとんど出力しないことがあります.

そのため,文字数閾値による異常検出を行います.

if [ ${#markdown_content} -lt 500 ]; then
  echo "[!] Suspiciously short" >> error.log
fi

これにより,大量処理時の事故を防止します.

8 RAG投入を前提とした設計意図

本設計は以下を前提としています.

  • title + summary をembedding対象にできる
  • 本文をチャンク分割してベクトル化できる
  • tagsによるフィルタ検索が可能
  • dateによる時系列検索が可能
  • サイト単位でDB更新が可能

単なるアーカイブではなく,検索可能知識基盤の構築を目的としています.

9 今後の拡張

  • チャンク戦略の最適化
  • サイト別設定ファイルの導入
  • 差分検出による再処理最小化
  • ベクトルDB自動更新パイプライン

10 まとめ

本設計は,

  • HTMLの構造的不定性に対応するためLLMを活用
  • メタ情報は機械抽出+意味補完のハイブリッド
  • サイト中心構造でスケーラブルに管理
  • RAG用途を前提としたデータ設計

という思想に基づいています.

これにより,個人サイト群を長期的に再利用可能な知識資産へと変換できます.


Date: 2026-03-05

Author: ozyukiwo

Created: 2026-03-11 水 08:08

Emacs 26.3 (Org mode 9.1.9)

Validate