鸿蒙智能体开发实战:22.真机测试

前言

开发完成智能体应用后,需要进行充分的测试确保其正常工作。本文介绍如何在本地和真实设备上进行测试,以及部署到生产环境的完整流程。

本地测试

启动开发服务器

bash 复制代码
# 激活虚拟环境
source venv/bin/activate

# 启动服务
python main.py

# 或使用 uvicorn
uvicorn main:app --host 0.0.0.0 --port 8080 --reload

使用 curl 测试

测试健康检查
bash 复制代码
curl http://localhost:8080/health

预期响应:

json 复制代码
{"status": "ok", "message": "Service is healthy"}
测试 Initialize 方法
bash 复制代码
curl -X POST http://localhost:8080/agent/message \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "initialize"
  }'

预期响应:

json 复制代码
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "agentSessionId": "8f01f3d172cd4396a0e535ae8aec6687",
    "agentSessionTtl": 604800
  }
}
测试 Message/Stream 方法
bash 复制代码
curl -X POST http://localhost:8080/agent/message \
  -H "Content-Type: application/json" \
  -H "agent-session-id: 8f01f3d172cd4396a0e535ae8aec6687" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "message/stream",
    "params": {
      "id": "task-001",
      "sessionId": "session-001",
      "message": {
        "role": "user",
        "parts": [{
          "kind": "text",
          "text": "你好"
        }]
      }
    }
  }'

使用 Python 脚本测试

python 复制代码
# tests/test_agent.py
import httpx
import json

BASE_URL = "http://localhost:8080"

def test_initialize():
    """测试初始化接口"""
    response = httpx.post(
        f"{BASE_URL}/agent/message",
        json={
            "jsonrpc": "2.0",
            "id": 1,
            "method": "initialize"
        }
    )
    data = response.json()
    print("Initialize 响应:", json.dumps(data, indent=2, ensure_ascii=False))
    assert "agentSessionId" in data.get("result", {})
    return data["result"]["agentSessionId"]

def test_message_stream(session_id):
    """测试流式消息接口"""
    with httpx.stream(
        "POST",
        f"{BASE_URL}/agent/message",
        headers={
            "Content-Type": "application/json",
            "agent-session-id": session_id
        },
        json={
            "jsonrpc": "2.0",
            "id": 2,
            "method": "message/stream",
            "params": {
                "id": "task-001",
                "sessionId": "session-001",
                "message": {
                    "role": "user",
                    "parts": [{
                        "kind": "text",
                        "text": "你好,请介绍一下你自己"
                    }]
                }
            }
        },
        timeout=60.0
    ) as response:
        print("Stream 响应:")
        for line in response.iter_lines():
            if line.startswith("data:"):
                data = json.loads(line[5:])
                print(json.dumps(data, indent=2, ensure_ascii=False))

if __name__ == "__main__":
    session_id = test_initialize()
    print(f"获取 session_id: {session_id}")
    test_message_stream(session_id)

使用 Postman 测试

  1. 创建新请求
  2. 设置方法为 POST
  3. URL: http://localhost:8080/agent/message
  4. Headers:
    • Content-Type: application/json
    • agent-session-id: <your-session-id>
  5. Body (raw JSON):
json 复制代码
{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "message/stream",
  "params": {
    "id": "task-001",
    "sessionId": "session-001",
    "message": {
      "role": "user",
      "parts": [{
        "kind": "text",
        "text": "你好"
      }]
    }
  }
}

小艺开放平台真机测试

上述测试方式是在开发者本地对A2A服务进行功能验证。在完成智能体编排后,还可以通过小艺开放平台的真机测试功能,在真实的鸿蒙设备上体验智能体的完整效果。

真机测试概述

真机测试为开发者提供了在智能体上架前即可在端侧设备上体验智能体使用效果的能力。这意味着你无需发布正式版本,即可在手机等真实设备上测试智能体的对话效果和能力。

图1:调试与预览区域中的真机测试入口

真机测试使用流程

第一步:配置真机测试白名单

在智能体的调试与预览区域,点击真机测试图标,选择【白名单】跳转至智能体白名单配置页面。

创建真机测试用户组:

配置项 说明
创建入口 智能体测试白名单页面 或 小艺开放平台 → 通用设置 → 真机测试管理
用户组上限 每个团队最多100个用户组
用户上限 每个用户组最多100个用户
添加方式 支持单用户添加【添加用户】和【批量导入】
账户类型 手机号码或邮箱(需已注册华为账号)

