news 2026/5/10 7:41:01

腾讯AppAgent:基于视觉的移动端AI自动化测试与智能交互实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
腾讯AppAgent:基于视觉的移动端AI自动化测试与智能交互实战

1. 项目概述:一个能“看”会“点”的智能体

最近在探索移动端自动化测试和智能交互时,我遇到了一个非常有意思的开源项目——来自腾讯QQGYLab的AppAgent。简单来说,这是一个能“看懂”手机屏幕,并像真人一样通过“点击”、“滑动”等操作来使用手机App的智能体。它不依赖于任何App内部的代码或接口,纯粹通过视觉感知和理解来完成任务,这个思路在当前的AI应用领域里,显得既“复古”又极具前瞻性。

想象一下,你拿到一款全新的、没有任何文档的App,或者是一个UI元素ID动态变化、难以用传统自动化框架定位的App,如何让机器自动操作它?传统方案往往需要开发人员编写大量的定位脚本,或者依赖App提供的测试接口。而AppAgent的思路是“返璞归真”:给智能体一张手机屏幕的截图,让它像人一样,用眼睛看,用大脑(大语言模型)分析屏幕上有什么、可以做什么,然后生成模拟触控的操作指令。这直接绕开了对App内部结构的依赖,实现了真正的“黑盒”自动化。

这个项目特别适合几类朋友:一是对移动端AI自动化、智能测试感兴趣的研究者和开发者;二是希望构建能够跨应用执行复杂任务的RPA(机器人流程自动化)工程师;三是任何被繁琐、重复的手机操作所困扰,想寻找一种“一劳永逸”的智能解决方案的极客。它不仅仅是一个工具,更代表了一种“视觉优先”的交互范式,为我们打开了通往通用手机智能助手的大门。

2. 核心架构与工作原理深度拆解

要理解AppAgent的强大之处,我们必须深入其核心架构。它并不是一个简单的“脚本录制回放”工具,而是一个集成了多模态大模型(LLM)、视觉理解模块和精准控制模块的复杂系统。其工作流程可以概括为“观察-思考-行动”的循环,非常类似于人类操作手机的过程。

2.1 基于视觉的自主探索与学习机制

AppAgent的核心创新在于其“零样本”学习能力。它不需要针对每个新App进行专门的训练或配置。启动后,智能体会首先进入一个“探索模式”。在这个模式下,它会像好奇的用户一样,随机或启发式地点击屏幕上的各种UI元素(按钮、输入框、标签页等),并观察每次点击后屏幕发生的变化。

注意:这里的“随机”并非完全无脑乱点。项目通常会集成一些启发式规则,例如优先点击看起来像按钮的区域、避免点击状态栏或导航栏的固定区域,以提升探索效率。

每一次“点击-观察”的交互都会生成一条记录,包含:操作前的屏幕截图、被点击的坐标或区域描述、操作后的屏幕截图。这些记录被组织成一个结构化的知识库,我们可以称之为“App记忆”或“操作图谱”。这个图谱本质上记录了在当前App的上下文中,执行某个动作会导致何种状态变迁。这是智能体后续能够进行规划的基础。例如,它通过学习会发现,在微信主界面点击右下角的“我”图标,会跳转到个人资料页。

2.2 多模态大模型(LLM)作为“大脑”

AppAgent的“思考”环节完全由多模态大模型驱动。这里的大模型需要具备强大的视觉理解(VLM)和推理规划能力。当接到一个任务指令,如“在微信中给张三发送一条消息‘晚上一起吃饭’”,智能体的工作流程如下:

  1. 视觉感知:获取当前屏幕截图,并将其与大模型可以理解的格式(如经过编码的图像特征或详细的文本描述)一起送入大模型。
  2. 任务分解与规划:大模型分析当前屏幕状态和任务目标。它会将复杂任务分解为一系列原子操作步骤。例如:“第一步,判断当前是否在微信聊天列表页;如果不是,则先点击返回按钮直到回到主界面,然后点击‘微信’标签。第二步,在聊天列表中找到‘张三’的聊天项并点击。第三步,点击底部的输入框,调用输入法输入文本‘晚上一起吃饭’。第四步,点击发送按钮。”
  3. 动作生成:对于规划出的每一个原子步骤(如“点击‘张三’的聊天项”),大模型需要结合当前屏幕截图,具体指出操作对象。这通常通过两种方式实现:一种是生成该对象的详细文本描述(如“带有‘张三’名字和最后一条消息预览的矩形区域”),另一种是直接输出屏幕上的归一化坐标(x, y)。项目通常会采用一种结合的方式,先描述,再通过一个轻量级的定位模型或规则将描述映射为精确坐标。

