news 2026/10/1 17:49:29

面向Agent的全模态数据平台架构设计与落地实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面向Agent的全模态数据平台架构设计与落地实践

1. 从“湖生万物”说起:这个全模态数据平台到底在解决什么问题

第一次看到“湖生万物,助力 AI”这个提法,我脑子里冒出来的第一个画面是数据湖。做数据这行的都清楚,数据湖这个概念喊了快十年,从最早的 Hadoop 生态到后来的湖仓一体,本质上一直在解决同一件事:把散落在各处的数据归拢到一处,让上层应用能方便地取用。但这次云栖2026抛出来的“面向 Agent 的全模态数据平台”,跟传统数据湖完全不是一个维度的东西。

传统数据湖服务的是人——分析师写 SQL 查数、BI 工程师拖拽做报表、数据科学家跑训练任务。而 Agent 时代的数据平台,服务对象变成了自主决策的智能体。这个转变听起来只是换了个用户,实际上整个架构逻辑都要推倒重来。人查数据有明确的意图,Agent 取数据是任务驱动的、动态的、多轮交互的。人看一张图片能理解语义,Agent 需要的是图片的向量表示、元数据标注、跨模态关联关系。这就是为什么标题里强调“全模态”——文本、图像、音频、视频、结构化数据、代码,全部要统一纳管,而且不是简单存起来,是要让 Agent 能“理解”和“调用”。

我过去两年参与过几个 Agent 项目的落地,最头疼的从来不是模型能力不够,而是数据供给跟不上。一个客服 Agent 要回答用户问题,背后需要产品文档、历史工单、FAQ、用户画像、订单数据五六个系统的数据,每个系统的数据格式、更新频率、访问方式都不一样。你要么写一堆胶水代码硬编码,要么搭一个中间层做适配。这个中间层,就是全模态数据平台要干的事。

所以这篇文章我想从实操角度拆解一下:一个面向 Agent 的全模态数据平台,核心架构应该怎么设计,关键模块怎么实现,踩过哪些坑,以及普通团队怎么用现有工具搭出一个可用的版本。不管你是做 Agent 开发的工程师,还是负责数据基础设施的架构师,或者只是对 AI 应用落地感兴趣的技术人,应该都能从中找到能直接抄作业的东西。

2. 核心架构拆解:为什么传统数据湖撑不起 Agent 场景

2.1 从“人查数”到“Agent 取数”的本质差异

先把这个差异说透,不然后面的架构设计都是空中楼阁。传统数据湖的典型查询模式是:用户提交一个 SQL,系统返回结果集。这个过程中,查询是显式的、一次性的、有明确边界的。Agent 取数完全不是这个逻辑。

Agent 的工作方式是:接到一个任务,比如“帮我分析上季度华东区销售下滑的原因”,它会自主拆解成若干子任务——先查销售数据,再查区域门店信息,再查促销活动记录,再查竞品动态,最后综合推理给出结论。这个过程中,Agent 可能调用十几次数据接口,每次调用的参数依赖上一次的结果,而且它不知道自己要找的数据具体在哪个表哪个字段,需要平台提供语义层的检索能力。

这就带来三个硬性要求。第一是低延迟高并发,Agent 的推理链路是串行的,每一步都等数据,数据接口慢 100ms,整个任务就慢好几秒。第二是语义检索能力,Agent 没法写精确的 SQL,它需要的是“给我找和华东区销售相关的所有数据”这种模糊查询,平台得支持向量检索、关键词检索、元数据过滤的混合查询。第三是多模态统一访问,Agent 可能同时需要一张图表、一段会议录音、一份 PDF 报告,平台得用统一的接口把这些都吐出来。

我见过不少团队试图在现有数据湖上套一层 API 网关就当成 Agent 数据平台用,结果就是 Agent 要么查不到数据,要么查到的数据格式对不上,最后变成人工兜底。这个坑的本质是:传统数据湖的元数据管理是面向人的,表名、字段名、注释都是给人看的,Agent 需要的是面向机器的语义描述。

2.2 全模态数据平台的五层架构模型

基于上面的差异分析,一个能真正支撑 Agent 的全模态数据平台,我倾向于把它拆成五层。这个分层不是拍脑袋想的,是实际项目中反复调整后沉淀下来的。

