基于您提供的《Oracle EBS FA事务处理底层表数据字典》,我将为您构建一个专注于EBS FA资产模块智能查询的AI模型。
这个模型的核心思想是:将结构化的数据字典转化为AI可以理解的领域知识图谱,并封装成一系列可复用的查询意图模板。当用户提出业务问题时,模型会进行意图识别、参数提取、语义匹配,最终自动生成准确、高效的SQL查询语句。
一、 AI模型架构设计
本模型采用“分层架构 + 模板引擎” 的设计模式,分为四层:
Schema知识库层 (Knowledge Base):将您提供的Excel数据字典结构化,形成机器可读的元数据。包含:
表定义:表名、中文名、用途说明。
字段定义:字段名、类型、是否必填、说明、示例值。
关联关系:根据“FA事务流水核心表关联关系速查表”建立表之间的外键关系图谱。
意图识别与解析层 (Intent Engine):接收用户的自然语言问题,通过大模型(LLM)或规则引擎,识别其业务意图(如“查询新增资产”、“追溯某笔折旧的凭证”)。
SQL生成引擎层 (SQL Generator):根据识别的意图,从预定义的查询模板库中选择最佳模板,并将用户问题中提取的参数(如资产ID、日期范围、账簿等)填入模板,生成最终SQL。
结果输出与解释层 (Output Layer):执行SQL(或直接返回SQL文本),并将结果格式化返回给用户,同时附带简要的SQL逻辑解释,增强可信度。
二、 核心工作步骤
当用户提问时,模型按以下步骤工作:
步骤1:用户输入
用户提出业务问题,例如:“帮我查一下上个月新增的所有电脑类资产。”
步骤2:意图识别与参数抽取
模型分析问题,识别出:
意图:
查询资产新增业务对象:
资产(Asset)时间范围:
上个月(需转换为具体日期,如2026-06-01到2026-06-30)筛选条件:
类别 = 电脑
步骤3:知识图谱检索
模型访问知识库,找到与“资产新增”相关的核心表:
FA_TRANSACTION_HEADERS(事务头)FA_BOOKS(账簿价值快照)FA_ADDITIONS_B(资产基础表,包含类别)
并确定它们的关联路径:FA_ADDITIONS_B.ASSET_ID->FA_TRANSACTION_HEADERS.ASSET_ID->FA_BOOKS.ASSET_ID
步骤4:模板匹配与SQL生成
模型从模板库中找到“新增资产查询”模板,并进行参数填充。
步骤5:结果输出
模型输出最终的SQL语句,并附上解释,方便用户验证和使用。
三、 程序代码实现(Python伪代码示例)
我们将使用一个简单的if-else逻辑配合正则表达式来实现意图识别,并使用jinja2模板引擎生成SQL。
import re from datetime import datetime, timedelta from jinja2 import Template # --- 1. Schema知识库(简化版,实际可用JSON/YAML) --- SCHEMA_KNOWLEDGE = { "tables": { "FA_TRANSACTION_HEADERS": {"alias": "fth", "desc": "事务头表"}, "FA_BOOKS": {"alias": "fb", "desc": "账簿价值快照"}, "FA_ADDITIONS_B": {"alias": "fa", "desc": "资产基础表"}, "FA_DEPRN_DETAIL": {"alias": "fdd", "desc": "折旧明细"}, "FA_RETIREMENTS": {"alias": "fr", "desc": "报废处置表"}, "XLA_EVENTS": {"alias": "xev", "desc": "SLA事件表"}, "XLA_DISTRIBUTION_LINKS": {"alias": "xdl", "desc": "SLA分配关联"}, "XLA_AE_HEADERS": {"alias": "xah", "desc": "SLA分录头"}, "XLA_AE_LINES": {"alias": "xal", "desc": "SLA分录行"}, }, "relationships": [ ("FA_ADDITIONS_B", "ASSET_ID", "FA_TRANSACTION_HEADERS", "ASSET_ID"), ("FA_TRANSACTION_HEADERS", "TRANSACTION_HEADER_ID", "FA_BOOKS", "TRANSACTION_HEADER_ID_IN"), ("FA_TRANSACTION_HEADERS", "TRANSACTION_HEADER_ID", "FA_RETIREMENTS", "TRANSACTION_HEADER_ID"), ("FA_DISTRIBUTION_HISTORY", "DISTRIBUTION_ID", "FA_DEPRN_DETAIL", "DISTRIBUTION_ID"), ("FA_TRANSACTION_HEADERS", "TRANSACTION_HEADER_ID", "XLA_EVENTS", "SOURCE_ID_INT_1"), ("XLA_EVENTS", "EVENT_ID", "XLA_AE_HEADERS", "EVENT_ID"), ("XLA_AE_HEADERS", "AE_HEADER_ID", "XLA_DISTRIBUTION_LINKS", "AE_HEADER_ID"), ] } # --- 2. SQL模板库(Jinja2格式)--- SQL_TEMPLATES = { "query_addition": Template(""" SELECT fa.asset_id, fa.segment1 AS asset_number, fa.description AS asset_desc, fth.transaction_date, fb.cost AS original_cost, fb.date_effective FROM FA_ADDITIONS_B fa JOIN FA_TRANSACTION_HEADERS fth ON fa.asset_id = fth.asset_id AND fth.transaction_type_code = 'ADDITION' JOIN FA_BOOKS fb ON fth.transaction_header_id = fb.transaction_header_id_in WHERE 1=1 {% if start_date %} AND fth.transaction_date >= TO_DATE('{{ start_date }}', 'YYYY-MM-DD') {% endif %} {% if end_date %} AND fth.transaction_date <= TO_DATE('{{ end_date }}', 'YYYY-MM-DD') {% endif %} {% if category_id %} AND fa.category_id = {{ category_id }} {% endif %} ORDER BY fth.transaction_date DESC """), "query_depreciation_detail": Template(""" SELECT fdd.asset_id, fdd.period_name, fdd.deprn_amount, fdd.deprn_reserve, fdd.nbv FROM FA_DEPRN_DETAIL fdd WHERE 1=1 {% if asset_id %} AND fdd.asset_id = {{ asset_id }} {% endif %} {% if period_name %} AND fdd.period_name = '{{ period_name }}' {% endif %} {% if book_type_code %} AND fdd.book_type_code = '{{ book_type_code }}' {% endif %} ORDER BY fdd.period_counter """), "query_retirement_detail": Template(""" SELECT fr.asset_id, fr.date_retired, fr.cost_retired, fr.accum_deprn_retired, fr.nbv_retired, fr.sale_proceeds, fr.gain_loss_amount, fr.retirement_type FROM FA_RETIREMENTS fr JOIN FA_TRANSACTION_HEADERS fth ON fr.transaction_header_id = fth.transaction_header_id WHERE 1=1 {% if asset_id %} AND fr.asset_id = {{ asset_id }} {% endif %} {% if start_date %} AND fr.date_retired >= TO_DATE('{{ start_date }}', 'YYYY-MM-DD') {% endif %} {% if end_date %} AND fr.date_retired <= TO_DATE('{{ end_date }}', 'YYYY-MM-DD') {% endif %} ORDER BY fr.date_retired DESC """), "trace_sla_to_gl": Template(""" -- SLA追溯:从FA事务到总账凭证 SELECT fth.transaction_header_id, fth.transaction_type_code, xev.event_type_code, xah.ae_header_id, xal.accounting_class_code, xal.code_combination_id, xal.accounted_dr, xal.accounted_cr, xal.gl_sl_link_id AS gl_je_header_id FROM FA_TRANSACTION_HEADERS fth JOIN XLA_EVENTS xev ON fth.transaction_header_id = xev.source_id_int_1 AND xev.application_id = 140 JOIN XLA_AE_HEADERS xah ON xev.event_id = xah.event_id JOIN XLA_AE_LINES xal ON xah.ae_header_id = xal.ae_header_id WHERE 1=1 {% if transaction_header_id %} AND fth.transaction_header_id = {{ transaction_header_id }} {% endif %} {% if asset_id %} AND fth.asset_id = {{ asset_id }} {% endif %} ORDER BY fth.transaction_header_id, xal.ae_line_num """) } # --- 3. 意图识别与SQL生成引擎 --- class FAQueryAssistant: def __init__(self): self.schema = SCHEMA_KNOWLEDGE self.templates = SQL_TEMPLATES def parse_user_query(self, user_input: str): """解析用户输入,提取意图和参数""" intent = None params = {} # 识别意图(基于关键词) if any(kw in user_input for kw in ["新增", "添加", "购买", "新建"]): intent = "query_addition" elif any(kw in user_input for kw in ["折旧", "计提"]): intent = "query_depreciation_detail" elif any(kw in user_input for kw in ["报废", "处置", "出售", "捐赠"]): intent = "query_retirement_detail" elif any(kw in user_input for kw in ["追溯", "SLA", "凭证", "分录", "总账"]): intent = "trace_sla_to_gl" # 提取通用参数(正则表达式) # 提取资产ID asset_match = re.search(r'资产[I|i][D|d]\s*[::]?\s*(\d+)', user_input) if asset_match: params['asset_id'] = int(asset_match.group(1)) # 提取日期范围 date_match = re.search(r'(\d{4}-\d{2}-\d{2})\s*(?:到|至|~)\s*(\d{4}-\d{2}-\d{2})', user_input) if date_match: params['start_date'] = date_match.group(1) params['end_date'] = date_match.group(2) else: # 处理相对时间,如“上月” if '上月' in user_input or '上个月' in user_input: today = datetime.now() first_of_month = today.replace(day=1) last_month_end = first_of_month - timedelta(days=1) last_month_start = last_month_end.replace(day=1) params['start_date'] = last_month_start.strftime('%Y-%m-%d') params['end_date'] = last_month_end.strftime('%Y-%m-%d') # 提取期间名称 period_match = re.search(r'期间\s*[::]?\s*([A-Za-z]+-\d{4})', user_input) if period_match: params['period_name'] = period_match.group(1) # 提取账簿 book_match = re.search(r'(主账簿|税务账簿|CIP)\s*[::]?\s*(\w+)', user_input) if book_match: params['book_type_code'] = book_match.group(2) return intent, params def generate_sql(self, user_input: str): """主入口:解析->匹配->生成SQL""" intent, params = self.parse_user_query(user_input) if not intent: return "抱歉,我无法理解您的查询意图。请尝试更明确的表述,例如:'查询上月新增的资产' 或 '追溯资产ID 500123的SLA分录'。" template = self.templates.get(intent) if not template: return f"错误:找不到意图 '{intent}' 对应的SQL模板。" sql = template.render(**params) # 添加解释 explanation = f"**【意图识别】**:`{intent}`\n" explanation += f"**【提取参数】**:`{params}`\n" explanation += f"**【生成的SQL】**:\n```sql\n{sql}\n```\n" explanation += "**【说明】**:此SQL将查询相关表,请根据实际数据库环境替换占位符或调整日期格式。" return explanation # --- 4. 测试与演示 --- if __name__ == "__main__": assistant = FAQueryAssistant() test_queries = [ "查一下上月新增的所有资产", "查询资产ID 500123的折旧明细,期间为JUN-2025", "追溯资产ID 500123的报废信息", "追溯事务头ID 1002345的SLA凭证到总账", "查一下资产调整的情况" # 未覆盖的意图 ] for query in test_queries: print(f"\n{'='*60}") print(f"【用户问题】:{query}") result = assistant.generate_sql(query) print(result)四、 AI大模型工作结果示例
假设用户输入:“追溯资产ID 500123的SLA凭证到总账”
模型内部工作流程如下:
意图识别:通过关键词
追溯,SLA,凭证,总账,匹配到意图trace_sla_to_gl。参数提取:通过正则
资产ID\s*[::]?\s*(\d+),提取到asset_id = 500123。SQL生成:使用
trace_sla_to_gl模板,渲染后得到以下SQL:
-- SLA追溯:从FA事务到总账凭证 SELECT fth.transaction_header_id, fth.transaction_type_code, xev.event_type_code, xah.ae_header_id, xal.accounting_class_code, xal.code_combination_id, xal.accounted_dr, xal.accounted_cr, xal.gl_sl_link_id AS gl_je_header_id FROM FA_TRANSACTION_HEADERS fth JOIN XLA_EVENTS xev ON fth.transaction_header_id = xev.source_id_int_1 AND xev.application_id = 140 JOIN XLA_AE_HEADERS xah ON xev.event_id = xah.event_id JOIN XLA_AE_LINES xal ON xah.ae_header_id = xal.ae_header_id WHERE 1=1 AND fth.asset_id = 500123 ORDER BY fth.transaction_header_id, xal.ae_line_num结果输出:模型返回上述SQL及其解释,帮助用户理解查询逻辑。
五、 总结与优化方向
优点:此模型结构清晰,易于扩展。通过增加新的模板和意图识别规则,可以覆盖更多FA业务场景(如重估、减值、CIP转固等)。
优化方向:
引入LLM:使用更强大的LLM(如DeepSeek)替代简单的规则匹配,能更灵活地理解复杂、口语化的用户问题。
动态Schema:直接从数据库读取表结构,使模型始终与真实环境同步。
上下文记忆:支持多轮对话,允许用户逐步细化查询条件。
结果可视化:不仅返回SQL,还可自动执行并返回表格或图表结果。
这个模型可以作为您EBS FA模块运维和分析的强大助手,显著提升数据查询效率和准确性。