这个过程中,之前探索阶段建立的“操作图谱”可以作为上下文知识提供给大模型,帮助它更准确地预测点击某个元素后的结果,避免无效或错误的操作。

2.3 精准控制与执行反馈循环

“思考”完成后,就进入“行动”阶段。AppAgent通过Android的adb(Android Debug Bridge)工具或iOS的类似接口,将规划好的操作指令(如tap 500 800)发送给手机执行。这里有一个关键细节:屏幕坐标的适配。不同手机分辨率不同,大模型输出的坐标可能是基于某种标准分辨率(如1080x2340)归一化的,因此需要根据当前连接设备的实际分辨率进行转换。

执行一个动作后,智能体会再次截取屏幕,开启新一轮的“观察-思考”。它会判断新屏幕状态是否符合预期:如果点击“发送”后,输入框清空且消息出现在聊天区域,说明操作成功,继续下一步;如果点击后弹出了一个权限申请窗口,那么当前任务状态就改变了,大模型需要重新规划,先处理这个弹窗。这就形成了一个闭环的反馈系统,让智能体能够应对操作过程中的各种意外情况,具备很强的鲁棒性。

3. 环境搭建与核心配置实操指南

要让AppAgent跑起来,需要搭建一个包含“大脑”(LLM)、“眼睛”(截图工具)和“手”(控制工具)的完整环境。下面我以Android平台为例,详细拆解每一步的操作和避坑点。

3.1 基础依赖与ADB配置

首先,你需要一台已经开启开发者选项和USB调试模式的Android手机或模拟器。在电脑上,adb是必须的。

# 在MacOS/Linux上,通常可以通过包管理器安装 # MacOS brew install android-platform-tools # Ubuntu/Debian sudo apt-get install android-tools-adb # 安装后,连接手机,执行以下命令检查设备是否被识别 adb devices

如果看到设备序列号并显示device,则表示连接成功。如果显示unauthorized,需要在手机屏幕上点击确认允许USB调试。

实操心得:使用模拟器(如Android Studio自带的AVD)进行开发和测试非常方便,可以轻松设置各种分辨率,并且截图速度更快。推荐使用adb connect 127.0.0.1:5555来连接本地模拟器。

3.2 项目部署与依赖安装

接下来,获取AppAgent的源代码并安装Python依赖。

git clone https://github.com/TencentQQGYLab/AppAgent.git cd AppAgent pip install -r requirements.txt

requirements.txt里通常会包含一些关键的库,比如torch(深度学习框架)、transformers(调用大模型)、Pillow(图像处理)、openai(如果使用OpenAI的API)等。这里可能会遇到第一个坑:版本冲突。

常见问题1:CUDA与PyTorch版本不匹配如果你希望利用GPU加速大模型推理(强烈推荐),需要安装CUDA版本的PyTorch。务必去 PyTorch官网 根据你的CUDA版本,复制对应的安装命令,而不是简单地pip install torch。例如,对于CUDA 11.8:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

3.3 大模型接入配置(核心环节)

这是整个项目的灵魂所在。AppAgent需要接入一个具备视觉能力的大模型。通常有两种选择:

  1. 本地部署模型:如LLaVAQwen-VL等开源多模态模型。优点是数据隐私性好,无需网络,长期成本可能更低。缺点是对硬件(尤其是GPU显存)要求高,部署复杂,推理速度可能较慢。
  2. 调用云API:如OpenAI的GPT-4V(ision)、Anthropic的Claude-3系列、或国内的一些大模型API。优点是简单快捷,模型能力强,无需关心硬件。缺点是有使用成本,且需要稳定的网络连接,数据需传输到第三方。