接入层负责对接各种数据源。结构化数据走 JDBC/ODBC,半结构化数据走 Kafka/Pulsar 消息队列,非结构化数据走对象存储的事件通知,API 数据走定时拉取或 webhook。这一层的核心设计原则是“插件化”,每种数据源对应一个 Connector,新增数据源不用改核心代码。我建议用 SPI 机制做扩展,Java 生态可以用 ServiceLoader,Python 生态可以用 entry_points。

存储层要解决多模态数据的统一存储问题。文本和结构化数据用列式存储(Parquet/ORC)加湖仓格式(Iceberg/Hudi/Delta Lake),向量数据用专门的向量数据库(Milvus/Qdrant/Weaviate),图像音频视频用对象存储加元数据索引。这里的关键决策是:不要试图用一种存储引擎搞定所有模态,那是自找麻烦。但要在上层做统一的 Catalog,让 Agent 感知不到底层存储的差异。

处理层负责数据的清洗、转换、增强。传统 ETL 处理的是结构化数据,这里要加上多模态处理能力——OCR 提取图片文字、ASR 转写音频、视频抽帧打标、文档解析分块。处理层还要做 embedding 生成,把文本、图像、音频都转成向量,这是 Agent 语义检索的基础。我实测下来,embedding 生成是整条链路里最耗资源的环节,建议用批处理加缓存的方式做,不要每次查询都实时生成。

语义层是整个平台最核心也最难做的部分。它要维护一套面向 Agent 的元数据体系,包括数据集的语义描述、字段的业务含义、数据之间的关联关系、数据的新鲜度和质量指标。Agent 通过语义层来发现数据,而不是通过表名。举个例子,Agent 问“最近的用户反馈”,语义层要能理解“最近”是时间范围,“用户反馈”对应哪些数据集,然后返回一个排序后的结果列表。

服务层对外暴露统一的 API。这里要支持几种调用方式:REST API 给简单查询用,GraphQL 给复杂关联查询用,gRPC 给高性能场景用,MCP 协议给 Agent 框架原生集成用。服务层还要做权限控制、限流熔断、查询缓存。我特别想强调 MCP 协议的重要性,2026 年主流 Agent 框架基本都支持 MCP,平台如果能原生暴露 MCP 接口,Agent 接入成本会低很多。

2.3 关键设计决策:为什么选择湖仓一体加向量索引的混合架构

架构选型这块我踩过不少坑,值得展开说说。最早我们试过纯向量数据库方案,把所有数据都转成向量存进去,查询全靠相似度检索。问题是向量检索的精度不够,Agent 要查“订单号 12345 的物流状态”,向量检索可能返回一堆语义相似但完全无关的结果。后来改成纯湖仓方案,用 SQL 做精确查询,但 Agent 又没法表达复杂的语义需求。

最终的方案是混合架构:湖仓负责精确查询和结构化分析,向量索引负责语义检索和模糊匹配,两者通过统一的查询路由层做协同。具体来说,Agent 发来一个查询请求,路由层先做意图识别——如果是精确查询(带明确 ID、时间范围、枚举值),走湖仓 SQL 引擎;如果是语义查询(自然语言描述、相似度匹配),走向量检索;如果是混合查询,两边都查然后做结果融合。

这个融合逻辑是难点。我们的做法是用一个轻量级的 rerank 模型对两路结果做重排序,综合考虑语义相似度、数据新鲜度、用户历史偏好等因素。实测下来,混合架构的召回率比单一路径高 40% 以上,延迟增加控制在 50ms 以内。

注意:混合架构的复杂度不低,如果团队规模小、数据量不大,建议先用湖仓加简单的关键词检索起步,等 Agent 场景真正跑起来再引入向量索引。不要为了架构而架构。

3. 核心模块实操:从数据接入到 Agent 调用的完整链路

3.1 多模态数据接入的工程实现

数据接入看起来简单,实际做起来细节非常多。我拿几个典型场景来说。

结构化数据接入相对成熟,用 Flink CDC 或者 Debezium 做增量同步就行。但要注意 schema 演进的问题——源库加了个字段,下游 Agent 的查询逻辑可能就挂了。我们的做法是在接入层做 schema 版本管理,每次 schema 变更生成一个新版本,Agent 查询时指定版本或者用兼容模式。另外,结构化数据的元数据要自动抽取,包括表名、字段名、类型、主键、外键、索引信息,这些是语义层的基础。

