1. 项目概述:一个面向AI智能体生态的监控与洞察工具
最近在折腾AI智能体(Agent)相关的项目,发现一个挺有意思的现象:当你的智能体数量从几个增长到几十个甚至更多时,管理它们的状态、追踪它们的决策过程、分析它们的性能瓶颈,就变成了一件非常头疼的事情。日志散落在各处,性能指标难以聚合,出了问题排查起来像大海捞针。这让我想起了早期微服务架构面临的监控挑战,而“agentwatch”这个项目,正是为了解决AI智能体领域的类似问题而生的。
简单来说,agentwatch是一个专门为AI智能体(特别是基于LLM的自主智能体)设计的开源监控与可观测性平台。它的核心目标,是让开发者能够像运维工程师监控服务器集群一样,清晰地洞察其智能体“军团”的实时运行状态、决策逻辑、资源消耗以及交互效能。无论你是研究者在实验新的智能体架构,还是开发者在构建一个包含多个协作智能体的复杂应用,agentwatch都能提供一套统一的仪表盘和数据分析工具,帮助你从“黑盒”走向“白盒”,优化智能体的行为与性能。
这个项目适合所有正在或计划深入使用AI智能体的开发者、研究员和产品团队。如果你满足以下任一条件,那么深入了解agentwatch将会非常有价值:你正在构建涉及多个智能体协作的系统;你的智能体需要处理复杂、多步骤的任务;你关心智能体的推理成本(如API调用次数、Token消耗)和响应延迟;你需要分析智能体决策的成功率与失败原因;或者,你单纯地对提升智能体系统的可解释性和可控性感兴趣。
2. 核心设计理念与架构拆解
2.1 为什么智能体需要专门的监控?
在深入agentwatch的具体实现之前,我们首先要理解一个根本问题:为什么不能用传统的APM(应用性能监控)或日志系统来监控智能体?答案在于智能体工作流的特殊性。
传统的Web服务监控,核心是请求-响应模型,关注的是延迟、错误率、吞吐量等。而一个基于LLM的智能体,其工作流通常是非线性的、状态丰富的、且依赖外部工具调用的。例如,一个客服智能体的单次任务可能包含:理解用户意图 -> 调用知识库查询工具 -> 进行多轮思考(Chain-of-Thought)-> 调用订单查询API -> 生成最终回复。这个过程涉及多次LLM调用、多次工具执行、以及内部的状态变迁。
因此,智能体监控需要捕获的维度更为复杂:
- LLM调用层面:每次调用的模型、输入/输出Token数、耗时、成本、以及可能出现的速率限制或内容过滤错误。
- 工具执行层面:调用了哪个工具、传入参数、返回结果、执行耗时与成功/失败状态。
- 智能体决策流层面:智能体的“思考”步骤(ReAct模式中的“Thought”)、执行动作(“Action”)的序列、以及最终输出(“Final Answer”)。这构成了智能体的“推理轨迹”。
- 会话与任务层面:一次用户会话(Session)中可能包含多个智能体任务(Task),需要能关联和追踪完整的交互历史。
agentwatch的设计正是围绕这些维度展开的。它不是一个简单的日志聚合器,而是一个理解智能体语义的监控系统。它能自动识别和结构化上述不同层面的事件,并将它们关联到一个统一的任务上下文中,为开发者提供一个完整的视角。
2.2 整体架构与数据流
agentwatch的架构遵循了经典的数据采集、传输、存储、展示流程,但在每个环节都针对智能体数据做了定制。
数据采集端(Instrumentation):这是接入agentwatch的第一步。项目提供了多种语言的SDK(如Python、JavaScript),以非侵入或低侵入的方式集成到你的智能体框架中。无论是使用LangChain、LlamaIndex、AutoGen还是自定义框架,你通常只需要几行初始化代码和装饰器,就能自动捕获智能体的关键事件。
# 示例:Python SDK 基础集成 from agentwatch import AgentWatchClient client = AgentWatchClient(api_key="your_key", endpoint="https://your.agentwatch.instance") # 装饰你的智能体主循环或关键函数 @client.trace_agent(name="CustomerSupportAgent") def run_agent_session(user_query): # 你的智能体逻辑 thoughts, actions, final_answer = your_agent_logic(user_query) return final_answerSDK会负责将事件序列化,并通过异步方式发送到后端,确保对智能体本身性能的影响最小化。
数据传输与处理层:采集到的事件数据通过HTTP或WebSocket发送到agentwatch的后端服务。后端包含一个摄入管道(Ingestion Pipeline),负责对数据进行验证、解析和丰富。例如,它会从原始日志中提取出LLM调用的参数、计算Token消耗(如果原始事件未提供)、并将工具调用与对应的智能体步骤进行关联。这一层是赋予数据“智能”的关键。
存储与索引层:处理后的数据会被存储到时间序列数据库(用于指标数据,如每秒请求数、平均延迟)和文档数据库(用于存储详细的轨迹数据,包含完整的思考、行动序列)。agentwatch利用高效的索引策略,使得你可以根据智能体名称、会话ID、任务状态、时间范围等多个维度快速查询海量的轨迹数据。
查询与可视化层:这是用户直接交互的部分,通常是一个Web仪表盘。它提供:
- 实时仪表盘:展示全局健康状态,如智能体在线数量、任务成功率、平均响应时间、总成本消耗等。
- 轨迹浏览器:像查看调用链一样,可视化单个智能体任务的完整执行过程。你可以层层展开,查看每一步的思考内容、调用的工具及其输入输出。
- 分析工作台:支持对历史数据进行聚合分析,例如,“过去一周,翻译智能体在调用‘术语库查询’工具时,失败率最高的参数是什么?”。
- 告警中心:允许你设置基于指标(如错误率突增)或模式(如检测到特定异常工具调用序列)的告警规则。
这个架构确保了从细粒度的单次推理到宏观的系统表现,你都能有清晰的掌控。
3. 核心功能深度解析与集成实操
3.1 核心监控维度详解
agentwatch的监控能力可以归纳为四大支柱,每一支柱都对应着智能体运维的一个关键方面。
3.1.1 性能与资源监控这是最基础的监控层面,关注“跑得快不快、贵不贵”。
- 延迟分析:记录从任务开始到结束的总耗时,并拆解为LLM思考时间、工具执行时间、网络延迟等组成部分。仪表盘上可以直观看到P50、P95、P99延迟,帮你定位是LLM服务慢还是某个外部API拖了后腿。
- 成本核算:这是智能体应用商业化的核心。agentwatch能根据每次LLM调用的模型类型、输入输出Token数,自动估算成本(支持OpenAI、Anthropic、Azure OpenAI等主流厂商的定价模型)。你可以按智能体、按项目、按时间维度查看成本报表,优化提示词(减少输入Token)或调整模型选用策略(在效果和成本间权衡)就有了数据依据。
- 吞吐量与并发:监控智能体系统处理并发请求的能力,观察队列长度、处理速率等指标,为资源扩容提供参考。
3.1.2 轨迹与可解释性这是agentwatch区别于通用监控的核心价值,它回答了“智能体是怎么想的、怎么做的”。
- 完整的推理轨迹记录:自动记录智能体在ReAct、Plan-and-Execute等模式下的每一个“Thought”(思考)、“Action”(行动,包括工具调用和参数)、“Observation”(观察结果)。这就像给智能体装了一个“黑匣子”飞行记录仪。
- 工具调用追踪:详细记录每次工具调用的名称、参数、返回结果、状态码和耗时。当智能体行为异常时,你可以快速定位是哪个工具调用出了问题,是参数错误还是外部服务异常。
- 会话上下文关联:将属于同一用户对话的多个智能体任务串联起来,呈现完整的交互故事线,对于调试多轮对话类智能体至关重要。
3.1.3 质量与成功率监控智能体的输出并非简单的对错,需要更细致的度量。
- 任务成功/失败判定:agentwatch允许你自定义成功标准。可以通过规则(如最终输出包含特定关键词)或通过后期人工标注反馈,来标记任务的成功与否。系统会自动计算成功率指标。
- 异常检测:自动检测常见的异常模式,如:循环思考(智能体陷入死循环)、工具调用连续失败、LLM返回格式错误、触犯内容安全策略等。这些异常会被高亮显示并可用于触发告警。
- 输出一致性分析:对于相同或相似的输入,分析智能体输出的稳定性,这对于评估智能体的可靠性非常重要。
3.1.4 依赖与拓扑发现在复杂的多智能体系统中,智能体之间会相互调用或协作。
- 服务依赖图:自动绘制智能体之间的调用关系图。例如,智能体A在处理某个任务时,会向智能体B发起子请求。这个图谱能帮助你理解系统架构,并在某个智能体故障时评估影响范围。
- 工具依赖分析:展示各个智能体对底层工具和API的依赖情况,识别出那些被广泛依赖的脆弱节点。
3.2 实际集成步骤与配置要点
假设我们有一个基于LangChain构建的客服智能体,下面是如何一步步将其接入agentwatch的详细过程。
第一步:部署与初始化agentwatch服务你可以选择使用agentwatch官方提供的云服务(如果有),但开源版本通常需要自行部署。项目一般提供Docker Compose配置,部署相对简单。
# 克隆仓库并启动服务 git clone https://github.com/mishanefedov/agentwatch.git cd agentwatch/deploy docker-compose up -d部署完成后,你会获得一个后端API地址(如http://localhost:8080)和一个前端仪表盘地址(如http://localhost:3000)。你需要从前端获取一个API Key,用于SDK认证。
第二步:在智能体代码中集成SDK在你的Python项目中安装agentwatch的SDK包:pip install agentwatch-sdk。
接下来是关键的集成代码。最佳实践是创建一个全局的监控客户端,并在应用启动时初始化。
# monitoring.py import os from agentwatch import AgentWatchClient, TraceConfig # 初始化客户端 aw_client = AgentWatchClient( api_key=os.getenv("AGENTWATCH_API_KEY"), endpoint=os.getenv("AGENTWATCH_ENDPOINT", "http://localhost:8080"), service_name="customer-support-service", # 你的服务名称 default_trace_config=TraceConfig( send_traces=True, sample_rate=1.0 # 采样率,1.0表示100%采样,生产环境可调低以节省资源 ) ) # 一个工具函数,用于包装LangChain的LLM调用 def wrap_llm(llm): """装饰LangChain的LLM对象,使其调用被监控""" original_generate = llm.generate async def monitored_generate(prompts, **kwargs): # 在调用前记录事件 with aw_client.start_span(name=f"llm_call_{llm.model_name}", type="llm") as span: span.set_attribute("model", llm.model_name) span.set_attribute("provider", llm._llm_type) try: result = await original_generate(prompts, **kwargs) # 调用成功后记录Token等信息(如果LLM返回了的话) if hasattr(result, 'llm_output') and result.llm_output.get('token_usage'): usage = result.llm_output['token_usage'] span.set_attribute("token.prompt", usage.get('prompt_tokens')) span.set_attribute("token.completion", usage.get('completion_tokens')) return result except Exception as e: span.record_exception(e) span.set_status("ERROR") raise llm.generate = monitored_generate return llm然后,在你的主智能体代码中:
# main_agent.py from langchain.agents import initialize_agent, AgentType from langchain.chat_models import ChatOpenAI from my_tools import get_customer_order_tool, search_knowledge_base_tool from monitoring import aw_client, wrap_llm @aw_client.trace_agent(name="CustomerSupportAgent") def create_and_run_agent(user_input: str): # 1. 初始化被监控的LLM llm = ChatOpenAI(model="gpt-4", temperature=0) monitored_llm = wrap_llm(llm) # 2. 初始化工具列表(agentwatch SDK通常也能自动装饰标准LangChain工具) tools = [get_customer_order_tool(), search_knowledge_base_tool()] # 3. 创建智能体 agent = initialize_agent( tools, monitored_llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True # LangChain的verbose输出也会被agentwatch捕获并关联 ) # 4. 运行智能体 with aw_client.start_transaction(name="handle_customer_query") as transaction: transaction.set_attribute("user_input", user_input) try: response = agent.run(user_input) transaction.set_status("SUCCESS") return response except Exception as e: transaction.record_exception(e) transaction.set_status("FAILURE") raise # 应用主循环 if __name__ == "__main__": query = "我昨天的订单12345发货了吗?" result = create_and_run_agent(query) print(result)第三步:配置与调优集成后,你需要在agentwatch仪表盘中进行一些初始配置:
- 项目与环境:创建对应的项目(如“客服系统”)和环境(如“开发”、“生产”),便于数据隔离。
- 告警规则:设置关键告警,例如:
- 当“CustomerSupportAgent”的错误率在5分钟内超过5%时,发送邮件告警。
- 当单次任务消耗的预估成本超过1美元时,发送钉钉/Slack通知。
- 数据保留策略:根据存储容量,设置原始轨迹数据和聚合指标数据的保留时长。详细轨迹数据通常更占空间,可以设置较短的保留期(如7天),而聚合指标可以保留更久(如90天)。
实操心得:集成阶段的注意事项
- 采样率策略:在生产环境,对100%的轨迹进行采样可能会产生大量数据和高昂成本。建议根据流量设置采样率(如10%)。对于错误请求,可以设置更高的采样率(如100%),确保所有异常都被捕获。
- 敏感信息过滤:智能体处理的数据可能包含用户隐私(如订单号、地址)。务必在SDK中配置数据过滤规则,对特定字段(如
user_input中的身份证号、手机号)进行脱敏处理,避免敏感数据被发送到监控系统。agentwatch SDK通常支持设置redacted_keys或提供自定义的span_processor来过滤属性。- 性能开销评估:在集成前后,对智能体的响应时间进行基准测试。agentwatch的SDK设计为异步和非阻塞,开销通常很小(<5%),但在高并发场景下仍需关注。如果开销过大,可以调整批处理发送的间隔和大小。
- 上下文传播:如果你的系统涉及多个服务(如前端、后端、智能体),需要确保Trace ID在服务间传递,这样才能在agentwatch中还原完整的分布式追踪链路。这通常遵循W3C Trace Context标准。
4. 仪表盘使用与数据分析实战
4.1 核心仪表盘功能导航
成功集成并运行一段时间后,你可以在agentwatch的Web界面看到丰富的数据。我们以客服智能体为例,看看如何从这些数据中获取洞察。
首页/总览仪表盘:这里是你系统的“健康晴雨表”。你会看到几个关键的大数字:当前在线的智能体实例数、过去一小时的请求总量、平均响应时间、成功率和总估算成本。下方通常有趋势图,展示这些指标随时间的变化。一眼就能看出系统是否处于正常状态。例如,你发现平均响应时间从200ms陡增至1500ms,那么很可能下游的LLM API或某个关键工具出现了性能问题。
智能体轨迹列表页:这里列出了所有被记录下来的智能体任务。你可以按时间、智能体名称、状态(成功/失败/错误)进行筛选和排序。点击任意一条记录,即可进入详情页。
单次轨迹详情页:这是调试智能体的“手术室”。页面通常以时间线或瀑布流的形式,清晰展示了该任务从开始到结束的完整生命周期。
- 顶部摘要:任务ID、所属智能体、开始结束时间、总耗时、状态和估算成本。
- 轨迹主体:以可折叠的层级结构展示每一步。一个典型的ReAct步骤会显示为一个“Thought”节点(包含LLM的内部推理),下面挂着一个“Action”节点(显示调用的工具和参数),再下面是一个“Observation”节点(显示工具返回的结果)。你可以逐层展开,查看每一步的原始文本。
- 原始数据与元数据:通常有一个“Raw”或“JSON”标签页,供高级用户查看底层传输的完整事件数据。
- 关联信息:如果该任务触发了告警,或者关联了用户反馈(如“ thumbs down”),也会在这里显示。
分析工作台:这是进行深度数据分析的地方。你可以使用类SQL的查询语言或图形化构建器,提出复杂的问题。例如:
- “找出过去24小时内,所有最终状态为失败,且曾调用过‘订单查询API’的任务。”
- “对比使用gpt-4和gpt-3.5-turbo模型的智能体,在回答‘退货政策’类问题上的平均成本与成功率。”
- “统计‘知识库查询工具’被调用的频率,并列出最常被查询的前10个关键词。”
4.2 基于监控数据的智能体优化案例
监控的最终目的是为了优化。下面通过几个真实场景,看看如何利用agentwatch的数据来驱动决策。
案例一:成本优化在仪表盘的成本分析报告中,你发现“处理投诉”类任务的成本异常高。通过轨迹详情深入分析,你发现这类任务中,智能体频繁调用一个“情感分析”子模型来评估用户情绪,且每次调用都使用完整的对话历史作为上下文,导致输入Token数巨大。
- 优化动作:修改提示词,让智能体在决定调用情感分析工具前,先尝试总结用户情绪关键词。同时,为情感分析工具设计一个简化的上下文输入格式。
- 效果验证:优化部署后,在agentwatch中对比优化前后同类任务的成本指标,发现平均成本下降了40%。
案例二:稳定性提升告警显示,“商品推荐智能体”在夜间错误率飙升。通过筛选该时段的失败轨迹,你发现错误集中表现为“库存查询工具超时”。
- 根因分析:轨迹详情显示,工具调用设置的超时时间为2秒,而夜间库存数据库进行批量作业,响应变慢。
- 优化动作:将库存查询工具的超时时间调整为5秒,并为其增加重试机制(指数退避)。
- 效果验证:调整后,观察该智能体的错误率曲线,确认夜间错误峰值消失。
案例三:提示词工程迭代你怀疑智能体在处理“多步骤操作指南”类问题时,给出的步骤顺序有时混乱。在分析工作台中,你查询所有包含“步骤”或“指南”关键词的成功任务,导出它们的“Final Answer”进行人工评估。
- 发现问题:评估发现,当指南步骤超过5步时,智能体偶尔会遗漏或颠倒步骤。
- 优化动作:在提示词中明确要求智能体“在输出步骤前,先在思考中列出所有步骤的编号和要点进行自我检查”。
- 效果验证:部署新提示词后,创建分析查询,计算新版本智能体在同类问题上,输出中包含完整步骤编号的任务比例。数据表明,该比例从75%提升到了95%。
5. 高级功能与定制化开发
5.1 自定义指标与事件
除了开箱即用的监控项,agentwatch通常允许你发送自定义指标和事件,以满足特定业务需求。
例如,你的电商客服智能体在成功完成一笔订单修改后,可以发送一个自定义业务事件:
with aw_client.start_transaction(name="modify_order"): # ... 智能体处理逻辑 ... if order_modified_successfully: aw_client.record_custom_event( name="order_modified", attributes={ "agent_name": "CustomerSupportAgent", "order_id": order_id, "modification_type": "address_change", "customer_tier": "vip" } )然后,你可以在仪表盘上创建图表,统计不同客户层级(customer_tier)的订单修改频率,或者监控各类修改(modification_type)的成功率。
5.2 告警规则的精细配置
告警不应仅限于简单的阈值。agentwatch支持更复杂的告警条件:
- 突变检测:当错误率在10分钟内相对上升了200%时告警,这比静态阈值(如>5%)更能适应业务量的自然波动。
- 模式匹配告警:当在智能体的“Thought”中连续出现“I don't know”或“I'm confused”这类短语超过3次时告警,这可能意味着智能体遇到了训练数据之外的新情况。
- 关联告警:当“支付工具调用失败”和“用户会话中断”两个事件在短时间内相继发生时,触发一个更高级别的告警,提示可能存在支付通道的系统性故障。
配置这些告警需要你对智能体的行为模式有深入理解,但它们能极大地提升运维的主动性和精准度。
5.3 数据导出与外部系统集成
监控数据不应只停留在agentwatch内部。你可以将数据导出到更通用的数据分析平台(如Grafana、Datadog)或数据仓库(如Snowflake、BigQuery)进行长期存储和跨系统关联分析。
agentwatch通常提供以下方式:
- API导出:通过API定期拉取聚合后的指标和采样后的轨迹数据。
- 流式导出:将事件流实时推送到Kafka或Amazon Kinesis等消息队列,供下游消费。
- 警报集成:将告警通知连接到现有的运维响应平台(如PagerDuty、OpsGenie)或团队协作工具(如Slack、Microsoft Teams)。
例如,你可以设置一个数据管道,将agentwatch中关于智能体成本的数据,与云服务商的账单数据、业务系统的营收数据一起,导入到数据仓库中,从而计算“智能体服务成本占营收比”这个关键的商业指标。
6. 常见问题排查与运维心得
在实际运维基于agentwatch的智能体系统时,你会遇到一些典型问题。这里记录下我踩过的坑和总结的经验。
6.1 数据采集与传输问题
问题1:仪表盘上看不到数据或数据延迟很高。
- 排查步骤:
- 检查SDK初始化:确认API Key、Endpoint地址正确,并且SDK初始化代码在智能体逻辑执行前已被调用。
- 检查网络连通性:从部署智能体的环境,尝试
curl或telnetagentwatch的后端API地址和端口。 - 检查SDK日志:agentwatch的SDK通常有内置日志器,设置日志级别为DEBUG,查看是否有发送失败或认证错误的记录。
- 检查队列与批处理:SDK为了性能,默认会缓冲事件并批量发送。检查缓冲队列是否已满,或批量发送的间隔是否设置得过长(如默认60秒)。在调试期,可以暂时将批处理间隔调短。
- 检查采样率:确认你没有将采样率(
sample_rate)设置为0。
问题2:监控数据本身产生了性能瓶颈。
- 现象:集成agentwatch后,智能体本身响应变慢。
- 解决方案:
- 异步与非阻塞:确保所有监控数据的发送操作都是异步的,不会阻塞智能体的主执行线程。
- 调整采样率:在生产环境,对非关键路径或高流量智能体采用采样监控。
- 精简数据:检查是否记录了过于庞大的属性(如将整个网页内容作为属性发送)。只记录必要的元数据和摘要信息。
- 升级硬件/资源:如果自建agentwatch,确保后端服务(尤其是数据库)有足够的资源处理写入压力。
6.2 数据解读与误报警问题
问题3:告警频繁,但大多是“狼来了”。
- 根因:告警规则设置过于敏感或不符合业务模式。
- 优化策略:
- 引入基线:不要只使用静态阈值。利用agentwatch的历史数据,计算指标在相同时段(如每周二上午)的基线,告警规则基于“偏离基线超过X%”来设定。
- 设置告警休眠期:对于已知的维护窗口或定时批处理任务期间,可以暂时禁用相关告警。
- 分级告警:区分“警告”(Warning)和“严重”(Critical)级别。只有核心指标异常才触发需要立即干预的严重告警。
问题4:轨迹数据过于庞大,难以找到有用信息。
- 策略:
- 善用筛选与标签:在创建事务(Transaction)或跨度(Span)时,为其打上丰富的业务标签,如
task_type="order_query",user_intent="complaint"。这样可以在海量数据中快速筛选出特定场景的轨迹。 - 关注错误与异常:日常巡检时,优先查看状态为“ERROR”或“FAILURE”的轨迹,这些是问题的直接体现。
- 使用对比分析:当发现一个异常慢的任务时,在分析工作台中找出一个相同类型但执行很快的成功任务,将两者的轨迹并排对比,差异点往往就是问题的关键。
- 善用筛选与标签:在创建事务(Transaction)或跨度(Span)时,为其打上丰富的业务标签,如
6.3 安全与隐私考量
问题5:如何避免监控数据泄露敏感信息?这是一个必须严肃对待的问题。除了前面提到的在SDK端过滤,还需要:
- 传输加密:确保agentwatch后端服务启用HTTPS,SDK与后端之间的通信是加密的。
- 存储加密:如果自建,确保数据库磁盘加密功能已开启。
- 访问控制:严格管理agentwatch仪表盘的访问权限,遵循最小权限原则。不同的团队成员(如开发者、运维、产品经理)应拥有不同的数据视图权限。
- 数据生命周期管理:制定明确的数据保留和销毁策略。包含个人身份信息(PII)的轨迹数据,其保留时间应严格遵守相关法律法规。
问题6:监控自身成为单点故障。
- 设计原则:监控系统的首要原则是“不能影响主业务的稳定性”。
- 实践:
- SDK的降级能力:确保SDK在无法连接到后端、或发送失败时,不会抛出异常导致智能体崩溃。它应该记录本地错误日志后,优雅地降级(即丢弃监控数据,继续执行主业务)。
- 后端高可用:如果自建agentwatch,应部署多实例集群,并考虑负载均衡和故障转移。
- 依赖隔离:避免监控系统与核心业务系统共享底层基础设施(如数据库、消息队列),防止资源竞争导致连锁故障。
将agentwatch这样的专业监控工具引入你的AI智能体开发流程,初期可能会增加一些复杂性和学习成本,但从中长期看,它带来的可见性、可控性和数据驱动的优化能力,是构建可靠、高效、可解释的智能体系统的基石。它让你从“猜测”智能体为何失败,转变为“洞察”其每一步决策,从而更有信心地将AI能力部署到真实的生产环境中去。