资讯动态

Agent上线前的三道生死防线:门禁、可观测性与AgentOps

发布时间:2026/10/14 6:30:58 来源:尧图企业网站定制
1. 这不是一份“交差文档”而是一张Agent上线前的生死线清单你手里的Agent模型刚在本地跑通了demo接口返回了漂亮的JSON日志里飘着几行绿色的“INFO”——这时候最容易犯一个致命错误以为它已经 ready for production。我见过太多团队在凌晨三点被报警电话叫醒只因为那个“看起来很稳”的Agent在生产环境里突然开始循环调用自身、把数据库连接池耗尽、或者把用户一句“帮我查下订单”翻译成十段毫无逻辑的API请求链。这不是模型能力的问题是工程化落地的断层。这张 Checklist 的核心价值不在于告诉你“要做什么”而在于帮你识别那些在模型训练阶段完全看不见、但在真实业务流中会瞬间引爆的隐性风险点。它覆盖三个关键维度门禁Access Control即谁可以触发、以什么权限触发、触发边界在哪可观测性埋点Observability Instrumentation即当它出错时你能否在30秒内定位到是prompt写错了、工具调用超时了、还是LLM返回了格式错乱的JSONAgentOps即如何把Agent真正嵌入现有运维体系让它像数据库服务一样可重启、可回滚、可灰度、可熔断。关键词“Agent 上线 Checklist”、“门禁”、“可观测性埋点”、“AgentOps”不是并列关系而是层层递进的防御纵深——门禁是城墙可观测性是城楼上的瞭望哨和烽火台AgentOps是整套城防调度系统。适合正在将RAG、Function Calling或ReAct类Agent从PoC推向真实业务场景的工程师、技术负责人和SRE也适合那些被老板问“这个Agent到底靠不靠谱”而答不上来的架构师。它不讲大模型原理不聊Prompt Engineering技巧只聚焦一件事当你的Agent第一次面对真实用户、真实数据、真实流量时如何确保它不崩、不乱、不丢人。2. 内容整体设计与思路拆解为什么这三道防线缺一不可2.1 门禁不是“能不能用”而是“在什么条件下能安全地用”很多团队把门禁简单等同于“加个API Key鉴权”这是对风险的严重误判。一个Agent的门禁本质是对意图、上下文、动作三重边界的动态校验。举个例子一个客服Agent用户输入“把我的账户余额清零”如果门禁只检查用户是否登录那这个恶意指令就会直接穿透。真正的门禁必须在LLM生成动作前介入做三件事第一意图识别Intent Classification——判断这句话是咨询、投诉、还是潜在的越权操作第二上下文水印Context Watermarking——检查当前对话历史中是否包含已被标记为高风险的关键词如“删除”、“清空”、“绕过”第三动作白名单Action Whitelisting——即使LLM生成了delete_user_account()函数调用门禁模块也必须根据当前用户角色普通用户/客服专员/管理员实时比对拒绝非授权动作。我参与过的一个金融类Agent项目上线前漏掉了“上下文水印”这一环结果测试时发现只要用户在上一轮对话中提过“黑客”“漏洞”等词后续任何正常查询都会被LLM过度联想生成大量无意义的权限探测请求。补救方案是在所有用户输入进入LLM前先过一遍轻量级的规则引擎我们用的是基于正则关键词权重的FastText模型给输入打一个“风险分”分值超过阈值就强制走人工审核通道。这个设计的底层逻辑是LLM是“思考者”但不能是“决策者”门禁是那个坐在LLM肩膀上的“守门人”它不干预思考过程但必须守住行动底线。2.2 可观测性埋点不是“看日志”而是构建Agent的“神经反射弧”传统服务的日志记录的是“发生了什么”而Agent的可观测性必须回答“为什么发生”和“接下来会怎样”。一个典型的Agent调用链远比HTTP请求复杂用户输入 → 意图识别 → RAG检索 → Prompt组装 → LLM调用 → Tool调用 → 结果解析 → 响应生成。其中任何一个环节出错都可能表现为最终响应的“语义失真”——比如用户问“订单发货了吗”Agent却回答“您的账户有500积分”。这种问题光看最后的response日志是无法定位的。我们的埋点设计强制要求在每个关键决策点插入结构化事件Structured Event而非简单打点。例如在LLM调用前埋点必须包含prompt_hash用于快速比对不同版本prompt的输出差异、retrieved_chunks_countRAG召回数量低于3通常意味着知识库覆盖不足、tool_call_candidatesLLM声称要调用的工具列表用于验证其理解是否与业务逻辑一致在Tool调用后必须记录tool_name、tool_input_truncated输入参数脱敏后的哈希值保护敏感数据、tool_duration_ms、tool_error_code非HTTP状态码而是业务自定义错误如TOOL_TIMEOUT、DATA_NOT_FOUND。最关键的是所有事件必须携带同一个trace_id并支持跨服务透传。我们实测下来当一个Agent响应异常时通过trace_id在ELK中搜索能在15秒内拉出完整调用链并一眼看出是RAG召回了错误文档还是LLM把get_order_status()误写成了get_user_profile()。这种设计的代价是埋点代码量增加约40%但换来的是故障平均定位时间MTTD从小时级降到分钟级。它不是为了满足审计要求而是为了让工程师在深夜接到告警时能立刻进入“战斗状态”而不是在几十万行日志里大海捞针。2.3 AgentOps不是“部署上线”而是让Agent成为基础设施的一部分把Agent打包成Docker镜像、扔进K8s集群只是完成了“部署”离“Ops”还差十万八千里。AgentOps的核心目标是让Agent具备与数据库、消息队列同等的可管理性Manageability。这意味着它必须原生支持热配置更新无需重启即可切换prompt模板或RAG知识源、细粒度熔断不是整个服务熔断而是对某个高频失败的Tool调用自动降级为mock响应、灰度发布新版本Agent只对1%的特定用户群生效并自动对比A/B两组的“任务完成率”和“用户满意度”指标。我们曾在一个电商导购Agent中实现过一个关键功能当检测到某类商品如“iPhone 15”的RAG检索准确率连续5分钟低于70%系统会自动触发“知识库快照回滚”将RAG索引切回到2小时前的稳定版本同时向运营同学发送企业微信告警附带失败样本和建议优化方向。这个能力的背后是一套轻量级的Agent生命周期管理器Agent Lifecycle Manager, ALM它独立于Agent主进程运行通过gRPC与Agent通信负责配置下发、健康检查、指标采集和策略执行。ALM本身是无状态的可以水平扩展。这种设计的哲学是Agent是“业务逻辑”ALM是“操作系统”前者专注智能后者保障稳定。很多团队试图用K8s的原生能力如ConfigMap、HPA来替代ALM结果发现ConfigMap更新有延迟HPA只能看CPU而Agent的瓶颈往往在LLM API的rate limit或RAG的向量检索延迟上。所以AgentOps不是K8s的延伸而是为Agent量身定制的一套“微操作系统”。3. 核心细节解析与实操要点门禁、埋点、Ops的硬核实现3.1 门禁模块的三层防御实现实战门禁模块我们采用“前置过滤器Pre-filter 中间件Middleware 后置校验Post-validator”三层架构每层解决不同维度的风险。前置过滤器Pre-filter部署在API网关层处理最粗粒度的准入。它不接触业务逻辑只做三件事1校验JWT Token的有效性和scope例如scopeagent:customer_service2基于IP地址段和请求频率做基础限流使用Redis计数器100次/分钟/用户3对原始用户输入进行基础脱敏和长度截断超过2000字符的输入只保留前1000字后1000字中间用[TRUNCATED]标记。这一步的代码极其轻量用Go写成一个独立的Sidecar容器与Agent服务共Pod部署确保即使Agent主进程崩溃门禁依然有效。 提示不要在这里做复杂的NLP分析网关层的资源宝贵所有计算密集型任务必须下沉。中间件Middleware集成在Agent框架内部是门禁的核心。我们基于LangChain的Runnable抽象开发了一个SecurityMiddleware类。它的invoke方法在每次调用前执行关键逻辑如下def invoke(self, input: dict, config: RunnableConfig) - dict: # 步骤1意图识别调用轻量级分类模型 intent self.intent_classifier.predict(input[query]) if intent in [MALICIOUS, UNAUTHORIZED]: raise SecurityException(fBlocked malicious intent: {intent}) # 步骤2上下文水印检查扫描最近3轮对话历史 recent_history self.get_recent_history(config[run_id], limit3) risk_score self.context_watermarker.score(recent_history [input[query]]) if risk_score 0.8: # 触发增强验证要求用户输入验证码或二次确认 return {requires_verification: True, verification_token: self.generate_token()} # 步骤3动作白名单预检解析LLM即将生成的tool call # 注意这里不是等LLM返回后再检查而是利用LLM的function calling能力 # 在生成前就预测它可能调用的工具通过prompt engineering引导LLM输出候选工具列表 candidate_tools self.llm_predict_candidate_tools(input[query], intent) for tool in candidate_tools: if not self.tool_authorizer.is_authorized(config[user_role], tool): raise SecurityException(fTool {tool} not authorized for role {config[user_role]}) return super().invoke(input, config)这个中间件的关键创新点在于“候选工具预测”。我们没有等待LLM生成最终的tool_calls而是在Prompt中加入一段明确指令“请先列出你认为最有可能调用的3个工具名称用逗号分隔不要解释只输出工具名。” 这样我们在LLM真正调用前就能拿到一个预测列表进行白名单校验。实测下来预测准确率高达92%且平均增加延迟不到50ms。后置校验Post-validator在Agent生成最终响应后、返回给用户前的最后一道关卡。它主要做两件事1内容安全扫描调用开源的perspectiveapi或自建的关键词正则引擎过滤涉政、色情、暴力等违规内容2业务逻辑一致性校验。例如一个订单查询Agent如果响应中包含了“订单已发货”但后置校验调用订单服务API发现状态仍是“待发货”则立即拦截该响应返回“系统信息暂未同步请稍后再试”。这一步防止了LLM“幻觉”导致的虚假信息传播。 注意后置校验的API调用必须设置严格的超时我们设为300ms和熔断机制避免它成为新的性能瓶颈。3.2 可观测性埋点的七类黄金事件定义我们定义了Agent生命周期中必须埋点的七类事件每一类都对应一个具体的、可操作的故障排查场景。所有事件均以OpenTelemetry标准格式上报确保与现有监控体系无缝集成。事件类型触发时机必填字段示例排查价值agent_input_received用户请求抵达Agent入口user_id,session_id,input_text_hash,input_length快速识别恶意刷量或异常长文本攻击retrieval_performedRAG检索完成retrieved_chunk_count,retrieved_chunk_scores_avg,knowledge_source_id,vector_search_latency_ms判断知识库质量chunk_scores_avg低于0.3说明检索失效prompt_assembledPrompt组装完成准备发给LLMprompt_hash,prompt_length,context_window_used_ratio,tool_descriptions_included_count分析prompt膨胀问题context_window_used_ratio超0.9易导致截断llm_invokedLLM调用发起llm_model_name,llm_temperature,llm_max_tokens,prompt_hash关联LLM性能与prompt变化定位模型退化tool_called工具调用发起tool_name,tool_input_hash,tool_timeout_ms,is_mocked识别慢工具和mock滥用is_mockedTrue需告警tool_result_received工具调用返回tool_name,tool_duration_ms,tool_error_code,tool_output_hash精准定位工具层故障tool_error_codeTIMEOUT需优化agent_response_sent最终响应返回用户response_length,response_format_valid,task_success_rate_estimate,trace_id衡量端到端质量response_format_validFalse说明LLM输出解析失败埋点的实操要点在于字段的“可操作性”。例如prompt_hash不是简单的MD5而是对Prompt模板字符串所有变量值脱敏后拼接再哈希这样同一个prompt模板在不同上下文下的hash一定不同便于精准归因。再如task_success_rate_estimate是一个由Agent自己估算的置信度分数0-1它基于LLM返回的tool_calls数量、retrieved_chunks的相关性得分、以及历史成功率模型综合计算得出这个分数直接决定了前端是否显示“AI正在思考中”还是“已为您找到答案”。我们发现这个自评分数与真实用户点击“有用”按钮的匹配度高达87%成为衡量Agent健康度的核心指标。3.3 AgentOps落地的四大支柱组件AgentOps不是一个概念而是一套可落地的组件集合。我们将其拆解为四个核心支柱1. 配置中心Config Hub一个独立的Web服务提供图形化界面和API。它管理所有Agent的动态配置prompt模板支持版本管理和A/B测试、RAG知识源URL可热切换、工具调用超时阈值、熔断规则如“get_order_status失败率5%持续1分钟则降级”。关键设计是“配置快照Config Snapshot”每次修改配置系统自动生成一个包含所有相关参数的JSON快照并赋予唯一ID。当Agent启动时会拉取指定快照ID的配置。这保证了配置变更的可追溯性和可回滚性。我们曾因一个prompt模板的微小改动把“请用中文回答”改成“请务必用中文回答”导致LLM输出格式混乱通过一键回滚到上一个快照30秒内恢复服务。2. 健康检查探针Health Probe一个轻量级HTTP端点/healthzAgent必须实现。它不仅检查进程存活更检查核心依赖的连通性1向LLM Provider发起一个极简的ping请求如{model:gpt-3.5-turbo,messages:[{role:user,content:ping}]}2执行一次最小化的RAG检索检索一个已知存在的、高置信度的文档ID3调用一个核心工具如get_user_profile并验证返回结构。只有当这三项全部通过探针才返回200。K8s的Liveness Probe直接调用此端点确保不健康的Agent被及时驱逐。3. 指标采集器Metrics Collector一个嵌入在Agent进程内的Go协程每10秒采集一次关键指标并推送到Prometheus Pushgateway。采集的指标不是泛泛的CPU/Memory而是业务语义指标agent_task_success_total{typeorder_query,statussuccess}、agent_tool_call_duration_seconds_bucket{toolget_order_status,le1.0}、agent_prompt_cache_hit_ratio。这些指标直接驱动告警和自动扩缩容。例如当agent_task_success_total{typeorder_query,statusfailure}的5分钟增长率超过200%自动触发告警并启动根因分析流程。4. 生命周期管理器ALM如前所述这是AgentOps的大脑。它通过gRPC与每个Agent实例通信下发指令。一个典型指令是RollbackKnowledgeSourceRequest当RAG知识库更新后出现大规模失败ALM会向所有Agent实例广播此指令Agent收到后立即从新知识源切回旧快照。ALM自身通过etcd实现高可用其指令日志被持久化确保任何操作都可审计。 实操心得ALM的指令设计必须是“幂等”的。同一个Rollback指令发10次效果和发1次完全一样。这是分布式系统稳定性的基石。4. 实操过程与核心环节实现从零搭建可运行的Checklist验证环境4.1 环境准备与依赖安装我们选择Python 3.11作为运行时因为它对异步IO和内存管理的优化最适合Agent这类I/O密集型应用。整个验证环境力求轻量避免引入K8s等重型依赖所有组件均可在单机Docker Compose中运行。核心依赖如下Agent框架LangChain 0.1.16稳定版避开了0.2.x的breaking changesLLM ProviderOllama本地运行llama3:8b确保离线可运行避免网络波动干扰测试RAG引擎ChromaDB 0.4.24轻量级向量数据库内存模式启动5秒内就绪可观测性OpenTelemetry Python SDK 1.24.0 Jaeger All-in-One Docker镜像jaegertracing/all-in-one:1.49配置中心Consul 1.16.3KV存储提供HTTP API和Web UI指标监控Prometheus 2.47.2 Grafana 10.2.1安装步骤全部命令在Linux/macOS终端执行# 1. 安装Docker和Docker Compose v2 curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER newgrp docker # 刷新group # 2. 启动Jaeger分布式追踪 docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_PORT:9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 14250:14250 \ -p 14268:14268 \ -p 14269:14269 \ -p 9411:9411 \ jaegertracing/all-in-one:1.49 # 3. 启动Consul配置中心 docker run -d --name consul \ -p 8500:8500 \ -e CONSUL_BIND_INTERFACEeth0 \ consul:1.16.3 # 4. 启动Prometheus Grafana mkdir -p ./prometheus ./grafana # 创建prometheus.yml配置文件略见GitHub仓库 # 创建grafana数据源和仪表盘JSON略见GitHub仓库 docker-compose up -d # 使用提供的docker-compose.yml提示所有配置文件和Docker Compose脚本均已整理在配套GitHub仓库链接见文末可一键克隆运行。环境启动后访问http://localhost:8500Consul UI、http://localhost:16686Jaeger UI、http://localhost:3000Grafana即可开始验证。4.2 门禁模块的完整代码实现与测试以下是门禁模块的核心代码已通过单元测试和集成测试验证。它实现了前述的三层防御并提供了清晰的测试用例。# security/middleware.py import hashlib import json import re from typing import Dict, Any, List, Optional from langchain_core.runnables import Runnable, RunnableConfig from langchain_core.runnables.base import RunnableBinding from langchain_core.messages import HumanMessage from langchain_core.tools import BaseTool class SecurityException(Exception): 门禁校验失败异常 pass class SecurityMiddleware(Runnable): def __init__( self, intent_classifier, # 轻量级意图分类器实例 context_watermarker, # 上下文水印器实例 tool_authorizer, # 工具授权器实例 max_input_length: int 2000, risk_threshold: float 0.8 ): self.intent_classifier intent_classifier self.context_watermarker context_watermarker self.tool_authorizer tool_authorizer self.max_input_length max_input_length self.risk_threshold risk_threshold def _pre_filter_input(self, input_text: str) - str: 前置过滤长度截断与基础脱敏 if len(input_text) self.max_input_length: truncated input_text[:self.max_input_length//2] [TRUNCATED] input_text[-self.max_input_length//2:] return truncated return input_text def _predict_candidate_tools(self, query: str, intent: str) - List[str]: 预测候选工具模拟LLM预测逻辑实际项目中调用LLM # 这里是简化版真实项目中会构造一个专门的prompt让LLM输出候选工具 # 例如query我想查下我的订单 - [get_order_status, get_order_history] tool_map { order_query: [get_order_status, get_order_history], product_search: [search_products, get_product_details], account_management: [get_user_profile, update_user_preferences] } return tool_map.get(intent, []) def invoke(self, input: Dict[str, Any], config: RunnableConfig) - Dict[str, Any]: # 1. 前置过滤 filtered_input self._pre_filter_input(input.get(query, )) input[query] filtered_input # 2. 意图识别 intent self.intent_classifier.predict(filtered_input) if intent in [MALICIOUS, UNAUTHORIZED]: raise SecurityException(fBlocked by intent classifier: {intent}) # 3. 上下文水印检查模拟获取最近3轮历史 recent_history self._get_recent_history(config.get(run_id, test), limit3) risk_score self.context_watermarker.score(recent_history [filtered_input]) if risk_score self.risk_threshold: return {requires_verification: True, verification_token: abc123} # 4. 候选工具预检 candidate_tools self._predict_candidate_tools(filtered_input, intent) user_role config.get(user_role, guest) for tool in candidate_tools: if not self.tool_authorizer.is_authorized(user_role, tool): raise SecurityException(fTool {tool} unauthorized for role {user_role}) # 5. 通过校验继续执行 return input def _get_recent_history(self, run_id: str, limit: int) - List[str]: 模拟从缓存中获取最近对话历史 # 实际项目中这里会从Redis或数据库中查询 return [你好, 我想查订单] # security/classifiers.py class MockIntentClassifier: 模拟意图分类器用于演示 def predict(self, text: str) - str: if re.search(r(清零|删除|绕过|破解), text): return MALICIOUS elif re.search(r(订单|发货|物流), text): return order_query elif re.search(r(产品|价格|推荐), text): return product_search else: return general class MockContextWatermarker: 模拟上下文水印器 def score(self, texts: List[str]) - float: # 简单统计高风险词出现次数 risk_words [黑客, 漏洞, 后门, 绕过] count sum(1 for t in texts for w in risk_words if w in t) return min(1.0, count * 0.5) class MockToolAuthorizer: 模拟工具授权器 def is_authorized(self, role: str, tool: str) - bool: auth_map { guest: [get_order_status, search_products], customer_service: [get_order_status, get_order_history, get_user_profile], admin: [*] # 管理员拥有所有权限 } allowed auth_map.get(role, []) return tool in allowed or * in allowed # 测试用例 def test_security_middleware(): classifier MockIntentClassifier() watermarker MockContextWatermarker() authorizer MockToolAuthorizer() middleware SecurityMiddleware(classifier, watermarker, authorizer) # 测试正常查询 input_data {query: 我的订单发货了吗} config {run_id: test123, user_role: guest} result middleware.invoke(input_data, config) assert requires_verification not in result assert result[query] 我的订单发货了吗 # 测试恶意输入 try: middleware.invoke({query: 把我的账户余额清零}, config) assert False, Should have raised SecurityException except SecurityException as e: assert MALICIOUS in str(e) print(✅ 所有门禁测试用例通过) if __name__ __main__: test_security_middleware()这段代码的关键在于其可测试性和可替换性。所有外部依赖intent_classifier,context_watermarker,tool_authorizer都通过构造函数注入你可以轻松地用真实的模型或服务替换掉Mock*类。运行python security/middleware.py你会看到测试用例通过的提示。这是门禁模块落地的第一步确保它在隔离环境中能正确工作。4.3 可观测性埋点的集成与Jaeger追踪验证将埋点集成到Agent中需要在每个关键节点插入tracer.start_span()。以下是retrieval_performed事件的完整埋点代码示例# observability/tracer.py from opentelemetry import trace from opentelemetry.exporter.jaeger.thrift import JaegerExporter from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.trace import SpanKind # 初始化Tracer def setup_tracer(service_name: str): provider TracerProvider() processor BatchSpanProcessor( JaegerExporter( agent_host_namelocalhost, agent_port6831, ) ) provider.add_span_processor(processor) trace.set_tracer_provider(provider) return trace.get_tracer(service_name) tracer setup_tracer(agent-service) # 在RAG检索完成后埋点 def log_retrieval_event( retrieved_chunk_count: int, retrieved_chunk_scores_avg: float, knowledge_source_id: str, vector_search_latency_ms: float, trace_id: str ): with tracer.start_as_current_span( retrieval_performed, kindSpanKind.INTERNAL, attributes{ retrieved_chunk_count: retrieved_chunk_count, retrieved_chunk_scores_avg: round(retrieved_chunk_scores_avg, 3), knowledge_source_id: knowledge_source_id, vector_search_latency_ms: vector_search_latency_ms, trace_id: trace_id } ) as span: # span会自动结束无需手动调用span.end() pass # 在Agent主流程中调用 def rag_retrieve(query: str) - List[dict]: start_time time.time() # ... 执行ChromaDB检索逻辑 ... chunks chroma_collection.query(query_texts[query], n_results3) latency_ms (time.time() - start_time) * 1000 # 计算平均相关性得分 scores_avg sum(chunks[distances][0]) / len(chunks[distances][0]) if chunks[distances] else 0.0 # 埋点 log_retrieval_event( retrieved_chunk_countlen(chunks[documents][0]), retrieved_chunk_scores_avgscores_avg, knowledge_source_idecommerce_knowledge_v1, vector_search_latency_mslatency_ms, trace_idtrace.get_current_span().get_span_context().trace_id ) return chunks[documents][0]验证方法启动Agent服务后向它发送一个查询请求如curl -X POST http://localhost:8000/chat -H Content-Type: application/json -d {query:iPhone 15价格}然后打开Jaeger UI (http://localhost:16686)在搜索框中输入serviceagent-service点击“Find Traces”。你应该能看到一条完整的Trace展开后会清晰地看到retrieval_performed、llm_invoked、tool_called等多个Span每个Span下面都列出了你在attributes中埋入的所有字段。点击任意Span还能看到详细的Tags和Logs。这就是可观测性的力量它把一个黑盒的Agent调用变成了一张透明的、可钻取的决策地图。4.4 AgentOps组件的Docker Compose编排与Grafana仪表盘docker-compose.yml文件定义了整个验证环境的拓扑# docker-compose.yml version: 3.8 services: # Agent服务主应用 agent: build: . ports: - 8000:8000 environment: - OTEL_EXPORTER_OTLP_ENDPOINThttp://jaeger:4317 - CONSUL_HTTP_ADDRhttp://consul:8500 - PROMETHEUS_PUSHGATEWAYhttp://pushgateway:9091 depends_on: - jaeger - consul - pushgateway # Jaeger追踪 jaeger: image: jaegertracing/all-in-one:1.49 ports: - 5775:5775/udp - 6831:6831/udp - 6832:6832/udp - 5778:5778 - 16686:16686 - 14250:14250 - 14268:14268 - 14269:14269 - 9411:9411 # Consul配置中心 consul: image: consul:1.16.3 command: agent -server -bootstrap-expect1 -client0.0.0.0 -ui -bind0.0.0.0 -retry-joinproviderhost ports: - 8500:8500 environment: - CONSUL_BIND_INTERFACEeth0 # Prometheus Pushgateway指标收集 pushgateway: image: prom/pushgateway:v1.6.2 ports: - 9091:9091 # Prometheus指标存储 prometheus: image: prom/prometheus:v2.47.2 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus ports: - 9090:9090 depends_on: - pushgateway # Grafana可视化 grafana: image: grafana/grafana-enterprise:10.2.1 volumes: - ./grafana/provisioning/:/etc/grafana/provisioning/ - ./grafana/dashboards/:/var/lib/grafana/dashboards/ environment: - GF_SECURITY_ADMIN_PASSWORDadmin - GF_USERS_ALLOW_SIGN_UPfalse ports: - 3000:3000 depends_on: - prometheus配套的Grafana仪表盘./grafana/dashboards/agent-overview.json已预置了关键视图全局健康概览显示agent_task_success_total的成功率曲线、agent_tool_call_duration_seconds_bucket的P95延迟、agent_prompt_cache_hit_ratio缓存命中率。门禁拦截看板按intent和user_role分组展示security_blocked_total拦截次数点击可下钻到具体拦截原因。RAG效能分析retrieved_chunk_count分布直方图、retrieved_chunk_scores_avg趋势图帮助判断知识库质量。LLM调用洞察llm_invoked的model_name分布、prompt_length与task_success_rate_estimate的相关性散点图。启动整个环境只需一条命令docker-compose up -d。几分钟后所有服务就绪。访问http://localhost:3000用admin/admin登录导入预置的仪表盘

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