当前位置: 首页 > news >正文

华为Met基于您提供的《Oracle EBS FA事务处理底层表数据字典》,我将为您构建一个专注于EBS FA资产模块智能查询的AI模型。这个模型的核心思想是:将结构化的数据字典转化为AI可以理解的领

基于您提供的《Oracle EBS FA事务处理底层表数据字典》,我将为您构建一个专注于EBS FA资产模块智能查询的AI模型。

这个模型的核心思想是:将结构化的数据字典转化为AI可以理解的领域知识图谱,并封装成一系列可复用的查询意图模板。当用户提出业务问题时,模型会进行意图识别、参数提取、语义匹配,最终自动生成准确、高效的SQL查询语句。


一、 AI模型架构设计

本模型采用“分层架构 + 模板引擎”​ 的设计模式,分为四层:

  1. Schema知识库层 (Knowledge Base):将您提供的Excel数据字典结构化,形成机器可读的元数据。包含:

    • 表定义:表名、中文名、用途说明。

    • 字段定义:字段名、类型、是否必填、说明、示例值。

    • 关联关系:根据“FA事务流水核心表关联关系速查表”建立表之间的外键关系图谱。

  2. 意图识别与解析层 (Intent Engine):接收用户的自然语言问题,通过大模型(LLM)或规则引擎,识别其业务意图(如“查询新增资产”、“追溯某笔折旧的凭证”)。

  3. SQL生成引擎层 (SQL Generator):根据识别的意图,从预定义的查询模板库中选择最佳模板,并将用户问题中提取的参数(如资产ID、日期范围、账簿等)填入模板,生成最终SQL。

  4. 结果输出与解释层 (Output Layer):执行SQL(或直接返回SQL文本),并将结果格式化返回给用户,同时附带简要的SQL逻辑解释,增强可信度。

二、 核心工作步骤

当用户提问时,模型按以下步骤工作:

步骤1:用户输入

用户提出业务问题,例如:“帮我查一下上个月新增的所有电脑类资产。”

步骤2:意图识别与参数抽取

模型分析问题,识别出:

  • 意图查询资产新增

  • 业务对象资产(Asset)

  • 时间范围上个月(需转换为具体日期,如2026-06-012026-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凭证到总账”

模型内部工作流程如下:

  1. 意图识别:通过关键词追溯,SLA,凭证,总账,匹配到意图trace_sla_to_gl

  2. 参数提取:通过正则资产ID\s*[::]?\s*(\d+),提取到asset_id = 500123

  3. 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
  1. 结果输出:模型返回上述SQL及其解释,帮助用户理解查询逻辑。

五、 总结与优化方向

  • 优点:此模型结构清晰,易于扩展。通过增加新的模板和意图识别规则,可以覆盖更多FA业务场景(如重估、减值、CIP转固等)。

  • 优化方向

    • 引入LLM:使用更强大的LLM(如DeepSeek)替代简单的规则匹配,能更灵活地理解复杂、口语化的用户问题。

    • 动态Schema:直接从数据库读取表结构,使模型始终与真实环境同步。

    • 上下文记忆:支持多轮对话,允许用户逐步细化查询条件。

    • 结果可视化:不仅返回SQL,还可自动执行并返回表格或图表结果。

这个模型可以作为您EBS FA模块运维和分析的强大助手,显著提升数据查询效率和准确性。

http://www.jsqmd.com/news/1138574/

相关文章:

  • iPhone 6 原理图设计规范解析:51页图纸中的5项专业标注与布局技巧
  • AI视频生成技术在游戏特效制作中的应用实践
  • CO2激光与UV激光钻孔对比:3种PCB基材成孔质量与效率实测分析
  • 2026前端最新八股文最新前端笔试题面试题ai基础入门知识题,开放题,场景题,15项面试真题 ,实战题,源码解析,面试题基础理论都有
  • 竞争存在论:存在的投影法则——三连续统框架下的认知与本质
  • sklearn 1.4+ 朴素贝叶斯3大分类器对比:GaussianNB vs MultinomialNB vs BernoulliNB 实战解析
  • postman写断言(assert)
  • 电脑的安装与卸载
  • 本地部署AI生图与视频生成:免费开源工具实战指南
  • RAG 重排序观测性:召回多不代表答案稳
  • 2026上半年Java面试真题汇总!
  • 终极Sketch设计转代码指南:用Marketch插件5步实现自动化HTML生成
  • 轮转数组三重解法精讲
  • 短剧译制成本结构横评:5款工具的翻译/配音/字幕费用占比
  • 怎样高效配置专业代码字体:提升开发体验的现代方案
  • 【SkyWalking从入门到精通】第09篇:SkyWalking安装全攻略——5分钟跑起来你的第一个APM系统
  • 题解:AcWing 1277 维护序列
  • 轻盈美学合规选品:机构与代理商应关注哪些方面
  • OPC公司如何提出好问题——在AI时代,“提问能力”是你唯一不可替代的竞争力
  • AI驱动的证券智能分析平台:架构设计与工程实践
  • d2s-editor:革新暗黑破坏神2存档编辑体验的可视化工具
  • YOLOv8猫狗品种识别检测系统(项目源码+YOLO数据集+模型权重+UI界面+python+深度学习+环境配置+目标检测)
  • Wan Video音乐伴舞功能:AI视频编辑与节奏分析技术详解
  • 百变互动-数字展厅沉浸式体验与视觉效果全解析
  • 五新智能:以成套智能装备赋能全球工程建设
  • 数字记忆守护者:WeChatMsg让你的微信聊天记录永久留存
  • 正规电商页面内嵌支付钓鱼攻击机理与全域协同防御研究
  • 如何快速构建企业级Vue3后台系统:Element-Plus-Admin完整实战指南
  • 电脑C盘智能清理软件5.0一键扫描清理各类垃圾文件,让您的电脑运行更流畅
  • 猫抓Cat-Catch技术深度解密:浏览器资源嗅探扩展的性能飞跃实战指南