文档数据接入是最麻烦的。PDF、Word、PPT 格式各异,解析出来的文本质量参差不齐。我们试过市面上主流的解析库,最后的选择是:简单文档用 PyMuPDF 直接抽文本,复杂版式用 OCR 兜底,表格用专门的表格识别模型处理。解析完之后要做分块,分块策略直接影响检索效果。我的经验是:按语义段落分块,每块 300-500 字,块之间保留 10% 的重叠,这样既能保证检索精度,又不会丢失上下文。

图像和视频数据的接入重点是元数据提取。图像要提取 EXIF 信息、做物体检测打标、生成 CLIP embedding。视频要抽关键帧、做场景分割、生成时序描述。这些处理都是计算密集型的,建议用异步任务队列做,不要阻塞主流程。我们用的是 Ray 做分布式处理,一个 10 分钟的视频大概 2 分钟能处理完。

音频数据先做 ASR 转写,再对转写文本做分块和 embedding。ASR 的准确率直接影响后续检索效果,建议用带说话人分离的模型,这样检索时能区分不同人的发言。转写结果要保留时间戳,Agent 需要定位到具体时间点时能直接跳转。

数据类型接入方式处理耗时(参考)关键注意事项
结构化数据CDC 增量同步秒级schema 版本管理
PDF 文档解析+OCR每页 1-3 秒表格和版式处理
图像元数据提取+embedding每张 0.5-2 秒批量处理降成本
视频抽帧+场景分割每分钟 10-20 秒异步任务队列
音频ASR+分块每分钟 5-10 秒说话人分离

3.2 语义层的元数据建模与检索优化

语义层是 Agent 能不能用好数据的关键。我见过太多平台数据存得很好,但 Agent 就是找不到,问题全出在语义层。

元数据建模的核心是建立三层描述体系。第一层是技术元数据,包括数据源、表名、字段、类型、分区、存储位置,这些是自动抽取的。第二层是业务元数据,包括数据集的中文名、业务描述、负责人、更新频率、数据质量评分,这些需要人工维护或者用 LLM 辅助生成。第三层是语义元数据,包括数据集的向量表示、实体识别结果、关系图谱、使用场景标签,这些是平台自动计算和持续更新的。

检索优化方面,纯向量检索的问题在于召回不稳定。我们的做法是“向量检索+关键词检索+元数据过滤”三路并行,然后用 RRF(Reciprocal Rank Fusion)做结果融合。具体参数上,向量检索取 Top 50,关键词检索取 Top 50,元数据过滤做硬性筛选,融合后取 Top 10 返回给 Agent。这个配置是反复调优后确定的,召回率和精度比较平衡。

还有一个容易被忽略的点是查询改写。Agent 发来的查询往往是自然语言,直接拿去检索效果不好。我们在检索前加了一个轻量级的查询改写模块,用一个小模型把自然语言查询转成结构化查询意图,包括实体识别、时间范围提取、数据类型过滤等。这个模块用 7B 级别的模型微调就能做,推理延迟控制在 100ms 以内。

3.3 Agent 调用接口的设计与 MCP 协议适配

Agent 调用数据平台的接口设计,核心原则是“让 Agent 少做决策”。什么意思?Agent 的推理能力是有限的,如果每次取数都要它自己判断走哪个接口、传什么参数,很容易出错。平台应该提供一个统一的入口,Agent 只需要描述“我要什么”,平台内部去路由。

我们设计的接口是这样的:Agent 发送一个自然语言查询加一些上下文信息(当前任务、历史对话、用户身份),平台返回一个结构化结果,包含数据内容、数据来源、置信度、相关建议。这个接口背后做了大量工作——意图识别、查询路由、结果融合、权限校验、脱敏处理,但对 Agent 来说就是一个简单的请求响应。