项目配置文件中通常会有一个专门设置模型的地方。以使用OpenAI API为例,你需要准备一个API Key,然后在配置文件(如config.yaml.env文件)中设置:

# config.yaml 示例 model_provider: "openai" openai_api_key: "sk-your-api-key-here" model_name: "gpt-4-vision-preview" # 指定视觉模型

如果使用本地模型,配置会更复杂,需要指定模型本地路径、加载设备(CPU/GPU)等。

注意事项:云API会产生费用。GPT-4V按Token和图片数量计费,在进行大量探索或复杂任务时,成本不容忽视。建议初期使用本地轻量模型(如较小的LLaVA变体)进行流程测试和调试,待流程跑通后再切换至更强的云模型进行效果验证或执行关键任务。

3.4 设备连接与权限授予

确保AppAgent脚本有权限控制你的手机。除了adb连接,对于一些高级操作(如输入文本),可能需要在手机上额外安装一个辅助应用(如com.android.shell权限的辅助服务),或者依赖adbinput text命令。项目文档会详细说明。通常,你需要执行一个初始化脚本,该脚本可能会通过adb在手机上安装一个代理APK,用于更稳定、更高权限的截图和控制。

# 示例初始化命令 python scripts/setup_device.py

执行过程中,请密切关注手机屏幕,按要求授予必要的权限,如“无障碍服务”、“屏幕录制”、“悬浮窗”等。这些权限是智能体“看”和“点”的基础。

4. 从零开始:第一个自动化任务实战

环境配置妥当后,我们来亲手运行一个完整的任务,感受一下AppAgent的魔力。我们选择一个相对简单的场景:打开手机上的“设置”应用,进入“WLAN”页面,然后打开Wi-Fi开关

4.1 任务定义与启动

AppAgent通常通过一个命令行接口或Python脚本来接收任务。任务描述需要使用自然语言,尽可能清晰。

python run_agent.py --task “打开设置,进入WLAN页面,然后开启Wi-Fi”

或者,更常见的是在一个配置文件中定义任务:

# task.yaml agent_task: name: "enable_wifi" description: “打开设置应用,导航到WLAN设置页面,并打开Wi-Fi开关。” start_app: “com.android.settings” # 可选,指定起始App的包名

运行后,智能体开始工作。你的手机会自动亮屏、解锁(如果脚本中配置了相关凭证),然后启动设置应用。

4.2 观察智能体的决策过程(关键)

在运行日志中,你会看到智能体“内心活动”的详细输出,这是理解其工作原理的最佳途径。日志可能如下所示:

[Step 1] 当前屏幕分析:识别到桌面界面,包含多个应用图标。根据任务“打开设置”,需要找到“设置”图标。 视觉模型识别结果:屏幕中央区域有“设置”图标,描述为“齿轮状图标,下方有‘设置’文字”。 决策:点击识别到的“设置”图标区域。执行坐标:(540, 1200)。 [Action] 通过ADB执行点击:tap 540 1200。 [Step 2] 等待屏幕稳定...截图。 当前屏幕分析:已进入设置主菜单。列表项包含“网络和互联网”、“已连接的设备”、“应用”等。 任务目标:进入WLAN页面。推断“WLAN”应在“网络和互联网”条目下。 决策:点击“网络和互联网”列表项。执行坐标:(540, 650)。 [Action] 通过ADB执行点击:tap 540 650。 [Step 3] 当前屏幕分析:进入“网络和互联网”子页面。列表项包含“互联网”、“Wi-Fi”、“热点和网络共享”等。注意到“Wi-Fi”右侧显示为“关闭”。 任务目标:打开Wi-Fi。需要点击“Wi-Fi”条目进入详情页,还是直接点击右侧开关?根据常见UI模式,应点击“Wi-Fi”条目。 决策:点击“Wi-Fi”列表项。执行坐标:(540, 750)。 ...(后续步骤)

从这个过程可以看到,智能体并不是死记硬背坐标,而是每一步都基于当前屏幕内容重新分析、规划和决策。这赋予了它强大的适应性。

4.3 处理意外情况:弹窗与状态判断

