astrology-ziwei-api / knowledge_enhanced_interpreter.py
th
Fix Zi Wei natal pattern conditions and conflicting matches
8164c6a
Raw History Blame Contribute Delete
54.2 kB
""" 知识库增强型AI解读引擎 v4.0 Knowledge-Enhanced AI Interpretation Engine 基于今日建成的紫微斗数知识库(772KB,5大核心模块) Powered by comprehensive Ziwei Doushu knowledge base (772KB, 5 core modules) v4.0 新增功能: - 巴纳姆冷读效果:温暖有共鸣的解读语言 - 六亲分析:父母/兄弟/夫妻/子女运批断 - 10步批命流程:标准化解读流程 - 福德宫核心秘诀:夫妻死别判断 知识库路径: - 主星特性: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/01-main-stars.md - 十二宫位: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/02-twelve-palaces.md - 四化理论: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/03-four-transformations.md - 流年大运: /agent-knowledge/mingli-knowledge/eastern/ziwei/timing/01-annual-fortune.md - 实战断诀: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/01-practical-divination.md - 批命方法论: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/00-reading-methodology.md - 六亲批断: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/00-six-relations.md Created: 2025-12-12 Updated: 2026-02-03 (v4.0 巴纳姆+六亲+批命流程) Author: Sisi 🦊 (紫微知识库管理员 + AI引擎架构师) """ from typing import Dict, List, Any, Optional from sihua_data import PALACE_ENGLISH from palace_strength import calculate_all_palaces_strength, calculate_palace_strength from star_brightness_table import enhance_star_with_brightness, get_palace_brightness_summary from san_fang_si_zheng_analyzer import analyze_san_fang_si_zheng, analyze_all_san_fang_si_zheng from geju_matcher import GejuMatcher, MATCHER_VERSION from star_combination_matcher import StarCombinationMatcher # v3.8: 星曜组合断语引擎 # v4.0 新增模块 - 使用延迟导入减少启动内存占用 # from barnum_cold_reader import BarnumColdReader, get_barnum_reader # from methodology_loader import MethodologyLoader, get_methodology_loader # from six_relations_interpreter import SixRelationsInterpreter, get_six_relations_interpreter # from reading_methodology import ReadingMethodologyEngine, get_reading_engine class KnowledgeEnhancedInterpreter: """知识库增强型AI解读器 - 基于772KB专业知识库 + v4.0巴纳姆效果""" def __init__(self): """初始化增强型解读器""" # v3.7: 初始化格局匹配器 self.geju_matcher = GejuMatcher() # v3.8: 初始化星曜组合断语匹配器 self.star_combination_matcher = StarCombinationMatcher() # v4.0 新增: 延迟初始化(减少启动内存占用) self._barnum_reader = None self._methodology_loader = None self._six_relations_interpreter = None self._reading_engine = None # 初始化知识库数据(修复:调用被遗忘的初始化方法) self.__init_v4_modules() def __init_v4_modules(self): """v4.0: 初始化模块数据""" # 十天干四化表(THE CORE!)- 从知识库提取 self.TIANGAN_SIHUA = { '甲': {'禄': '廉贞', '权': '破军', '科': '武曲', '忌': '太阳'}, '乙': {'禄': '天机', '权': '天梁', '科': '紫微', '忌': '太阴'}, '丙': {'禄': '天同', '权': '天机', '科': '文昌', '忌': '廉贞'}, '丁': {'禄': '太阴', '权': '天同', '科': '天机', '忌': '巨门'}, '戊': {'禄': '贪狼', '权': '太阴', '科': '右弼', '忌': '天机'}, '己': {'禄': '武曲', '权': '贪狼', '科': '天梁', '忌': '文曲'}, '庚': {'禄': '太阳', '权': '武曲', '科': '天府', '忌': '天同'}, '辛': {'禄': '巨门', '权': '太阳', '科': '文曲', '忌': '文昌'}, '壬': {'禄': '天梁', '权': '紫微', '科': '左辅', '忌': '武曲'}, '癸': {'禄': '破军', '权': '巨门', '科': '太阴', '忌': '贪狼'} } # 主星基本特性(从01-main-stars.md提取) self.MAIN_STAR_TRAITS = { '紫微': { '五行': '己阴土', '化气': '尊贵', '特质': '帝王星,领导力强,尊贵有气度', '事业': '适合管理、政治、高层领导', '性格': '自尊心强,喜欢掌权,有责任感' }, '天机': { '五行': '乙阴木', '化气': '善', '特质': '智慧星,机智聪明,善于策划', '事业': '适合教育、咨询、策划、技术', '性格': '心思细腻,反应快,喜欢思考' }, '太阳': { '五行': '丙阳火', '化气': '贵', '特质': '光明星,热情大方,爱面子', '事业': '适合外交、公关、管理、服务业', '性格': '热情开朗,重视名声,乐于助人' }, '武曲': { '五行': '辛阴金', '化气': '财', '特质': '财星,刚毅果断,理财能力强', '事业': '适合金融、财务、工程、武职', '性格': '务实稳重,意志坚定,重视物质' }, '天同': { '五行': '壬阳水', '化气': '福', '特质': '福星,温和慈善,享受生活', '事业': '适合服务业、文艺、娱乐', '性格': '随和乐观,不喜竞争,享受安逸' }, '廉贞': { '五行': '丁阴火', '化气': '囚', '特质': '次桃花星,灵活多变,善社交', '事业': '适合公关、演艺、设计、外交', '性格': '热情主动,交际广泛,感情丰富' }, '天府': { '五行': '戊阳土', '化气': '令', '特质': '财库星,保守稳健,善于积累', '事业': '适合管理、财务、行政', '性格': '谨慎务实,重视安全,善于守成' }, '太阴': { '五行': '癸阴水', '化气': '富', '特质': '财星,温柔细腻,重视内涵', '事业': '适合教育、文化、艺术、服务', '性格': '温和内敛,心思细密,重情重义' }, '贪狼': { '五行': '甲阳木', '化气': '桃花', '特质': '桃花星,多才多艺,欲望强烈', '事业': '适合娱乐、销售、艺术、交际', '性格': '积极进取,爱好广泛,社交能力强' }, '巨门': { '五行': '癸阴水', '化气': '暗', '特质': '是非星,口才好,易招口舌', '事业': '适合法律、传媒、教师、咨询', '性格': '善于表达,直言不讳,易得罪人' }, '天相': { '五行': '壬阳水', '化气': '印', '特质': '印星,忠诚可靠,协调能力强', '事业': '适合行政、服务、辅助性工作', '性格': '诚实守信,重视外表,善于调和' }, '天梁': { '五行': '戊阳土', '化气': '荫', '特质': '贵人星,清高正直,喜助人', '事业': '适合医疗、慈善、教育、宗教', '性格': '正直善良,喜欢助人,清高自持' }, '七杀': { '五行': '庚阳金', '化气': '杀', '特质': '将星,果断勇敢,独立性强', '事业': '适合军警、竞争性行业、开创', '性格': '刚毅果断,独来独往,不服输' }, '破军': { '五行': '癸阴水', '化气': '耗', '特质': '先锋星,开创变革,破旧立新,不畏艰难', '事业': '适合军警、探险、改革、投机、开拓性行业', '性格': '冲劲十足,不惧挑战,敢于推翻重来,喜新厌旧' } } # 十二宫位核心意义(从02-twelve-palaces.md提取) self.PALACE_MEANINGS = { '命宫': { '代表': '一生格局、性格特质、外在表现', '三方四正': ['官禄宫', '财帛宫', '迁移宫'], '重要性': '特别重要', '判断要点': '命宫强弱决定一生成就高低' }, '兄弟宫': { '代表': '兄弟姐妹、同事关系、合伙运', '三方四正': ['仆役宫', '疾厄宫', '田宅宫'], '重要性': '较重要', '判断要点': '看与兄弟朋友的缘分和帮助' }, '夫妻宫': { '代表': '配偶状况、婚姻关系、恋爱运', '三方四正': ['福德宫', '官禄宫', '迁移宫'], '重要性': '特别重要', '判断要点': '配偶条件、婚姻幸福度' }, '子女宫': { '代表': '子女状况、生育能力、性生活', '三方四正': ['田宅宫', '仆役宫', '疾厄宫'], '重要性': '较重要', '判断要点': '子女数量质量、性欲强弱' }, '财帛宫': { '代表': '财运状况、赚钱能力、理财观', '三方四正': ['命宫', '福德宫', '官禄宫'], '重要性': '特别重要', '判断要点': '财运好坏、赚钱方式' }, '疾厄宫': { '代表': '身体健康、疾病倾向、体质', '三方四正': ['兄弟宫', '田宅宫', '子女宫'], '重要性': '重要', '判断要点': '健康状况、易患疾病' }, '迁移宫': { '代表': '外出运、人际关系、社会评价', '三方四正': ['命宫', '夫妻宫', '福德宫'], '重要性': '特别重要', '判断要点': '外出发展、社交能力、外部机遇' }, '仆役宫': { '代表': '朋友关系、下属状况、社交圈', '三方四正': ['兄弟宫', '子女宫', '田宅宫'], '重要性': '较重要', '判断要点': '朋友质量、得到帮助' }, '官禄宫': { '代表': '事业成就、工作状况、社会地位', '三方四正': ['命宫', '财帛宫', '夫妻宫'], '重要性': '特别重要', '判断要点': '事业发展、工作稳定性' }, '田宅宫': { '代表': '不动产、家庭环境、居住状况', '三方四正': ['兄弟宫', '疾厄宫', '子女宫'], '重要性': '重要', '判断要点': '房产运、家庭和睦' }, '福德宫': { '代表': '精神享受、福气厚薄、兴趣爱好', '三方四正': ['财帛宫', '夫妻宫', '迁移宫'], '重要性': '特别重要', '判断要点': '福气深浅、精神状态' }, '父母宫': { '代表': '父母状况、长辈关系、读书运', '三方四正': ['官禄宫', '福德宫', '迁移宫'], '重要性': '重要', '判断要点': '父母缘分、学业成绩' } } # 四化判断优先级(从03-four-transformations.md提取) self.SIHUA_PRIORITY = { '本命盘': 0.4, # 40% - 基础命格 '大限盘': 0.3, # 30% - 10年大势 '流年盘': 0.2, # 20% - 当年运势 '流月日': 0.1 # 10% - 短期波动 } # v4.0: 延迟加载属性 @property def barnum_reader(self): """延迟加载巴纳姆冷读引擎""" if self._barnum_reader is None: from barnum_cold_reader import get_barnum_reader self._barnum_reader = get_barnum_reader() return self._barnum_reader @property def methodology_loader(self): """延迟加载知识库加载器""" if self._methodology_loader is None: from methodology_loader import get_methodology_loader self._methodology_loader = get_methodology_loader() return self._methodology_loader @property def six_relations_interpreter(self): """延迟加载六亲解读器""" if self._six_relations_interpreter is None: from six_relations_interpreter import get_six_relations_interpreter self._six_relations_interpreter = get_six_relations_interpreter() return self._six_relations_interpreter @property def reading_engine(self): """延迟加载批命流程引擎""" if self._reading_engine is None: from reading_methodology import get_reading_engine self._reading_engine = get_reading_engine() return self._reading_engine def interpret_full_chart_enhanced( self, sihua_analysis: dict, chart_data: dict ) -> dict: """ 增强版完整命盘解读 - 基于知识库 Args: sihua_analysis: 四化分析结果 chart_data: 原始命盘数据 Returns: dict: 增强版AI解读结果 """ year_sihua = sihua_analysis.get('year_sihua', {}) overall_judgment = sihua_analysis.get('overall_judgment', {}) # 0. 提取宫位数据(用于后续分析) palaces = chart_data.get('palaces', []) # NEW: 计算所有宫位的强弱评分 (P0-2核心功能!) palace_strength_analysis = calculate_all_palaces_strength( palaces, sihua_analysis ) # NEW v3.6: 计算所有宫位的三方四正分析 (P1核心功能!) san_fang_analysis = analyze_all_san_fang_si_zheng( palaces, sihua_analysis ) # NEW v3.7: 格局识别(P1核心功能!) # 获取出生年干(用于格局匹配) birth_year_stem = (chart_data.get('year_stem') or chart_data.get('chart', {}).get('year_heavenly_stem')) # The Node adapter stores the clock in solar_date/birth_info, not a root hour field. birth_time = (chart_data.get('birth_info', {}).get('time') or chart_data.get('solar_date', '').split(' ')[-1]) try: pattern_birth_hour = int(birth_time.split(':')[0]) if ':' in birth_time else None if pattern_birth_hour is not None and not 0 <= pattern_birth_hour <= 23: pattern_birth_hour = None except (TypeError, ValueError): pattern_birth_hour = None # 匹配所有格局 matched_patterns = self.geju_matcher.match_all_patterns( palaces, birth_year_stem, pattern_birth_hour ) # 生成格局总结 pattern_summary = self.geju_matcher.get_pattern_summary(matched_patterns) birth_hour = pattern_birth_hour # NEW v3.8: 星曜组合断语匹配(P1完成!) # v3.14.0升级:添加宏观格局分析(紫微孤君+日月反背+星系类型) star_combination_result = self.star_combination_matcher.match_all_combinations( palaces, birth_hour # v3.14.0新增:传递出生时辰 ) # 1. 生成命盘核心特质(基于主星) core_traits = self._analyze_core_traits(chart_data) # 2. 生成宫位详细分析(融合知识库 + 宫位评分 + 三方四正) palace_analysis = self._analyze_palaces_with_knowledge( chart_data, year_sihua, palace_strength_analysis, # v3.5: 传入宫位评分 san_fang_analysis # v3.6: 传入三方四正分析 ) # 3. 生成四化深度解读(基于理论) sihua_deep_analysis = self._analyze_sihua_with_theory(year_sihua) # 4. 生成整体运势(知识库增强) life_overview = self._generate_enhanced_life_overview( overall_judgment, core_traits ) # 5. 生成实战建议(基于南北派断诀) practical_advice = self._generate_practical_advice( year_sihua, chart_data, core_traits ) # 6. 生成优势与挑战(知识库版本) strengths_challenges = self._analyze_strengths_challenges_enhanced( year_sihua, palace_analysis ) # ========== v4.0 可选功能:巴纳姆增强 + 六亲分析 + 10步批命 ========== # 使用静默失败模式,不影响核心功能 v4_features = {} try: # 延迟加载v4.0模块(减少启动内存占用) if self._barnum_reader is None: from barnum_cold_reader import get_barnum_reader self._barnum_reader = get_barnum_reader() if self._six_relations_interpreter is None: from six_relations_interpreter import get_six_relations_interpreter self._six_relations_interpreter = get_six_relations_interpreter() if self._reading_engine is None: from reading_methodology import get_reading_engine self._reading_engine = get_reading_engine() # 1. 六亲分析(基于86个批断技巧) gender = chart_data.get('gender', '男') six_relations_result = self._six_relations_interpreter.analyze_all_relations( palaces, sihua_analysis, gender ) v4_features['six_relations_analysis'] = six_relations_result # 2. 10步批命流程(可选,较重) # 用户可以通过API参数决定是否执行 if chart_data.get('enable_ten_step_reading', False): ten_step_result = self._reading_engine.execute_ten_step_reading(chart_data) v4_features['ten_step_reading'] = ten_step_result # 3. 巴纳姆温暖描述(轻量级增强) # 为palace_analysis添加巴纳姆增强版本 if hasattr(self, '_barnum_reader') and palace_analysis: v4_features['barnum_enhanced_palaces'] = [] for palace in palace_analysis[:3]: # 仅增强前3个重要宫位(命宫/财帛/官禄) palace_name = palace.get('palace_name', '') interpretation = palace.get('interpretation', '') if interpretation: barnum_result = self._barnum_reader.apply_barnum_effect( interpretation, palace_name=palace_name ) v4_features['barnum_enhanced_palaces'].append({ 'palace_name': palace_name, 'original': interpretation, 'enhanced': barnum_result.get('enhanced', '') }) except Exception as e: # 静默失败,记录错误但不影响核心功能 v4_features['v4_error'] = f'v4.0 features partially failed: {str(e)}' # ========== 返回结果(含v4.0可选功能) ========== result = { 'core_traits': core_traits, # NEW: 命盘核心特质 'palace_analysis': palace_analysis, # NEW: 宫位详细分析(含强弱评分) 'palace_strength_summary': palace_strength_analysis['summary'], # NEW v3.5: 宫位强弱总结 'pattern_recognition': { # NEW v3.7: 格局识别 ⭐ 'matcher_version': MATCHER_VERSION, 'calculation_mode': 'deterministic_rules', 'matched_patterns': matched_patterns, # 匹配到的所有格局 'pattern_summary': pattern_summary, # 格局总结 'pattern_count': len(matched_patterns), # 格局数量 'highest_score': pattern_summary.get('highest_score', 0), # 最高分格局 'overall_quality': pattern_summary.get('overall_quality', 'unknown') # 整体质量 }, 'star_combinations': { # NEW v3.8: 星曜组合断语 ⭐⭐ | v3.14: 宏观格局分析 🌟 'matched_rules': star_combination_result['matched_rules'], # 匹配到的所有组合规则 'summary': star_combination_result['summary'], # 组合总结(含评分、分类统计) 'interpretations_by_category': star_combination_result['interpretations_by_category'], # 按分类整理的断语 'total_matched': star_combination_result['total_matched'], # 匹配数量 'total_rules_checked': star_combination_result['total_rules_checked'], # 检查的总规则数 'macro_patterns': star_combination_result.get('macro_patterns', {}) # v3.14.0新增:宏观格局分析 }, 'sihua_deep_analysis': sihua_deep_analysis, # ENHANCED: 四化深度解读 'life_overview': life_overview, # ENHANCED: 整体运势 'practical_advice': practical_advice, # NEW: 实战建议 'strengths_challenges': strengths_challenges, # ENHANCED: 优势挑战 'interpretation_quality': 'knowledge_enhanced_v4.0_with_barnum_sixrelations', # 升级到v4.0 'knowledge_base_version': '2026-02-03', # 更新到v4.0发布日期 'knowledge_modules_used': [ '01-main-stars.md', '02-twelve-palaces.md', '03-four-transformations.md', '01-practical-divination.md', 'star_brightness_table.py', # v3.5: 星曜庙旺陷表 'palace_strength.py', # v3.5: 宫位强弱评分系统 'san_fang_si_zheng_analyzer.py', # v3.6: 三方四正分析引擎 'geju_patterns.py', # v3.7: 格局规则库(15个经典格局) 'geju_matcher.py', # v3.7: 格局匹配引擎 'star_combination_rules.py', # v3.8: 星曜组合规则库(19条核心规则) 'star_combination_matcher.py', # v3.8: 星曜组合匹配引擎 # v4.0 新增模块 'barnum_cold_reader.py', # v4.0: 巴纳姆冷读引擎 'six_relations_interpreter.py', # v4.0: 六亲解读器(86个技巧) 'reading_methodology.py' # v4.0: 10步批命流程引擎 ] } # 合并v4.0功能(如果存在) if v4_features: result['v4_features'] = v4_features return result def _analyze_core_traits(self, chart_data: dict) -> dict: """ 分析命盘核心特质(基于主星知识库) 从 chart_data 中提取命宫主星,查 MAIN_STAR_TRAITS 字典生成分析 Returns: dict: 核心特质分析 """ # 从 palaces 中找到命宫 palaces = chart_data.get('palaces', []) ming_palace_stars = [] ming_palace = None for palace in palaces: if palace.get('name') == '命宫': ming_palace = palace break # 提取命宫主星名称 if ming_palace: for star in ming_palace.get('major_stars', []): star_name = star.get('name', '') if isinstance(star, dict) else star if star_name: ming_palace_stars.append(star_name) # 从 MAIN_STAR_TRAITS 查询特质 personalities = [] careers = [] traits_detail = [] for star_name in ming_palace_stars: star_traits = self.MAIN_STAR_TRAITS.get(star_name, {}) if star_traits: personalities.append(star_traits.get('性格', '')) careers.append(star_traits.get('事业', '')) traits_detail.append({ 'star': star_name, 'wuxing': star_traits.get('五行', ''), 'huaqi': star_traits.get('化气', ''), 'trait': star_traits.get('特质', ''), 'career': star_traits.get('事业', ''), 'personality': star_traits.get('性格', '') }) # 组合输出 personality_summary = '、'.join(filter(None, personalities)) if personalities else '命宫无主星,性格受辅星和三方四正影响' career_tendency = '、'.join(filter(None, careers)) if careers else '事业方向受三方四正主星影响' # 判断格局等级 fortune_level = 'medium' if len(ming_palace_stars) >= 2: fortune_level = 'high' # 双星坐命格局较高 elif len(ming_palace_stars) == 0: fortune_level = 'special' # 空宫需看三方四正借星 traits = { 'primary_stars': ming_palace_stars, 'personality_summary': personality_summary, 'career_tendency': career_tendency, 'fortune_level': fortune_level, 'traits_detail': traits_detail } return traits def _analyze_palaces_with_knowledge( self, chart_data: dict, year_sihua: dict, palace_strength_analysis: dict = None, san_fang_analysis: List[dict] = None ) -> List[dict]: """ 融合知识库的宫位分析(含强弱评分 + 三方四正) Args: chart_data: 命盘数据 year_sihua: 年干四化 palace_strength_analysis: 宫位强弱评分结果(v3.5) san_fang_analysis: 三方四正分析结果(v3.6 NEW!) Returns: list: 各宫位详细分析 """ palace_analyses = [] palaces = chart_data.get('palaces', []) # 创建宫位名称到强弱评分的映射 strength_map = {} if palace_strength_analysis and 'palaces' in palace_strength_analysis: for palace_strength in palace_strength_analysis['palaces']: palace_name = palace_strength['name'] strength_map[palace_name] = palace_strength['strength'] # 创建宫位名称到三方四正分析的映射(v3.6 NEW!) san_fang_map = {} if san_fang_analysis: for san_fang in san_fang_analysis: palace_name = san_fang.get('palace', '') san_fang_map[palace_name] = san_fang for palace_name, palace_info in self.PALACE_MEANINGS.items(): # 从chart_data中找到对应的宫位数据 palace_data = next((p for p in palaces if p.get('name') == palace_name), None) # 获取该宫位的强弱评分 strength_info = strength_map.get(palace_name, {}) # 获取该宫位的三方四正分析(v3.6 NEW!) san_fang_info = san_fang_map.get(palace_name, {}) # 提取星曜信息 stars_list = [] if palace_data: major_stars = palace_data.get('major_stars', []) minor_stars = palace_data.get('minor_stars', []) for star in major_stars: star_name = star.get('name', '') if isinstance(star, dict) else star stars_list.append(star_name) # 提取四化信息 transformations = [] for sihua_type, data in year_sihua.items(): if data.get('palace') == palace_name: transformations.append({ 'type': sihua_type, 'star': data.get('star'), 'emoji': self._get_sihua_emoji(sihua_type) }) # 判断整体质量(基于强弱评分) overall_quality = '待评估' if strength_info: rank = strength_info.get('rank', 'C') if rank in ['A+', 'A']: overall_quality = '极佳' elif rank in ['B+', 'B']: overall_quality = '良好' elif rank in ['C+', 'C']: overall_quality = '一般' else: overall_quality = '需改善' analysis = { 'palace': palace_name, 'english_name': PALACE_ENGLISH.get(palace_name, palace_name), 'represents': palace_info['代表'], 'importance': palace_info['重要性'], 'judgment_points': palace_info['判断要点'], 'san_fang_si_zheng': palace_info['三方四正'], 'stars': stars_list, # NEW: 实际星曜列表 'transformations': transformations, # NEW: 四化列表 'overall_quality': overall_quality, # NEW: 整体质量 'strength': strength_info, # v3.5: 宫位强弱评分详情 'san_fang_analysis': san_fang_info # v3.6 NEW: 三方四正详细分析 } palace_analyses.append(analysis) return palace_analyses def _get_sihua_emoji(self, sihua_type: str) -> str: """获取四化emoji""" emoji_map = { '化禄': '💰', '化权': '👑', '化科': '📜', '化忌': '⚠️' } return emoji_map.get(sihua_type, '') def _analyze_sihua_with_theory(self, year_sihua: dict) -> dict: """ 基于四化理论的深度分析 Returns: dict: 四化深度分析 """ analysis = { 'theory_basis': '十天干四化表(易经理论基础)', 'sihua_interactions': [], # 四化间的互动关系 'critical_transformations': [], # 关键四化 'suggestions': [] # 基于理论的建议 } # 分析四化间的互动 if '化禄' in year_sihua and '化忌' in year_sihua: hualu_palace = year_sihua['化禄'].get('palace') huaji_palace = year_sihua['化忌'].get('palace') analysis['sihua_interactions'].append({ 'type': '禄忌对冲', 'description': f'化禄在{hualu_palace},化忌在{huaji_palace}', 'interpretation': '有得有失,需要平衡发展,把握机会同时规避风险' }) return analysis def _generate_enhanced_life_overview( self, overall_judgment: dict, core_traits: dict ) -> dict: """ 生成知识库增强的整体运势 Returns: dict: 增强版运势概述 """ total_score = overall_judgment.get('total_score', 0) # 使用更温暖、专业的语言(符合思思的风格) if total_score >= 30: fortune_level = '上上吉' emoji = '✨' summary = '您的命盘格局优秀,一生多贵人相助,事业财运俱佳。建议把握机会,积极进取,可有大成就。' tone = 'very_positive' elif total_score >= 15: fortune_level = '上吉' emoji = '🌟' summary = '您的命盘配置良好,整体运势不错。只要努力奋斗,把握时机,定能成就一番事业。' tone = 'positive' elif total_score >= 0: fortune_level = '中吉' emoji = '🌤️' summary = '您的命盘平稳中带有机遇。需要主动把握机会,谨慎处理挑战,稳健发展可趋吉避凶。' tone = 'balanced' elif total_score >= -15: fortune_level = '平' emoji = '⚖️' summary = '您的命盘有些挑战,但也有转机。建议修身养性,积极化解不利因素,保持乐观心态。' tone = 'cautious' else: fortune_level = '需化解' emoji = '🔔' summary = '您的命盘存在一些挑战。建议多行善事,提升自身修养,化解不利因素。记住:命运掌握在自己手中。' tone = 'supportive' return { 'fortune_level': fortune_level, 'emoji': emoji, 'total_score': total_score, 'summary': summary, 'tone': tone, 'sisi_note': '💕 思思提示:紫微斗数仅供参考,积极行动比算命更重要!', 'knowledge_enhanced': True } def _generate_practical_advice( self, year_sihua: dict, chart_data: dict, core_traits: dict ) -> dict: """ 生成基于南北派断诀的实战建议 Returns: dict: 实战建议 """ advice_items = [] # 基于四化生成具体建议 for sihua_type, data in year_sihua.items(): palace = data.get('palace') star = data.get('star') # TODO: 从01-practical-divination.md提取对应断语 # 目前先用模板 if sihua_type == '化禄': advice_items.append({ 'category': '财运机遇', 'priority': 'high', 'palace': palace, 'advice': f'{star}化禄在{palace},这是您的财运和喜事来源。建议重点发展{palace}相关事务。', 'action_items': [ f'积极把握{palace}方面的机会', '主动出击,不要被动等待', '这是您的优势领域,可以大胆尝试' ] }) elif sihua_type == '化忌': advice_items.append({ 'category': '风险规避', 'priority': 'critical', 'palace': palace, 'advice': f'{star}化忌在{palace},需要特别注意该领域。建议谨慎处理,避免冲动。', 'action_items': [ f'谨慎处理{palace}相关事务', '避免重大决策和投资', '多听取他人建议,不要一意孤行' ] }) return { 'specific_advice': advice_items, 'overall_strategy': '综合分析命盘优势和挑战,扬长避短,趋吉避凶', 'sisi_reminder': '记住:命运70%靠自己,30%靠天意。积极行动最重要!', 'knowledge_source': '基于南北派断诀(138页实战经验)' } def _analyze_strengths_challenges_enhanced( self, year_sihua: dict, palace_analysis: List[dict] ) -> dict: """ 知识库增强的优势挑战分析 Returns: dict: 优势挑战详细分析 """ strengths = [] challenges = [] # 基于四化分析优势和挑战 for sihua_type, data in year_sihua.items(): palace = data.get('palace') star = data.get('star') score = data.get('impact_score', 0) if sihua_type in ['化禄', '化权', '化科']: strength = { 'type': sihua_type, 'palace': palace, 'star': star, 'description': self._get_knowledge_based_strength(sihua_type, palace, star), 'score': score, 'action_suggestion': self._get_strength_action(sihua_type, palace) } strengths.append(strength) elif sihua_type == '化忌': challenge = { 'type': sihua_type, 'palace': palace, 'star': star, 'description': self._get_knowledge_based_challenge(palace, star), 'severity': self._get_challenge_severity_enhanced(score), 'score': score, 'solution': self._get_challenge_solution(palace) } challenges.append(challenge) return { 'strengths': strengths, 'challenges': challenges, 'balance_analysis': { 'strength_count': len(strengths), 'challenge_count': len(challenges), 'overall_balance': self._calculate_balance_score(strengths, challenges), 'recommendation': self._get_balance_recommendation(strengths, challenges) }, 'knowledge_enhanced': True } def _get_knowledge_based_strength(self, sihua_type: str, palace: str, star: str) -> str: """基于知识库的优势描述""" # 融合主星特性和宫位意义 star_trait = self.MAIN_STAR_TRAITS.get(star, {}).get('特质', '') base_descriptions = { '化禄': f'{star}{star_trait},在{palace}化禄,财运亨通,喜事连连', '化权': f'{star}{star_trait},在{palace}化权,掌握主导权,能力突出', '化科': f'{star}{star_trait},在{palace}化科,名声显扬,贵人相助' } return base_descriptions.get(sihua_type, f'{palace}运势良好') def _get_knowledge_based_challenge(self, palace: str, star: str) -> str: """基于知识库的挑战描述""" palace_meaning = self.PALACE_MEANINGS.get(palace, {}).get('代表', palace) return f'{star}化忌在{palace}({palace_meaning}),需要特别注意该领域,谨慎处理可化解' def _get_strength_action(self, sihua_type: str, palace: str) -> str: """获取优势的行动建议""" actions = { '化禄': f'积极把握{palace}方面的机会,这是您的财运来源', '化权': f'在{palace}方面主动出击,建立自己的影响力', '化科': f'注重{palace}的文化修养和名声积累,多结识贵人' } return actions.get(sihua_type, f'善用{palace}的优势') def _get_challenge_solution(self, palace: str) -> str: """获取挑战的解决方案""" solutions = { '命宫': '修身养性,提升自我,化解人生挑战', '财帛宫': '谨慎理财,避免贪心,稳健投资', '夫妻宫': '用心经营感情,多沟通理解,避免冲动', '官禄宫': '踏实工作,提升能力,避免盲目跳槽', '疾厄宫': '注意健康,预防疾病,保持良好生活习惯' } return solutions.get(palace, f'谨慎处理{palace}事务,化险为夷') def _get_challenge_severity_enhanced(self, score: int) -> dict: """增强版挑战严重度评估""" if score <= -25: return {'level': '严重', 'color': 'red', 'priority': 'urgent'} elif score <= -15: return {'level': '中等', 'color': 'orange', 'priority': 'important'} else: return {'level': '较轻', 'color': 'yellow', 'priority': 'normal'} def _calculate_balance_score(self, strengths: List, challenges: List) -> int: """计算平衡分数""" strength_total = sum(s['score'] for s in strengths) challenge_total = sum(c['score'] for c in challenges) return strength_total + challenge_total def _get_balance_recommendation(self, strengths: List, challenges: List) -> str: """获取平衡建议""" balance_score = self._calculate_balance_score(strengths, challenges) if balance_score >= 20: return '整体优势明显,积极进取可大有作为' elif balance_score >= 0: return '优势和挑战并存,需要扬长避短,稳健发展' else: return '挑战较大,需要谨慎应对,化解不利因素' def generate_summary_text_enhanced(self, interpretation: dict) -> str: """ 生成增强版文字总结 Args: interpretation: 增强版解读结果 Returns: str: 文字总结 """ overview = interpretation.get('life_overview', {}) core_traits = interpretation.get('core_traits', {}) strengths_challenges = interpretation.get('strengths_challenges', {}) practical_advice = interpretation.get('practical_advice', {}) summary_parts = [] # 品牌标识 summary_parts.append("【天機玄鑑 · 紫微斗数AI解读】") summary_parts.append(f"知识库版本: {interpretation.get('knowledge_base_version', '2025-12-12')}") summary_parts.append("") # 整体运势 summary_parts.append(f"【整体运势】{overview.get('emoji', '')} {overview.get('fortune_level', '')}") summary_parts.append(overview.get('summary', '')) summary_parts.append(overview.get('sisi_note', '')) summary_parts.append("") # 核心特质 # TODO: 待core_traits实现后添加 # 主要优势 strengths = strengths_challenges.get('strengths', []) if strengths: summary_parts.append("【您的优势】") for s in strengths: summary_parts.append(f"• {s['type']}: {s['description']}") summary_parts.append(f" 建议: {s.get('action_suggestion', '')}") summary_parts.append("") # 主要挑战 challenges = strengths_challenges.get('challenges', []) if challenges: summary_parts.append("【需要注意】") for c in challenges: severity = c.get('severity', {}) level = severity.get('level', '待评估') if isinstance(severity, dict) else severity summary_parts.append(f"• {c['type']}: {c['description']} (严重程度: {level})") summary_parts.append(f" 化解: {c.get('solution', '')}") summary_parts.append("") # 实战建议 summary_parts.append("【核心建议】") summary_parts.append(practical_advice.get('overall_strategy', '')) summary_parts.append(practical_advice.get('sisi_reminder', '')) summary_parts.append("") # 平衡分析 balance = strengths_challenges.get('balance_analysis', {}) summary_parts.append(f"【综合评估】{balance.get('recommendation', '')}") # 结尾 summary_parts.append("") summary_parts.append("---") summary_parts.append("🦊 Generated with knowledge & love by Sisi") summary_parts.append("📚 基于772KB专业紫微斗数知识库") summary_parts.append("⚠️ 仅供参考,积极行动比算命更重要") return "\n".join(summary_parts) # ============== v4.0 新增方法 ============== def apply_barnum_effect( self, interpretation: Dict, gender: str = '', age_group: str = 'middle' ) -> Dict: """ v4.0: 应用巴纳姆效果,让解读更温暖有共鸣 Args: interpretation: 原始解读结果 gender: 性别 (男/女) age_group: 年龄段 (young/middle_young/middle/senior) Returns: dict: 巴纳姆效果增强后的解读 """ enhanced = interpretation.copy() # 1. 增强整体运势文本 if 'life_overview' in enhanced: overview = enhanced['life_overview'] original_summary = overview.get('summary', '') # 应用巴纳姆效果 (v4.1修复:参数签名应该是original_text, star_name, palace_name, tone) barnum_enhanced = self.barnum_reader.apply_barnum_effect( original_summary ) overview['summary_barnum'] = barnum_enhanced.get('enhanced', original_summary) overview['barnum_hooks'] = barnum_enhanced.get('hooks_used', []) # 2. 增强优势描述 if 'strengths_challenges' in enhanced: sc = enhanced['strengths_challenges'] for strength in sc.get('strengths', []): original_desc = strength.get('description', '') # 使用星曜的温暖描述 star = strength.get('star', '') if star: warm_desc = self.barnum_reader.get_star_warm_description(star) if warm_desc: strength['description_barnum'] = warm_desc # 3. 增强挑战描述(使用敏感内容替换) if 'strengths_challenges' in enhanced: sc = enhanced['strengths_challenges'] for challenge in sc.get('challenges', []): original_desc = challenge.get('description', '') safe_desc = self.barnum_reader.replace_sensitive_content(original_desc) challenge['description_safe'] = safe_desc enhanced['barnum_enhanced'] = True enhanced['barnum_version'] = '4.0' return enhanced def analyze_six_relations( self, chart_data: Dict, sihua_analysis: Dict ) -> Dict: """ v4.0: 六亲关系分析 Args: chart_data: 命盘数据 sihua_analysis: 四化分析结果 Returns: dict: 六亲分析结果 """ palaces = chart_data.get('palaces', []) gender = chart_data.get('gender', '') year_sihua = sihua_analysis.get('year_sihua', {}) # 转换宫位数据格式 palace_dict = {} for palace in palaces: palace_name = palace.get('name', '') if palace_name: palace_dict[palace_name] = palace # 调用六亲解读器(修复:应该传入palaces list,不是palace_dict) six_relations_result = self.six_relations_interpreter.analyze_all_relations( palaces, year_sihua, gender ) return { 'six_relations': six_relations_result, 'methodology': '六亲批断(86条技巧)', 'key_discovery': '福德宫化忌→夫妻必死别', 'version': '4.0' } def apply_reading_methodology( self, chart_data: Dict, sihua_analysis: Dict ) -> Dict: """ v4.0: 应用10步批命流程 Args: chart_data: 命盘数据 sihua_analysis: 四化分析结果 Returns: dict: 10步批命结果 """ # 准备数据 palaces = chart_data.get('palaces', []) year_sihua = sihua_analysis.get('year_sihua', {}) # 转换宫位数据为字典格式 palace_dict = {} for palace in palaces: palace_name = palace.get('name', '') if palace_name: palace_dict[palace_name] = palace # 准备chart_data格式供引擎使用 engine_chart_data = { 'palaces': palace_dict, 'ming_palace': palace_dict.get('命宫', {}), 'shen_palace': self._find_shen_palace(palaces), 'sihua': year_sihua, 'birth_info': chart_data.get('birth_info', {}), 'gender': chart_data.get('gender', ''), 'tiangan': chart_data.get('year_stem', ''), 'wuxing': chart_data.get('wuxing', ''), 'daxun': chart_data.get('daxun', []) } # 执行10步批命 reading_result = self.reading_engine.execute_ten_step_reading(engine_chart_data) return { 'ten_step_reading': reading_result, 'methodology': '10步标准批命流程', 'formulas_applied': len(reading_result.get('formulas_matched', [])), 'version': '4.0' } def _find_shen_palace(self, palaces: List) -> Dict: """查找身宫""" for palace in palaces: if palace.get('is_shen_palace', False): return palace return {} def _calculate_age_group(self, birth_year: int) -> str: """计算年龄段""" if not birth_year: return 'middle' import datetime current_year = datetime.datetime.now().year age = current_year - birth_year if age < 25: return 'young' elif age < 40: return 'middle_young' elif age < 55: return 'middle' else: return 'senior' def generate_summary_text_v4(self, interpretation: dict) -> str: """ v4.0: 生成温暖有共鸣的文字总结 Args: interpretation: v4.0解读结果 Returns: str: 巴纳姆效果增强的文字总结 """ overview = interpretation.get('life_overview', {}) six_relations = interpretation.get('six_relations', {}) reading = interpretation.get('reading_methodology', {}) strengths_challenges = interpretation.get('strengths_challenges', {}) summary_parts = [] # 品牌标识(v4.0升级) summary_parts.append("【天機玄鑑 · 紫微斗数AI解读 v4.0】") summary_parts.append(f"知识库版本: {interpretation.get('knowledge_base_version', '2026-02-03')}") summary_parts.append("✨ 巴纳姆温暖版 | 10步标准批命 | 六亲全分析") summary_parts.append("") # 整体运势(使用巴纳姆增强版) summary_parts.append(f"【整体运势】{overview.get('emoji', '')} {overview.get('fortune_level', '')}") barnum_summary = overview.get('summary_barnum', overview.get('summary', '')) summary_parts.append(barnum_summary) summary_parts.append("") # 格局识别总结 ten_step = reading.get('ten_step_reading', {}) if ten_step: summary_info = ten_step.get('summary', {}) if summary_info.get('overall_pattern'): summary_parts.append("【命格总评】") summary_parts.append(summary_info.get('overall_pattern', '')) summary_parts.append("") # 六亲分析摘要 six_rel = six_relations.get('six_relations', {}) if six_rel: summary_parts.append("【六亲运势】") # 父母运 parents = six_rel.get('parents', {}) if parents.get('summary'): summary_parts.append(f"👨‍👩‍👧 父母: {parents.get('summary', '')}") # 婚姻运(重点!) spouse = six_rel.get('spouse', {}) if spouse.get('summary'): summary_parts.append(f"💕 婚姻: {spouse.get('summary', '')}") if spouse.get('critical_warning'): warning = spouse.get('critical_warning', {}) safe_msg = self.barnum_reader.replace_sensitive_content( warning.get('message', '') ) summary_parts.append(f" ⚠️ 特别提醒: {safe_msg}") # 子女运 children = six_rel.get('children', {}) if children.get('summary'): summary_parts.append(f"👶 子女: {children.get('summary', '')}") summary_parts.append("") # 核心优势(巴纳姆增强) strengths = strengths_challenges.get('strengths', []) if strengths: summary_parts.append("【您的核心优势】") for s in strengths[:3]: # 只显示前3个 desc = s.get('description_barnum', s.get('description', '')) summary_parts.append(f"✨ {s.get('type', '')}: {desc}") summary_parts.append("") # 需要关注(安全版描述) challenges = strengths_challenges.get('challenges', []) if challenges: summary_parts.append("【需要关注】") for c in challenges[:2]: # 只显示前2个 desc = c.get('description_safe', c.get('description', '')) summary_parts.append(f"💡 {desc}") if c.get('solution'): summary_parts.append(f" 化解: {c.get('solution', '')}") summary_parts.append("") # 温暖的结语 summary_parts.append("【温馨寄语】") summary_parts.append("您的命盘就像一幅独特的画卷,每一笔都有其意义。") summary_parts.append("记住:了解自己是为了更好地成长,而非被命运所限。") summary_parts.append("把握当下,积极行动,未来掌握在您自己手中。") summary_parts.append("") # 结尾 summary_parts.append("---") summary_parts.append("🦊 Generated with knowledge & love by Sisi") summary_parts.append("📚 基于772KB专业紫微斗数知识库 + 巴纳姆温暖效果") summary_parts.append("💕 让命理不再冰冷,让解读充满共鸣") summary_parts.append("⚠️ 仅供参考,您的人生由您做主") return "\n".join(summary_parts)
"""
知识库增强型AI解读引擎 v4.0
Knowledge-Enhanced AI Interpretation Engine
基于今日建成的紫微斗数知识库(772KB,5大核心模块)
Powered by comprehensive Ziwei Doushu knowledge base (772KB, 5 core modules)
v4.0 新增功能:
- 巴纳姆冷读效果:温暖有共鸣的解读语言
- 六亲分析:父母/兄弟/夫妻/子女运批断
- 10步批命流程:标准化解读流程
- 福德宫核心秘诀:夫妻死别判断
知识库路径:
- 主星特性: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/01-main-stars.md
- 十二宫位: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/02-twelve-palaces.md
- 四化理论: /agent-knowledge/mingli-knowledge/eastern/ziwei/foundations/03-four-transformations.md
- 流年大运: /agent-knowledge/mingli-knowledge/eastern/ziwei/timing/01-annual-fortune.md
- 实战断诀: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/01-practical-divination.md
- 批命方法论: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/00-reading-methodology.md
- 六亲批断: /agent-knowledge/mingli-knowledge/eastern/ziwei/interpretations/00-six-relations.md
Created: 2025-12-12
Updated: 2026-02-03 (v4.0 巴纳姆+六亲+批命流程)
Author: Sisi 🦊 (紫微知识库管理员 + AI引擎架构师)
"""
from typing import Dict, List, Any, Optional
from sihua_data import PALACE_ENGLISH
from palace_strength import calculate_all_palaces_strength, calculate_palace_strength
from star_brightness_table import enhance_star_with_brightness, get_palace_brightness_summary
from san_fang_si_zheng_analyzer import analyze_san_fang_si_zheng, analyze_all_san_fang_si_zheng
from geju_matcher import GejuMatcher, MATCHER_VERSION
from star_combination_matcher import StarCombinationMatcher # v3.8: 星曜组合断语引擎
# v4.0 新增模块 - 使用延迟导入减少启动内存占用
# from barnum_cold_reader import BarnumColdReader, get_barnum_reader
# from methodology_loader import MethodologyLoader, get_methodology_loader
# from six_relations_interpreter import SixRelationsInterpreter, get_six_relations_interpreter
# from reading_methodology import ReadingMethodologyEngine, get_reading_engine
class KnowledgeEnhancedInterpreter:
"""知识库增强型AI解读器 - 基于772KB专业知识库 + v4.0巴纳姆效果"""
def __init__(self):
"""初始化增强型解读器"""
# v3.7: 初始化格局匹配器
self.geju_matcher = GejuMatcher()
# v3.8: 初始化星曜组合断语匹配器
self.star_combination_matcher = StarCombinationMatcher()
# v4.0 新增: 延迟初始化(减少启动内存占用)
self._barnum_reader = None
self._methodology_loader = None
self._six_relations_interpreter = None
self._reading_engine = None
# 初始化知识库数据(修复:调用被遗忘的初始化方法)
self.__init_v4_modules()
def __init_v4_modules(self):
"""v4.0: 初始化模块数据"""
# 十天干四化表(THE CORE!)- 从知识库提取
self.TIANGAN_SIHUA = {
'甲': {'禄': '廉贞', '权': '破军', '科': '武曲', '忌': '太阳'},
'乙': {'禄': '天机', '权': '天梁', '科': '紫微', '忌': '太阴'},
'丙': {'禄': '天同', '权': '天机', '科': '文昌', '忌': '廉贞'},
'丁': {'禄': '太阴', '权': '天同', '科': '天机', '忌': '巨门'},
'戊': {'禄': '贪狼', '权': '太阴', '科': '右弼', '忌': '天机'},
'己': {'禄': '武曲', '权': '贪狼', '科': '天梁', '忌': '文曲'},
'庚': {'禄': '太阳', '权': '武曲', '科': '天府', '忌': '天同'},
'辛': {'禄': '巨门', '权': '太阳', '科': '文曲', '忌': '文昌'},
'壬': {'禄': '天梁', '权': '紫微', '科': '左辅', '忌': '武曲'},
'癸': {'禄': '破军', '权': '巨门', '科': '太阴', '忌': '贪狼'}
}
# 主星基本特性(从01-main-stars.md提取)
self.MAIN_STAR_TRAITS = {
'紫微': {
'五行': '己阴土',
'化气': '尊贵',
'特质': '帝王星,领导力强,尊贵有气度',
'事业': '适合管理、政治、高层领导',
'性格': '自尊心强,喜欢掌权,有责任感'
},
'天机': {
'五行': '乙阴木',
'化气': '善',
'特质': '智慧星,机智聪明,善于策划',
'事业': '适合教育、咨询、策划、技术',
'性格': '心思细腻,反应快,喜欢思考'
},
'太阳': {
'五行': '丙阳火',
'化气': '贵',
'特质': '光明星,热情大方,爱面子',
'事业': '适合外交、公关、管理、服务业',
'性格': '热情开朗,重视名声,乐于助人'