大模型在数据分析领域展现出强大的技术潜力和应用价值
一、大模型在数据分析中的核心能力
-
自然语言交互能力
大模型支持用户通过自然语言(如“分析华东区Q2销售额趋势”)直接发起分析需求,无需掌握SQL等专业技能。例如,京东的ChatBI系统通过自然语言对话实现数据查询,降低技术门槛,使业务人员可自主完成分析。 -
复杂数据处理能力
- 自动化处理:大模型可自动完成数据清洗、转换、特征提取等任务。例如,长安汽车的AI助手能快速处理海量生产数据,简化数据分析流程。
- 模式识别:通过深度学习算法,大模型可从图像、文本、语音等多模态数据中提取特征。例如,在医疗影像分析中,大模型可识别病灶特征辅助诊断。
-
预测与决策支持能力
大模型基于历史数据和机器学习算法,可进行趋势预测、风险评估等。例如,在金融领域,大模型可预测股票价格走势或客户购买倾向;在供应链管理中,可预测未来需求量,优化库存管理。
二、典型应用场景
-
商业智能(BI)与数据可视化
大模型可将复杂数据转化为可视化图表,生成动态报告。例如,波司登利用大模型分析顾客行为数据,优化库存管理,提升业绩。 -
智能客服与用户行为分析
通过分析用户历史行为数据,大模型可提供个性化推荐或服务。例如,电商平台通过大模型分析用户购买记录,推荐相关商品,提升转化率。 -
工业与制造业优化
大模型可实时监测设备状态,预测故障,优化生产流程。例如,中煤科工集团利用大模型提高煤炭开采的安全水平和生产效率。 -
医疗与健康领域
大模型在医学影像分析、疾病预测、病历管理等方面发挥重要作用。例如,某医院通过大模型实现病情快速诊断与个性化治疗建议,提升医疗资源利用效率。
大模型在颠覆性价值
- 革新了自然语言与数据库的交互范式 / 重新定义了数据分析的交互边界
- 显著降低了业务人员的数据获取门槛 / 实现了“人人可分析”的愿景
- 在NLP2SQL领域已展现出初步的商用可行性 / 完成了从实验室到试点场景的跨越
- 在数据分析领域如同一把“万能钥匙”般充满想象空间 / 点燃了“对话即分析”的技术火种
- 在自然语言到结构化查询的映射任务中取得了突破性进展 / 验证了端到端语义解析的可行性
- 让数据分析从‘技术特权’转变为‘业务标配’
但以上的前提是在NLP2SQL任务上F1值的突破,具备商用价值。然而其落地过程中仍面临多重技术瓶颈与工程化挑战
看典型数据集的F1值参考
数据集 | 简单查询(WikiSQL) | 复杂查询(Spider) | 对话式查询(CoSQL) |
---|---|---|---|
SOTA | 92%-94% | 70%-75% | 60%-65% |
优秀 | ≥90% | ≥65% | ≥55% |
可接受 | ≥85% | ≥60% | ≥50% |
较差 | <80% | <55% | <45% |
可见理论上最简单的条件下WikiSQL最高也就94%,有多简单呢:
每个数据库都只有一个表,因此无需考虑主键、外键的问题,预测的SQL语句形式相对简单,基本为一个SQL主句加上0-3个WHERE子句条件限制构成。
注意以上只是参考值,并不是实际水平,我们看2025年的一个统计:
多模态与结构化感知模型:如PICARD通过迭代解码约束提升SQL语法正确性,RAT-SQL+BERT结合关系感知Transformer,在WikiSQL上EX可达92%以上。这已经是最高水平了。
在这么简单的情况下还不能达到100%是哪个系统能接受的吗?
我们看大模型数据分析的几个重要步骤
大模型驱动的数据分析流程可拆解为数据准备、模型交互、分析执行、结果应用四大核心阶段,每个阶段均需结合大模型特性与传统数据分析方法论。
一、数据准备阶段:构建模型可理解的“数据原料”
-
数据接入与治理
- 多源异构数据整合:大模型需处理结构化(数据库/CSV)、半结构化(JSON/日志)、非结构化(文本/图像)数据,需通过ETL工具或数据编织技术统一接入。
- 数据质量校验:
- 缺失值处理:对文本字段中的“N/A”或数值字段的空值,通过大模型生成填充策略(如基于业务规则的默认值、上下文预测值)。
- 异常值检测:利用大模型识别数值分布中的离群点(如销售额突然暴涨10倍),结合统计方法交叉验证。
- 数据安全脱敏:对敏感字段(如身份证号、手机号)进行大模型驱动的动态脱敏,例如通过同义替换、掩码生成等技术,确保训练数据合规。
-
数据特征工程
- 特征提取:
- 文本数据:大模型生成TF-IDF、BERT嵌入向量,捕捉语义特征(如用户评论的情感倾向)。
- 时序数据:通过Transformer模型提取周期性、趋势性特征(如销售数据的季节性波动)。
- 特征选择:基于大模型对特征重要性的评估(如SHAP值解释),筛选高相关性特征,减少模型过拟合风险。
- 特征提取:
二、模型交互阶段:实现自然语言驱动的分析意图解析
-
自然语言理解(NLU)
- 意图识别:大模型将用户输入(如“分析最近3个月高净值客户的购买行为”)拆解为分析目标(客户行为分析)、时间范围(近3个月)、筛选条件(高净值客户)。
- 实体抽取:识别业务实体(如“高净值客户”对应数据库中的
vip_level=3
字段),通过NER(命名实体识别)技术完成语义到数据结构的映射。
-
查询生成与优化
- SQL生成:基于大模型的CodeX技术,将自然语言转换为可执行的SQL语句。例如:
- 用户输入:“统计不同地区客户对各类产品的投诉率”。
- 生成SQL
- 查询优化:大模型对生成的SQL进行语法校验、性能优化(如添加索引建议、避免全表扫描),并通过执行计划分析预测查询耗时。
- SQL生成:基于大模型的CodeX技术,将自然语言转换为可执行的SQL语句。例如:
三、分析执行阶段:大模型与计算引擎的协同
-
分布式计算调度
- 任务拆分:对复杂查询(如涉及多表JOIN、聚合计算),大模型将任务拆解为多个子任务,分配至Spark/Flink等计算引擎并行执行。
- 资源动态分配:基于查询复杂度(如数据量级、计算步骤),大模型预测所需的CPU/内存资源,通过Kubernetes动态扩容。
-
实时计算与流式分析
- 流数据接入:对Kafka等消息队列中的实时数据,大模型生成Flink SQL或CEP(复杂事件处理)规则,实现毫秒级响应(如欺诈交易检测)。
- 增量计算:针对周期性查询(如每日销售日报),大模型优化计算逻辑,仅处理新增数据而非全量扫描。
四、结果应用阶段:从分析到决策的闭环
-
结果可视化与解释
- 智能图表推荐:大模型根据数据类型(如时间序列、分类数据)自动选择可视化形式(折线图/柱状图/热力图),并生成交互式仪表盘(如Metabase/Tableau)。
- 结果解释:对异常数据点(如某日销售额骤降),大模型结合历史数据、外部因素(如节假日、竞品活动)生成原因分析报告。
-
决策支持与自动化
- 预测与模拟:基于大模型的时序预测能力(如Prophet、Transformer),生成未来趋势(如未来3个月库存需求),并支持What-If分析(如价格调整10%对销量的影响)。
- 自动化决策:在供应链补货、广告投放等场景,大模型直接输出操作建议(如补货量=预测需求×1.2安全系数),并通过API触发系统执行。
五、技术挑战与应对策略
挑战 | 大模型解决方案 |
---|---|
语义歧义 | 结合数据库schema知识图谱,通过RAG(检索增强生成)减少误解 |
复杂查询生成错误 | 采用“自然语言→逻辑形式→SQL”三阶段生成框架,增加中间校验环节 |
数据安全风险 | 在模型推理层嵌入权限校验模块,确保查询仅访问用户有权限的表/字段 |
计算资源消耗 | 通过模型蒸馏、量化压缩模型体积,或采用“大模型+小模型”协同推理架构 |
业务定制化需求 | 在领域预训练中融入行业术语(如医疗ICD编码、金融久期计算),提升垂直场景准确率 |
六、未来演进方向
- 从工具到智能体:大模型逐步具备主动分析能力(如自动发现数据关联性、预警异常),从“被动响应”转向“主动建议”。
- 多模态融合分析:整合文本、图像、视频数据(如分析直播带货中的用户评论与商品展示画面关联性)。
- 联邦学习与隐私计算:通过分布式大模型训练,实现跨企业数据协作分析,同时满足GDPR等合规要求。
面临的挑战
就目前情况看,大模型在意图解析、分析、决策等环节表现出了越来越接近人类专家水平的认知能力与工程化价值,尤其在自然语言交互、多模态数据理解及动态决策支持方面展现出突破性进展。
但是在数据分析环节还面临在重大挑战,特别NLP2SQL环节的准确率还完全达不到实用要求。
大模型在NLP2SQL(自然语言转SQL)的技术链条中,通过语义理解、模式匹配、代码生成、执行验证四大核心环节,重构了传统数据分析的底层逻辑。
一、需求解析与语义对齐
目标:将用户口语化需求转化为结构化查询意图
关键技术:
-
领域知识注入
- 通过微调(Fine-tuning)或提示工程(Prompt Engineering),将行业术语(如医疗领域的“LVEF值”→
left_ventricular_ejection_fraction
)与数据库字段绑定。 - 示例:用户问“统计心衰患者用药依从性”,模型需关联
patient_diagnosis.disease_code
与medication_records.adherence_rate
。
- 通过微调(Fine-tuning)或提示工程(Prompt Engineering),将行业术语(如医疗领域的“LVEF值”→
-
意图分层解析
- 拆解复合需求为原子任务。例如,用户问“分析各省份高净值客户占比及增长趋势”,模型需分解为:
- 定义高净值客户(资产>阈值)
- 按省份分组统计
- 计算环比增长率
- 拆解复合需求为原子任务。例如,用户问“分析各省份高净值客户占比及增长趋势”,模型需分解为:
-
模糊需求澄清
- 通过多轮对话确认隐含条件。例如,用户问“最近销售额”,模型可追问:“‘最近’指最近30天还是本季度?是否需要排除节假日数据?”
二、数据模式链接(Schema Linking)
目标:在多源异构数据中精准定位相关表字段
关键技术:
-
向量语义检索
- 将表字段名、注释、示例数据编码为向量,通过Faiss/Pinecone等库实现语义召回。
- 示例:用户问“分析双十一活动效果”,模型通过向量检索关联
promotion_campaign
表(字段含activity_name
)与order_items
表(字段含promotion_id
)。
-
跨库表关联推理
- 基于数据血缘图谱,自动发现表间关联路径。例如,在金融场景中,通过
user_id
关联customer_info
表与transaction_records
表,即使字段名不一致(如uid
vsuser_id
)。
- 基于数据血缘图谱,自动发现表间关联路径。例如,在金融场景中,通过
-
动态Schema生成
- 对非结构化数据(如Excel、JSON)生成虚拟表结构。例如,用户上传包含“日期”“销售额”的CSV文件,模型自动将其映射为临时表
temp_sales_data
。
- 对非结构化数据(如Excel、JSON)生成虚拟表结构。例如,用户上传包含“日期”“销售额”的CSV文件,模型自动将其映射为临时表
三、SQL生成与优化
目标:生成可执行、高效的SQL语句
关键技术:
-
统一SQL方言层
- 设计中间表示(IR)屏蔽方言差异。例如,将
DATE_TRUNC('month', date)
(PostgreSQL)转换为DATE_FORMAT(date, '%Y-%m')
(MySQL),再通过方言适配器转换为目标语法。
- 设计中间表示(IR)屏蔽方言差异。例如,将
-
复杂查询结构化生成
- 采用思维链(Chain-of-Thought)技术,分步构建复杂查询。例如,用户问“统计各省份用户中,购买高端产品占比超过10%的省份”
-
执行性能优化
- 结合数据库元数据(如表大小、索引情况)调整查询策略。例如,对大表避免使用
SELECT *
,自动添加分页条件(如LIMIT 10000
)。
- 结合数据库元数据(如表大小、索引情况)调整查询策略。例如,对大表避免使用
四、执行验证与结果解释
目标:确保SQL正确性并提升结果可理解性
关键技术:
-
执行前语法校验
- 通过ANTLR等工具解析SQL语法树,捕获函数不匹配(如误用
DATE_FORMAT
于Hive)或表不存在等错误。
- 通过ANTLR等工具解析SQL语法树,捕获函数不匹配(如误用
-
执行后逻辑验证
- 对比结果与常识/历史数据。例如,若查询“北京用户数”返回10亿,模型可触发警告:“结果超出合理范围(北京人口约2000万),建议检查WHERE条件。”
-
自然语言结果解释
- 将SQL查询逻辑翻译为业务语言。例如,将:
解释为:“按商品品类统计退货率,公式为:退货订单数/总订单数。”SELECT product_category, SUM(CASE WHEN return_flag = 1 THEN 1 ELSE 0 END) / COUNT(*) AS return_rate FROM orders GROUP BY product_category;
- 将SQL查询逻辑翻译为业务语言。例如,将:
五、交互式增强与自主迭代
目标:构建持续进化的数据分析智能体
关键技术:
-
主动学习反馈
- 对用户纠正的SQL(如“WHERE条件应为
create_time > '2023-01-01'
而非create_time > NOW() - INTERVAL 1 YEAR
”)进行强化学习,优化未来生成策略。
- 对用户纠正的SQL(如“WHERE条件应为
-
多模态结果呈现
- 根据结果特征自动选择可视化形式。例如:
- 数值型数据→折线图/柱状图
- 地理分布→热力图
- 文本数据→词云
- 根据结果特征自动选择可视化形式。例如:
-
执行计划可视化
- 以DAG图展示数据流动过程,允许用户干预(如替换数据源或调整JOIN顺序)。
技术挑战与应对策略
挑战 | 解决方案 |
---|---|
长尾Schema覆盖不足 | 通过RAG动态加载领域知识库,支持企业自定义术语映射(如“高净值”→asset_value > 500万 ) |
方言兼容性差 | 建立方言转换规则库,支持MySQL/PostgreSQL/Hive/Spark SQL等多种方言的自动适配 |
复杂计算易出错 | 对WINDOW 函数、LATERAL JOIN 等高级语法进行专项训练,错误率降低67% |
多源数据时效性差异 | 通过CDC(变更数据捕获)技术同步异构数据源,确保JOIN操作基于同一时间切片 |
通过层层分析可以发现整个过程的瓶颈在于 方言兼容性 , 按正常理解每个数据库的语法基本上都提供了公开可查的说明手册,这对于大模型来说应该是很简单的事,而实际并非如此。NLP2SQL技术的方言兼容性是影响其跨数据库系统落地效果的关键因素。
一、SQL方言差异的根源与影响
不同数据库系统对SQL标准的扩展差异显著,例如:
- 语法结构差异:Oracle的
ROWNUM
伪列、MySQL的LIMIT
子句、SQL Server的TOP
语法在分页查询中互不兼容,需针对性适配。 - 函数支持差异:日期处理函数如
DATE_ADD
(MySQL)、DATEADD
(SQL Server)存在参数格式差异,影响时间条件生成。 - 数据类型映射:Oracle的
VARCHAR2
与MySQL的VARCHAR
在精度定义和存储行为上存在细微差异,需在Schema理解阶段处理。
二、技术实现中的方言兼容策略
主流NLP2SQL框架通过以下技术路径实现兼容:
-
抽象语法层设计:
采用AST(抽象语法树)中间表示,将自然语言解析为数据库无关的逻辑查询计划,再通过方言转换器生成目标SQL。
例如:Apache Calcite通过RelNode构建逻辑执行计划,支持PostgreSQL、Hive等方言映射。 -
方言感知生成器:
基于Transformer的模型(如T5、GPT)通过多任务学习融合方言特征,在微调阶段加入方言标签(如--dialect mysql
)引导生成。
实验表明,方言感知微调可使跨方言准确率提升15%-20%。 -
动态SQL改写引擎:
规则引擎(如Apache Druid的SQL方言适配层)通过模式匹配替换方言特定语法,例如将SELECT TOP 10
改写为LIMIT 10
。
结合AST验证确保改写后的SQL语义一致。"
AnyLine如何解决方言兼容问题
AnyLine采用的第1种方式抽象语法层设计,这种方式的工作量最大,需要为每个数据库定制适配器生成特定的SQL,但可以保证准确性,而不是像大模型一样靠概率。而实际工作量也不是非常大,因为数据库的类型是有限的,通过层层继承,最后需要实现的方法并没有多少个,只需要实现差异部分即可。看一下传统项目中AnyLine数据读取的过程。
graph TD
A[开始] --> B[提交查询参数并指定数据源]
B -->|不指定则调用默认| C[ServiceProxy]
C --> D[根据数据源定位service]
D --> E{cache}
E -->|否| D
E -->|是| F[统一参数为RunPrepare]
F --> G[定位runtime获取adapter]
G --> H[dao]
H --> I[提交RunPrepare]
I --> J[adapter]
J --> K[创建适合数据库的Run]
K --> L[actuator]
L --> M[合成SQL]
M --> N[官方驱动]
N --> O[流式读取]
O --> P[ResultSetMetaData]
P -->|通用数据类型对应| Q[TypeMetadataAlias]
Q --> R[StandardTypeMetadata]
P --> S[handler]
S --> T[adapter]
T --> U[结果数据类型]
U --> V[DataReaderFactory]
V --> T
T --> W[Converter]
W --> X[DataSet<DataRow> List<Entity>]
subgraph 数据库与Java类型对应
Y[TypeMetadataAlias]
Y -->|关联| R
end
方言兼容发生在adapter环节,目前已经适配了100+的关系型及非关系型数据库,作到不同数据库操作的一致性。
AnyLine在大模型数据分析NLP2SQL环节实现“语义理解”与“数据库执行”解耦,最终实现NLP2AnyLine2SQL
AnyLine与大模型协同实现NLP2SQL解耦的完整工作流程:
1. 元数据理解阶段
大模型首先调用AnyLine获取数据库元数据(表结构、字段类型、关系约束等),建立对目标数据库的基础认知框架。这一步骤确保后续语义理解不会产生结构性错误。
2. 语义解析阶段
大模型接收用户自然语言查询后:
- 识别核心操作类型(查询/聚合/排序等)
- 提取关键实体(时间范围、筛选字段等)
- 构建条件逻辑树(AND/OR嵌套关系)
- 输出符合AnyLine约定的JSON中间表示,约定有两类:
1.多表关联关系{ "table": "FI_USER", //主表 "alias": "FI", /别名 "distinct": "distinct", //去重 "joins": [ //关联表S { "table": "HR_USER", //关联表名 "alias": "HR", //关联表别名 "type": "LEFT", //关联方式 "conditions": { //关联条件 这里是逆向生成的所以属性比较复杂(完整)具体参考 ConfigStore<>JSON互换 "join": "AND", "items": [ { "join": "AND", "text": "FI.ID = HR.ID", "compare": 10, "over_condition": false, "over_value": true, "parser": { "compare": 10, "join": "AND", "swt": "NONE" } } ] } } ], "columns": [ //需要查询的列 默认* "FI.ID AS FI_ID", "HR.ID AS HR_ID" ] } 因为上面的conditions是逆向生成的所以与查询条件的属性一样,比较复杂,可以简化成成: {"conditions":"HR.ID = FI.HR_ID"} 或 {"conditions":"HR.ID = FI.HR_ID AND HR.CODE = FI.HR_CODE"} 或 {"conditions":["HR.ID = FI.HR_ID","HR.CODE = FI.HR_CODE"]}
2.查询条件注意两个类Config和ConfigChain Config:查询条件,对下面json里的一个{} ConfigChain:继承自Config是多个条件的集合,集合中的条目有可能是Config也有可能还是个ConfigChain,可以理解成一个()里有多个条件,也对应下面json里的一个items[] join:表示前一个条件与当前条件的join方式(and或or) 下面的JSON是通过ConfigStore.json()逆向生成的,所以会有许多附加属性,最后有简化格式。 { "columns": { "query": [ //需要查询列,如果未提供则查询 ], "exclude": [ //不需要查询的列,有些情况显要返回给前端的列非常多,但只有很少几个不需要返回如密码, //通过query一个一个指定太啰嗦,可以通过exclude指定表示 查除了exclude之外的所有列 ] }, "navi":{ //分页(更多默认设置参考PageNaviConfig) "page":1, //当前第page页 默认1 "vol":10 //每页vol行 默认PageNaviConfig.DEFAULT_VAR_PAGE_DEFAULT_VOL } "havings":["MIN(PRICE)>100","COUNT(*)>1"], "havings":[{"text":"MIN(PRICE)>100"}]//自动生成的会比较复杂效果一样 "havings":[] //与conditions.items格式一致 "groups":["TYPE_CODE", "CLASS_CODE"], "groups":[{column:"TYPE_CODE", column:"CLASS_CODE"}]//自动生成的会比较复杂效果一样 "conditions": { //ConfigStore中查询条件的最外层对应属性ConfigChain 简化方式可以直接写String查询条件或[String | json]数组(见最后示例) "join": "AND", //这里有JOIN方式,是因为有可能会有多个ConfigStore,前一个ConfigStore与当前ConigStore以and方式join "items": [ //ConfigChain中的集合,相当于SQL条件中的()中的多个and或or { //集合中的条目有可能还是一个集合,相当于多层嵌套 "join": "AND", "items": [ { "join": "AND", "text": null, //表示一个静态条件,没有参数或者其他比较复杂的条件 如 USER_ID IS NULL "key": null, //表示http参数名在AnylineController.condition("USER_ID:usr")形式中用到的key=usr "var": "ID", //列名或自定义SQL的查询条件ID "compare": 10, //比较运算符,参考org.anyline.entity.Compare枚举,默认10(equal) "values": [1], //值对于IN BETWEEN会有多个值 "over_condition": false, //覆盖相同var查询条件 "over_value": true, //相同查询条件第二次赋值是否覆盖上一次的值,如果不覆盖则追加到values集合中 "parser": { //比较复杂的条件需要更多参数 "prefix": null, //自定义SQL中的查询条件可能有多个占位符,赋值时需要prefix.var:key格式(查询条件id.占位符:http参数) "var": "ID", //与外层var作用重复,只需要指定一个即可 "class": null, //参数值有可能需要预处理var:class.method(key) "method": null, "key": null, //与外层key作用重复,只需要指定一个即可 "default": [], //通过key没取到会值时的默认值 "compare": 10, //与外层compare用重复,只需要指定一个即可 "join": "AND" //与外层join作用重复,只需要指定一个即可 } }, { "join": "AND", "text": null, "key": null, "var": "NAME", "compare": 50, "values": ["ZH"], "over_condition": false, "over_value": true, "parser": { "prefix": null, "var": "NAME", "class": null, "method": null, "key": null, "default": [], "compare": 50, "join": "AND" } }, { "join": "AND", "text": null, "key": null, "var": "TYPE_CODE", "compare": 40, "values": ["1","2","3"], "over_condition": false, "over_value": true, "parser": { "prefix": null, "var": "TYPE_CODE", "class": null, "method": null, "key": null, "default": [], "compare": 40, "join": "AND" } } ] }, { "join": "OR", "items": [ { "join": "AND", "items": [ { "join": "AND", "text": null, "key": null, "var": "A", "compare": 10, "values": [1], "over_condition": false, "over_value": true, "parser": { "prefix": null, "var": "A", "class": null, "method": null, "key": null, "default": [], "compare": 10, "join": "AND" } }, { "join": "OR", "text": null, "key": null, "var": "B", "compare": 10, "values": null, "over_condition": false, "over_value": true, "parser": { "prefix": null, "var": "B", "class": null, "method": null, "key": null, "default": [], "compare": 10, "join": "OR" } } ] } ] } ] } }
以上是通过ConfigStore逆向生成所以比较复杂。
实际可参考【表关联格式约定】和【查询条件格式约定】
3. 执行反馈阶段
AnyLine接收到中间表示后:
- 进行SQL方言适配(MySQL/Oracle等)
- 自动优化查询计划(索引提示、子查询处理)
- 执行后返回结构化数据结果
- 大模型对原始数据做最终呈现处理(单位换算、趋势分析等)
最终通过NPL2AnyLine2SQL方式实现大模型无需感知数据库物理细节,AnyLine则专注查询优化与执行,双方通过标准化JSON接口实现高效协作。
graph TD
A[开始] --> B[用户输入自然语言查询]
B --> C[大模型接收查询]
C --> D[大模型进行语义理解]
D --> E[大模型输出中间表示\nJSON格式]
E --> F[AnyLine接收中间表示]
F --> G[数据源特征分析\n判断数据库类型]
G --> H[定位对应Adapter]
H --> I[AnyLine生成SQL]
I --> J[AnyLine执行SQL]
J --> K[AnyLine返回结果给大模型]
K --> L[大模型处理并呈现结果]
L --> M[结果呈现给用户]