实战中绝不会一帆风顺。例如,在打开Wi-Fi时,系统可能会弹出一个确认对话框:“是否允许设置更改网络设置?”。一个健壮的智能体必须能处理这种中断。

在AppAgent的框架下,当点击后出现非预期屏幕(弹窗)时,视觉模型会识别到这一变化。大模型在规划下一步动作时,会将这个新出现的弹窗作为最高优先级的操作对象。它的推理可能是:“当前出现了一个确认弹窗,内容是‘允许设置更改网络设置吗?’,有两个按钮:‘确定’和‘取消’。为了完成打开Wi-Fi的任务,需要点击‘确定’按钮。” 然后生成点击“确定”按钮的指令。

这个过程展示了智能体的实时交互和纠错能力。你可以通过查看更详细的调试日志,来观察它如何处理这些分支情况。

实操心得:在初期测试时,建议将日志级别调到DEBUG,并录制屏幕。这样当任务失败时,你可以回放屏幕录像并结合详细日志,精准定位是哪个环节的识别或决策出了错:是没识别到关键元素?是坐标映射错了?还是大模型的规划逻辑有误?这是优化智能体表现的关键。

5. 核心能力扩展与高级应用场景

掌握了基础操作后,我们可以探索AppAgent更强大的能力和更复杂的应用场景。这不仅仅是点击,而是涉及记忆、学习、规划和工具使用的综合智能。

5.1 跨应用工作流编排

AppAgent的真正威力在于串联多个App完成一个复杂目标。例如,一个经典的场景是:“将微信聊天中朋友发来的一个快递单号,复制下来,然后打开淘宝,粘贴到物流查询页面进行查询。”

这个任务涉及多个应用(微信、淘宝)、多种操作(长按复制、切换应用、粘贴、查询)。实现它需要两个关键扩展:

  1. 任务规划器增强:需要一个更强大的“顶层”规划模型,能够将这样的用户指令分解成跨应用的子任务序列:[在微信中找到包含单号的消息] -> [长按文本并选择复制] -> [返回桌面] -> [打开淘宝] -> [找到物流查询入口] -> [点击输入框并粘贴] -> [点击查询]
  2. 跨应用状态管理:智能体需要记住上下文信息,比如从微信复制出来的“快递单号”这个字符串,在后续的淘宝App中要能使用。这通常通过一个内部的“状态变量”或“剪贴板”模块来实现。

在AppAgent的框架中,可以通过在给大模型的系统提示(System Prompt)中明确告知其具备“复制到剪贴板”、“从剪贴板粘贴”等能力,并指导它如何在规划中使用这些能力。执行层面,adb提供了adb shell input textadb shell am broadcast等命令来模拟系统剪贴板操作。

5.2 结合OCR与专用工具提升精度

纯视觉大模型有时在识别细小文字或特定格式内容(如验证码、复杂表格)时力有不逮。此时,可以引入专用工具作为补充。例如:

  • 集成OCR模块:对于需要精确读取文本的场景(如读取短信验证码、文档内容),可以调用像PaddleOCRTesseract这样的高精度OCR引擎,将截图中的文字区域识别成结构化文本,再将文本提供给大模型进行分析。这比单纯依赖VLM的文本识别通常更准确、更快速。
  • 自定义动作库:对于一些非常规但固定的操作,可以“教”给智能体。例如,在某个特定App中,下拉刷新是一个复杂的手势(先按下,再移动,最后抬起)。我们可以预先定义好一个名为pull_to_refresh的动作,其底层是adb shell input swipe ...命令序列。当大模型判断需要刷新时,它不再规划具体的滑动坐标,而是直接输出“执行pull_to_refresh动作”的指令。这降低了模型的规划难度,提高了执行可靠性。

5.3 自主探索与技能库构建

AppAgent的探索模式不仅可以用于单次任务的执行前预热,更可以系统性地用于构建一个“App技能库”。我们可以设计一个自动化的探索脚本,让智能体在一个安全的环境(如模拟器)中,系统地遍历一个App的所有主要界面和功能,记录下每一步的操作和状态变化。