重要限制 :添加的测试账号必须为当前团队账号下的成员,且拥有小艺开放平台的权限,否则会提示"仅可添加本团队账号下的成员"。Inhouse类型的账号暂时无法为团队成员添加小艺开放平台的权限,如需要进行真机测试,请使用主账号进行测试。

第二步:发布真机测试
  1. 在调试与预览区域点击【真机测试】→【发布真机测试】
  2. 提示请求成功后,白名单内人员通过重新启动小艺
  3. 等待 3至5分钟,在对话列表中即可看到带有"开发中"标签的智能体
第三步:在设备上测试

在华为手机上打开小艺,即可在对话列表中看到"开发中"标签的智能体。你可以像普通用户一样与智能体对话,测试其在真实环境下的表现。

真机测试有效期管理

项目 说明
有效期 发布后 15天内 有效
范围基准 最后一次发布所选用户组为准
取消测试 编排页面 → 【真机测试】→ 【取消发布】

图2:真机测试发布界面,显示有效期和取消发布选项

真机测试用户组创建

入口1:在智能体的测试白名单页面进行配置

入口2 :通过小艺开放平台 → 通用设置 → 真机测试管理

以智能体测试白名单页面为例:

图3:在测试白名单页面创建用户组并添加测试用户

bash 复制代码
# 真机测试用户组创建步骤
1. 在测试白名单页面点击右上角【新建用户组】
2. 填写用户组名称
3. 点击操作栏内【管理用户】管理组成员
4. 选择【添加用户】或【批量导入】
5. 输入用户手机号或邮箱(需已注册华为账号)
6. 确认添加

规则限制

  • 每个团队最多可创建100个用户组
  • 每个用户组最多可添加100个用户
  • 添加用户时根据注册账户类型填写
  • 需拥有小艺开放平台权限的团队成员

调试台使用指南

在实际使用智能体时,如果响应不符合预期、速度过慢甚至不响应,可以通过调试台查看智能体的执行细节,快速排查问题。

调试台概述

小艺开放平台的调试台功能提供全链路调试能力,你可以在调试台查看每一条用户请求从输入到响应的全流程,包括模型调用、工作流执行、知识库检索等详细信息。

适用场景

场景 说明
开发调试 搭建智能体时,输出不符合预期需修改流程
线上排障 用户反馈智能体不响应、返回错误信息时诊断定位

进入调试台

通过智能体的编排页面进入调试台:

bash 复制代码
# 调试台操作步骤
1. 在智能体编排页面右侧的调试与预览区域
2. 发送一条消息开始与智能体对话
3. 收到智能体响应后
4. 点击右上角的调试选项进入调试台页面

进入调试台页面后,默认展示当前消息的响应过程,你可以筛选或选择查看之前某次对话的响应过程。

调试台信息说明

调试台中展示每轮对话运行的全链路,包括:

  • 调用流程:请求从进入系统到返回响应的完整路径
  • 节点详情:每个节点的状态、耗时等详细信息
  • 输入输出:各节点的输入数据和输出数据
  • Token消耗:各环节的token使用情况

基础信息

页面默认展示当前会话的信息,你也可以通过会话时间来筛选会话,例如查看某一天所有运行的会话。

会话概览数据包含:

指标 说明
会话整体耗时 从请求到响应的总用时
Token消耗 本次会话消耗的总token数
节点数量 本次请求涉及的处理节点数
状态 成功/失败/超时

调测树

在排查和定位问题时,往往需要查看请求的完整调用链路。平台采用可视化树形图展示请求响应的完整链路及各节点的执行情况。

查看请求响应链路:

你可以通过树形图查看本次请求的完整响应流程。每个节点代表一个处理步骤,例如:

复制代码
用户输入
  └─ 意图识别
       └─ 知识库检索
            └─ 大模型生成
                 └─ 结果输出

查看节点详细信息:

点击任一节点可查看该节点的详细信息,包括:

json 复制代码
{
  "node_id": "node_llm_001",
  "node_type": "大模型节点",
  "duration": 1520,
  "status": "success",
  "token_usage": {
    "prompt_tokens": 1200,
    "completion_tokens": 350,
    "total_tokens": 1550
  },
  "input": {
    "model": "deepseek-r1",
    "messages": [...]
  },
  "output": {
    "content": "根据知识库的信息,产品的保修期为..."
  }
}

火焰图

除了调测树,调试台还提供火焰图来直观查看各个流程的耗时分布。

复制代码
火焰图示例:

