Spaces:
Running
Running
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} 件省略")
|