这些记录可以被结构化地存储下来,形成一个关于该App的“操作手册”或“知识图谱”。当下次需要在该App上执行任务时,智能体可以先从这个知识图谱中检索相似的操作历史,快速获得可行的操作路径,而不是每次都从零开始推理,这能极大提升效率和成功率。这相当于为智能体建立了“长期记忆”。

6. 实战避坑指南与性能优化

在实际部署和长期使用AppAgent的过程中,我积累了一些宝贵的经验和教训,这里分享给大家,希望能帮你少走弯路。

6.1 稳定性与可靠性提升

1. 屏幕同步与等待策略:这是自动化脚本最常见的失败点。手机操作有延迟,网络加载需要时间。点击后立即截图,看到的可能还是上一个界面。

解决方案:实现智能等待。不要使用固定的sleep(2)。可以采用以下策略组合:

  • 基于像素变化的等待:连续截图,比较关键区域的像素哈希值,直到连续几次截图差异小于阈值,说明界面已稳定。
  • 基于元素出现的等待:等待某个特定的UI元素(如图标、文字)出现在屏幕上。这需要结合OCR或图像模板匹配。
  • 超时与重试机制:任何操作都设置一个超时时间(如10秒)。如果超时后未达到预期状态,则触发重试逻辑(如重新点击)或失败处理流程。

2. 坐标漂移与动态UI:不同机型分辨率不同,同一App不同版本UI可能微调,某些列表项位置会滚动。直接使用绝对坐标是脆弱的。

解决方案

  • 使用相对坐标或元素描述:鼓励大模型输出基于元素描述(如“点击‘登录’按钮”)而非绝对坐标的指令。后台通过一个轻量的目标检测或图像匹配模型将描述转化为当前屏幕下的坐标。
  • 健壮的元素定位:结合多种定位方式:颜色特征、形状特征、文字内容(OCR)。优先使用唯一的文字标识进行定位。
  • 容错点击:点击时,可以以目标点为中心,在一个小范围内(如5x5像素)随机选择一个点进行点击,模拟人手操作的不精确性,有时反而能避开某些边缘检测问题。

6.2 成本控制与效率优化

1. 大模型调用成本:如果使用GPT-4V等API,每一次截图发送、每一次决策都是一次计费调用。复杂的任务可能导致成本激增。

优化策略

  • 本地轻量VLM预处理:先用一个本地部署的、速度快、成本低的轻量视觉模型(如BLIP)对截图进行初步分析,过滤掉无变化的屏幕或者只提取关键信息(如“屏幕上是否有弹窗?”),只有需要复杂推理时才调用昂贵的云大模型。
  • 缓存机制:对于相同的屏幕状态和相同的任务,缓存大模型的决策结果。例如,每次回到微信主界面,其布局是相同的,不需要反复分析。
  • 压缩截图:在保证可识别的前提下,降低截图的分辨率和质量,减少传输的数据量和Token消耗。

2. 执行速度优化:从截图、上传、模型推理、到返回指令、执行操作,整个循环的延迟可能达到数秒甚至十几秒,影响体验。

优化策略

  • 并行与流水线:当智能体在执行一个操作(如点击后等待)时,可以并行处理下一帧的截图准备。
  • 模型蒸馏与量化:如果使用本地模型,尝试使用蒸馏后的小模型或进行量化(INT8),在精度损失可接受的前提下大幅提升推理速度。
  • 操作预测:对于一些线性流程,可以尝试预测下一步操作并预先准备,减少等待模型推理的时间。

6.3 常见失败模式与排查清单

当你的AppAgent任务失败时,可以按照以下清单逐项排查:

