
很多同学在接触 AI Agent 时都会遇到一个共同的困境刷了很多收藏夹里的教程看了很多“手把手带你写 Agent”的短视频但真到自己动手做一个能解决实际问题的智能体时还是不知道从哪儿下手。网上的资料确实不少但多数要么只讲概念、不给代码要么一上来就上架构师级别的源码对新手很不友好。这篇文章就想解决这个信息差问题。我会用一套完整的思路帮你从零开始拆解 AI Agent 开发的全过程先搞清楚 Agent 到底是什么再准备开发环境接着理解大模型调用、工具调用、记忆等核心机制最后用一个“AI Agent 通过 ES REST API 智能分析日志”的真实场景串起整个知识点。整个内容可以看作一套精简但完整的 Agent 开发学习路线按这个顺序走你会比零散看几百集视频更高效地建立起自己的知识框架。无论你是准备入门 AI 应用开发的学生还是后端想转型 AI 工程化的开发者这篇文章都值得认真读完。文末还会附上 Agent 开发面试常见考点、高频避坑思路和进阶学习建议。1. 背景与核心概念1.1 什么是 AI AgentAI Agent中文常译作“智能体”。我们先用一句话来理解它一个 AI Agent是一个能够感知环境、做出决策并通过调用工具与环境交互来完成复杂任务的智能系统。拆开来看它有三个核心特征感知能接收用户的自然语言指令也能读取外部数据比如数据库、日志系统、文件、网页。决策在大模型LLM的推理能力支持下把复杂任务拆解成子任务并决定每一步该调用什么工具。行动通过调用 API、执行代码、操作外部系统等方式真正改变环境状态或获得结果。你可以把它理解成“一个拥有大脑大模型、手脚工具、笔记本记忆的机器人”。传统的人工智能应用比如一个简单的问答机器人是用户问一句、它答一句没有多步推理也不会去调用系统。而 Agent 不一样它会自己规划我要不要查数据库要不要先统计一下用户最近一周的数据工具调用的结果出来后下一步是继续查询还是直接生成结论1.2 Agent 与 RAG、聊天机器人的区别很多初学者会把 Agent、RAG检索增强生成、Chatbot聊天机器人这几个概念混在一起。其实它们侧重点不同概念核心目标关键组件典型能力聊天机器人多轮对话大模型 上下文管理聊天、问答、情感陪伴RAG 应用检索外部知识并生成回答向量库 文档切片 检索基于私有知识库回答问题AI Agent自主规划与执行任务大模型 工具调用 记忆查数据、调接口、写文件、执行自动化任务简单理解RAG 是给大模型配了一本“参考书”Agent 是给大模型配备了“手和脚”。实际项目中Agent 往往也会内置 RAG 能力两者不是对立关系而是组合关系。1.3 Agent 的常见类型ReAct 型 Agent核心思路是交替进行“推理Reasoning”和“行动Acting”。它每执行一步工具调用就会把观察到的结果重新交给大模型推理形成循环直到完成任务。这是目前最主流的轻量级 Agent 模式适用于大多数工具调用场景。Plan-and-Execute 型 Agent先让大模型制定完整计划再逐步执行。适合任务步骤明确、可以提前拆分的场景。缺点是计划一旦变化调整成本较高。多智能体Multi-Agent系统由多个 Agent 协作不同的 Agent 承担不同角色比如一个负责拆解任务另一个负责写代码还有一个负责代码审查。适合复杂工程类任务例如一个完整的软件项目开发流程。1.4 Agent 的常见应用场景Agent 之所以在近几年爆发式增长是因为它几乎能覆盖所有需要“理解 操作”的场景智能运维日志分析根据用户一句话自动从 ElasticsearchES查询日志、统计分析错误率、定位故障原因。数据分析报表读取数据库中的运营数据自动生成数据分析和可视化报告。自动化办公根据邮件内容自动整理待办事项、创建日程、回复邮件。研发辅助根据需求描述自动生成代码、执行测试、提交代码。爬虫与信息收集按用户要求访问网站提取结构化信息并输出 Markdown 或表格。本文后面要实战的“日志分析 Agent”就属于第一个场景非常有代表性也是招聘市场上很常见的 Agent 开发需求。2. 环境准备与版本说明在实际写代码之前我们需要把开发环境准备好。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。2.1 操作系统与运行环境操作系统Windows 10/11、macOS、Linux 均可。开发语言Python 3.10 或更高版本。包管理工具pip 或 conda。IDE推荐使用 VS Code 或 PyCharm。终端CMD、PowerShell、bash 均可。2.2 Python 依赖库在项目根目录创建一个虚拟环境然后安装以下核心依赖python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activatepip install openai elasticsearch python-dotenv这些库的作用openai用于调用 OpenAI 官方的 GPT 系列模型也可以兼容通过 API Forward 等方式接入的国产大模型。注意具体厂商 SDK 可能不同但整体思路一致。elasticsearch官方提供的 ES Python 客户端用来查询 Elasticsearch 中的日志数据。python-dotenv用于读取.env配置文件把 API Key 等敏感信息放在环境变量中不硬编码到代码里。如果你使用的是国内大模型服务比如阿里云百炼、智谱 AI、DeepSeek 等一般只需要把 API 的 base_url 和 model 名称换成对应服务商的值即可调用链路完全一致。2.3 大模型 API 准备Agent 开发的核心是调用大模型。你需要准备一个可用的 LLM API支持 Function Calling函数调用能力。目前主流的大模型服务商都支持这个能力例如 OpenAI 的 gpt-4o、gpt-4o-mini、DeepSeek 的 deepseek-chat 等。在.env配置文件中写入OPENAI_API_KEYsk-你的密钥 OPENAI_BASE_URLhttps://api.openai.com/v1 OPENAI_MODELgpt-4o-mini # ES 配置 ES_HOSThttp://localhost:9200 ES_USERNAMEelastic ES_PASSWORD你的密码注意如果你的大模型 API 是通过代理、中转或本地私有化部署接入的只需要修改OPENAI_BASE_URL即可。2.4 示例项目结构为了后续实战代码清晰可读建议按下面的结构组织项目agent-log-project/ ├── .env ├── requirements.txt ├── main.py # Agent 入口 ├── tools/ │ ├── __init__.py │ └── es_tools.py # ES 查询工具 └── agents/ ├── __init__.py ├── core.py # Agent 核心循环 └── prompts.py # 系统提示词3. Agent 核心原理拆解掌握了环境准备接下来需要理解 Agent 的四个核心机制。这几个概念是 Agent 开发的基石面试中也几乎必问。3.1 大模型Agent 的“大脑”大模型本身不具备访问外部世界的能力它只是一个文本生成模型。但通过推理它能理解用户意图并生成结构化的指令比如“我需要调用某某工具参数是什么”。大模型在 Agent 中承担三个角色理解意图把用户模糊的自然语言转化为明确的任务。任务规划把复杂任务分解为多个可执行的步骤。决策工具根据当前状态决定调用哪个工具、传什么参数。在开发中我们通过系统提示词System Prompt来约束大模型的行为。一个好的系统提示词能让 Agent 的决策质量提升一个档次。相关术语建议新手重点掌握System Prompt、User Message、Assistant Message、Tool Message。3.2 工具调用Agent 的“手脚”工具调用Tool Calling / Function Calling是 Agent 与外部世界交互的桥梁。它允许大模型输出一段结构化的 JSON声明“我要调用这个函数参数是这些”。以大模型 API 为例我们需要在请求中声明工具列表{ type: function, function: { name: query_es_logs, description: 查询 Elasticsearch 中的日志数据, parameters: { type: object, properties: { index: { type: string, description: 索引名称 }, time_range: { type: string, description: 时间范围例如 now-15m } }, required: [index] } } }大模型看到这个工具列表后如果需要查询日志就会输出类似下面的内容{ name: query_es_logs, arguments: {\index\: \app-log\, \time_range\: \now-15m\} }开发者拿到这段输出解析出函数名和参数然后在自己的代码里真正去执行 ES 查询再把查询结果拼装成“工具消息”返回给大模型。大模型看到结果后继续推理并生成最终回答。这就是一次完整的工具调用循环。3.3 记忆Agent 的“笔记本”记忆机制分为短期记忆和长期记忆短期记忆当前对话的上下文窗口包括历史消息、工具调用结果。它决定了 Agent 在本次任务中的连续性。长期记忆把历史对话摘要、用户偏好、任务经验存储到数据库或向量库中跨会话复用。在简单 Agent 中我们主要依赖短期记忆也就是不断把新的消息追加到messages列表中再传给大模型。当上下文过长时要考虑做截断或摘要否则会超出模型 token 限制。3.4 规划Agent 的“思维链”规划能力是 Agent 解决复杂问题的基础。主流的规划方式有两种ReAct 循环推理 → 行动 → 观察 → 再推理循环直到问题解决。这是最简单、最稳定的实现方式。Plan-and-Execute首先生成完整计划再按计划逐步执行每步校验结果。对于大多数初学者推荐先掌握 ReAct 模式。它实现简单且对任务变化有天然适应能力。下面是一个 ReAct 循环的状态机描述可以用文字说明整体流程开始 ↓ 用户输入任务 ↓ 大模型思考是否需要调用工具 ├─ 需要 → 输出工具调用请求 │ ↓ │ 解析函数名和参数 │ ↓ │ 执行对应工具函数 │ ↓ │ 把工具结果返回给大模型 → 继续思考 │ ↓ └─ 不需要或已经完成 → 生成最终回答 ↓ 结束3.5 Agent 完整架构从工程视角看一个完整的 Agent 系统通常包含六个模块模块作用用户交互层接收用户输入返回最终结果任务规划层拆解复杂任务制定执行计划大模型推理层理解意图、决策下一步动作工具执行层封装各种外部 API 和内部能力记忆管理层维护短期上下文和长期知识安全与监控层组织权限控制、数据脱敏、日志审计在工作原理上用户请求先进入任务规划层规划层结合大模型推理判断是否调用工具如果需要调用工具执行层对应的能力执行结果回到大模型继续下一轮推理直到生成最终结果交还用户。整个链路中记忆管理层持续维护上下文状态。4. 完整实战AI Agent 通过 ES REST API 智能分析日志下面进入这篇文章的重头戏。我们来实现一个真正能跑起来的 Agent场景是用户用一句话描述需求Agent 自动查询 Elasticsearch 日志分析错误率并给出结论和排查建议。4.1 需求分析假设我们有一个 Web 应用它的访问日志和错误日志都存在 Elasticsearch 中索引名为app-log。字段包括timestamp日志时间level日志级别如 INFO、WARN、ERRORmessage日志内容service服务名我们想实现以下能力用户输入“帮我查一下最近15分钟的错误日志数量。”Agent 理解用户意图调用 ES 查询工具。工具返回统计结果。Agent 分析结果生成一份自然语言报告告诉用户错误数量、主要错误类型、可能的排查方向。4.2 创建项目结构首先按 2.4 节建好目录然后准备requirements.txtopenai1.0 elasticsearch8.0 python-dotenv1.0执行安装pip install -r requirements.txt4.3 编写 ES 查询工具文件路径tools/es_tools.pyimport os from elasticsearch import Elasticsearch from dotenv import load_dotenv load_dotenv() class ESTool: 封装 ES 的常用查询能力供 Agent 调用。 def __init__(self): self.client Elasticsearch( os.getenv(ES_HOST), basic_auth(os.getenv(ES_USERNAME), os.getenv(ES_PASSWORD)), request_timeout30, ) def query_error_log_count(self, index: str, time_range: str) - str: 查询指定索引、指定时间范围内 ERROR 级别日志的数量。 Args: index: 索引名称例如 app-log time_range: 时间范围例如 now-15m Returns: JSON 字符串包含错误日志总数。 query { query: { bool: { must: [ {term: {level: ERROR}}, {range: {timestamp: {gte: time_range}}} ] } } } result self.client.count(indexindex, bodyquery) return str(result.body) def query_error_log_sample(self, index: str, time_range: str, size: int 10) - str: 查询 ERROR 日志的样本内容用于分析错误类型。 Args: index: 索引名称 time_range: 时间范围 size: 返回样本条数 Returns: JSON 字符串包含日志样本。 query { size: size, query: { bool: { must: [ {term: {level: ERROR}}, {range: {timestamp: {gte: time_range}}} ] } }, sort: [{timestamp: {order: desc}}] } result self.client.search(indexindex, bodyquery) return str(result.body)这段代码封装了两个工具函数query_error_log_count查询错误日志总数。query_error_log_sample查询错误日志样本内容。它们都是只读查询不会修改 ES 数据符合运维分析场景的安全要求。4.4 编写 Agent 核心循环文件路径agents/core.py这是整个 Agent 的核心包含系统提示词、工具注册、逻辑循环和最终回答四个部分。import json import os from openai import OpenAI from dotenv import load_dotenv from tools.es_tools import ESTool load_dotenv() client OpenAI( api_keyos.getenv(OPENAI_API_KEY), base_urlos.getenv(OPENAI_BASE_URL), ) model os.getenv(OPENAI_MODEL, gpt-4o-mini) # 实例化 ES 工具 es_tool ESTool() # 工具注册表把工具函数暴露给大模型 tools [ { type: function, function: { name: query_error_log_count, description: 查询 Elasticsearch 中 ERROR 级别日志的数量, parameters: { type: object, properties: { index: {type: string, description: 索引名称}, time_range: {type: string, description: 时间范围如 now-15m、now-1h} }, required: [index, time_range] } } }, { type: function, function: { name: query_error_log_sample, description: 查询 ERROR 级别日志的样本内容, parameters: { type: object, properties: { index: {type: string, description: 索引名称}, time_range: {type: string, description: 时间范围}, size: {type: integer, description: 返回条数默认10} }, required: [index, time_range] } } } ] # 系统提示词 system_prompt 你是一个智能日志分析助手。你会根据用户的指令调用 Elasticsearch 查询工具来获取日志信息。 你的分析过程如下 1. 理解用户想要查询的时间范围和索引。 2. 如果需要统计错误数量调用 query_error_log_count。 3. 如果需要分析错误类型调用 query_error_log_sample。 4. 根据工具返回的数据生成简洁、专业的分析报告。 注意 - 时间范围是用户没有明确指定时默认使用 now-30m。 - 如果查询结果为空要明确告知用户“该时间范围内无对应日志”。 - 报告包含错误数量、错误类型占比、可能原因、排查建议。 def call_es_function(name: str, arguments: str) - str: 根据大模型输出的函数名分发到对应的工具函数。 args json.loads(arguments) if name query_error_log_count: return es_tool.query_error_log_count(args.get(index), args.get(time_range)) elif name query_error_log_sample: return es_tool.query_error_log_sample( args.get(index), args.get(time_range), args.get(size, 10) ) else: return f未知工具: {name} def run_agent(user_input: str, max_steps: int 5) - str: 运行 Agent 主循环。 Args: user_input: 用户输入的自然语言指令。 max_steps: 最多允许的 Agent 循环步数防止死循环。 Returns: Agent 的最终回答文本。 messages [ {role: system, content: system_prompt}, {role: user, content: user_input} ] for step in range(max_steps): print(f Step {step 1} ) response client.chat.completions.create( modelmodel, messagesmessages, toolstools, tool_choiceauto, ) message response.choices[0].message tool_calls message.tool_calls if tool_calls: # 先把模型的工具调用消息加入上下文 messages.append(message) for tool_call in tool_calls: function_name tool_call.function.name function_args tool_call.function.arguments print(f调用工具: {function_name}, 参数: {function_args}) result call_es_function(function_name, function_args) # 把工具执行结果作为 tool 消息加入上下文 messages.append({ role: tool, tool_call_id: tool_call.id, content: result, }) print(f工具返回: {result[:200]}...) else: # 没有工具调用说明模型已经准备好最终回答 return message.content return Agent 已达到最大步骤限制请重新描述需求。 if __name__ __main__: user_input 帮我查一下最近15分钟的错误日志数量并分析一下错误类型。 answer run_agent(user_input) print(\n 最终回答 \n) print(answer)4.5 代码逻辑解释这个run_agent函数是核心循环我们需要仔细理解初始化消息列表第一轮消息包含系统提示词和用户输入。调用大模型传入tools参数让大模型知道可用的工具。判断是否有工具调用大模型返回的内容可能是普通文本也可能包含tool_calls。如果是后者说明它想调用工具。把模型的工具调用请求追加到上下文这一步非常重要它告诉大模型“你已经提出要调用工具”。执行工具函数解析参数、调用本地 Python 函数拿到 ES 查询结果。把工具执行结果追加到上下文作为tool角色的消息返回给大模型。再次调用大模型大模型看到工具结果后可能继续调用工具也可能输出最终答案。循环直到没有工具调用或达到最大步数max_steps是一个安全阀防止 Agent 进入无意义的死循环避免产生不可控的 API 消耗。4.6 运行与验证在项目根目录执行python agents/core.py如果一切正常你会在终端看到类似输出 Step 1 调用工具: query_error_log_count, 参数: {index: app-log, time_range: now-15m} 工具返回: {count: 128, _shards: {total: 5, successful: 5, failed: 0}} Step 2 调用工具: query_error_log_sample, 参数: {index: app-log, time_range: now-15m, size: 10} 工具返回: {took: 12, hits: {...}} 最终回答 根据最近15分钟的日志数据系统共记录了 **128 条 ERROR 级别日志**。 主要错误类型包括 - 数据库连接超时56条占比43.75% - 空指针异常32条占比25% - 外部 API 调用失败24条占比18.75% - 其他类型16条占比12.5% **可能原因** 1. 数据库连接池配置可能过小导致高峰期连接超时。 2. 部分接口存在未判空导致的空指针异常。 3. 外部依赖服务可能有间歇性故障。 **排查建议** 1. 检查数据库连接池最大连接数配置结合 QPS 进行评估。 2. 优先查看空指针异常对应的调用链日志定位具体代码行。 3. 检查外部 API 服务最近是否有变更或限流策略。这样一个能“听懂人话、自己查数据、自己分析报告”的日志分析 Agent 就完成了。如果你接入的是 DeepSeek、智谱 AI 等模型代码中model和base_url换成对应厂商即可循环逻辑不需要改。5. 常见问题与排查思路在 Agent 开发过程中新手最容易遇到以下几类问题。我把它们整理成一张排查表方便你按图索骥。问题现象常见原因解决思路Agent 不调用工具直接编造答案工具描述不够清晰模型能力不足给每个工具函数写清楚用途、参数说明换用支持 Function Calling 的模型工具返回参数缺失大模型没有输出 required 字段检查parameters中required是否声明在系统提示词中补充“必须提供完整参数”JSON 解析失败大模型返回了非法 JSON工具参数被截断对模型输出做异常捕获加重试逻辑缩短工具描述长度上下文过长超出 token 限制多轮工具调用后历史消息过多对历史做裁剪或使用摘要压缩只保留最近的 N 条工具消息API 报错 429触发限流增加退避重试降低并发更换响应更快的模型Agent 陷入死循环工具结果满足不了模型判断条件添加max_steps限制优化系统提示词明确“完成后立即输出最终答案”ES 查询返回空结果索引不存在时间字段格式不对先手动用 curl 或 Kibana 验证查询语句检查索引是否存在字段名是否准确敏感信息泄露日志内容包含用户名、手机号等在工具返回前做脱敏处理限制工具只返回必要字段在这张表里最常见也最容易忽略的是第一项工具描述写得不够清晰。大模型是通过工具描述来决定何时调用、怎么调用的。如果你只写“查询日志”它可能不知道具体怎么指定时间范围。相反如果你写“查询 Elasticsearch 中 ERROR 级别日志数量参数包含索引名称和时间范围”模型的调用准确率会高出一个档次。6. 最佳实践与工程建议能把 Agent 跑通只是第一步要让它能在真实项目中稳定运行还需要关注下面这些工程细节。6.1 系统提示词的编写规范系统提示词是 Agent 行为的“宪法”优秀的提示词应包含角色定位告诉模型它是什么角色解决什么问题。能力边界明确它能做什么、不能做什么防止幻觉。工具使用规则什么时候该调用工具什么时候不该调用。输出格式要求要求它输出结构化的报告而不是混乱的文本。例如你可以加上一句如果用户的问题与日志查询无关请直接拒绝并解释你的能力范围。这样可以避免用户拿 Agent 当普通聊天机器人使用从而节省 API 调用成本。6.2 工具函数的安全边界工具函数是 Agent 与外部系统交互的入口也是最容易出安全问题的地方。只读优先像日志分析这类场景工具函数应该尽量设计为只读查询不要开放删除、写入等高危操作。如果确实需要写操作必须增加二次确认机制。参数校验对模型传入的每个参数都要做类型校验和白名单校验。例如索引名称只允许字母、数字、下划线。防止恶意构造参数。权限收敛ES 账号只授予查询权限不要使用超级管理员账号。数据脱敏工具返回的内容在传给大模型前要做敏感信息过滤。你不想让模型在生成报告时把用户的手机号、身份证号带出来。6.3 日志与可观测性Agent 是一个多步骤决策系统一旦出现问题排查难度比普通接口大得多。所以日志记录格外重要。建议至少记录以下信息完整的用户输入。每一步模型的原始返回内容。工具调用的函数名、参数、返回结果摘要。每一步的耗时。最终的 token 消耗量。下面是一个简单的日志记录示例import logging logging.basicConfig( levellogging.INFO, format%(asctime)s [%(levelname)s] %(message)s ) logger logging.getLogger(__name__) # 在 run_agent 循环中记录日志 logger.info(User input: %s, user_input) logger.info(Function call: %s %s, function_name, function_args) logger.info(Function result: %s, result[:200])有了这些日志你才能回答“为什么这个 Agent 多查了一次 ES”“为什么最终结论不准”这类问题。6.4 性能与成本控制Agent 每次工具调用都会产生一次大模型 API 请求成本是普通对话接口的数倍。控制成本的核心思路是模型分级简单任务用便宜快速的模型如 gpt-4o-mini、deepseek-chat复杂任务才用高级模型。工具按需加载不要一次性把所有工具都塞给大模型。根据用户意图只加载相关的工具子集。结果缓存相同的查询条件在短时间内重复请求可以直接返回缓存结果。设置最大步数max_steps参数控制在 5 左右既能完成大多数任务又能避免无限循环。6.5 生产环境的注意事项从 Demo 到生产Agent 的开发难度会提升一个量级。异步化Agent 执行可能需要几十秒甚至几分钟不适合放在同步 HTTP 请求中。建议使用消息队列 WebSocket 轮询等异步方案。人工确认机制涉及到生产环境变更、删除操作时Agent 不能直接执行必须要有人工审批环节。版本管理Agent 的行为不仅由代码决定还由提示词和工具描述决定。建议对提示词的每一次变更都做版本管理像代码一样走评审流程。灰度发布新提示词或新工具上线时先让一部分流量使用观察效果再全量发布。7. 总结与学习路线7.1 本文核心知识回顾通过这篇文章你已经掌握了 AI Agent 开发最核心的知识链路Agent 的本质是“大模型 工具 记忆 规划”。大模型通过 Function Calling 机制实现工具调用。ReAct 循环是 Agent 自主决策的主要实现方式。一个日志分析 Agent 的完整代码包含 ES 查询工具封装和 Agent 主循环。Agent 生产化需要考虑安全、日志、成本、权限等工程问题。7.2 推荐学习路线如果你打算系统地学习 Agent 开发可以参考下面这条路径第一阶段大模型 API 基础1-2周掌握 Chat Completion API 的基本用法。熟练编写 System Prompt、User Prompt。理解 Token、温度、上下文窗口等基础概念。第二阶段Function Calling 专项1周实现一个最简单的函数调用 Demo。理解大模型返回的tool_calls数据结构。用代码实现工具分发逻辑。第三阶段Agent 框架实战2-3周手写一个简单的 ReAct Agent 循环不要一上来就依赖框架。理解 LangChain 中 Agent 的核心概念但不要盲目追新。尝试自己封装 2-3 个常用工具日志查询、天气查询、数据库查询。第四阶段复杂场景与生产化2周以上实现多轮对话下的记忆管理。实现 RAG 与 Agent 的组合。设计安全审计和成本控制模块。阅读开源 Agent 框架源码比如比较流行的 MetaGPT、AutoGen 或 LangGraph。7.3 Agent 开发面试高频考点什么是 ReAct它解决什么问题大模型 Function Calling 的调用流程是怎样的如何防止 Agent 陷入死循环如果工具返回的数据量过大超过上下文限制怎么办Agent 的长期记忆如何设计多 Agent 协作时如何避免“消息风暴”如何评估一个 Agent 的判断质量这些问题的答案其实都在你动手实践的过程中会慢慢积累。没有一条路比亲手写一个 Agent 并跑到线上更高效。Agent 开发的价值不在于你背下了多少术语而在于你能不能让模型真正“动起来”。建议你现在就打开编辑器把文章里这个 ES 日志分析 Agent 跑起来哪怕只查询自己电脑上一个小型日志文件。跑通一个再往上加能力你会越做越顺手。