ChoTensai_V3 / src /services /knowledge_service.py
TOMOCHIN4
v3: FastAPI + Gemini統合版デプロイ
994a408
"""
Knowledge Base Service
ローカルファイルからKnowledge Baseを読み込む
"""
import os
import logging
from pathlib import Path
from typing import Optional
logger = logging.getLogger(__name__)
# 教科コードとファイル名のマッピング
SUBJECT_TO_FILE = {
"jp": "japanese.md",
"math": "math.txt",
"sci": "science.md",
"soc": "social.md"
}
# 教科コードと日本語名のマッピング
SUBJECT_TO_NAME = {
"jp": "国語",
"math": "算数",
"sci": "理科",
"soc": "社会"
}
class KnowledgeService:
"""Knowledge Base読み込みサービス"""
def __init__(self, knowledge_dir: str = "knowledge"):
self.knowledge_dir = Path(knowledge_dir)
self._cache = {} # ファイル内容キャッシュ
self._load_all()
def _load_all(self):
"""全教科のKBを読み込んでキャッシュ"""
for subject, filename in SUBJECT_TO_FILE.items():
filepath = self.knowledge_dir / filename
if filepath.exists():
try:
with open(filepath, "r", encoding="utf-8") as f:
self._cache[subject] = f.read()
logger.info(f"Loaded KB for {subject}: {len(self._cache[subject])} chars")
except Exception as e:
logger.error(f"Failed to load KB for {subject}: {e}")
self._cache[subject] = ""
else:
logger.warning(f"KB file not found: {filepath}")
self._cache[subject] = ""
def is_available(self) -> bool:
"""サービス利用可能かチェック"""
return any(len(content) > 0 for content in self._cache.values())
def get_knowledge(self, subject: str) -> str:
"""
指定教科のKnowledge Base内容を取得
Args:
subject: 教科コード (jp, math, sci, soc)
Returns:
Knowledge Baseの内容
"""
return self._cache.get(subject, "")
def get_subject_name(self, subject: str) -> str:
"""教科コードから日本語名を取得"""
return SUBJECT_TO_NAME.get(subject, subject)
def get_all_subjects(self) -> list:
"""利用可能な教科リストを取得"""
return [s for s, content in self._cache.items() if len(content) > 0]
def get_kb_stats(self) -> dict:
"""KB統計情報を取得"""
return {
subject: {
"chars": len(content),
"lines": content.count("\n") + 1 if content else 0
}
for subject, content in self._cache.items()
}