华为Met基于您提供的《Oracle EBS FA事务处理底层表数据字典》,我将为您构建一个专注于EBS FA资产模块智能查询的AI模型。这个模型的核心思想是:将结构化的数据字典转化为AI可以理解的领
基于您提供的《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 11 {% 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 11 {% 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 11 {% 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 11 {% 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(day1) last_month_end first_of_month - timedelta(days1) last_month_start last_month_end.replace(day1) 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】**\nsql\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 11 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模块运维和分析的强大助手显著提升数据查询效率和准确性。