""" 知识库加载器 - Methodology Knowledge Loader 加载和解析批命方法论知识文件 Version: 1.0 Created: 2026-02-03 Author: Sisi & TH Studio 知识文件路径: - 00-reading-methodology.md: 10步批命流程 + 36条核心口诀 - 00-palace-analysis.md: 150个宫位分析案例 - 00-timing-methodology.md: 43个时间预测技巧 - 00-six-relations.md: 86个六亲批断技巧 """ from typing import Dict, List, Any, Optional import re import os class MethodologyLoader: """ 知识库加载器 从markdown文件加载批命方法论知识 """ def __init__(self, knowledge_base_path: str = None): """ 初始化知识库加载器 Args: knowledge_base_path: 知识库根路径 """ # 默认知识库路径(本地开发用) self.knowledge_base_path = knowledge_base_path or "/Volumes/sparksverse/agent-knowledge/mingli-knowledge/eastern/ziwei" # 知识文件映射 self.knowledge_files = { 'reading_methodology': 'interpretations/00-reading-methodology.md', 'palace_analysis': 'interpretations/00-palace-analysis.md', 'timing_methodology': 'timing/00-timing-methodology.md', 'six_relations': 'interpretations/00-six-relations.md' } # 缓存加载的知识 self._cache = {} # 内置核心知识(作为备用,当文件不可用时) self._init_builtin_knowledge() def _init_builtin_knowledge(self): """初始化内置核心知识""" # 10步批命流程 self.ten_steps = [ { 'step': 1, 'name': '确认盘面基础信息', 'key_points': [ '核对出生时辰准确性', '确定命局数(水二木三金四土五火六)', '标注命宫、身宫、四化位置' ] }, { 'step': 2, 'name': '看总格成败', 'key_points': [ '观察命宫三方四正', '观察四化星分布', '识别吉格凶格' ] }, { 'step': 3, 'name': '看身宫定后天发展', 'key_points': [ '身在财帛→私企或自己做老板', '身在官禄→做官', '身在迁移→外地发展', '身在夫妻→后天被婚姻影响' ] }, { 'step': 4, 'name': '批六亲关系', 'key_points': [ '父母宫+日月位置', '兄弟宫+眉毛面相', '夫妻宫+福德宫同参', '子女宫+面相验证' ] }, { 'step': 5, 'name': '看事业财运方向', 'key_points': [ '官禄宫最喜化权', '财帛宫权禄相逢主老板命', '迁移宫看外地发展' ] }, { 'step': 6, 'name': '看疾厄宫', 'key_points': [ '结合中医经脉流注判断', '化忌所在宫对应脏腑', '杀星集中处对应疾病' ] }, { 'step': 7, 'name': '批流年大运', 'key_points': [ '十年大运看三方四正', '小流年只看本宫和对宫', '未来十年无大运,大限在前十年' ] }, { 'step': 8, 'name': '看婚姻成败时机', 'key_points': [ '红鸾天喜相会主婚姻', '过忌成婚最好', '天喜在不同宫位含义不同' ] }, { 'step': 9, 'name': '看田宅宫', 'key_points': [ '祖产情况', '置产吉凶', '阳宅方位判断' ] }, { 'step': 10, 'name': '福德宫判断', 'key_points': [ '主一辈子福禄财禄事业', '女命最重要的宫', '福德宫化忌主夫妻死别' ] } ] # 36条核心口诀 self.core_formulas = { 'geju': [ # 格局口诀 {'name': '紫府坐垣', 'meaning': '命宫在寅申,紫微天府入庙,位列三台,爵禄荣昌'}, {'name': '七杀朝斗', 'meaning': '命宫在寅申,七杀独坐入庙,威震边疆'}, {'name': '府相会命', 'meaning': '天府天相分别位于财帛事业宫,天生辅佐人才'}, {'name': '日月并明', 'meaning': '太阳旺辰+太阴旺戌,命宫在辰或戌,一世荣华'}, {'name': '明珠出海', 'meaning': '命宫在未,太阴亥宫入庙+太阳卯宫入庙,父母双全'}, {'name': '火贪相聚', 'meaning': '贪狼+火星/铃星同宫,武贵格,做武官'}, {'name': '禄马交驰', 'meaning': '禄存/化禄+天马同宫,辛苦赚大钱,巨富'}, {'name': '日照雷门', 'meaning': '命宫在卯,太阳入命庙,男命最吉'}, {'name': '月朗天门', 'meaning': '命宫在亥,太阴入命庙,女命最吉'}, {'name': '水澄桂萼', 'meaning': '子宫太阴入庙,清官,女人漂亮'} ], 'xiong': [ # 凶格口诀 {'name': '半空折翅', 'meaning': '命宫在巳或亥,廉贪落陷对冲或化忌冲命,三方四正无吉星,中年横夭'}, {'name': '日月反背', 'meaning': '白天月亮、夜间太阳均落陷,离乡发展,克父母'}, {'name': '羊陀夹杀', 'meaning': '擎羊陀罗在命宫两侧,犯小人,易被人影响'}, {'name': '吉处藏凶', 'meaning': '吉星丛中煞星落陷,必凶'}, {'name': '廉贞七杀', 'meaning': '落陷主半路埋尸'}, {'name': '廉贞破军', 'meaning': '落陷主水中做冢'}, {'name': '廉贞贪狼', 'meaning': '落陷主横夭(先天疾病或自杀)'} ], 'panduan': [ # 判断口诀 {'name': '命好不如限好', 'meaning': '十年大运为主,小流年为辅'}, {'name': '未来十年无大运', 'meaning': '化忌所在十年或对冲十年,大限在前十年'}, {'name': '目不见日月', 'meaning': '太阳太阴均落陷,主死'}, {'name': '杀星庙旺', 'meaning': '凶处藏吉'}, {'name': '杀星落陷', 'meaning': '在劫难逃'}, {'name': '过忌成婚最好', 'meaning': '化忌年份过后再婚吉'}, {'name': '官星进官禄宫最好', 'meaning': '财星进财帛宫最好'}, {'name': '遇险而止招凶', 'meaning': '遇险行险能脱险'}, {'name': '机月同梁', 'meaning': '定为吏也,公家单位工作'} ], 'mianxiang': [ # 面相口诀 {'name': '南人北相', 'meaning': '北人南相,非富即贵'}, {'name': '正面不见耳', 'meaning': '五官开阔,面阔厚重,贵相'}, {'name': '三庭均等', 'meaning': '上停中停下停相等,最佳'}, {'name': '眉毛至少高眼睛一寸', 'meaning': '主为官'}, {'name': '眉低山根低', 'meaning': '想不开'} ], 'yangzhai': [ # 阳宅口诀 {'name': '西北角是厨房', 'meaning': '死夫宅'}, {'name': '西南角是厨房', 'meaning': '死妻宅'}, {'name': '西北角是客厅', 'meaning': '夫妻生离'}, {'name': '厕所在房子正中', 'meaning': '心脏病、中风'}, {'name': '凶宅三字成灾', 'meaning': '少则3月3年,多则6年'} ] } # 六亲批断关键规则 self.six_relations_rules = { 'parents': { 'key_rule': '太阳代表父亲,太阴代表母亲', 'critical_patterns': [ {'pattern': '化忌在父母宫+日月反背', 'meaning': '父母不在身边或双亡'}, {'pattern': '太阳落陷+化忌', 'meaning': '父亲先逝'}, {'pattern': '太阴化忌', 'meaning': '母亲早逝或与母亲相克'}, {'pattern': '廉贞破军在父母宫', 'meaning': '父母离散'} ] }, 'siblings': { 'key_rule': '眉毛代表兄弟姐妹,左兄右姐', 'critical_patterns': [ {'pattern': '化忌入兄弟宫', 'meaning': '兄弟不和/夭折/合伙破财'}, {'pattern': '太阴落陷', 'meaning': '无兄弟或兄弟夭折'}, {'pattern': '断眉乱眉', 'meaning': '兄弟刑克'} ] }, 'spouse': { 'key_rule': '福德宫化忌→夫妻必死别(最重要!)', 'critical_patterns': [ {'pattern': '福德宫化忌+夫妻宫未见生离', 'meaning': '必定死别'}, {'pattern': '廉贞破军在福德或夫妻宫', 'meaning': '夫妻死别横祸'}, {'pattern': '西北厨房', 'meaning': '死先生(阳宅)'}, {'pattern': '西南厨房', 'meaning': '死妻子(阳宅)'} ] }, 'children': { 'key_rule': '阳星代表儿子,阴星代表女儿', 'critical_patterns': [ {'pattern': '化忌入子女宫', 'meaning': '没有儿子'}, {'pattern': '子女宫空宫+对面化忌', 'meaning': '无子'}, {'pattern': '日月反背+化忌', 'meaning': '没有儿子'} ] } } # 时间预测核心规则 self.timing_rules = { 'daxun_rules': [ {'rule': '命好不如限好', 'meaning': '十年大运为主,小流年为辅'}, {'rule': '未来十年无大运,大限在前十年', 'meaning': '化忌所在或对冲的十年无大运'}, {'rule': '早年大限,父母可避', 'meaning': '13-22岁大运遇凶,父母照顾可化解'} ], 'liunian_rules': [ {'rule': '宫为当年值日发生之大事', 'meaning': '流年在哪宫,当年大事与该宫相关'}, {'rule': '流年只看本宫和对宫', 'meaning': '大运看三方四正,流年只看本宫+对宫'}, {'rule': '化忌对冲流年', 'meaning': '未来十年无大运,该年大凶'} ], 'death_limit_rules': [ {'rule': '杀星独守+无吉星', 'meaning': '十年大运杀星独守无吉星化解,代表死限'}, {'rule': '目不见日月', 'meaning': '太阳太阴均落陷,主死'}, {'rule': '大小二限逢疾厄', 'meaning': '十年大运和流年同在疾厄宫,主死'} ] } # 乙年规律(小鱼验证100%) self.special_year_patterns = { '乙年': { 'sihua': {'禄': '太阴', '权': '天机', '科': '天同', '忌': '巨门'}, 'warning': '巨门化忌冲疾厄宫,健康波折、事业变动', 'pattern': '乙年巨门化忌→冲疾厄宫,空宫大运极凶,有星大运先苦后甜', 'verification': '小鱼1995/2005/2015/2025四次验证,准确率100%' }, '壬年': { 'sihua': {'禄': '天梁', '权': '紫微', '科': '左辅', '忌': '武曲'}, 'warning': '武曲化忌冲财帛/身宫,财运/生命危险', 'pattern': '壬年武曲化忌→冲身宫,空宫大运生命危险,有星大运有惊无险', 'verification': '小鱼2022年空宫大运新冠差点死,其他壬年无事' } } def load_all_knowledge(self) -> Dict[str, Any]: """ 加载所有知识文件 Returns: dict: 完整的知识库 """ knowledge = { 'ten_steps': self.ten_steps, 'core_formulas': self.core_formulas, 'six_relations_rules': self.six_relations_rules, 'timing_rules': self.timing_rules, 'special_year_patterns': self.special_year_patterns, 'loaded_from': 'builtin', 'total_rules': self._count_total_rules() } # 尝试从文件加载更多内容 for name, path in self.knowledge_files.items(): full_path = os.path.join(self.knowledge_base_path, path) if os.path.exists(full_path): try: content = self._load_markdown_file(full_path) if content: knowledge[f'{name}_raw'] = content knowledge['loaded_from'] = 'file' except Exception as e: print(f"Warning: Failed to load {path}: {e}") return knowledge def _load_markdown_file(self, file_path: str) -> Optional[str]: """加载markdown文件""" try: with open(file_path, 'r', encoding='utf-8') as f: return f.read() except Exception: return None def _count_total_rules(self) -> Dict[str, int]: """统计总规则数""" return { 'ten_steps': len(self.ten_steps), 'geju_formulas': len(self.core_formulas.get('geju', [])), 'xiong_formulas': len(self.core_formulas.get('xiong', [])), 'panduan_formulas': len(self.core_formulas.get('panduan', [])), 'mianxiang_formulas': len(self.core_formulas.get('mianxiang', [])), 'yangzhai_formulas': len(self.core_formulas.get('yangzhai', [])), 'six_relations_patterns': sum( len(v.get('critical_patterns', [])) for v in self.six_relations_rules.values() ), 'timing_rules': sum( len(v) for v in self.timing_rules.values() ), 'special_year_patterns': len(self.special_year_patterns) } def get_step_by_number(self, step_number: int) -> Optional[Dict]: """ 获取指定步骤的批命流程 Args: step_number: 步骤编号 (1-10) Returns: dict: 步骤详情 """ for step in self.ten_steps: if step['step'] == step_number: return step return None def get_formulas_by_category(self, category: str) -> List[Dict]: """ 获取指定分类的口诀 Args: category: 分类名称 (geju/xiong/panduan/mianxiang/yangzhai) Returns: list: 口诀列表 """ return self.core_formulas.get(category, []) def get_six_relations_rules(self, relation_type: str) -> Optional[Dict]: """ 获取六亲批断规则 Args: relation_type: 六亲类型 (parents/siblings/spouse/children) Returns: dict: 规则详情 """ return self.six_relations_rules.get(relation_type) def get_special_year_pattern(self, tiangan: str) -> Optional[Dict]: """ 获取特殊年份规律 Args: tiangan: 天干 (甲/乙/丙/丁/戊/己/庚/辛/壬/癸) Returns: dict: 年份规律 """ key = f'{tiangan}年' return self.special_year_patterns.get(key) def match_formula(self, pattern_description: str) -> List[Dict]: """ 根据描述匹配口诀 Args: pattern_description: 配置描述 Returns: list: 匹配的口诀列表 """ matches = [] description_lower = pattern_description.lower() # 搜索所有口诀 for category, formulas in self.core_formulas.items(): for formula in formulas: name = formula.get('name', '') meaning = formula.get('meaning', '') if name in pattern_description or any( keyword in description_lower for keyword in meaning.lower().split(',') ): matches.append({ 'category': category, **formula }) return matches def get_death_limit_rules(self) -> List[Dict]: """获取死限判断规则""" return self.timing_rules.get('death_limit_rules', []) def get_marriage_timing_rules(self) -> List[Dict]: """获取婚姻时机判断规则""" return [ {'rule': '红鸾天喜交会', 'meaning': '主婚姻'}, {'rule': '过忌成婚', 'meaning': '化忌年份过后再婚吉'}, {'rule': '天喜在命宫夫妻宫', 'meaning': '吉'}, {'rule': '天喜在福德宫', 'meaning': '主多婚'}, {'rule': '红鸾天喜在凶星宫相会', 'meaning': '婚姻不成'} ] # 单例模式 _loader_instance = None def get_methodology_loader() -> MethodologyLoader: """获取知识库加载器单例""" global _loader_instance if _loader_instance is None: _loader_instance = MethodologyLoader() return _loader_instance # 导出 __all__ = ['MethodologyLoader', 'get_methodology_loader']