[意图识别]  ████ 200ms
[知识库检索] ████████████ 600ms
[大模型生成]  ██████████████████████ 1200ms
[后处理]    ███ 150ms
  • 横轴表示耗时
  • 各流程按照执行顺序排列
  • 点击进度条可查看节点的具体调用情况
  • 颜色越深、条形越长表示耗时越多

指定对话调试

支持在调试与预览页面打开指定的对话调试详情信息,点击回复内容下方的调试图标即可查看右侧本地调试的内容详情。

调试常见问题

Q: 调试与预览窗口中的运行结果与调试台的运行结果有何区别?

A: 调试与预览窗口中的运行结果会实时展示请求的响应过程,当运行完毕后会展示最终的信息。而调试台中会展示指定请求的完整响应节点和每个节点的执行信息。

Q: 网页调试时,如何获取本次对话用于问题定位的sessionId?

A:

  1. 打开浏览器调试台,活动栏中选择网络(Network)
  2. 调测智能体
  3. 点击名称为"run"的请求,选择"消息"或"Payload"
  4. 取出第一条数据中的sessionId、interactionId
  5. 若有多条run运行记录,可以根据运行时间判断

Docker 部署测试

构建 Docker 镜像

dockerfile 复制代码
# Dockerfile
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8080

CMD ["python", "main.py"]

Docker Compose 配置

yaml 复制代码
# docker-compose.yml
version: '3.8'

services:
  agent:
    build: .
    ports:
      - "8080:8080"
    environment:
      - VOLCANIC_API_KEY=${VOLCANIC_API_KEY}
      - VOLCANIC_BASE_URL=${VOLCANIC_BASE_URL}
      - LANGUAGE_MODEL=${LANGUAGE_MODEL}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3

启动 Docker 容器

bash 复制代码
# 配置环境变量
cp .env.example .env
vim .env

# 启动容器
docker-compose up -d

# 查看状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止容器
docker-compose down

生产环境部署

服务器要求

  • Python 3.9+
  • 至少 2GB 内存
  • 稳定的网络连接(访问大模型 API)

一键部署脚本

bash 复制代码
#!/bin/bash
# deploy.sh

set -e

APP_NAME="ai-assistant"
APP_DIR="/opt/$APP_NAME"
SERVICE_NAME="$APP_NAME.service"

echo "=== 开始部署 $APP_NAME ==="

# 创建应用目录
sudo mkdir -p $APP_DIR
sudo chown $USER:$USER $APP_DIR

# 复制文件
cp -r . $APP_DIR/
cd $APP_DIR

# 安装依赖
pip3 install -r requirements.txt

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/$SERVICE_NAME > /dev/null <<EOF
[Unit]
Description=$APP_NAME Service
After=network.target

[Service]
Type=simple
User=$USER
WorkingDirectory=$APP_DIR
Environment="PATH=$APP_DIR/venv/bin"
ExecStart=$APP_DIR/venv/bin/python main.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

# 重载 systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl enable $SERVICE_NAME
sudo systemctl start $SERVICE_NAME

echo "=== 部署完成 ==="
echo "查看状态:sudo systemctl status $SERVICE_NAME"
echo "查看日志:sudo journalctl -u $SERVICE_NAME -f"

使用脚本部署

bash 复制代码
# 安装
sudo ./deploy.sh install

# 配置 API 密钥
sudo vim /opt/ai-assistant/.env

# 启动服务
sudo ./deploy.sh start

# 查看状态
sudo ./deploy.sh status

# 查看日志
sudo ./deploy.sh logs

# 停止服务
sudo ./deploy.sh stop

Nginx 反向代理配置

nginx 复制代码
# /etc/nginx/sites-available/ai-assistant
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # SSE 支持
        proxy_set_header Connection "";
        proxy_http_version 1.1;
        proxy_set_header X-Accel-Buffering no;
        proxy_buffering off;
        proxy_cache off;

        # 超时设置
        proxy_connect_timeout 60s;
        proxy_send_timeout 300s;
        proxy_read_timeout 300s;
    }
}

启用配置:

bash 复制代码
sudo ln -s /etc/nginx/sites-available/ai-assistant /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

日志管理

日志文件位置

复制代码
logs/
├── ai-assistant-YYYYMMDD.log   # 主日志
├── request-YYYYMMDD.log        # 请求日志
├── sse-YYYYMMDD.log            # SSE 流式输出日志
└── volcanic-YYYYMMDD.log       # API 调用日志

日志查看脚本

bash 复制代码
#!/bin/bash
# logs.sh

LOG_DIR="logs"
TODAY=$(date +%Y%m%d)