MCP 协议的适配是 2026 年的重点。MCP 本质上是一套标准化的工具调用协议,Agent 框架通过 MCP 来发现和调用外部能力。我们把数据平台的查询能力封装成 MCP Tool,Agent 在运行时能自动发现这些 Tool 并调用。具体实现上,需要定义 Tool 的 schema,包括名称、描述、参数定义、返回值格式。描述要写得足够清晰,因为 Agent 是靠描述来决定要不要调用这个 Tool 的。

# MCP Tool 定义示例(简化版) { "name": "query_multimodal_data", "description": "查询全模态数据平台,支持文本、图像、音频、视频、结构化数据的统一检索", "parameters": { "query": {"type": "string", "description": "自然语言查询描述"}, "modalities": {"type": "array", "items": {"type": "string"}, "description": "需要的数据模态"}, "time_range": {"type": "object", "description": "时间范围过滤"}, "top_k": {"type": "integer", "default": 10, "description": "返回结果数量"} } }

提示:MCP Tool 的描述文本直接影响 Agent 的调用准确率。我建议把描述写得具体一些,包含典型使用场景和参数示例,不要写得太抽象。

4. 性能与并发:Agent 场景下的数据平台怎么扛住压力

4.1 Agent 并发取数的压力特征分析

Agent 场景的并发压力和传统 Web 应用完全不同。传统应用的请求是均匀分布的,QPS 可以预测。Agent 的请求是突发性的——一个复杂任务可能瞬间发起几十个数据查询,然后沉默几秒等推理,再发起下一波。这种脉冲式的流量特征对系统的弹性要求很高。

我实测过一个客服 Agent 场景,单个用户会话平均触发 15-20 次数据查询,峰值时 100 个并发会话就是 1500-2000 QPS。而且这些查询的复杂度差异很大,有的只是查一个订单状态(10ms 返回),有的要做跨模态语义检索(500ms 以上)。如果系统不能区分对待,简单查询会被复杂查询拖死。

我们的解决方案是查询分级+资源隔离。把查询分成三级:L1 是精确查询(带 ID 的键值查询),走缓存和内存索引,目标延迟 10ms;L2 是条件查询(带过滤条件的结构化查询),走湖仓引擎,目标延迟 100ms;L3 是语义查询(向量检索+融合排序),走专门的检索集群,目标延迟 500ms。三级查询用不同的线程池和资源配额,互不影响。

4.2 缓存策略与预取机制的设计

缓存是扛并发的第一道防线。但 Agent 场景的缓存和传统缓存不一样,因为查询的个性化程度高,缓存命中率天然偏低。我们的做法是分层缓存。

第一层是结果缓存,key 是查询的规范化表示,value 是完整结果。这层命中率大概 20-30%,主要覆盖高频的重复查询。第二层是向量缓存,缓存 embedding 计算结果,因为 embedding 生成很耗资源,同一个文本多次查询时直接复用。这层命中率能到 60% 以上。第三层是元数据缓存,语义层的元数据变化不频繁,全量缓存在内存里,查询时直接命中。

预取机制是另一个优化点。Agent 的任务往往有固定的模式,比如客服场景总是先查用户信息、再查订单、再查工单。我们分析了历史查询序列,用马尔可夫链预测下一步可能查什么,提前把数据加载到缓存。这个预取策略把平均查询延迟降低了 35% 左右。

4.3 限流降级与故障隔离的实操配置

再好的系统也会遇到故障,关键是故障时不崩。我们的限流策略是基于令牌桶做的,但桶的容量和补充速率是动态调整的——根据系统当前的负载情况自动伸缩。具体配置上,L1 查询的令牌桶容量是 10000,补充速率 5000/s;L2 是 2000 和 500/s;L3 是 500 和 100/s。这些数值是根据压测结果定的,不同系统需要自己调。

降级策略分三级。一级降级是关闭语义检索的 rerank 环节,直接用向量相似度排序,延迟降低 60%,精度损失约 15%。二级降级是关闭向量检索,只走关键词检索,延迟降低 80%,精度损失约 40%。三级降级是只返回缓存结果,不查底层存储。降级触发条件是错误率超过阈值或者延迟超过阈值,恢复是自动的,但要有冷却时间,避免频繁抖动。

故障隔离方面,最重要的是把不同数据源的查询隔离开。我们给每个数据源分配独立的连接池和线程池,一个数据源挂了不影响其他数据源。另外,所有外部调用都要设超时,超时时间根据数据源的历史 P99 延迟来定,一般是 P99 的 2 倍。

