GeekHeron / Engineering

伏羲引擎 (Fuxi Engine) v2.0
技术架构深度拆解

// STACK: PYTHON FLASK · DEEPSEEK V3 · SQLALCHEMY · ASTRO-ALGORITHMS
// UPDATED: 2026.01.20

摘要: 传统的在线排盘系统往往只是对农历库的简单封装,而“AI 算命”则常陷入大模型幻觉与套话的泥潭。 伏羲引擎 v2.0 重构了底层逻辑:引入天文级精度的“真太阳时”校正算法,构建了基于 context-injection 的 AI 编排层,并解决了一系列 Python Web 开发中的跨域工程挑战。 本文将基于核心代码库(bazi_engine.py, ai_service.py, config.py)进行源码级复盘。

1. 核心算力:从“时钟时间”到“真太阳时”

app/services/bazi_engine.py 的重构中,最大的技术突破是引入了 真太阳时 (True Solar Time) 系统。 传统算法直接使用用户输入的钟表时间(平太阳时),这在命理学上是极其粗糙的。北京时间 12:00 在新疆(东经87度)实际上太阳还在爬坡,而在哈尔滨(东经126度)太阳已经西斜。

1.1 经度校正与均时差

我们引入了 time_utils.py,通过用户输入的地理经度(longitude),结合当日的 均时差 (Equation of Time) 进行二次校正。代码逻辑如下:

def calculate_bazi_data(year, month, day, hour, minute, ... longitude):
    # ... (省略基础校验)
    
    if longitude is not None:
        # 调用天文工具库计算真太阳时
        # 解决了“同一个钟表时间,不同地点八字时柱完全不同”的边缘 Case
        tst = get_true_solar_time(base_year, base_month, base_day, hour, minute, float(longitude))
        year, month, day, hour, minute = tst.year, tst.month, tst.day, tst.hour, tst.minute
        is_true_solar = True
    
    # 继续使用 Lunar 库进行干支转换...

1.2 数字化量化系统

为了让 AI 理解“强弱”概念,我们在 BaziLogic 类中实现了一套加权打分算法。系统遍历四柱干支,计算日主(Me Wuxing)在月令的得令情况以及其他三柱的生助情况,最终输出一个 0-100 的量化分数。这些硬数据(Hard Data)是后续 AI 推理的基石。

2. AI 编排层:Prompt 工程与防幻觉机制

app/services/ai_service.py 中,我们没有选择简单的“Chat”模式,而是构建了一个基于 RAG 思想的上下文注入系统。

2.1 解决 LLM 的“时间感知缺失”

通用大模型(如 DeepSeek V3)本身没有“今年是哪一年”的实时感知,直接询问流年运势往往会得到基于其训练截止日期的错误回答(例如它可能认为今年还是 2023 年)。

我们在生成 Prompt 时,强制注入了当前的时间锚点:

def generate_prompt(data, ...):
    # 强制注入服务器当前计算出的年份,防止 AI 幻觉
    current_luck = data.get("current_luck", {})
    numeric_year = current_luck.get("meta", {}).get("year_str", "2026年")
    
    base_info = f"""
    【当前时间基准】
    公历年份: {numeric_year}
    流年干支: {liunian_ganzhi}年 (AI请务必基于此年份进行运势推演,不要使用默认训练数据时间)
    """

2.2 合规与安全层 (Safety Layer)

作为面向公众的 SaaS 服务,合规性至关重要。我们在代码中定义了全局常量 COMPLIANCE_DISCLAIMER,并将其硬编码到每一个 System Prompt 的尾部。这强制要求 AI:

3. 工程实战:CORS 跨域与 Cookie 的爱恨情仇

在前后端分离(前端 VSCode Live Server :5500,后端 Flask :5000)的开发环境中,跨域资源共享 (CORS)Session 丢失 是最耗时的工程坑。

app/__init__.pyapp/config.py 中,我们留下了一组“战损版”的配置,完美解决了 Nginx 反代环境下的 Cookie 传递问题:

# 1. 必须明确指定 Origins,不能用通配符 '*'
# 否则浏览器会拒绝携带 Credentials (Cookie)
allowed_origins = [
    "http://localhost:5500", 
    "https://www.fuxiengine.xyz"
]

# 2. CORS 初始化
CORS(app, 
     supports_credentials=True, # 关键:允许跨域 Cookie
     resources={r"/*": {"origins": allowed_origins}})

# 3. Cookie 策略 (Config.py)
# Lax 是现代浏览器在安全性与可用性之间的最佳平衡
SESSION_COOKIE_SAMESITE = 'Lax' 
# 在非 HTTPS 的开发/宝塔环境中,强制关闭 Secure 也是为了防止 Session 丢失
SESSION_COOKIE_SECURE = False

4. 商业化闭环:卡密与数据模型

项目的变现逻辑并非简单的接入 Stripe,而是设计了一套解耦的 卡密系统 (CardKey System)

5. 总结

伏羲引擎 v2.0 不仅仅是一个算命玩具,它是一次将传统算法(lunar_python)、现代 AI 工程(DeepSeek)与 Python Web 最佳实践(Flask Blueprint/SQLAlchemy)深度融合的尝试。 它证明了,即使是再传统的领域,通过严谨的代码重构与架构设计,也能焕发出具有现代感的数字化生命力。