问题现象可能原因排查步骤与解决方案
任务一开始就失败,手机无反应1. ADB连接断开
2. 设备未授权
3. 屏幕未解锁
1. 执行adb devices确认设备在线。
2. 检查手机是否弹出授权提示。
3. 确保屏幕已解锁,或脚本中包含自动解锁逻辑。
智能体点击位置明显错误1. 坐标映射错误(分辨率适配问题)
2. 大模型识别错误
3. 屏幕内容已变化但未及时截图
1. 核对脚本中的分辨率转换逻辑。
2. 查看日志中模型对屏幕的描述,是否识别错了元素。
3. 增加操作后的稳定等待时间。
智能体在某个界面“卡住”,不断重复无效操作1. 陷入了状态循环(如误入侧边栏)
2. 未能识别关键的新UI元素(如弹窗)
3. 任务规划逻辑有缺陷
1. 查看日志,分析当前屏幕状态和决策依据。
2. 检查截图是否清晰包含了所有UI元素。
3. 在系统提示中加强关于“避免循环”、“检测异常状态”的指令。
任务执行速度极慢1. 网络延迟高(使用云API)
2. 本地模型推理速度慢
3. 等待策略过于保守
1. 考虑使用本地模型或更换API节点。
2. 对本地模型进行优化(量化、使用更小模型)。
3. 调整等待策略的超时和检测阈值。
无法输入文本或输入错误1.adb input text对某些输入框不兼容
2. 输入法问题
3. 需要先精确点击激活输入框
1. 尝试使用ADB模拟键盘事件逐个输入。
2. 切换手机默认输入法为系统自带输入法(如Google拼音)。
3. 确保在输入前,模型已成功点击了输入框(可通过观察输入框光标判断)。

最后,我想分享一点个人体会。AppAgent这类项目,其魅力在于它用一种“以简驭繁”的方式挑战了复杂的移动端自动化问题。它不追求对App内部结构的百分百掌控,而是选择模拟最通用的人类交互方式——视觉和触控。这带来了极高的灵活性,但也对模型的感知和推理能力提出了巨大挑战。在实际使用中,完全无人值守的、鲁棒性极高的通用智能体仍然有很长的路要走,但在特定场景、经过适当引导和配置后,它已经能发挥出惊人的价值,比如自动化测试、数据采集、个人工作流自动化等。持续优化提示词(Prompt)、结合更可靠的底层工具(如精准OCR)、构建应用知识库,是提升其可用性的关键方向。这个项目就像一个强大的引擎,如何造出一辆好车,还需要我们这些开发者不断地调校和打磨。

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

医疗AI跨学科协作实战:数据治理、工具链与沟通机制解析

1. 项目概述:当AI遇见医疗,一场关于“人”的协作革命“医疗AI研究”这五个字,听起来充满了前沿科技的光环,仿佛只要算法够新、算力够强,就能轻松攻克疾病难题。但真正扎进这个领域,你会发现,最棘…

作者头像 李华
网站建设 2026/5/10 7:36:37

5分钟掌握B站视频转文字:Bili2text完整指南与实战教程

5分钟掌握B站视频转文字:Bili2text完整指南与实战教程 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text Bili2text是一款强大的B站视频转文字工具&a…

作者头像 李华
网站建设 2026/5/10 7:35:30

D2L Brightspace命令行工具开发:面向AI Agent的自动化学习数据管道

1. 项目概述如果你是一名在校学生,或者像我一样,经常需要和学校的在线学习平台(LMS)打交道,那么你肯定对D2L Brightspace这个界面不陌生。每天登录网页,在课程、作业、成绩、公告之间来回切换,手…

作者头像 李华
网站建设 2026/5/10 7:35:28

3步打造你的Unity游戏实时翻译神器

3步打造你的Unity游戏实时翻译神器 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过心仪的外语游戏?当精美的日系角色扮演游戏展现在眼前,却因满屏日文…

作者头像 李华
网站建设 2026/5/10 7:35:06

从直接使用原生 API 到通过 Taotoken 聚合调用的稳定性感受差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从直接使用原生 API 到通过 Taotoken 聚合调用的稳定性感受差异 作为一名长期与各类大模型 API 打交道的开发者,我的日…

作者头像 李华
网站建设 2026/5/10 7:34:28

基于Next.js与Reddit API构建高性能第三方Web客户端:Troddit项目全解析

1. 项目概述:Troddit,一个为Reddit而生的第三方Web客户端 如果你和我一样,是Reddit的深度用户,同时又对官方应用或网页版的一些体验感到不那么顺手——比如界面略显臃肿、加载速度时快时慢,或者单纯想找一个更清爽、更…

作者头像 李华