File size: 3,197 Bytes
fb05e78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
ベクトルストア操作用のドキュメント読み込みユーティリティ。
"""

import json
import logging
from typing import List

from langchain_core.documents import Document

logger = logging.getLogger(__name__)


def load_chunks_from_json(json_file_path: str) -> List[Document]:
    """
    JSONファイルからドキュメントチャンクを読み込み、LangChainのDocumentに変換する。

    期待されるJSONフォーマット:
    [
      {
        "metadata": {
          "title": "...",
          "file_name": "...",
          "source_url": "...",
          "chunk_index": 0
        },
        "page_content": "..."
      },
      ...
    ]
    """
    try:
        with open(json_file_path, 'r', encoding='utf-8') as f:
            chunks_data = json.load(f)
        
        documents = []
        for chunk in chunks_data:
            # メタデータ付きでDocumentを作成
            doc = Document(
                page_content=chunk['page_content'],
                metadata=chunk['metadata']
            )
            documents.append(doc)
        
        logger.info(f"{len(documents)}個のドキュメントチャンクを正常に読み込みました")
        return documents
    
    except FileNotFoundError:
        logger.error(f"エラー: {json_file_path} が見つかりません!")
        logger.error("カレントディレクトリにchunks.jsonが存在するか確認してください。")
        return []
    except json.JSONDecodeError as e:
        logger.error(f"エラー: {json_file_path} のJSON形式が不正です")
        logger.error(f"JSONエラー: {e}")
        return []
    except Exception as e:
        logger.error(f"{json_file_path} の読み込み中にエラーが発生しました: {e}")
        return []


def display_document_info(docs: List[Document], max_display: int = 5) -> None:
    """
    読み込んだドキュメントの情報を表示する。
    
    Args:
        docs: 表示するドキュメントのリスト
        max_display: 表示する最大ドキュメント数(デフォルト: 5)
    """
    logger.info(f"\n=== ドキュメント情報 ===")
    logger.info(f"総ドキュメント数: {len(docs)}")
    
    if not docs:
        logger.info("ドキュメントが見つかりませんでした。")
        return
    
    # 最大max_display件まで表示
    for i, doc in enumerate(docs[:max_display]):
        meta = doc.metadata
        logger.info(f"\n--- ドキュメント {i+1} ---")
        logger.info(f"タイトル: {meta.get('title', 'N/A')}")
        logger.info(f"ファイル名: {meta.get('file_name', 'N/A')}")
        logger.info(f"URL: {meta.get('source_url', 'N/A')}")
        logger.info(f"チャンク番号: {meta.get('chunk_index', 'N/A')}")
        
        # 内容のプレビュー(最初の100文字)
        preview = doc.page_content[:100].replace('\n', ' ')
        logger.info(f"内容プレビュー: {preview}{'...' if len(doc.page_content) > 100 else ''}")
    
    # 残りのドキュメント数を表示
    if len(docs) > max_display:
        logger.info(f"\n...他 {len(docs) - max_display} 件省略")