降级级别触发条件影响恢复策略
一级延迟 P99 > 1s精度降 15%冷却 30s 后自动恢复
二级错误率 > 5%精度降 40%冷却 60s 后自动恢复
三级错误率 > 20%只返回缓存人工确认后恢复

5. 踩坑实录:Agent 数据平台落地中的典型问题与排查

5.1 数据质量问题的排查与治理

Agent 对数据质量的敏感度远高于人。人看到一条脏数据会自己判断忽略,Agent 会把它当成事实依据,导致整个推理链路跑偏。我们遇到过最典型的问题是数据新鲜度不一致——用户画像数据是 T+1 更新的,订单数据是实时的,Agent 查出来的结果就是矛盾的。

治理方案是建立数据质量监控体系,核心指标包括:新鲜度(数据更新时间与当前时间的差值)、完整度(非空字段比例)、一致性(跨表关联字段的匹配率)、准确性(抽样人工校验)。每个数据集都要设阈值,超过阈值触发告警。Agent 查询时,平台会在返回结果里附带数据质量标记,Agent 可以根据标记决定是否采信。

另一个坑是元数据描述不准确。语义层的元数据如果是人工维护的,很容易过时或者写错。我们的做法是用 LLM 辅助生成元数据描述,然后人工审核。LLM 生成的描述虽然不一定完美,但至少能保证覆盖度和一致性。审核环节重点看业务含义和关联关系,技术元数据基本可以自动通过。

5.2 检索精度不达标的调优过程

检索精度是 Agent 数据平台的核心指标。我们最初上线时,Top 10 召回率只有 55%,Agent 经常找不到需要的数据。调优过程持续了两个月,主要做了这几件事。

第一是优化分块策略。原来按固定长度分块,导致语义被切断。改成按语义段落分块后,召回率提升了 12 个百分点。第二是引入混合检索。纯向量检索换成向量+关键词+元数据过滤的混合模式,召回率再提升 15 个百分点。第三是微调 embedding 模型。用业务数据对通用 embedding 模型做微调,让向量表示更贴合领域语义,召回率提升 8 个百分点。第四是优化 rerank 模型。用交叉编码器做精排,Top 10 精度提升 20 个百分点。

最终 Top 10 召回率做到 88%,Top 3 精度做到 75%。这个水平基本能满足 Agent 场景的需求。调优过程中最大的体会是:没有银弹,每个环节优化一点,累积起来效果就很明显。

5.3 常见问题速查表与避坑指南

问题现象可能原因排查方法解决方案
Agent 查不到数据语义元数据缺失检查数据集是否注册补全元数据描述
查询延迟高向量检索未走索引查看检索执行计划重建向量索引
结果不相关分块策略不合理抽样检查分块质量调整分块参数
并发上不去连接池配置过小监控连接池使用率扩大连接池
数据不一致多源更新不同步对比各源更新时间统一更新调度
内存溢出embedding 缓存过大监控缓存内存占用设置缓存上限

注意:Agent 数据平台的排查和传统系统不同,很多问题是语义层面的,不是技术层面的。排查时要同时看技术指标和业务效果,不能只看监控面板。

6. 从零搭建:小团队如何用现有工具快速落地

6.1 技术选型的最小可行方案

不是每个团队都有资源自研全套平台。如果让我给一个小团队推荐最小可行方案,我会这样选:存储用 MinIO 加 Iceberg,向量库用 Qdrant(轻量、部署简单),处理用 Ray Data,语义层用 PostgreSQL 加 pgvector 扩展,服务层用 FastAPI。这套组合全部开源,部署成本低,社区活跃,遇到问题好找答案。

如果团队有云资源,可以用云厂商的托管服务替代自建。对象存储用云 OSS,向量检索用云上的向量检索服务,消息队列用云 Kafka。托管服务的优势是运维成本低,劣势是灵活性差、成本高。我的建议是核心链路自建,边缘能力用托管。

6.2 分阶段实施路线图

落地不要想着一步到位,分三个阶段比较稳妥。第一阶段(1-2 个月)先做结构化数据的接入和查询,把基础链路跑通,让 Agent 能查到基本数据。第二阶段(2-3 个月)加入文档和图像数据,建立语义层,实现混合检索。第三阶段(3-6 个月)完善多模态处理、性能优化、监控告警,达到生产可用标准。

