以下是基于实际开发经验总结的高代码应用最佳实践,帮助您更高效地构建和部署 AI Agent 应用。
以下是基于实际开发经验总结的高代码应用最佳实践,帮助您更高效地构建和部署 AI Agent 应用。
核心要求:
入口文件必须命名为
从零开始构建高代码应用的推荐流程:
从模板起步:在控制台创建应用时选择合适的模板(基础对话 Agent、工具调用 Agent 或深度研究 Agent),快速获得可运行的基础项目。
本地开发调试:将模板代码下载到本地,参考代码包内的readme文件安装依赖,安装依赖后在本地运行和调试。
添加工具:在控制台工具页面添加所需工具(知识库、MCP 服务等),获取环境变量信息,在代码中实现工具调用逻辑。
构建并上传:将项目打包为
控制台测试:部署成功后,使用右侧API 测试模式验证接口,使用文本对话体验模式验证对话效果。
迭代优化:根据测试结果调整代码,使用
根据不同场景选择合适的工具类型:
场景
推荐工具
说明
企业知识问答
知识库
将产品文档、FAQ、操作手册等导入知识库,Agent 可精准检索回答。
外部服务调用
MCP 服务
需要搜索、金融数据、企业查询等外部能力时,优先从 MCP 广场选择已有服务,减少开发量。
多 Agent 协作
应用组件
将复杂任务拆分为多个专业子 Agent(如翻译、摘要、分析),通过应用组件串联协作。
数据查询分析
数据连接器
需要访问企业内部表格数据或文件时使用,支持结构化和非结构化数据。
多种工具可以组合使用。例如:知识库提供领域知识 + MCP 搜索服务提供实时信息 + 数据连接器访问业务数据,共同构建一个功能完整的 Agent。
编写高质量的 MCP 工具函数,提升 Agent 的工具调用效果:
工具描述要精确:
参数描述要完整:每个参数都应该通过
返回结构化结果:工具返回值应该格式化为大模型易于理解的文本,包含关键信息和上下文。
异常处理要友好:工具函数中的异常应转化为大模型可理解的错误信息,而非原始堆栈。
充分利用控制台提供的两种测试模式:
测试模式
适用场景
使用建议
API 测试
调试自定义接口、验证请求/响应格式、测试不同 Path 和 Header
开发初期用于验证接口连通性和参数格式。可自定义 HTTP Method、Path、Header 和 Body。
文本对话体验
模拟真实用户对话、验证多轮对话能力、检验工具调用效果
开发中后期用于端到端验证。重点测试工具触发是否准确、回复质量是否满意。
调试建议:
在部署页面的日志子 Tab 中查看运行时日志,排查工具调用错误。
在应用观测页面中观察调用次数、错误率和响应时间,识别性能瓶颈。
使用
将高代码应用从开发测试推进到生产环境时,建议按照以下步骤操作:
配置应用网关:在网关页面创建 API 网关实例,配置自定义域名和路由规则,将应用服务暴露在稳定的域名上。
应用部署地域应与网关所在地域相同,否则会导致路由不可达。
开启 Token 鉴权:在网关配置中开启使用 Token 鉴权,确保只有经过授权的请求才能访问 API。
关闭测试域名公网访问:在部署页面的触发器配置中,开启禁止公网访问开关,仅保留网关域名作为唯一入口。
调整资源规格:根据预期流量调整 vCPU、内存和最小实例数。设置最小实例数 >= 1 可避免冷启动延迟。对于高性能、有状态或长程任务场景,可考虑使用 K8s 部署方式(需先开通容器服务 ACK),详见选择部署方式。
开启应用观测:启用应用观测功能并在代码中植入
高代码应用的前端页面提供三种集成方式,根据需求选择合适的方案:
方式
适用场景
说明
直接体验
快速验证、内部演示
使用右侧文本对话体验模式,零代码即可体验,适合开发阶段快速验证。
自定义交互卡片
轻量定制、品牌展示
在代码中定义交互卡片样式,直接在对话体验窗中展示自定义 UI 元素,无需独立前端项目。开发文档请参见 Spark Design 自定义卡片。
自定义前端 WebUI
完全定制、生产级前端
基于 Spark Design 前端框架开发完全自定义的前端页面,适合对 UI 有高度定制需求的生产环境。开发文档请参见 Spark Design 开发文档。
建议开发阶段使用"直接体验"快速验证功能,交付阶段根据需求复杂度选择"交互卡片"或"自定义 WebUI"。
使用流式响应:Agent API 协议默认支持 SSE 流式输出。确保代码中使用异步生成器 (
项目结构
核心要求:
入口文件必须命名为 main.py。
必须提供 GET /health 接口。使用 AgentScope Runtime 时该接口自动注册,无需手动实现。
对话接口默认使用 /process 路径,遵循 Agent API 协议规范。
requirements.txt 中必须使用 == 固定依赖版本号(如 dashscope==1.20.14),避免使用 >= 等范围约束符。范围约束会导致每次构建拉取不同版本的依赖包,可能引起构建失败或运行时行为不一致。本地调试通过后,可使用 pip freeze > requirements.txt 导出精确版本。
推荐开发流程
从零开始构建高代码应用的推荐流程:
从模板起步:在控制台创建应用时选择合适的模板(基础对话 Agent、工具调用 Agent 或深度研究 Agent),快速获得可运行的基础项目。
本地开发调试:将模板代码下载到本地,参考代码包内的readme文件安装依赖,安装依赖后在本地运行和调试。
.whl 格式并上传部署。
runtime-fc-deploy --update 命令快速更新部署。
工具选择指南
根据不同场景选择合适的工具类型:
场景
推荐工具
说明
企业知识问答
知识库
将产品文档、FAQ、操作手册等导入知识库,Agent 可精准检索回答。
外部服务调用
MCP 服务
需要搜索、金融数据、企业查询等外部能力时,优先从 MCP 广场选择已有服务,减少开发量。
多 Agent 协作
应用组件
将复杂任务拆分为多个专业子 Agent(如翻译、摘要、分析),通过应用组件串联协作。
数据查询分析
数据连接器
需要访问企业内部表格数据或文件时使用,支持结构化和非结构化数据。
多种工具可以组合使用。例如:知识库提供领域知识 + MCP 搜索服务提供实时信息 + 数据连接器访问业务数据,共同构建一个功能完整的 Agent。
MCP 工具开发最佳实践
编写高质量的 MCP 工具函数,提升 Agent 的工具调用效果:
工具描述要精确:name 和 description 直接影响大模型的工具选择决策。描述应清晰说明工具的功能、适用场景和预期输入。
Field(description=...) 提供清晰的描述,包括预期格式、取值范围和默认值说明。
测试与调试
充分利用控制台提供的两种测试模式:
测试模式
适用场景
使用建议
API 测试
调试自定义接口、验证请求/响应格式、测试不同 Path 和 Header
开发初期用于验证接口连通性和参数格式。可自定义 HTTP Method、Path、Header 和 Body。
文本对话体验
模拟真实用户对话、验证多轮对话能力、检验工具调用效果
开发中后期用于端到端验证。重点测试工具触发是否准确、回复质量是否满意。
调试建议:
在部署页面的日志子 Tab 中查看运行时日志,排查工具调用错误。
在应用观测页面中观察调用次数、错误率和响应时间,识别性能瓶颈。
使用 复制调用命令 按钮获取 curl 命令,在本地终端直接调试。
开启应用观测功能,使用 @trace 装饰器追踪大模型调用耗时和工具执行链路。
生产环境部署
将高代码应用从开发测试推进到生产环境时,建议按照以下步骤操作:
配置应用网关:在网关页面创建 API 网关实例,配置自定义域名和路由规则,将应用服务暴露在稳定的域名上。
应用部署地域应与网关所在地域相同,否则会导致路由不可达。
开启 Token 鉴权:在网关配置中开启使用 Token 鉴权,确保只有经过授权的请求才能访问 API。
关闭测试域名公网访问:在部署页面的触发器配置中,开启禁止公网访问开关,仅保留网关域名作为唯一入口。
调整资源规格:根据预期流量调整 vCPU、内存和最小实例数。设置最小实例数 >= 1 可避免冷启动延迟。对于高性能、有状态或长程任务场景,可考虑使用 K8s 部署方式(需先开通容器服务 ACK),详见选择部署方式。
开启应用观测:启用应用观测功能并在代码中植入 @trace 装饰器,持续监控应用的调用质量和性能。
前端集成
高代码应用的前端页面提供三种集成方式,根据需求选择合适的方案:
方式
适用场景
说明
直接体验
快速验证、内部演示
使用右侧文本对话体验模式,零代码即可体验,适合开发阶段快速验证。
自定义交互卡片
轻量定制、品牌展示
在代码中定义交互卡片样式,直接在对话体验窗中展示自定义 UI 元素,无需独立前端项目。开发文档请参见 Spark Design 自定义卡片。
自定义前端 WebUI
完全定制、生产级前端
基于 Spark Design 前端框架开发完全自定义的前端页面,适合对 UI 有高度定制需求的生产环境。开发文档请参见 Spark Design 开发文档。
建议开发阶段使用"直接体验"快速验证功能,交付阶段根据需求复杂度选择"交互卡片"或"自定义 WebUI"。
性能优化建议
使用流式响应:Agent API 协议默认支持 SSE 流式输出。确保代码中使用异步生成器 (async yield) 返回结果,用户可实时看到输出,提升体验。
合理设置最小实例数:生产环境建议最小实例数 >= 1,避免冷启动带来的首次请求延迟(通常 10-30 秒)。注意最小实例数会持续产生费用。
工具调用并行化:当 Agent 需要调用多个独立工具时,使用 asyncio.gather() 并行执行,减少总响应时间。
缓存频繁查询:对于变化不频繁的知识库查询或外部 API 调用结果,在内存中缓存以减少重复请求。