前言
开发完成智能体应用后,需要进行充分的测试确保其正常工作。本文介绍如何在本地和真实设备上进行测试,以及部署到生产环境的完整流程。
本地测试
启动开发服务器
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 测试
- 创建新请求
- 设置方法为 POST
- URL:
http://localhost:8080/agent/message - Headers:
Content-Type: application/jsonagent-session-id: <your-session-id>
- 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类型的账号暂时无法为团队成员添加小艺开放平台的权限,如需要进行真机测试,请使用主账号进行测试。
第二步:发布真机测试
- 在调试与预览区域点击【真机测试】→【发布真机测试】
- 提示请求成功后,白名单内人员通过重新启动小艺
- 等待 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:
- 打开浏览器调试台,活动栏中选择网络(Network)
- 调测智能体
- 点击名称为"run"的请求,选择"消息"或"Payload"
- 取出第一条数据中的sessionId、interactionId
- 若有多条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功能 | 开发中期 | 可视化,方便调试 | 原生接口不够用 |
| 真机测试 | 端到端用户体验 | 发布前 | 真实设备,完整流程 | 需要设备,用户组配置 |
| 调试台 | 全链路执行详情 | 开发+排障 | 可视化调测树+火焰图 | 无法替代功能测试 |
小结
本文全面介绍了鸿蒙智能体开发中的测试与调试方法:
- 本地API测试:curl、Python脚本、Postman对A2A服务进行功能性验证
- 真机测试:通过小艺开放平台在真实设备上体验智能体
- 调试台:全链路可视化调测,树形图和火焰图双重诊断
- Docker部署测试:容器化部署和编排验证
- 生产部署:systemd服务管理、Nginx反向代理配置
- 日志管理:日志文件分类和查看脚本
- 问题排查:常见错误的定位和解决方案
掌握这些测试和调试工具,能够显著提升智能体开发效率,确保上架质量。从API功能验证到端侧用户体验,再到生产环境的稳定运行,每个环节都不容忽视。
如果觉得本文对你有帮助,欢迎点赞 👍、收藏 ⭐ 和关注 🎯!你的支持是我持续创作的动力!