case "$1" in
    "main")
        tail -n ${2:-100} "$LOG_DIR/ai-assistant-$TODAY.log"
        ;;
    "request")
        tail -n ${2:-100} "$LOG_DIR/request-$TODAY.log"
        ;;
    "sse")
        tail -n ${2:-100} "$LOG_DIR/sse-$TODAY.log"
        ;;
    "follow")
        tail -f "$LOG_DIR/ai-assistant-$TODAY.log"
        ;;
    "errors")
        grep -i "error\|exception\|failed" "$LOG_DIR"/*.log | tail -100
        ;;
    *)
        echo "Usage: $0 {main|request|sse|follow|errors}"
        ;;
esac

常见问题排查

1. 服务无法启动

bash 复制代码
# 检查端口占用
lsof -i :8080

# 检查 Python 依赖
pip list | grep fastapi

# 查看详细错误
python main.py 2>&1

2. API 调用失败

bash 复制代码
# 检查环境变量
echo $VOLCANIC_API_KEY

# 测试 API 连通性
curl -H "Authorization: Bearer $VOLCANIC_API_KEY" \
     https://api.example.com/v1/models

3. SSE 连接中断

  • 检查 Nginx 缓冲配置
  • 增加超时时间
  • 检查防火墙设置

性能监控

健康检查端点

bash 复制代码
# 定期检查
curl http://localhost:8080/health

# 添加到监控系统
*/5 * * * * curl -f http://localhost:8080/health || echo "Service down"

请求统计

python 复制代码
# 在应用中添加简单的统计
request_count = 0
error_count = 0

@app.get("/stats")
async def get_stats():
    return {
        "request_count": request_count,
        "error_count": error_count
    }

测试方法对比总结

测试方法 测试范围 适用阶段 优点 局限
curl/脚本 A2A API功能 开发初期 快速验证,自动化 无法测试端侧效果
Postman A2A API功能 开发中期 可视化,方便调试 原生接口不够用
真机测试 端到端用户体验 发布前 真实设备,完整流程 需要设备,用户组配置
调试台 全链路执行详情 开发+排障 可视化调测树+火焰图 无法替代功能测试

小结

本文全面介绍了鸿蒙智能体开发中的测试与调试方法:

  1. 本地API测试:curl、Python脚本、Postman对A2A服务进行功能性验证
  2. 真机测试:通过小艺开放平台在真实设备上体验智能体
  3. 调试台:全链路可视化调测,树形图和火焰图双重诊断
  4. Docker部署测试:容器化部署和编排验证
  5. 生产部署:systemd服务管理、Nginx反向代理配置
  6. 日志管理:日志文件分类和查看脚本
  7. 问题排查:常见错误的定位和解决方案

掌握这些测试和调试工具,能够显著提升智能体开发效率,确保上架质量。从API功能验证到端侧用户体验,再到生产环境的稳定运行,每个环节都不容忽视。


如果觉得本文对你有帮助,欢迎点赞 👍、收藏 ⭐ 和关注 🎯!你的支持是我持续创作的动力!

相关资源

相关推荐
星释2 小时前
鸿蒙智能体开发实战:39.鸿蒙壁纸大师 - 前端卡片显示与交互优化
前端·华为·交互·harmonyos·鸿蒙·火山引擎
tyqtyq224 小时前
药品说明书解读 —— AI 安全用药助手,鸿蒙原生应用深度解析
人工智能·学习·华为·生活·harmonyos
风华圆舞5 小时前
鸿蒙HarmonyOS滚字组件实战 —— 逐字 Slot Roll,从浏览器到原生 ArkUI
华为·harmonyos·arkui·slottext·measureutils·共享时间轴·滚字
不羁的木木5 小时前
HarmonyOS APP实战-画图APP - 第8篇:图像效果应用(亮度/模糊/灰度)
华为·harmonyos
●VON5 小时前
HarmonyKit | 鸿蒙开发展望:HarmonyKit 未来路线图与社区共建
华为·单元测试·harmonyos·鸿蒙
HarmonyOS_SDK5 小时前
借助游戏预启动提前加载游戏,读条快人一步
harmonyos
不羁的木木6 小时前
HarmonyOS APP实战-画图APP - 第3篇:矩形与圆形绘制
华为·harmonyos
绝世番茄7 小时前
Column 与 if/else 条件渲染:动态子组件的布局行为
华为·harmonyos·鸿蒙
花开彼岸天~7 小时前
鸿蒙实战:AppStorage 全局状态管理
华为·harmonyos·鸿蒙系统
爱吃大芒果8 小时前
鸿蒙 7 新特性科普:什么是系统 Agent 智能体?
华为·harmonyos·智能体