每个阶段都要有明确的验收标准。第一阶段的验收标准是 Agent 能通过平台查到结构化数据,查询延迟 P99 小于 200ms。第二阶段的验收标准是 Top 10 召回率大于 80%,支持至少三种数据模态。第三阶段的验收标准是支撑 1000 QPS,可用性 99.9%。

6.3 团队配置与技能要求

小团队做这个事,3-5 个人比较合适。需要一个数据工程师负责接入和处理,一个后端工程师负责服务和接口,一个算法工程师负责检索和排序,一个运维工程师负责部署和监控。如果人手不够,后端和运维可以合并,算法和数据可以合并。

技能要求上,数据工程师要懂 Flink/Spark 和湖仓格式,后端工程师要懂 Python/Java 和 API 设计,算法工程师要懂 embedding 和向量检索,运维要懂 Docker/K8s 和监控体系。Agent 相关的知识可以边做边学,核心是数据平台的基本功要扎实。

我在实际项目中的体会是,这个事最难的不是技术,是跨团队协作。数据平台团队、Agent 开发团队、业务团队三方的诉求经常不一致,需要有一个强有力的技术负责人来对齐目标、协调资源。技术方案再完美,协作不畅也落不了地。

最后分享一个小技巧:上线初期一定要做端到端的链路追踪,从 Agent 发起查询到数据返回,每个环节的耗时和状态都要记录。这样出问题时能快速定位是哪个环节的锅,避免扯皮。我们用的是 OpenTelemetry 加 Jaeger,接入成本低,效果很好。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 17:48:51

芯片行业大文件上传实战:Java后端分块架构详解

芯片制造行业的网页应用,Java后端的文件上传一直是块硬骨头。我最早接触这个需求是在做晶圆厂生产数据管理系统时,光刻机跑出来的GDSII版图文件动辄几十GB,甚至上百GB,还有晶圆检测环节产出的高分辨率缺陷图片,一批Rev…

作者头像 李华
网站建设 2026/10/1 17:48:23

微电网混合储能双层能量管理:基于MPC的Matlab仿真实现

微电网里加储能,最头疼的不是“加多少”,而是“怎么管”。光伏一会有电一会没电,负荷说涨就涨,电池若只顾着平抑波动,SOC容易跑偏,寿命咔咔掉;若只顾着省钱,功率波动又压不住。单一储…

作者头像 李华
网站建设 2026/10/1 17:46:31

LSTM空气质量预测与可视化分析:Python实战教程

简介:这是一套基于长短期记忆网络(LSTM)的空气质量数据预测与可视化分析系统,采用Python编程语言实现,面向计算机相关专业的高阶课程实践、毕业设计及机器学习入门人群。系统覆盖数据预处理、异常值清洗、归一化、多层…

作者头像 李华
网站建设 2026/10/1 17:45:44

高温发酵菌群稳定性如何保障?多组学拆解群落失稳机制

高温发酵的车间里,最怕的不是温度不够,而是菌群“变心”。做白酒酒醅、堆肥、沼气发酵的朋友应该都有这种体验:前面几批数据漂漂亮亮,产酸、产气、升温曲线都正常,突然某一天指标全线塌方,翻池闻到的味道不…

作者头像 李华
网站建设 2026/10/1 17:45:11

文件IO性能优化实战:系统调用、缓冲与Page Cache深度解析

最近在帮团队排查一个线上服务变慢的问题,最后定位到文件IO上,顺手把之前积累的一些东西整理了一下。说实话,“文件IO操作”这个题目看起来基础,但真正能把它讲透、用对的人并不多。很多人写代码处理文件,读出来写进去…

作者头像 李华
网站建设 2026/10/1 17:44:14

YOLO机场X光安检打火机识别数据集构建与训练实战

简介:X光安检打火机识别数据集聚焦机场安检场景,面向计算机视觉算法工程师与安检设备研发者,主要解决危险品中打火机的自动检测问题。数据集共2119个文件,包含真实场景jpg图像706张,以及配套的xml与txt标注文件各706个…

作者头像 李华