{"id":387,"date":"2026-08-03T20:33:24","date_gmt":"2026-08-03T12:33:24","guid":{"rendered":"https:\/\/flycloud.io\/?p=387"},"modified":"2026-10-07T20:36:33","modified_gmt":"2026-10-07T12:36:33","slug":"%e4%bc%81%e4%b8%9a%e7%ba%a7-ai-agent-%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7%ef%bc%9a%e7%9b%91%e6%8e%a7%e3%80%81%e8%bf%bd%e8%b8%aa%e4%b8%8e%e6%95%85%e9%9a%9c%e8%af%8a%e6%96%ad%e5%ae%9e%e8%b7%b5","status":"publish","type":"post","link":"https:\/\/flycloud.io\/en\/2026\/08\/03\/%e4%bc%81%e4%b8%9a%e7%ba%a7-ai-agent-%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7%ef%bc%9a%e7%9b%91%e6%8e%a7%e3%80%81%e8%bf%bd%e8%b8%aa%e4%b8%8e%e6%95%85%e9%9a%9c%e8%af%8a%e6%96%ad%e5%ae%9e%e8%b7%b5\/","title":{"rendered":"\u4f01\u4e1a\u7ea7 AI Agent \u53ef\u89c2\u6d4b\u6027\uff1a\u76d1\u63a7\u3001\u8ffd\u8e2a\u4e0e\u6545\u969c\u8bca\u65ad\u5b9e\u8df5"},"content":{"rendered":"<h2 class=\"wp-block-heading\" id=\"slide-0\">\u4e00\u3001\u9ed1\u76d2\u56f0\u5883\uff1aAI Agent\u4e3a\u4f55\u9700\u8981\u5168\u65b0\u7684\u53ef\u89c2\u6d4b\u6027\u8303\u5f0f<\/h2>\n\n\n\n<p>2025\u5e74\uff0cAI Agent\u4ece\u5b9e\u9a8c\u5ba4\u8d70\u5411\u89c4\u6a21\u5316\u751f\u4ea7\u843d\u5730\u3002\u4ece\u5f00\u53d1\u8005\u65e5\u5e38\u4f7f\u7528\u7684\u4ee3\u7801\u52a9\u624b\u5230\u4f01\u4e1a\u670d\u52a1\u573a\u666f\u4e0b\u7684\u667a\u80fd\u5ba2\u670d\uff0c\u518d\u5230\u590d\u6742\u5ea6\u6301\u7eed\u5347\u7ea7\u7684\u591a\u667a\u80fd\u4f53\u534f\u540c\u7cfb\u7edf\uff0cAI Agent\u6b63\u5728\u4ee5\u524d\u6240\u672a\u6709\u7684\u901f\u5ea6\u6e17\u900f\u4f01\u4e1a\u6838\u5fc3\u4e1a\u52a1\u3002<\/p>\n\n\n\n<p>\u7136\u800c\uff0c\u4e0e\u4f20\u7edf\u7684\u786e\u5b9a\u6027\u8f6f\u4ef6\u4e0d\u540c\uff0cAI Agent\u7684\u672c\u8d28\u662f\u975e\u786e\u5b9a\u6027\u7684\u3002\u4e00\u4e2aAI Agent\u901a\u8fc7\u91cd\u590d\u7684\u51b3\u7b56\u6b65\u9aa4\u89e3\u51b3\u95ee\u9898\uff0c\u800c\u975e\u5355\u6b21\u54cd\u5e94\u2014\u2014\u5728\u6bcf\u4e00\u6b65\u4e2d\uff0c\u5b83\u53ef\u4ee5\u9009\u62e9\u76f4\u63a5\u4ece\u5185\u90e8\u6a21\u578b\u77e5\u8bc6\u56de\u7b54\uff0c\u4e5f\u53ef\u4ee5\u59d4\u6258\u7ed9\u5916\u90e8\u5de5\u5177\uff0c\u89c2\u5bdf\u7ed3\u679c\u540e\u7ee7\u7eed\u3002\u8fd9\u79cd\u52a8\u6001\u751f\u6210\u7684\u6267\u884c\u8def\u5f84\uff0c\u4f7f\u5f97\u6bcf\u4e00\u8f6e\u6267\u884c\u90fd\u53ef\u80fd\u4e0d\u540c\u3002<\/p>\n\n\n\n<p>\u4f20\u7edf\u76d1\u63a7\u5de5\u5177\u9762\u4e34\u4e00\u4e2a\u6839\u672c\u6027\u7684<strong>\u8bed\u4e49\u9e3f\u6c9f<\/strong>\uff08semantic gap\uff09\uff1a\u73b0\u6709\u5de5\u5177\u8981\u4e48\u89c2\u5bdfAgent\u7684\u9ad8\u5c42\u610f\u56fe\uff08\u901a\u8fc7LLM\u63d0\u793a\u8bcd\uff09\uff0c\u8981\u4e48\u89c2\u5bdf\u5176\u5e95\u5c42\u7cfb\u7edf\u52a8\u4f5c\uff08\u5982\u7cfb\u7edf\u8c03\u7528\uff09\uff0c\u4f46<strong>\u65e0\u6cd5\u5c06\u8fd9\u4e24\u4e2a\u89c6\u89d2\u5173\u8054\u8d77\u6765<\/strong>\u3002\u8fd9\u79cd\u76f2\u76ee\u6027\u4f7f\u5f97\u533a\u5206\u826f\u6027\u64cd\u4f5c\u3001\u6076\u610f\u653b\u51fb\u548c\u4ee3\u4ef7\u9ad8\u6602\u7684\u6545\u969c\u53d8\u5f97\u6781\u5176\u56f0\u96be\u3002<\/p>\n\n\n\n<p>\u6b63\u56e0\u5982\u6b64\uff0c\u53ef\u89c2\u6d4b\u6027\u5fc5\u987b\u4ece\u4e00\u5f00\u59cb\u5c31\u6210\u4e3aAI Agent\u7cfb\u7edf\u7684\u57fa\u7840\u8bbe\u65bd\uff0c\u800c\u975e\u4e8b\u540e\u8865\u6551\u3002IBM\u5728\u5176watsonx.governance\u4e2d\u5f15\u5165\u7684\u667a\u80fd\u4f53\u76d1\u63a7\u529f\u80fd\uff0c\u6b63\u662f\u4e3a\u4e86\u89e3\u51b3\u4f01\u4e1a\u63d0\u51fa\u7684\u4e24\u4e2a\u6838\u5fc3\u95ee\u9898\uff1a\u201c\u6211\u80fd\u7cbe\u786e\u67e5\u770b\u6211\u7684AI\u667a\u80fd\u4f53\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u7684\u5b9e\u9645\u884c\u4e3a\u5417\uff1f\u201d\u201c\u6211\u80fd\u5426\u83b7\u5f97\u5173\u4e8eAI\u6cbb\u7406\u4e0eAI\u5b89\u5168\u72b6\u51b5\u7684\u7edf\u4e00\u89c6\u56fe\uff1f\u201d<\/p>\n\n\n\n<p>AgentOps\u4f5c\u4e3a\u4e00\u79cdDevOps\/MLOps\u5f0f\u7684\u7aef\u5230\u7aef\u5e73\u53f0\u5e94\u8fd0\u800c\u751f\uff0c\u6db5\u76d6\u667a\u80fd\u4f53\u7cfb\u7edf\u7684\u5f00\u53d1\u3001\u8bc4\u4f30\u3001\u6d4b\u8bd5\u3001\u90e8\u7f72\u548c\u751f\u4ea7\u8fd0\u7ef4\u7684\u5168\u751f\u547d\u5468\u671f\u3002\u672c\u6587\u5c06\u4ece\u8ffd\u8e2a\uff08Tracing\uff09\u3001\u65e5\u5fd7\uff08Logging\uff09\u3001\u8bc4\u4f30\uff08Evaluation\uff09\u548c\u6545\u969c\u6062\u590d\uff08Recovery\uff09\u56db\u4e2a\u7ef4\u5ea6\uff0c\u7cfb\u7edf\u9610\u8ff0\u4f01\u4e1a\u7ea7AI Agent\u53ef\u89c2\u6d4b\u6027\u4f53\u7cfb\u7684\u8bbe\u8ba1\u4e0e\u5b9e\u8df5\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-1\">\u4e8c\u3001\u8ffd\u8e2a\uff08Tracing\uff09\uff1a\u8ba9Agent\u7684\u6267\u884c\u8def\u5f84\u5b8c\u5168\u53ef\u89c1<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-2\">2.1 Trace\u4e0eSpan\u6a21\u578b<\/h3>\n\n\n\n<p>Agent\u8c03\u8bd5\u7684\u672c\u8d28\u662f\u201c\u8ba9\u4e0d\u53ef\u89c1\u53d8\u5f97\u53ef\u89c1\u201d\u3002OpenTelemetry\u63d0\u4f9b\u4e86\u6838\u5fc3\u7684Trace\u548cSpan\u6a21\u578b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Trace<\/strong> = \u4e00\u6b21\u4efb\u52a1\u6267\u884c\u7684\u5b8c\u6574\u6545\u4e8b\uff08\u4ece\u5f00\u59cb\u5230\u7ed3\u675f\uff09<\/li>\n\n\n\n<li><strong>Span<\/strong> = \u6545\u4e8b\u4e2d\u7684\u6bcf\u4e2a\u7ae0\u8282\uff08\u4e00\u6b65\u64cd\u4f5c\uff09<\/li>\n<\/ul>\n\n\n\n<p>\u4e00\u4e2aTrace\u5305\u542b\u591a\u4e2aSpan\uff0c\u5f62\u6210\u4e00\u68f5\u6267\u884c\u6811\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nTrace: \"\u5206\u6790\u4ee3\u7801\u8d28\u91cf\" (\u603b\u8017\u65f6 5\u520632\u79d2)\n\u251c\u2500\u2500 Span: \u8bfb\u53d6 README.md (\u8017\u65f6 0.2\u79d2)\n\u251c\u2500\u2500 Span: \u904d\u5386 src\/ \u76ee\u5f55 (\u8017\u65f6 0.5\u79d2)\n\u2502   \u251c\u2500\u2500 Span: \u5206\u6790 main.py (\u8017\u65f6 1.2\u79d2)\n\u2502   \u251c\u2500\u2500 Span: \u5206\u6790 utils.py (\u8017\u65f6 0.8\u79d2)\n\u2502   \u2514\u2500\u2500 Span: \u5206\u6790 config.py (\u8017\u65f6 0.3\u79d2)\n\u251c\u2500\u2500 Span: \u8c03\u7528 LLM \u5206\u6790\u4ee3\u7801\u7ed3\u6784 (\u8017\u65f6 45\u79d2, 3200 tokens)\n\u251c\u2500\u2500 Span: \u8c03\u7528 LLM \u751f\u6210\u62a5\u544a (\u8017\u65f6 38\u79d2, 2800 tokens)\n\u2514\u2500\u2500 Span: \u5de5\u5177\u8c03\u7528 git log (\u8017\u65f6 2.1\u79d2)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-3\">2.2 \u57fa\u4e8eOpenTelemetry\u7684\u6807\u51c6\u5316\u8ffd\u8e2a<\/h3>\n\n\n\n<p>OpenTelemetry\u5df2\u6210\u4e3aAI Agent\u53ef\u89c2\u6d4b\u6027\u7684\u4e8b\u5b9e\u6807\u51c6\u3002AWS Bedrock AgentCore Observability\u3001\u963f\u91cc\u4e91LoongSuite\u7b49\u4e3b\u6d41\u65b9\u6848\u5747\u57fa\u4e8eOpenTelemetry\u6784\u5efa\u3002<\/p>\n\n\n\n<p>OpenTelemetry GenAI\u8bed\u4e49\u89c4\u8303\u5b9a\u4e49\u4e86\u8ffd\u8e2a\u667a\u80fd\u4f53\u7cfb\u7edf\u6240\u9700\u7684\u6807\u51c6\u5c5e\u6027\uff0c\u5305\u62ec\u4efb\u52a1\uff08task\uff09\u3001\u52a8\u4f5c\uff08action\uff09\u3001\u667a\u80fd\u4f53\uff08agent\uff09\u3001\u56e2\u961f\uff08team\uff09\u3001\u5de5\u4ef6\uff08artifact\uff09\u548c\u8bb0\u5fc6\uff08memory\uff09\u3002Datadog\u7b49\u5382\u5546\u5df2\u539f\u751f\u652f\u6301OTel GenAI\u8bed\u4e49\u89c4\u8303\uff0c\u5b9e\u73b0\u5bf9\u63d0\u793a\u8bcd\u3001\u6a21\u578b\u54cd\u5e94\u3001Token\u7528\u91cf\u3001\u5de5\u5177\/\u667a\u80fd\u4f53\u8c03\u7528\u548c\u63d0\u4f9b\u5546\u5143\u6570\u636e\u7684\u6807\u51c6\u5316\u8ffd\u8e2a\u3002<\/p>\n\n\n\n<p>\u4ee5\u4e0b\u662f\u4e00\u4e2a\u57fa\u4e8eOpenTelemetry\u7684Agent\u8ffd\u8e2a instrumentation\u5b9e\u73b0\u793a\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# agent_tracing.py - \u57fa\u4e8eOpenTelemetry\u7684AI Agent\u8ffd\u8e2a\u88c5\u9970\u5668\n\nfrom opentelemetry import trace\nfrom opentelemetry.sdk.trace import TracerProvider\nfrom opentelemetry.sdk.trace.export import BatchSpanProcessor\nfrom opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter\nfrom opentelemetry.semconv.gen_ai import GenAIAttributes\nfrom functools import wraps\nimport json\nfrom typing import Dict, Any, Optional\n\n\n# \u521d\u59cb\u5316TracerProvider\n\ntracer_provider = TracerProvider()\nspan_processor = BatchSpanProcessor(OTLPSpanExporter(endpoint=\"http:\/\/jaeger:4317\"))\ntracer_provider.add_span_processor(span_processor)\ntrace.set_tracer_provider(tracer_provider)\n\ntracer = trace.get_tracer(__name__)\n\ndef agent_trace(agent_name: str, operation: str):\n    \"\"\"\u88c5\u9970\u5668\uff1a\u4e3aAgent\u7684\u6bcf\u4e2a\u6b65\u9aa4\u81ea\u52a8\u751f\u6210\u8ffd\u8e2aSpan\"\"\"\n    def decorator(func):\n        @wraps(func)\n        def wrapper(*args, **kwargs):\n            # \u4ece\u4e0a\u4e0b\u6587\u4e2d\u63d0\u53d6trace_id\u7528\u4e8e\u5173\u8054\n            ctx = trace.get_current_span().get_span_context() if trace.get_current_span() else None\n\n            with tracer.start_as_current_span(\n                f\"{agent_name}.{operation}\",\n                attributes={\n                    \"gen_ai.agent.name\": agent_name,\n                    \"gen_ai.agent.operation\": operation,\n                    \"gen_ai.agent.version\": \"1.0.0\",\n                    # OpenTelemetry GenAI\u8bed\u4e49\u89c4\u8303\u5c5e\u6027\n                    \"gen_ai.conversation.id\": kwargs.get(\"conversation_id\", \"\"),\n                    \"gen_ai.request.model\": kwargs.get(\"model\", \"unknown\"),\n                }\n            ) as span:\n                try:\n                    result = func(*args, **kwargs)\n\n                    # \u8bb0\u5f55Token\u7528\u91cf\uff08OpenTelemetry GenAI\u89c4\u8303\uff09\n                    if isinstance(result, dict) and \"usage\" in result:\n                        span.set_attribute(\"gen_ai.usage.input_tokens\", result&#91;\"usage\"].get(\"prompt_tokens\", 0))\n                        span.set_attribute(\"gen_ai.usage.output_tokens\", result&#91;\"usage\"].get(\"completion_tokens\", 0))\n                        span.set_attribute(\"gen_ai.usage.total_tokens\", result&#91;\"usage\"].get(\"total_tokens\", 0))\n\n                    span.set_status(trace.StatusCode.OK)\n                    return result\n\n                except Exception as e:\n                    span.record_exception(e)\n                    span.set_status(trace.StatusCode.ERROR, str(e))\n                    raise\n        return wrapper\n    return decorator\n\n\n\n# \u4f7f\u7528\u793a\u4f8b\uff1a\u4e3aAgent\u7684LLM\u8c03\u7528\u6b65\u9aa4\u6dfb\u52a0\u8ffd\u8e2a\n\nclass ResearchAgent:\n    def __init__(self, model: str = \"gpt-4\"):\n        self.model = model\n        self.tools = &#91;]\n\n    @agent_trace(agent_name=\"ResearchAgent\", operation=\"llm_call\")\n    def call_llm(self, prompt: str, conversation_id: Optional&#91;str] = None, **kwargs):\n        \"\"\"\u8c03\u7528LLM\uff0c\u81ea\u52a8\u751f\u6210\u8ffd\u8e2aSpan\"\"\"\n        # \u5b9e\u9645\u7684LLM\u8c03\u7528\u903b\u8f91\n        response = self._execute_llm_call(prompt)\n\n        # \u8fd4\u56de\u5305\u542bToken\u7528\u91cf\u7684\u7ed3\u679c\n        return {\n            \"content\": response&#91;\"content\"],\n            \"usage\": response.get(\"usage\", {}),\n            \"model\": self.model\n        }\n\n    @agent_trace(agent_name=\"ResearchAgent\", operation=\"tool_invoke\")\n    def invoke_tool(self, tool_name: str, tool_args: Dict&#91;str, Any], conversation_id: Optional&#91;str] = None):\n        \"\"\"\u8c03\u7528\u5de5\u5177\uff0c\u81ea\u52a8\u751f\u6210\u8ffd\u8e2aSpan\"\"\"\n        # \u5de5\u5177\u8c03\u7528\u903b\u8f91\n        result = self._execute_tool(tool_name, tool_args)\n        return result\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-4\">2.3 \u65e0\u4fb5\u5165\u8ffd\u8e2a\uff1aeBPF\u6280\u672f\u7684\u65b0\u8def\u5f84<\/h3>\n\n\n\n<p>\u4f20\u7edf\u7684SDK\u63d2\u6869\u65b9\u5f0f\u8981\u6c42\u4fee\u6539\u5e94\u7528\u4ee3\u7801\uff0c\u8fd9\u5728\u5feb\u901f\u8fed\u4ee3\u7684Agent\u5f00\u53d1\u4e2d\u53ef\u80fd\u6210\u4e3a\u74f6\u9888\u3002<strong>\u8fb9\u754c\u8ffd\u8e2a<\/strong>\uff08boundary tracing\uff09\u63d0\u4f9b\u4e86\u4e00\u79cd\u65b0\u7684\u601d\u8def\u2014\u2014\u5728\u7a33\u5b9a\u7684\u7cfb\u7edf\u63a5\u53e3\u5904\u4ece\u5916\u90e8\u76d1\u63a7Agent\uff0c\u65e0\u9700\u4fee\u6539\u5e94\u7528\u4ee3\u7801\u3002<\/p>\n\n\n\n<p>AgentSight\u6846\u67b6\u5229\u7528eBPF\u6280\u672f\uff0c\u5728\u65e0\u9700\u63d2\u6869\u7684\u60c5\u51b5\u4e0b\u62e6\u622aTLS\u52a0\u5bc6\u7684LLM\u6d41\u91cf\u4ee5\u63d0\u53d6\u8bed\u4e49\u610f\u56fe\uff0c\u540c\u65f6\u76d1\u63a7\u5185\u6838\u4e8b\u4ef6\u4ee5\u89c2\u5bdf\u7cfb\u7edf\u7ea7\u5f71\u54cd\u3002\u8fd9\u79cd\u6280\u672f\u5177\u6709\u4ee5\u4e0b\u4f18\u52bf\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u6846\u67b6\u65e0\u5173<\/strong>\uff1a\u9002\u7528\u4e8e\u4efb\u4f55Agent\u6846\u67b6\uff08LangChain\u3001AutoGPT\u3001Claude Code\u7b49\uff09<\/li>\n\n\n\n<li><strong>\u5bf9API\u53d8\u5316\u5f39\u6027\u9ad8<\/strong>\uff1a\u4e0d\u4f9d\u8d56\u4e8e\u7279\u5b9aSDK\u7248\u672c<\/li>\n\n\n\n<li><strong>\u6027\u80fd\u5f00\u9500\u4f4e<\/strong>\uff1a&lt;3%\u7684\u6027\u80fd\u635f\u8017<\/li>\n\n\n\n<li><strong>\u53ef\u68c0\u6d4b<\/strong>\uff1a\u63d0\u793a\u6ce8\u5165\u653b\u51fb\u3001\u8d44\u6e90\u6d6a\u8d39\u7684\u63a8\u7406\u5faa\u73af\u3001\u591aAgent\u7cfb\u7edf\u4e2d\u7684\u9690\u85cf\u534f\u8c03\u74f6\u9888<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# AgentSight eBPF\u8ffd\u8e2a\u914d\u7f6e\u793a\u4f8b\uff08\u6982\u5ff5\u6027\uff09\n\n\n# \u4f7f\u7528eBPF\u7a0b\u5e8f\u6302\u8f7d\u5230\u7cfb\u7edf\u8c03\u7528\u548cTLS\u5e93\u51fd\u6570\u4e0a\n\n# \u4ee5\u4e0b\u4e3aeBPF C\u4ee3\u7801\u7247\u6bb5\u793a\u610f\uff08\u5b9e\u9645\u90e8\u7f72\u9700\u7f16\u8bd1\u4e3aBPF\u5b57\u8282\u7801\uff09\n\n\"\"\"\nSEC(\"uprobe\/\/usr\/lib\/x86_64-linux-gnu\/libssl.so.3\/SSL_write\")\nint trace_ssl_write(struct pt_regs *ctx) {\n    \/\/ \u62e6\u622aLLM\u8bf7\u6c42\u7684TLS\u52a0\u5bc6\u6d41\u91cf\n    void *ssl = (void *)PT_REGS_PARM1(ctx);\n    void *buf = (void *)PT_REGS_PARM2(ctx);\n    int len = (int)PT_REGS_PARM3(ctx);\n\n    \/\/ \u63d0\u53d6\u8bf7\u6c42\u5185\u5bb9\uff08\u5728TLS\u52a0\u5bc6\u524d\u6355\u83b7\uff09\n    char payload&#91;4096];\n    bpf_probe_read_user(payload, sizeof(payload), buf);\n\n    \/\/ \u5c06payload\u53d1\u9001\u5230\u7528\u6237\u6001\u5904\u7406\u7a0b\u5e8f\u8fdb\u884c\u8bed\u4e49\u5206\u6790\n    bpf_perf_event_output(ctx, &amp;events, BPF_F_CURRENT_CPU, payload, len);\n    return 0;\n}\n\nSEC(\"kprobe\/do_sys_openat2\")\nint trace_file_open(struct pt_regs *ctx) {\n    \/\/ \u76d1\u63a7Agent\u7684\u6587\u4ef6\u7cfb\u7edf\u64cd\u4f5c\uff08\u7cfb\u7edf\u8c03\u7528\u5c42\u9762\uff09\n    \/\/ \u4e0eTLS\u5c42\u7684\u4e8b\u4ef6\u5173\u8054\uff0c\u5efa\u7acb\u201c\u610f\u56fe-\u52a8\u4f5c\u201d\u6620\u5c04\n    return 0;\n}\n\"\"\"\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-5\">\u4e09\u3001\u65e5\u5fd7\uff08Logging\uff09\uff1a\u7ed3\u6784\u5316\u3001\u53ef\u68c0\u7d22\u7684\u6267\u884c\u8bb0\u5f55<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-6\">3.1 \u4e09\u5c42\u65e5\u5fd7\u6a21\u578b<\/h3>\n\n\n\n<p>AgentTrace\u6846\u67b6\u63d0\u51fa\u4e86\u4e00\u4e2a\u5173\u952e\u6d1e\u5bdf\uff1a\u4f20\u7edf\u7684\u65e5\u5fd7\u7cfb\u7edf\u4e0d\u8db3\u4ee5\u6ee1\u8db3Agent\u7cfb\u7edf\u7684\u53ef\u89c2\u6d4b\u6027\u9700\u6c42\u3002\u5b83\u5b9a\u4e49\u4e86\u4e09\u5c42\u7ed3\u6784\u5316\u65e5\u5fd7\u8868\u9762\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5c42\u7ea7<\/th><th>\u5185\u5bb9<\/th><th>\u7528\u9014<\/th><\/tr><\/thead><tbody><tr><td><strong>\u64cd\u4f5c\u5c42\uff08Operational\uff09<\/strong><\/td><td>\u7cfb\u7edf\u8c03\u7528\u3001API\u8bf7\u6c42\u3001\u5de5\u5177\u6267\u884c\u3001\u7f51\u7edcI\/O<\/td><td>\u6027\u80fd\u76d1\u63a7\u3001\u8d44\u6e90\u8ffd\u8e2a\u3001\u6545\u969c\u5b9a\u4f4d<\/td><\/tr><tr><td><strong>\u8ba4\u77e5\u5c42\uff08Cognitive\uff09<\/strong><\/td><td>LLM\u63a8\u7406\u6b65\u9aa4\u3001\u601d\u7ef4\u94fe\uff08CoT\uff09\u3001\u51b3\u7b56\u4f9d\u636e<\/td><td>\u7406\u89e3Agent\u884c\u4e3a\u3001\u68c0\u6d4b\u5bf9\u9f50\u504f\u5dee<\/td><\/tr><tr><td><strong>\u4e0a\u4e0b\u6587\u5c42\uff08Contextual\uff09<\/strong><\/td><td>\u4f1a\u8bdd\u72b6\u6001\u3001\u8bb0\u5fc6\u5185\u5bb9\u3001\u73af\u5883\u53d8\u91cf\u3001\u4efb\u52a1\u76ee\u6807<\/td><td>\u72b6\u6001\u6062\u590d\u3001\u884c\u4e3a\u590d\u73b0\u3001\u5ba1\u8ba1\u6eaf\u6e90<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>AgentTrace\u5f3a\u8c03\u6301\u7eed\u7684\u3001\u53ef\u5185\u7701\u7684\u8ffd\u8e2a\u6355\u83b7\uff0c\u4e0d\u4ec5\u670d\u52a1\u4e8e\u8c03\u8bd5\u6216\u57fa\u51c6\u6d4b\u8bd5\uff0c\u66f4\u4f5c\u4e3aAgent\u5b89\u5168\u3001\u8d23\u4efb\u5f52\u5c5e\u548c\u5b9e\u65f6\u76d1\u63a7\u7684\u57fa\u7840\u5c42\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-7\">3.2 \u7ed3\u6784\u5316\u65e5\u5fd7\u5b9e\u73b0<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# agent_logging.py - \u7ed3\u6784\u5316\u65e5\u5fd7\u7cfb\u7edf\n\nimport structlog\nimport json\nfrom datetime import datetime\nfrom typing import Any, Dict, Optional\nimport uuid\n\n\n# \u914d\u7f6estructlog\n\nstructlog.configure(\n    processors=&#91;\n        structlog.processors.TimeStamper(fmt=\"iso\"),\n        structlog.processors.JSONRenderer()\n    ]\n)\nlogger = structlog.get_logger()\n\nclass AgentLogger:\n    \"\"\"Agent\u4e09\u5c42\u7ed3\u6784\u5316\u65e5\u5fd7\u8bb0\u5f55\u5668\"\"\"\n\n    def __init__(self, agent_name: str, session_id: Optional&#91;str] = None):\n        self.agent_name = agent_name\n        self.session_id = session_id or str(uuid.uuid4())\n        self.trace_id = None\n\n    def _log(self, level: str, layer: str, event: str, **kwargs):\n        \"\"\"\u6838\u5fc3\u65e5\u5fd7\u8bb0\u5f55\u65b9\u6cd5\"\"\"\n        log_entry = {\n            \"timestamp\": datetime.utcnow().isoformat(),\n            \"agent\": self.agent_name,\n            \"session_id\": self.session_id,\n            \"trace_id\": self.trace_id,\n            \"layer\": layer,  # \"operational\" | \"cognitive\" | \"contextual\"\n            \"event\": event,\n            \"level\": level,\n            **kwargs\n        }\n        # \u8f93\u51faJSON\u683c\u5f0f\u65e5\u5fd7\uff0c\u4fbf\u4e8e\u68c0\u7d22\u548c\u56de\u653e\n        print(json.dumps(log_entry))\n        return log_entry\n\n    # ---- \u64cd\u4f5c\u5c42\u65e5\u5fd7 ----\n    def log_tool_call(self, tool_name: str, args: Dict, result: Any, duration_ms: float):\n        return self._log(\n            \"INFO\", \"operational\", \"tool_execution\",\n            tool_name=tool_name,\n            args=args,\n            result_preview=str(result)&#91;:500],\n            duration_ms=duration_ms\n        )\n\n    def log_llm_call(self, model: str, prompt: str, response: str, \n                     prompt_tokens: int, completion_tokens: int, latency_ms: float):\n        return self._log(\n            \"INFO\", \"operational\", \"llm_inference\",\n            model=model,\n            prompt_preview=prompt&#91;:200],\n            response_preview=response&#91;:200],\n            prompt_tokens=prompt_tokens,\n            completion_tokens=completion_tokens,\n            total_tokens=prompt_tokens + completion_tokens,\n            latency_ms=latency_ms,\n            cost_estimate=self._estimate_cost(model, prompt_tokens, completion_tokens)\n        )\n\n    # ---- \u8ba4\u77e5\u5c42\u65e5\u5fd7 ----\n    def log_reasoning_step(self, step_number: int, thought: str, action: str, action_input: str):\n        return self._log(\n            \"DEBUG\", \"cognitive\", \"reasoning_step\",\n            step_number=step_number,\n            thought=thought&#91;:500],\n            action=action,\n            action_input=action_input&#91;:200]\n        )\n\n    def log_decision(self, decision: str, alternatives: list, confidence: float):\n        return self._log(\n            \"INFO\", \"cognitive\", \"decision_made\",\n            decision=decision,\n            alternatives=alternatives,\n            confidence=confidence\n        )\n\n    # ---- \u4e0a\u4e0b\u6587\u5c42\u65e5\u5fd7 ----\n    def log_state_snapshot(self, state: Dict, checkpoint_id: str):\n        return self._log(\n            \"INFO\", \"contextual\", \"state_snapshot\",\n            checkpoint_id=checkpoint_id,\n            state=state\n        )\n\n    def log_memory_update(self, memory_type: str, key: str, value_preview: str):\n        return self._log(\n            \"DEBUG\", \"contextual\", \"memory_update\",\n            memory_type=memory_type,  # \"short_term\" | \"long_term\" | \"episodic\"\n            key=key,\n            value_preview=value_preview&#91;:200]\n        )\n\n    def set_trace_id(self, trace_id: str):\n        self.trace_id = trace_id\n\n    @staticmethod\n    def _estimate_cost(model: str, prompt_tokens: int, completion_tokens: int) -&gt; float:\n        \"\"\"\u4f30\u7b97LLM\u8c03\u7528\u6210\u672c\uff08\u793a\u4f8b\uff09\"\"\"\n        rates = {\n            \"gpt-4\": {\"prompt\": 0.03, \"completion\": 0.06},   # \u6bcf1K tokens\n            \"gpt-3.5-turbo\": {\"prompt\": 0.001, \"completion\": 0.002},\n            \"claude-3-opus\": {\"prompt\": 0.015, \"completion\": 0.075},\n        }\n        rate = rates.get(model, {\"prompt\": 0.01, \"completion\": 0.03})\n        return (prompt_tokens \/ 1000 * rate&#91;\"prompt\"]) + (completion_tokens \/ 1000 * rate&#91;\"completion\"])\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-8\">3.3 \u65e5\u5fd7\u5173\u8054\u4e0e\u68c0\u7d22<\/h3>\n\n\n\n<p>\u5728\u751f\u4ea7\u73af\u5883\u4e2d\uff0c\u65e5\u5fd7\u9700\u8981\u4e0e\u8ffd\u8e2a\uff08Trace\uff09\u548c\u6307\u6807\uff08Metrics\uff09\u5173\u8054\u3002\u901a\u8fc7\u7edf\u4e00\u7684<code>trace_id<\/code>\u3001<code>session_id<\/code>\u548c<code>span_id<\/code>\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4ece\u7528\u6237\u8bf7\u6c42\u5230\u6bcf\u4e00\u6b21LLM\u8c03\u7528\u3001\u5de5\u5177\u6267\u884c\u7684\u5b8c\u6574\u94fe\u8def\u8ffd\u6eaf\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# \u65e5\u5fd7\u4e0e\u8ffd\u8e2a\u5173\u8054\u793a\u4f8b\n\n{\n    \"timestamp\": \"2026-08-03T14:32:18.456Z\",\n    \"agent\": \"CustomerSupportAgent\",\n    \"session_id\": \"sess_abc123\",\n    \"trace_id\": \"4bf92f3577b34da6a3ce929d0e0e4736\",\n    \"span_id\": \"00f067aa0ba902b7\",\n    \"layer\": \"operational\",\n    \"event\": \"llm_inference\",\n    \"model\": \"gpt-4\",\n    \"prompt_tokens\": 245,\n    \"completion_tokens\": 187,\n    \"latency_ms\": 1234,\n    \"cost_estimate\": 0.0186\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-9\">\u56db\u3001\u8bc4\u4f30\uff08Evaluation\uff09\uff1a\u4ece\u201c\u8dd1\u8d77\u6765\u4e86\u201d\u5230\u201c\u77e5\u9053\u597d\u4e0d\u597d\u201d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-10\">4.1 \u8bc4\u4f30\u7684\u5fc5\u8981\u6027<\/h3>\n\n\n\n<p>\u5927\u591a\u6570\u56e2\u961f\u4ecd\u505c\u7559\u5728\u201c\u6563\u843d\u7684\u65e5\u5fd7\u3001\u4e34\u65f6\u7684\u8bc4\u4f30\u811a\u672c\u3001\u5bf9\u6a21\u578b\u6392\u884c\u699c\u7684\u622a\u56fe\u3001\u5bf9\u7279\u5b9aAgent\u6216\u6a21\u578b\u4e3a\u4f55\u5931\u8d25\u7684\u96f6\u7406\u89e3\u201d\u9636\u6bb5\u3002\u751f\u4ea7\u73af\u5883\u4e2d\u7684Agent\u8bc4\u4f30\u9700\u8981\u7cfb\u7edf\u5316\u7684\u65b9\u6cd5\u8bba\u3002<\/p>\n\n\n\n<p>Amazon CloudWatch\u73b0\u5df2\u652f\u6301\u901a\u8fc7AgentCore Evaluations\u5bf9AI Agent\u8fdb\u884c\u81ea\u52a8\u5316\u8d28\u91cf\u8bc4\u4f30\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u6301\u7eed\u76d1\u63a7Agent\u8d28\u91cf\uff0c\u5e76\u5728CloudWatch\u4eea\u8868\u677f\u4e2d\u67e5\u770b\u7edf\u4e00\u7684\u8d28\u91cf\u6307\u6807\u548cAgent\u9065\u6d4b\u6570\u636e\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-11\">4.2 \u591a\u7ef4\u5ea6\u8bc4\u4f30\u6307\u6807\u4f53\u7cfb<\/h3>\n\n\n\n<p>AWS\u5728\u5176Agentic AI\u57fa\u7840\u8bbe\u65bd\u5b9e\u8df5\u4e2d\uff0c\u6784\u5efa\u4e86\u5305\u542b\u4ee5\u4e0b\u7ef4\u5ea6\u7684\u8bc4\u4f30\u6307\u6807\u4f53\u7cfb\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7ef4\u5ea6<\/th><th>\u5173\u952e\u6307\u6807<\/th><th>\u6d4b\u91cf\u65b9\u5f0f<\/th><\/tr><\/thead><tbody><tr><td><strong>\u4efb\u52a1\u5b8c\u6210\u7387<\/strong><\/td><td>\u4efb\u52a1\u6210\u529f\u7387\u3001\u6b65\u9aa4\u5b8c\u6210\u7387<\/td><td>\u7aef\u5230\u7aef\u4efb\u52a1\u9a8c\u8bc1<\/td><\/tr><tr><td><strong>\u51b3\u7b56\u51c6\u786e\u6027<\/strong><\/td><td>\u5de5\u5177\u9009\u62e9\u51c6\u786e\u7387\u3001\u63a8\u7406\u6b63\u786e\u7387<\/td><td>\u4eba\u5de5\u6807\u6ce8\/LLM-as-Judge<\/td><\/tr><tr><td><strong>\u6548\u7387<\/strong><\/td><td>\u6267\u884c\u6b65\u6570\u3001Token\u6d88\u8017\u3001\u7aef\u5230\u7aef\u5ef6\u8fdf<\/td><td>\u8ffd\u8e2a\u6570\u636e\u5206\u6790<\/td><\/tr><tr><td><strong>\u5b89\u5168\u6027<\/strong><\/td><td>\u8fdd\u89c4\u64cd\u4f5c\u7387\u3001\u63d0\u793a\u6ce8\u5165\u68c0\u6d4b\u7387<\/td><td>\u7b56\u7565\u5f15\u64ce\u5ba1\u8ba1<\/td><\/tr><tr><td><strong>\u6210\u672c<\/strong><\/td><td>\u6bcf\u4efb\u52a1\u6210\u672c\u3001\u6a21\u578b\u8c03\u7528\u6210\u672c<\/td><td>Token\u7528\u91cf\u00d7\u5355\u4ef7<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u4e3b\u6d41\u8bc4\u4f30\u6846\u67b6\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AgentBench<\/strong>\uff1a\u591a\u7ef4\u5ea6Agent\u80fd\u529b\u57fa\u51c6\u6d4b\u8bd5<\/li>\n\n\n\n<li><strong>AgentBoard<\/strong>\uff1a\u53ef\u89c6\u5316Agent\u8bc4\u4f30\u5e73\u53f0<\/li>\n\n\n\n<li><strong>\u03c4-bench<\/strong>\uff1a\u9762\u5411\u5de5\u5177\u4f7f\u7528\u573a\u666f\u7684\u8bc4\u4f30\u6846\u67b6<\/li>\n\n\n\n<li><strong>MCPEval<\/strong>\uff1a\u57fa\u4e8e\u6a21\u578b\u4e0a\u4e0b\u6587\u534f\u8bae\uff08MCP\uff09\u7684\u81ea\u52a8\u5316\u7aef\u5230\u7aef\u8bc4\u4f30\u6846\u67b6<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-12\">4.3 \u81ea\u52a8\u5316\u8bc4\u4f30\u6d41\u6c34\u7ebf<\/h3>\n\n\n\n<p>TraceVerse\u751f\u6001\u7cfb\u7edf\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b8c\u6574\u7684Agent\u8bc4\u4f30\u6d41\u6c34\u7ebf\u53c2\u8003\u5b9e\u73b0\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                    TraceVerse \u8bc4\u4f30\u6d41\u6c34\u7ebf                    \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502  TraceVerde          \u2192  \u96f6\u4ee3\u7801OTel\u63d2\u6869\uff0c\u6355\u83b7\u6240\u6709LLM\u8c03\u7528\u3001   \u2502\n\u2502  (genai_otel_instrument)  \u5de5\u5177\u8c03\u7528\u3001\u5411\u91cf\u68c0\u7d22                \u2502\n\u2502                          \u2193                                 \u2502\n\u2502  SMOLTRACE            \u2192  \u8fd0\u884cAgent\u8bc4\u4f30\uff0c\u751f\u62104\u7c7bHF\u6570\u636e\u96c6     \u2502\n\u2502  (Evaluation Engine)      (\u6392\u884c\u699c\/\u7ed3\u679c\/\u8ffd\u8e2a\/\u6307\u6807)           \u2502\n\u2502                          \u2193                                 \u2502\n\u2502  TraceMind MCP Server \u2192  AI\u9a71\u52a8\u7684\u5206\u6790\uff0811\u4e2a\u5de5\u5177+3\u4e2a\u8d44\u6e90\uff09   \u2502\n\u2502                          \u2193                                 \u2502\n\u2502  TraceMind-AI         \u2192  Gradio\u4ea4\u4e92\u754c\u9762\uff0c\u81ea\u7136\u8bed\u8a00\u67e5\u8be2       \u2502\n\u2502  (Gradio App)             \"\u4e3a\u4ec0\u4e48\u8fd9\u4e2a\u4efb\u52a1\u5931\u8d25\u4e86\uff1f\"          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# agent_evaluation.py - Agent\u8bc4\u4f30\u6846\u67b6\u793a\u4f8b\n\nfrom typing import List, Dict, Any, Optional\nfrom dataclasses import dataclass, field\nimport json\nimport asyncio\n\n@dataclass\nclass EvaluationResult:\n    \"\"\"\u5355\u6b21\u8bc4\u4f30\u7ed3\u679c\"\"\"\n    task_id: str\n    success: bool\n    steps_taken: int\n    total_tokens: int\n    total_latency_ms: float\n    tool_calls: int\n    error: Optional&#91;str] = None\n    metrics: Dict&#91;str, float] = field(default_factory=dict)\n\n@dataclass\nclass EvaluationSuite:\n    \"\"\"\u8bc4\u4f30\u5957\u4ef6\"\"\"\n    name: str\n    tasks: List&#91;Dict&#91;str, Any]]\n    results: List&#91;EvaluationResult] = field(default_factory=list)\n\n    def add_result(self, result: EvaluationResult):\n        self.results.append(result)\n\n    def summary(self) -&gt; Dict&#91;str, float]:\n        \"\"\"\u751f\u6210\u8bc4\u4f30\u6458\u8981\"\"\"\n        total = len(self.results)\n        if total == 0:\n            return {}\n        successes = sum(1 for r in self.results if r.success)\n        return {\n            \"success_rate\": successes \/ total,\n            \"avg_steps\": sum(r.steps_taken for r in self.results) \/ total,\n            \"avg_tokens\": sum(r.total_tokens for r in self.results) \/ total,\n            \"avg_latency_ms\": sum(r.total_latency_ms for r in self.results) \/ total,\n            \"avg_tool_calls\": sum(r.tool_calls for r in self.results) \/ total,\n        }\n\n\nclass AgentEvaluator:\n    \"\"\"Agent\u8bc4\u4f30\u5f15\u64ce\"\"\"\n\n    def __init__(self, agent, logger):\n        self.agent = agent\n        self.logger = logger\n        self.suites: Dict&#91;str, EvaluationSuite] = {}\n\n    def create_suite(self, name: str, tasks: List&#91;Dict]) -&gt; EvaluationSuite:\n        \"\"\"\u521b\u5efa\u8bc4\u4f30\u5957\u4ef6\"\"\"\n        suite = EvaluationSuite(name=name, tasks=tasks)\n        self.suites&#91;name] = suite\n        return suite\n\n    async def run_suite(self, suite_name: str) -&gt; EvaluationSuite:\n        \"\"\"\u8fd0\u884c\u8bc4\u4f30\u5957\u4ef6\"\"\"\n        suite = self.suites.get(suite_name)\n        if not suite:\n            raise ValueError(f\"Suite {suite_name} not found\")\n\n        for task in suite.tasks:\n            self.logger.info(f\"Running eval task: {task.get('name', 'unnamed')}\")\n\n            try:\n                # \u6267\u884c\u4efb\u52a1\u5e76\u6536\u96c6\u8ffd\u8e2a\u6570\u636e\n                result = await self._execute_task(task)\n                suite.add_result(result)\n            except Exception as e:\n                self.logger.error(f\"Task failed: {e}\")\n                suite.add_result(EvaluationResult(\n                    task_id=task.get(\"id\", \"unknown\"),\n                    success=False,\n                    steps_taken=0,\n                    total_tokens=0,\n                    total_latency_ms=0,\n                    tool_calls=0,\n                    error=str(e)\n                ))\n\n        # \u8f93\u51fa\u8bc4\u4f30\u6458\u8981\n        summary = suite.summary()\n        self.logger.info(f\"Suite {suite_name} summary: {json.dumps(summary)}\")\n        return suite\n\n    async def _execute_task(self, task: Dict) -&gt; EvaluationResult:\n        \"\"\"\u6267\u884c\u5355\u4e2a\u8bc4\u4f30\u4efb\u52a1\uff08\u5e26\u8ffd\u8e2a\uff09\"\"\"\n        # \u5b9e\u9645\u5b9e\u73b0\u4e2d\u4f1a\u8c03\u7528Agent\u5e76\u6536\u96c6\u8ffd\u8e2a\u6570\u636e\n        # \u6b64\u5904\u4e3a\u793a\u610f\u7ed3\u6784\n        pass\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-13\">\u4e94\u3001\u6545\u969c\u6062\u590d\uff08Recovery\uff09\uff1a\u4ece\u201c\u5d29\u6e83\u91cd\u542f\u201d\u5230\u201c\u81ea\u6108\u95ed\u73af\u201d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-14\">5.1 Agent\u6545\u969c\u7684\u7279\u6b8a\u6027<\/h3>\n\n\n\n<p>AI Agent\u7684\u6545\u969c\u4e0e\u4f20\u7edf\u8f6f\u4ef6\u6709\u672c\u8d28\u533a\u522b\u3002\u4f20\u7edf\u76d1\u63a7\u65e0\u6cd5\u6355\u6349\u7684\u6545\u969c\u6a21\u5f0f\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u63a8\u7406\u9000\u5316<\/strong>\uff1aAgent\u9677\u5165\u65e0\u6548\u7684\u63a8\u7406\u5faa\u73af<\/li>\n\n\n\n<li><strong>\u5de5\u5177\u8bef\u7528<\/strong>\uff1a\u9009\u62e9\u4e86\u9519\u8bef\u7684\u5de5\u5177\u6216\u4f20\u5165\u4e86\u9519\u8bef\u7684\u53c2\u6570<\/li>\n\n\n\n<li><strong>\u5e7b\u89c9\u4f20\u64ad<\/strong>\uff1a\u65e9\u671f\u7684\u8f7b\u5fae\u5e7b\u89c9\u5728\u540e\u7eed\u6b65\u9aa4\u4e2d\u88ab\u653e\u5927<\/li>\n\n\n\n<li><strong>\u4e0a\u4e0b\u6587\u6ea2\u51fa<\/strong>\uff1a\u5bf9\u8bdd\u5386\u53f2\u8d85\u8fc7\u6a21\u578b\u4e0a\u4e0b\u6587\u7a97\u53e3<\/li>\n<\/ul>\n\n\n\n<p>VIGIL\uff08\u81ea\u7701\u5f0f\u8fd0\u884c\u65f6\uff09\u5c55\u793a\u4e86\u4e00\u79cd\u4ece\u201cLLM\u9a71\u52a8\u7684\u811a\u672c\u201d\u5411<strong>\u81ea\u6108Agent\u8fd0\u884c\u65f6<\/strong>\u7684\u8f6c\u53d8\u2014\u2014\u7cfb\u7edf\u80fd\u591f\u5728\u4e25\u683c\u7684\u7ed3\u6784\u548c\u8bed\u4e49\u62a4\u680f\u4e0b\u89c2\u5bdf\u3001\u8bca\u65ad\u548c\u4fee\u590d\u81ea\u8eab\u884c\u4e3a\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-15\">5.2 \u68c0\u67e5\u70b9\u4e0e\u65ad\u70b9\u7eed\u8dd1<\/h3>\n\n\n\n<p>\u68c0\u67e5\u70b9\u673a\u5236\u662f\u5b9e\u73b0Agent\u6545\u969c\u6062\u590d\u7684\u57fa\u7840\u3002\u6838\u5fc3\u601d\u8def\u662f\u5728\u6bcf\u4e2a\u6267\u884c\u6b65\u9aa4\u540e\u4fdd\u5b58Agent\u7684\u72b6\u6001\u5feb\u7167\uff0c\u5f53\u6545\u969c\u53d1\u751f\u65f6\u4ece\u6700\u8fd1\u7684\u68c0\u67e5\u70b9\u6062\u590d\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# agent_checkpoint.py - Agent\u68c0\u67e5\u70b9\u4e0e\u6062\u590d\u673a\u5236\n\nimport pickle\nimport hashlib\nimport json\nfrom datetime import datetime\nfrom typing import Any, Dict, Optional, List\nfrom pathlib import Path\nimport redis\nimport zlib\n\nclass AgentCheckpointManager:\n    \"\"\"Agent\u68c0\u67e5\u70b9\u7ba1\u7406\u5668\"\"\"\n\n    def __init__(self, redis_client: Optional&#91;redis.Redis] = None, local_dir: str = \".\/checkpoints\"):\n        self.redis = redis_client\n        self.local_dir = Path(local_dir)\n        self.local_dir.mkdir(parents=True, exist_ok=True)\n\n    def save_checkpoint(self, agent_id: str, step_id: str, state: Dict&#91;str, Any]) -&gt; str:\n        \"\"\"\u4fdd\u5b58Agent\u72b6\u6001\u68c0\u67e5\u70b9\"\"\"\n        checkpoint = {\n            \"agent_id\": agent_id,\n            \"step_id\": step_id,\n            \"timestamp\": datetime.utcnow().isoformat(),\n            \"state\": state,\n            \"checksum\": self._compute_checksum(state)\n        }\n\n        # \u5e8f\u5217\u5316\u5e76\u538b\u7f29\n        serialized = pickle.dumps(checkpoint)\n        compressed = zlib.compress(serialized)\n\n        # \u751f\u6210\u68c0\u67e5\u70b9ID\n        checkpoint_id = hashlib.sha256(f\"{agent_id}:{step_id}:{datetime.utcnow().isoformat()}\".encode()).hexdigest()&#91;:16]\n\n        # \u5b58\u50a8\u5230Redis\uff08\u70ed\u6570\u636e\uff09\u548c\u672c\u5730\uff08\u6301\u4e45\u5316\uff09\n        if self.redis:\n            self.redis.setex(f\"checkpoint:{checkpoint_id}\", 86400 * 7, compressed)  # 7\u5929TTL\n\n        # \u672c\u5730\u6301\u4e45\u5316\n        checkpoint_path = self.local_dir \/ f\"{checkpoint_id}.cp\"\n        with open(checkpoint_path, \"wb\") as f:\n            f.write(compressed)\n\n        return checkpoint_id\n\n    def load_checkpoint(self, checkpoint_id: str) -&gt; Optional&#91;Dict&#91;str, Any]]:\n        \"\"\"\u52a0\u8f7d\u68c0\u67e5\u70b9\"\"\"\n        # \u5c1d\u8bd5\u4eceRedis\u52a0\u8f7d\n        if self.redis:\n            data = self.redis.get(f\"checkpoint:{checkpoint_id}\")\n            if data:\n                return self._deserialize_checkpoint(data)\n\n        # \u56de\u9000\u5230\u672c\u5730\n        checkpoint_path = self.local_dir \/ f\"{checkpoint_id}.cp\"\n        if checkpoint_path.exists():\n            with open(checkpoint_path, \"rb\") as f:\n                return self._deserialize_checkpoint(f.read())\n\n        return None\n\n    def list_checkpoints(self, agent_id: str, limit: int = 10) -&gt; List&#91;Dict]:\n        \"\"\"\u5217\u51faAgent\u7684\u6240\u6709\u68c0\u67e5\u70b9\"\"\"\n        # \u5b9e\u9645\u5b9e\u73b0\u4e2d\u9700\u8981\u7ef4\u62a4\u7d22\u5f15\n        checkpoints = &#91;]\n        for cp_file in sorted(self.local_dir.glob(\"*.cp\"), key=lambda x: x.stat().st_mtime, reverse=True)&#91;:limit]:\n            data = self._deserialize_checkpoint(cp_file.read_bytes())\n            if data and data.get(\"agent_id\") == agent_id:\n                checkpoints.append({\n                    \"id\": cp_file.stem,\n                    \"timestamp\": data.get(\"timestamp\"),\n                    \"step_id\": data.get(\"step_id\")\n                })\n        return checkpoints\n\n    def _compute_checksum(self, state: Dict) -&gt; str:\n        \"\"\"\u8ba1\u7b97\u72b6\u6001\u6821\u9a8c\u548c\"\"\"\n        state_str = json.dumps(state, sort_keys=True)\n        return hashlib.sha256(state_str.encode()).hexdigest()&#91;:16]\n\n    def _deserialize_checkpoint(self, data: bytes) -&gt; Optional&#91;Dict]:\n        \"\"\"\u53cd\u5e8f\u5217\u5316\u68c0\u67e5\u70b9\"\"\"\n        try:\n            decompressed = zlib.decompress(data)\n            return pickle.loads(decompressed)\n        except Exception:\n            return None\n\n\nclass DurableAgent:\n    \"\"\"\u652f\u6301\u65ad\u70b9\u7eed\u8dd1\u7684Agent\u5305\u88c5\u5668\"\"\"\n\n    def __init__(self, agent, checkpoint_manager: AgentCheckpointManager):\n        self.agent = agent\n        self.checkpoint_manager = checkpoint_manager\n        self.agent_id = id(agent)  # \u5b9e\u9645\u5e94\u4f7f\u7528\u552f\u4e00\u6807\u8bc6\n\n    async def run_with_recovery(self, task: str, max_retries: int = 3) -&gt; Any:\n        \"\"\"\u5e26\u6545\u969c\u6062\u590d\u7684Agent\u6267\u884c\"\"\"\n        retry_count = 0\n        checkpoint_id = None\n        restored_state = None\n\n        while retry_count &lt; max_retries:\n            try:\n                if checkpoint_id:\n                    # \u4ece\u68c0\u67e5\u70b9\u6062\u590d\u6267\u884c\n                    restored_state = self.checkpoint_manager.load_checkpoint(checkpoint_id)\n                    if restored_state:\n                        print(f\"Resuming from checkpoint {checkpoint_id}\")\n                        # \u6062\u590dAgent\u72b6\u6001\n                        self._restore_agent_state(restored_state&#91;\"state\"])\n\n                # \u6267\u884cAgent\u4efb\u52a1\n                result = await self._run_agent(task, checkpoint_id)\n\n                # \u6210\u529f\u5b8c\u6210\uff0c\u6e05\u7406\u68c0\u67e5\u70b9\n                if checkpoint_id:\n                    self.checkpoint_manager.redis.delete(f\"checkpoint:{checkpoint_id}\")\n                return result\n\n            except Exception as e:\n                retry_count += 1\n                print(f\"Agent failed (attempt {retry_count}\/{max_retries}): {e}\")\n\n                # \u4fdd\u5b58\u68c0\u67e5\u70b9\u4ee5\u4fbf\u6062\u590d\n                current_state = self._capture_agent_state()\n                checkpoint_id = self.checkpoint_manager.save_checkpoint(\n                    self.agent_id, \n                    f\"step_{retry_count}\", \n                    current_state\n                )\n                print(f\"Saved checkpoint {checkpoint_id} for recovery\")\n\n                if retry_count &gt;= max_retries:\n                    raise RuntimeError(f\"Agent failed after {max_retries} retries\") from e\n\n        return None\n\n    async def _run_agent(self, task: str, checkpoint_id: Optional&#91;str] = None):\n        \"\"\"\u5b9e\u9645Agent\u6267\u884c\u903b\u8f91\"\"\"\n        pass\n\n    def _capture_agent_state(self) -&gt; Dict:\n        \"\"\"\u6355\u83b7Agent\u5f53\u524d\u72b6\u6001\"\"\"\n        # \u5b9e\u9645\u5b9e\u73b0\u4e2d\u9700\u6355\u83b7\uff1a\u5bf9\u8bdd\u5386\u53f2\u3001\u8bb0\u5fc6\u3001\u4efb\u52a1\u961f\u5217\u3001\u4e2d\u95f4\u7ed3\u679c\u7b49\n        pass\n\n    def _restore_agent_state(self, state: Dict):\n        \"\"\"\u6062\u590dAgent\u72b6\u6001\"\"\"\n        pass\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"slide-16\">5.3 \u4e09\u5c42\u81ea\u6108\u67b6\u6784<\/h3>\n\n\n\n<p>\u57fa\u4e8e\u751f\u4ea7\u73af\u5883\u4e2d\u8fd0\u884c\u591a\u4e2aAgent\u7684\u7ecf\u9a8c\uff0c\u81ea\u6108\u67b6\u6784\u53ef\u5206\u4e3a\u4e09\u4e2a\u5c42\u6b21\uff1a<\/p>\n\n\n\n<p><strong>\u7b2c\u4e00\u5c42\uff1a\u77ac\u65f6\u6545\u969c\u6062\u590d\uff08\u6beb\u79d2\u7ea7\uff09<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u7f51\u7edc\u8d85\u65f6\u3001API\u9650\u6d41\u3001\u4e34\u65f6\u670d\u52a1\u4e0d\u53ef\u7528<\/li>\n\n\n\n<li>\u7b56\u7565\uff1a\u6307\u6570\u9000\u907f\u91cd\u8bd5\u3001\u7194\u65ad\u5668\u3001\u8d85\u65f6\u63a7\u5236<\/li>\n<\/ul>\n\n\n\n<p><strong>\u7b2c\u4e8c\u5c42\uff1a\u6267\u884c\u6545\u969c\u6062\u590d\uff08\u79d2\u5230\u5206\u949f\u7ea7\uff09<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5de5\u5177\u8c03\u7528\u5931\u8d25\u3001LLM\u8f93\u51fa\u683c\u5f0f\u9519\u8bef\u3001\u4e0a\u4e0b\u6587\u6ea2\u51fa<\/li>\n\n\n\n<li>\u7b56\u7565\uff1a\u68c0\u67e5\u70b9\u6062\u590d\u3001\u66ff\u4ee3\u8def\u5f84\u6267\u884c\u3001\u964d\u7ea7\u7b56\u7565<\/li>\n<\/ul>\n\n\n\n<p><strong>\u7b2c\u4e09\u5c42\uff1a\u7cfb\u7edf\u6027\u81ea\u6108\uff08\u5206\u949f\u5230\u5c0f\u65f6\u7ea7\uff09<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Agent\u884c\u4e3a\u9000\u5316\u3001\u6a21\u578b\u6f02\u79fb\u3001\u5b89\u5168\u8fdd\u89c4<\/li>\n\n\n\n<li>\u7b56\u7565\uff1a\u81ea\u52a8\u56de\u6eda\u5230\u5df2\u77e5\u826f\u597d\u7248\u672c\u3001\u89e6\u53d1\u4eba\u5de5\u5ba1\u6838\u3001\u6a21\u578b\u5207\u6362<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\n# self_healing.py - \u4e09\u5c42\u81ea\u6108\u67b6\u6784\u793a\u4f8b\n\nimport asyncio\nfrom typing import Optional, Callable, Any\nfrom enum import Enum\nimport time\n\nclass FailureLevel(Enum):\n    TRANSIENT = 1      # \u77ac\u65f6\u6545\u969c\n    EXECUTION = 2      # \u6267\u884c\u6545\u969c  \n    SYSTEMIC = 3       # \u7cfb\u7edf\u6027\u6545\u969c\n\nclass HealingStrategy:\n    \"\"\"\u81ea\u6108\u7b56\u7565\"\"\"\n\n    @staticmethod\n    def retry_with_backoff(func: Callable, max_retries: int = 3, base_delay: float = 1.0):\n        \"\"\"\u7b56\u75651\uff1a\u6307\u6570\u9000\u907f\u91cd\u8bd5\"\"\"\n        async def wrapper(*args, **kwargs):\n            for attempt in range(max_retries):\n                try:\n                    return await func(*args, **kwargs)\n                except Exception as e:\n                    if attempt == max_retries - 1:\n                        raise\n                    delay = base_delay * (2 ** attempt)\n                    await asyncio.sleep(delay)\n            return None\n        return wrapper\n\n    @staticmethod\n    def checkpoint_recovery(checkpoint_manager, agent_id: str):\n        \"\"\"\u7b56\u75652\uff1a\u68c0\u67e5\u70b9\u6062\u590d\"\"\"\n        def decorator(func: Callable):\n            async def wrapper(*args, **kwargs):\n                # \u5c1d\u8bd5\u4ece\u6700\u65b0\u68c0\u67e5\u70b9\u6062\u590d\n                checkpoints = checkpoint_manager.list_checkpoints(agent_id, limit=1)\n                if checkpoints:\n                    checkpoint = checkpoint_manager.load_checkpoint(checkpoints&#91;0]&#91;\"id\"])\n                    if checkpoint:\n                        # \u6062\u590d\u72b6\u6001\u540e\u7ee7\u7eed\u6267\u884c\n                        pass\n                return await func(*args, **kwargs)\n            return wrapper\n        return decorator\n\n    @staticmethod\n    def fallback_to_safe_mode(primary_func: Callable, fallback_func: Callable):\n        \"\"\"\u7b56\u75653\uff1a\u964d\u7ea7\u5230\u5b89\u5168\u6a21\u5f0f\"\"\"\n        async def wrapper(*args, **kwargs):\n            try:\n                return await primary_func(*args, **kwargs)\n            except Exception:\n                # \u8bb0\u5f55\u964d\u7ea7\u4e8b\u4ef6\n                return await fallback_func(*args, **kwargs)\n        return wrapper\n\n\nclass SelfHealingAgent:\n    \"\"\"\u5177\u5907\u81ea\u6108\u80fd\u529b\u7684Agent\"\"\"\n\n    def __init__(self, agent, checkpoint_manager):\n        self.agent = agent\n        self.checkpoint_manager = checkpoint_manager\n        self.health_status = \"healthy\"\n        self.failure_history = &#91;]\n\n    async def execute_with_healing(self, task: str) -&gt; Any:\n        \"\"\"\u5e26\u81ea\u6108\u673a\u5236\u7684Agent\u6267\u884c\"\"\"\n\n        # \u7b2c\u4e00\u5c42\uff1a\u77ac\u65f6\u6545\u969c\u91cd\u8bd5\n        try:\n            result = await HealingStrategy.retry_with_backoff(\n                self._execute_primary,\n                max_retries=3\n            )(task)\n            return result\n        except Exception as e:\n            self._record_failure(FailureLevel.TRANSIENT, e)\n\n        # \u7b2c\u4e8c\u5c42\uff1a\u68c0\u67e5\u70b9\u6062\u590d\n        try:\n            result = await self._execute_with_checkpoint_recovery(task)\n            return result\n        except Exception as e:\n            self._record_failure(FailureLevel.EXECUTION, e)\n\n        # \u7b2c\u4e09\u5c42\uff1a\u964d\u7ea7\u4e0e\u544a\u8b66\n        self.health_status = \"degraded\"\n        result = await HealingStrategy.fallback_to_safe_mode(\n            self._execute_primary,\n            self._execute_safe_mode\n        )(task)\n\n        # \u89e6\u53d1\u4eba\u5de5\u4ecb\u5165\u544a\u8b66\n        self._trigger_escalation()\n        return result\n\n    async def _execute_primary(self, task: str) -&gt; Any:\n        \"\"\"\u4e3b\u8981\u6267\u884c\u8def\u5f84\"\"\"\n        pass\n\n    async def _execute_with_checkpoint_recovery(self, task: str) -&gt; Any:\n        \"\"\"\u5e26\u68c0\u67e5\u70b9\u6062\u590d\u7684\u6267\u884c\"\"\"\n        pass\n\n    async def _execute_safe_mode(self, task: str) -&gt; Any:\n        \"\"\"\u5b89\u5168\u6a21\u5f0f\u6267\u884c\uff08\u6709\u9650\u529f\u80fd\uff09\"\"\"\n        pass\n\n    def _record_failure(self, level: FailureLevel, error: Exception):\n        self.failure_history.append({\n            \"timestamp\": time.time(),\n            \"level\": level.value,\n            \"error\": str(error)\n        })\n\n    def _trigger_escalation(self):\n        \"\"\"\u89e6\u53d1\u4eba\u5de5\u4ecb\u5165\u544a\u8b66\"\"\"\n        # \u53d1\u9001\u544a\u8b66\u5230Ops\u56e2\u961f\n        pass\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-17\">\u516d\u3001\u4f53\u7cfb\u67b6\u6784\u5168\u666f<\/h2>\n\n\n\n<p>\u7efc\u5408\u4ee5\u4e0a\u56db\u4e2a\u7ef4\u5ea6\uff0c\u4f01\u4e1a\u7ea7AI Agent\u53ef\u89c2\u6d4b\u6027\u4f53\u7cfb\u7684\u5b8c\u6574\u67b6\u6784\u5982\u4e0b\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502                        AI Agent \u53ef\u89c2\u6d4b\u6027\u4f53\u7cfb\u5168\u666f                        \u2502\n\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\u2502  \u2502                        \u6570\u636e\u91c7\u96c6\u5c42                               \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502 OTel SDK \u2502  \u2502 eBPF\u65e0\u4fb5\u5165\u2502  \u2502 \u7ed3\u6784\u5316\u65e5\u5fd7\u2502  \u2502 \u81ea\u5b9a\u4e49\u57cb\u70b9   \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502 (\u63d2\u6869)   \u2502  \u2502 (\u8fb9\u754c\u8ffd\u8e2a)\u2502  \u2502 (JSON)   \u2502  \u2502 (\u4e1a\u52a1\u6307\u6807)   \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \n\u2502  \n\u2502  \u2502                        \u6570\u636e\u5b58\u50a8\u4e0e\u5904\u7406\u5c42                         \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502  Jaeger  \u2502  \u2502  Loki    \u2502  \u2502Prometheus\u2502  \u2502 \u68c0\u67e5\u70b9\u5b58\u50a8    \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502 (Traces) \u2502  \u2502 (Logs)   \u2502  \u2502(Metrics) \u2502  \u2502 (Redis\/S3)   \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502   \u2502\n\n\u2502  \u2502                        \u5206\u6790\u5f15\u64ce\u5c42                               \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502 \u5173\u8054\u5206\u6790 \u2502  \u2502 \u5f02\u5e38\u68c0\u6d4b \u2502  \u2502 \u6210\u672c\u5206\u6790 \u2502  \u2502 \u6839\u56e0\u5b9a\u4f4d     \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502(TraceID) \u2502  \u2502(UEBA)    \u2502  \u2502(Token\/$$)\u2502  \u2502(\u56e0\u679c\u63a8\u65ad)    \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502   \u2502\n\n\u2502  \u2502                        \u8bc4\u4f30\u4e0e\u51b3\u7b56\u5c42                             \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502\u81ea\u52a8\u5316\u8bc4\u4f30\u2502  \u2502 \u8d28\u91cf\u95e8\u7981 \u2502  \u2502 \u81ea\u6108\u51b3\u7b56 \u2502  \u2502 \u4eba\u5de5\u5ba1\u6838     \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502(Evals)   \u2502  \u2502(CI\/CD)   \u2502  \u2502(Healing) \u2502  \u2502(HITL)        \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2502   \u2502\n\u2502  \n\u2502  \u2502                        \u53ef\u89c6\u5316\u5c42                                 \u2502   \u2502\n\u2502  \u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u2502   \u2502\n\u2502  \u2502  \u2502  Grafana \/ LangSmith \/ \u81ea\u7814\u63a7\u5236\u53f0                       \u2502  \u2502   \u2502\n\u2502  \u2502  \u2502  - \u6267\u884c\u8ffd\u8e2a\u65f6\u95f4\u7ebf  - \u8bc4\u4f30\u4eea\u8868\u677f  - \u544a\u8b66\u4e2d\u5fc3  - \u6210\u672c\u770b\u677f \u2502  \u2502   \u2502\n\u2502  \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"slide-18\">\u4e03\u3001\u603b\u7ed3\u4e0e\u5c55\u671b<\/h2>\n\n\n\n<p>AI Agent\u7684\u53ef\u89c2\u6d4b\u6027\u4e0d\u662f\u4f20\u7edfAPM\u7684\u7b80\u5355\u5ef6\u4f38\uff0c\u800c\u662f\u4e00\u6b21\u8303\u5f0f\u7ea7\u7684\u91cd\u6784\u3002\u5b83\u8981\u6c42\u6211\u4eec\u5728\u4ee5\u4e0b\u5c42\u9762\u505a\u51fa\u6839\u672c\u6027\u6539\u53d8\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4ece\u201c\u9ed1\u76d2\u201d\u5230\u201c\u900f\u660e\u201d<\/strong> \uff1a\u901a\u8fc7Trace\/Span\u6a21\u578b\u548ceBPF\u8fb9\u754c\u8ffd\u8e2a\uff0c\u8ba9Agent\u7684\u6bcf\u4e00\u6b65\u63a8\u7406\u548c\u884c\u52a8\u90fd\u53ef\u89c1\u3001\u53ef\u8ffd\u6eaf<\/li>\n\n\n\n<li><strong>\u4ece\u201c\u6563\u843d\u65e5\u5fd7\u201d\u5230\u201c\u4e09\u5c42\u7ed3\u6784\u5316\u201d<\/strong> \uff1a\u5c06\u65e5\u5fd7\u5206\u4e3a\u64cd\u4f5c\u5c42\u3001\u8ba4\u77e5\u5c42\u548c\u4e0a\u4e0b\u6587\u5c42\uff0c\u6ee1\u8db3\u4e0d\u540c\u89d2\u8272\u7684\u53ef\u89c2\u6d4b\u9700\u6c42<\/li>\n\n\n\n<li><strong>\u4ece\u201c\u8dd1\u8d77\u6765\u5c31\u884c\u201d\u5230\u201c\u53ef\u8bc4\u4f30\u3001\u53ef\u6bd4\u8f83\u201d<\/strong> \uff1a\u5efa\u7acb\u6807\u51c6\u5316\u7684\u8bc4\u4f30\u4f53\u7cfb\u548c\u81ea\u52a8\u5316\u6d41\u6c34\u7ebf<\/li>\n\n\n\n<li><strong>\u4ece\u201c\u5d29\u6e83\u91cd\u542f\u201d\u5230\u201c\u81ea\u6108\u95ed\u73af\u201d<\/strong> \uff1a\u901a\u8fc7\u68c0\u67e5\u70b9\u3001\u65ad\u70b9\u7eed\u8dd1\u548c\u591a\u5c42\u81ea\u6108\u7b56\u7565\uff0c\u5b9e\u73b0Agent\u7cfb\u7edf\u7684\u97e7\u6027<\/li>\n<\/ol>\n\n\n\n<p>\u6b63\u5982IBM\u5728watsonx Orchestrate\u4e2d\u6240\u5b9e\u8df5\u7684\u90a3\u6837\uff0cAgentOps\u901a\u8fc7\u5b9e\u65f6\u76d1\u63a7\u548c\u57fa\u4e8e\u7b56\u7565\u7684\u63a7\u5236\uff0c\u786e\u4fdd\u667a\u80fd\u4f53\u7684\u884c\u4e3a\u53ef\u9760\u4e14\u5b89\u5168\u3002Agent\u53ef\u89c2\u6d4b\u6027\u4e3a\u667a\u80fd\u4f53\u6784\u5efa\u8005\u63d0\u4f9b\u4e86\u667a\u80fd\u4f53\u73af\u5883\u7684\u6574\u4f53\u89c6\u56fe\u3002<\/p>\n\n\n\n<p>\u968f\u7740OpenTelemetry GenAI\u8bed\u4e49\u89c4\u8303\u7684\u6210\u719f\u548ceBPF\u7b49\u65e0\u4fb5\u5165\u6280\u672f\u7684\u666e\u53ca\uff0cAI Agent\u53ef\u89c2\u6d4b\u6027\u5c06\u4ece\u201c\u9526\u4e0a\u6dfb\u82b1\u201d\u53d8\u4e3a\u201c\u4e0d\u53ef\u6216\u7f3a\u201d\u7684\u751f\u4ea7\u73af\u5883\u6807\u914d\u3002\u4f01\u4e1a\u5e94\u5f53\u4ece\u73b0\u5728\u5f00\u59cb\uff0c\u5c06\u53ef\u89c2\u6d4b\u6027\u4f5c\u4e3aAgent\u5f00\u53d1\u7684\u7b2c\u4e00\u4f18\u5148\u7ea7\uff0c\u800c\u975e\u4e8b\u540e\u8865\u6551\u3002<\/p>","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u9ed1\u76d2\u56f0\u5883\uff1aAI Agent\u4e3a\u4f55\u9700\u8981\u5168\u65b0\u7684\u53ef\u89c2\u6d4b\u6027\u8303\u5f0f 2025\u5e74\uff0cAI Agent\u4ece\u5b9e\u9a8c\u5ba4\u8d70\u5411\u89c4\u6a21\u5316\u751f\u4ea7\u843d\u5730\u3002\u4ece\u5f00\u53d1\u8005\u65e5\u5e38\u4f7f\u7528\u7684\u4ee3\u7801\u52a9\u624b\u5230\u4f01\u4e1a\u670d\u52a1\u573a\u666f\u4e0b\u7684\u667a\u80fd\u5ba2\u670d\uff0c\u518d\u5230\u590d\u6742\u5ea6\u6301\u7eed\u5347\u7ea7\u7684\u591a\u667a\u80fd\u4f53\u534f\u540c\u7cfb\u7edf\uff0cAI Agent\u6b63\u5728\u4ee5\u524d\u6240\u672a\u6709\u7684\u901f\u5ea6\u6e17\u900f\u4f01\u4e1a\u6838\u5fc3\u4e1a\u52a1\u3002 \u7136\u800c\uff0c\u4e0e\u4f20\u7edf\u7684\u786e\u5b9a\u6027\u8f6f\u4ef6\u4e0d\u540c\uff0cAI Agent\u7684\u672c\u8d28\u662f\u975e\u786e\u5b9a\u6027\u7684\u3002\u4e00\u4e2aAI Agent\u901a\u8fc7\u91cd\u590d\u7684\u51b3\u7b56\u6b65\u9aa4\u89e3\u51b3\u95ee\u9898\uff0c\u800c\u975e\u5355\u6b21\u54cd\u5e94\u2014\u2014\u5728\u6bcf\u4e00\u6b65&hellip;<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,10],"tags":[],"class_list":["post-387","post","type-post","status-publish","format-standard","hentry","category-ai","category-alibaba-cloud"],"_links":{"self":[{"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/posts\/387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/comments?post=387"}],"version-history":[{"count":3,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/posts\/387\/revisions"}],"predecessor-version":[{"id":390,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/posts\/387\/revisions\/390"}],"wp:attachment":[{"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/media?parent=387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/categories?post=387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flycloud.io\/en\/wp-json\/wp\/v2\/tags?post=387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}