最近关于 Grok Bot 的热度明显上来了,尤其是“模板分享”这个功能开放之后,很多开发者开始尝试把自己的 Bot 工作流做成模板发布出来。相比于 SpaceX 花 2.2 亿美元处理管辖权这类新闻,Grok Bot 对普通开发者的影响其实更直接:它把 AI 应用从“聊天窗口”往“自动化执行体”推了一大步。马斯克对 AI 的警告依然很严肃,但从工程实践角度看,真正值得关注的是如何用模板化方式把 Bot 的提示词、配置、工具调用、后续动作沉淀成可复用的工程资产。
这篇文章我会从一个可落地的角度出发,围绕 Grok Bot 模板分享整理一套完整的实操方案,包括模板结构怎么设计、配置文件怎么写、Bot 核心逻辑怎么组织、怎么把模板分享给团队或社区,以及常见报错的排查思路。无论你是刚接触 Bot 开发的新手,还是已经在做 AI 应用集成的后端开发者,都能从中拿到可以直接改用的代码和配置。
1. Grok Bot 是什么?它解决了什么问题
1.1 从“对话助手”到“自动化 Bot”
我们在聊 Grok Bot 之前,先把概念理顺。Grok 本身是 xAI 推出的对话模型产品,主打实时信息和相对更开放的交互风格。而 Grok Bot 则可以理解为基于 Grok 模型能力构建的机器人应用,它会根据用户输入、触发器、上下文或外部事件,自动执行预设的回应动作。
传统聊天机器人的问题在于:所有逻辑都写在代码里,改一个话术就要改代码、重新部署。Grok Bot 则把“人设”“回应规则”“工具参数”“任务步骤”拆分成了模板,这让 Bot 的迭代效率一下子提高了不少。你不需要改核心代码,只需要在模板中调整提示词,Bot 的行为就会随之变化。
1.2 Grok Bot 的核心能力
从各方面资料来看,Grok Bot 的核心能力大致包括几个部分:
- 自然语言理解与生成:基于 Grok 模型完成对话、总结、问答、内容创作。
- 模板化配置体系:Bot 的系统提示词、用户提示词、参数、工具权限都可以写在模板中,分离度比较高。
- 工具调用:Bot 可以调用搜索、计算、API 请求等外部工具,适合做自动化任务。
- 发布与分享:Bot 模板可以导出、复制、分享给团队或者社区,降低重复搭建成本。
这些能力组合在一起,意味着你可以在十几分钟内,把一个业务场景变成一个可交互的 Bot,再通过模板方式快速复制到相似场景。
1.3 为什么“模板分享”这么重要
我个人理解,“模板分享”是 AI 应用走向工程化的一个关键节点。它本质上是在做“提示词工程 + 配置管理 + 工具编排”的封装。以前每个人都要从头调教一个 Bot,现在只需要找一个接近需求的模板,做小幅定制即可。
从团队协作角度看,模板分享也让“谁来配置 Bot”这个问题得到简化:业务人员负责写模板里的提示词,工程师负责维护工具和接口,配置人和代码人解耦。这也是我在很多项目里特别推荐模板化思路的根本原因。
2. 环境准备与版本说明
2.1 技术选型思路
在开始搭建之前,先明确一下你手里的环境。本文示例采用“Python 3.10 + OpenAI 兼容 API + .env 配置管理”这个组合,并在 Bot 逻辑中预留 Grok 接口的接入位置。由于 Grok 接口的版本和 API 参数在不同时期变化比较快,我不会把某一套固定版本号写成唯一标准,你实际使用时需要根据自己的 API 文档调整模型名称和请求参数。
如果你的环境里已经有可用的对话模型 API,不管是 Grok 还是兼容接口,都可以沿用本文的模板思路。模板的价值在于“结构可复用”,模型地址只是其中一个可替换变量。
2.2 本地开发环境准备
下面是我建议的本地环境:
| 依赖 | 建议内容 | 说明 |
|---|---|---|
| 操作系统 | Windows 10/11、macOS、Linux 均可 | 示例代码不依赖特定系统 |
| Python | 3.10 及以上 | 推荐 3.11,类型提示更友好 |
| 包管理工具 | pip 或 poetry | 示例用 pip 说明 |
| 代码编辑器 | VS Code 或 PyCharm | 便于调试 API 参数 |
| API 密钥 | Grok 或其他模型服务密钥 | 保存在 .env 中,不要提交到仓库 |
| Git | 2.x | 用于模板版本管理和分享 |
请先确认 API 服务商是否支持你所在网络环境访问。如果使用本地代理或内网接口,需要在 .env 中额外配置接口地址。
2.3 项目结构规划
模板化 Bot 项目结构会直接影响后续维护体验。我建议采用下面这种分层结构:
grok-bot-template/ ├── .env.example ├── requirements.txt ├── config/ │ ├── settings.py │ └── bot_template.yaml ├── core/ │ ├── bot.py │ ├── llm_client.py │ └── tools.py ├── templates/ │ ├── system_prompt.txt │ └── reply_format.txt ├── output/ │ └── logs/ └── main.py这种结构的优势在于:配置、提示词、工具函数、Bot 主逻辑完全分离。你分享模板时,只需要打包config、templates和核心代码,别人拿到之后第一件事就是改.env和bot_template.yaml。
3. 模板设计总览
3.1 模板里到底放什么
很多人以为模板只是一段系统提示词,其实远远不够。一个能快速复制到多场景的 Grok Bot 模板,至少应该包含四层内容:
- 场景定义层:说明这个 Bot 服务于什么业务场景。
- 人设与语气层:定义 Bot 的身份、说话风格、边界。
- 规则与约束层:定义什么该做、什么不该做、输出格式要求。
- 工具与参数层:定义可调用工具、环境变量、模型参数。
将这四层拆分后,模板不再是一段“死文案”,而是一套可配置的 Bot 运行规范。
3.2 提示词模板的结构
一段合格的 Bot 提示词模板,建议按照下面的顺序组织:
你是一个 [角色]。 你服务于 [目标用户/场景]。 你的任务目标是 [具体目标]。 你需要注意的约束有 [规则]。 当用户提出请求时,你需要先 [步骤一],再 [步骤二],最后 [步骤三]。 如果遇到无法处理的情况,请按 [兜底策略] 处理。这套结构的好处是:它把角色、目标、规则、步骤“显式”写出来,模型在推理时不容易丢失关键信息。很多模板效果不稳定,往往是因为约束和步骤混在一起,模型分不清优先级。
3.3 配置模板和代码解耦
模板分享另一个核心点是“配置与代码解耦”。我通常会使用 YAML 文件来保存 Bot 的运行时配置,代码里不写死任何业务关键词。
下面是一个 bot_template.yaml 的示例片段:
bot: name: "customer_service_bot" description: "面向售前咨询场景的客服机器人" model: "grok-3-latest" temperature: 0.7 max_tokens: 1024 prompt: system_prompt: "templates/system_prompt.txt" reply_format: "templates/reply_format.txt" tools: enabled: true search: true calculator: true fallback: response: "抱歉,这个问题我暂无法处理,请转人工客服。"注意,这里的model字段只是示例,具体值需要以你拥有的模型访问权限为准。配置解耦之后,你可以通过对不同用户使用不同的 YAML 文件,实现一套代码多套 Bot。
4. 完整实战:搭建一个可复用的 Grok Bot 模板
4.1 创建项目结构
按照上面的结构,我们开始搭项目。先创建根目录和子目录:
mkdir -p grok-bot-template/{config,core,templates,output/logs} cd grok-bot-template创建完成后,用tree或ls -R检查目录是否完整。接下来我们需要创建依赖文件、配置文件、提示词模板和核心代码。
4.2 添加依赖文件
requirements.txt 内容如下:
requests==2.31.0 python-dotenv==1.0.0 pyyaml==6.0.1安装命令:
pip install -r requirements.txt同时创建.env.example,用于记录环境变量模板:
# Grok 或兼容接口配置 LLM_API_KEY=your_api_key_here LLM_BASE_URL=https://api.example.com/v1 LLM_MODEL=grok-3-latest # 运行配置 BOT_NAME=customer_service_bot LOG_LEVEL=INFO复制一份为.env并填入真实密钥:
cp .env.example .env这里必须提醒你:.env文件不要提交到 Git 仓库,建议在.gitignore中把.env和output/logs/排除掉。
4.3 编写配置加载模块
路径:config/settings.py
这个模块负责加载环境变量和 YAML 模板配置,把配置统一封装成一个对象,方便其他模块调用:
import os from pathlib import Path import yaml from dotenv import load_dotenv BASE_DIR = Path(__file__).resolve().parent.parent load_dotenv(BASE_DIR / ".env") class Settings: def __init__(self): self.api_key = os.getenv("LLM_API_KEY") self.base_url = os.getenv("LLM_BASE_URL") self.model = os.getenv("LLM_MODEL", "grok-3-latest") self.bot_name = os.getenv("BOT_NAME", "grok_bot") self.log_level = os.getenv("LOG_LEVEL", "INFO") self.template = self.load_template() def load_template(self): template_path = BASE_DIR / "config" / "bot_template.yaml" with open(template_path, "r", encoding="utf-8") as f: return yaml.safe_load(f) settings = Settings()这里的逻辑并不复杂,关键点有两个:一是load_dotenv必须在导入阶段执行,否则后续模块读取不到环境变量;二是 YAML 解析统一放在 Settings 里,避免每个模块各自读文件。
4.4 编写大模型客户端
路径:core/llm_client.py
因为 Grok 接口和 OpenAI 兼容接口结构非常接近,我们可以用requests直接封装一个最小客户端。这样避免依赖过重的 SDK,也方便在模板演示中看清楚请求结构:
import json import time import requests class LLMClient: def __init__(self, api_key: str, base_url: str, model: str, timeout: int = 60): self.api_key = api_key self.base_url = base_url.rstrip("/") self.model = model self.timeout = timeout self.session = requests.Session() self.session.headers.update({ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", }) def chat(self, messages, temperature=0.7, max_tokens=1024): payload = { "model": self.model, "messages": messages, "temperature": temperature, "max_tokens": max_tokens, } url = f"{self.base_url}/chat/completions" try: response = self.session.post(url, json=payload, timeout=self.timeout) response.raise_for_status() return response.json() except requests.exceptions.Timeout: raise RuntimeError("请求模型接口超时,请检查网络或接口地址") except requests.exceptions.HTTPError as e: status_code = e.response.status_code if status_code == 401: raise RuntimeError("API 密钥无效,请检查 LLM_API_KEY") elif status_code == 429: raise RuntimeError("请求过于频繁,触发了限流,请稍后重试") raise RuntimeError(f"模型接口返回 HTTP {status_code}: {e.response.text}") def parse_reply(self, response): try: return response["choices"][0]["message"]["content"] except (KeyError, IndexError): raise RuntimeError("模型返回格式异常,请检查接口返回值") def retry_decorator(max_retries=3, delay=2): def decorator(func): def wrapper(*args, **kwargs): for attempt in range(max_retries): try: return func(*args, **kwargs) except RuntimeError as e: if attempt == max_retries - 1: raise time.sleep(delay) return wrapper return decorator注意,LLMClient.chat返回的是原始 JSON,而parse_reply负责提取最终回复文本。这样拆分的好处是:如果接口结构有变化,只需要修改parse_reply,不用动业务代码。
4.5 定义工具函数
路径:core/tools.py
一个 Bot 模板如果要支持自动化,必须有工具层。下面的代码定义了一个简单的工具注册表,后续可以扩展搜索、查询订单、调用内部 API 等能力:
class ToolRegistry: def __init__(self): self.tools = {} def register(self, name, func, description=None): self.tools[name] = { "func": func, "description": description or name, } def call(self, name, **kwargs): if name not in self.tools: raise ValueError(f"工具 {name} 未注册") return self.tools[name]["func"](**kwargs) def list_tools(self): return [{"name": k, "description": v["description"]} for k, v in self.tools.items()] def calculate_expression(expression: str) -> str: try: # 仅允许数字、四则运算符号,避免执行任意代码 if not expression.replace(" ", "").replace("+", "").replace("-", "").replace("*", "").replace("/", "").isdigit(): return "表达式包含不允许的字符" return str(eval(expression)) except ZeroDivisionError: return "除零错误" except Exception: return "表达式计算失败" registry = ToolRegistry() registry.register("calculator", calculate_expression, description="四则运算计算器")这里的calculate_expression使用了足够严格的白名单校验,避免用户输入进入eval造成安全问题。你在实际项目中如果要调用外部 API,应该把密钥放在配置文件中,不要硬编码在工具函数里。
4.6 编写 Bot 主逻辑
路径:core/bot.py
Bot 主逻辑负责把提示词模板、工具调用、对话历史串联起来:
import os from pathlib import Path from config.settings import settings from core.llm_client import LLMClient, retry_decorator from core.tools import registry class GrokBot: def __init__(self): self.client = LLMClient( api_key=settings.api_key, base_url=settings.base_url, model=settings.model, ) self.system_prompt = self._read_prompt("system_prompt.txt") self.reply_format = self._read_prompt("reply_format.txt") self.history = [] self.max_history_len = 20 def _read_prompt(self, filename): prompt_file = Path(__file__).resolve().parent.parent / "templates" / filename return prompt_file.read_text(encoding="utf-8") def build_messages(self, user_input): messages = [ {"role": "system", "content": self.system_prompt}, {"role": "system", "content": f"请按照以下格式回复:\n{self.reply_format}"}, ] # 历史消息只保留最近 N 条 start_index = max(0, len(self.history) - self.max_history_len) messages.extend(self.history[start_index:]) messages.append({"role": "user", "content": user_input}) return messages def process_tool_command(self, text): # 这里做一个极简工具触发:当文本以 !tool 开头时,调用注册工具 if not text.startswith("!tool"): return None parts = text.split(maxsplit=2) if len(parts) < 3: return "工具调用格式:!tool 工具名 参数" tool_name = parts[1] tool_params = parts[2] if tool_name == "calculator": return registry.call("calculator", expression=tool_params) return f"未识别的工具:{tool_name}" @retry_decorator(max_retries=3, delay=1.5) def reply(self, user_input): tool_result = self.process_tool_command(user_input) if tool_result is not None: return tool_result messages = self.build_messages(user_input) response = self.client.chat(messages) answer = self.client.parse_reply(response) self.history.append({"role": "user", "content": user_input}) self.history.append({"role": "assistant", "content": answer}) return answer这个类有两个值得注意的设计:一个是通过max_history_len限制上下文长度,避免对话特别长时把 token 消耗撑爆;另一个是把工具调用放在模型调用之前,让简单、确定性强的任务不经过模型推理,既省时间又省钱。
4.7 编写主入口
路径:main.py
主入口采用命令行交互方式,方便测试:
from core.bot import GrokBot def main(): bot = GrokBot() print("Grok Bot 模板演示已启动,输入 exit 可退出") print("内置工具:!tool calculator 表达式") while True: user_input = input("你:").strip() if user_input.lower() in ("exit", "quit"): break if not user_input: continue try: answer = bot.reply(user_input) print(f"Bot:{answer}") except Exception as e: print(f"Bot 出现错误:{e}") if __name__ == "__main__": main()到这里,一个最小可运行的 Grok Bot 模板项目就成型了。
4.8 运行与验证
启动命令:
python main.py预期交互输出大致如下:
Grok Bot 模板演示已启动,输入 exit 可退出 内置工具:!tool calculator 表达式 你:你好 Bot:你好,我是客服助手,请问有什么可以帮您? 你:!tool calculator (12+34)*2 Bot:92 你:exit如果你的模型接口没有正确配置,通常会直接抛出 API 密钥或网络错误。这时先检查.env文件,再检查接口地址是否可以访问。
5. 模板分享与扩展思路
5.1 分享前必须检查的清单
把模板分享给团队或社区之前,建议做一个自查,避免把密钥和敏感信息发出去:
| 检查项 | 说明 |
|---|---|
| 是否删除了 .env | 必须删除,只保留 .env.example |
| 是否检查代码注释 | 注释中不要出现真实密钥、内网地址 |
| 是否包含业务敏感性内容 | 去掉客户数据、内部策略 |
| 是否附带 README | 说明环境要求、启动方式、目录结构 |
| 是否锁定了依赖版本 | requirements.txt 中固定版本 |
做一次双向检查:一是检查版本库中有没有历史遗留密钥,二是检查代码中是否有绝对路径。这两点是模板分享最容易翻车的地方。
5.2 多轮对话模板
上面的例子已经实现了基础的历史消息保存,但是模板化项目还可以进一步把“多轮对话上下文长度”和“记忆摘要策略”配置化。比如在 YAML 中增加:
memory: max_history_len: 20 use_summary: false summary_trigger_len: 40这表示当历史超过 40 条时,可以先把较早的对话交给模型做摘要,再把摘要加入上下文。这个功能对于客服、教育、陪伴类 Bot 非常有用,因为它能在不无限增长 token 的情况下保留关键信息。
多轮对话的模板提示词也要做相应调整,比如在 system_prompt.txt 中加入:
你会收到一段对话历史,历史中可能包含之前已经回答过的内容。 请只基于最新问题的上下文作答,不要重复历史信息。 如果最新问题缺少关键信息,请主动询问用户补齐。5.3 工具调用模板
很多 Bot 模板现在都会加入“工具调用”能力。工具调用的本质是让模型输出一个结构化指令,然后由程序解析并执行。你可以把工具列表作为一个 JSON 数组发给模型,引导模型在需要时返回特定格式。
在 bot_template.yaml 中继续扩展:
tools: enabled: true definitions: - name: "calculator" description: "计算数学表达式" parameters: - name: "expression" type: "string" required: true - name: "search_news" description: "搜索实时资讯" parameters: - name: "keyword" type: "string" required: true代码里再增加一个parse_tool_call方法,负责解析模型输出的 JSON。这一步是模板从“聊天的 Bot”升级为“工作的 Bot”的关键。
5.4 定时任务模板
如果你要把 Bot 变成定时推送助手,比如每天早上汇总信息,可以设计一个独立的任务模板。它不是通过用户输入触发,而是通过调度器周期触发。以下是一个最小思路:
import time def scheduled_task(bot, task_text): for _ in range(5): answer = bot.reply(task_text) if answer: return answer time.sleep(5) return "定时任务执行失败"这类定时模板不建议在单机脚本中长时间运行,更推荐部署在云函数、容器服务或专门的调度平台上,保证重试和日志能力。
6. 常见问题与排查思路
6.1 问题列表
我把搭建与使用 Grok Bot 模板过程中常见的问题整理成一张表,方便快速定位:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
启动时提示找不到.env文件 | 没有复制.env.example为.env | 执行cp .env.example .env |
| 接口返回 401 | API 密钥错误或过期 | 重新生成密钥并更新.env |
| 接口返回 404 | base_url 路径不对 | 确认是否包含/v1等路径前缀 |
| 接口返回 429 | 触发限流 | 降低请求频率,启用重试与退避 |
| Bot 回答不遵循模板格式 | system_prompt 与 reply_format 冲突 | 简化格式要求,拆成明确步骤 |
| 中文回复乱码 | 控制台编码问题 | Windows 执行chcp 65001再运行脚本 |
| 工具调用无法触发 | 工具名或参数格式错误 | 检查!tool指令分隔符 |
| 对话历史越来越长 | 没有限制 max_history_len | 在配置中设置合适的长度阈值 |
6.2 排查流程建议
当你遇到问题时,建议按以下顺序排查:
- 先验证 API 可用性:用 curl 或 Postman 直接请求接口,确认密钥和参数无误。
- 再验证配置加载:临时打印
settings.api_key和settings.base_url,确认环境变量是否真的加载成功。 - 然后验证提示词模板:把系统提示词和用户输入直接放到接口调试工具中,观察输出。
- 最后验证工具链路:先手动调用工具函数,再通过 Bot 指令触发。
很多问题其实都卡在第二步,也就是环境变量没有读到。用.env文件时,一定要确认项目工作目录是否包含了.env,以及是否安装并正确执行了load_dotenv。
6.3 请求重试的坑
我在retry_decorator中给reply方法加了重试,但直接重试整个reply存在一个隐患:如果模型已经成功返回,只是parse_reply解析超时,重试就会重复扣费。更稳妥的做法是只对“网络请求失败”“5xx 状态码”“超时”这些异常重试,不要对“解析失败”重试。
实际项目中,可以把请求和解析拆开:
def safe_reply(self, user_input): for attempt in range(3): try: response = self.client.chat(self.build_messages(user_input)) return self.client.parse_reply(response) except (TimeoutError, ConnectionError): if attempt == 2: raise time.sleep(1) return None这段代码只重试网络层异常,不会因为解析失败而重复计费。
7. 最佳实践与工程建议
7.1 提示词模板的命名与版本管理
提示词文件建议遵循场景_用途.txt的命名规则,例如:
直接写在代码里的一句话,分享价值很低。我更推荐为每个模板维护一个简单的变更记录文件。比如templates/CHANGELOG.md,每次修改都要记录:改了什么、为什么改、验证结果如何。
7.2 敏感信息管理
这个是老生常谈,但每次都会被不少人忽略。分享模板时,我建议做到下面几点:
- 所有密钥只放
.env,并提交.env.example。 - 日志输出时过滤包含
Authorization、api_key的字段。 - 如果团队使用 Git,可以借助 Git 钩子或密钥扫描工具防止
.env被提交。 - 对外发布模板前,用
grep -r "sk-" templates/ core/这类命令扫一遍。
安全边界的核心原则是:最小权限。模型服务密钥只给运行环境使用,不要把它配置到前端代码或自动化测试公共配置中。
7.3 配置管理:把“人设”当配置,不把“人设”当代码
我在项目里见过很常见的一种坏味道:系统提示词被写死在代码里,每次业务要调一句话,都要后端开发介入。模板化思路最大的价值,就是避免这种耦合。
我推荐的模式是:
代码负责执行流程 YAML 负责运行时参数 TXT 负责提示词内容这样业务人员可以自行调整 Bot 人设,工程师只需要保证流程稳定。
7.4 日志与可观测性
Bot 应用比普通接口更依赖日志,因为你很难从一次回答中判断模型是否“正确”。建议在 Bot 的reply方法中加入结构化日志:
import logging logger = logging.getLogger("grok_bot") def reply(self, user_input): logger.info("receive input: %s", user_input[:100]) start_time = time.time() answer = ... logger.info("reply completed, cost=%.2fs", time.time() - start_time) return answer生产环境中,结构化日志字段至少应该包括:用户标识、会话标识、输入摘要、模型名称、响应耗时、token 消耗、是否触发了工具调用。这些字段能极大帮助你复盘线上问题。
7.5 生产部署注意点
直接用python main.py跑起来只适合本地验证。生产部署时,我建议考虑以下几点:
- 使用
gunicorn或uvicorn启动一个 HTTP 服务,而不是终端交互模式。 - 在服务网关层做限流与鉴权,防止 Bot 接口被刷。
- 把
.env换成配置中心或容器环境变量,避免配置文件散落在多台服务器上。 - 设置模型调用超时时间,避免用户长时间等待。
- 考虑成本控制:对单次请求的 max_tokens 做上限,对频率高的用户做降级策略。
7.6 模板分享的社区化思路
如果你打算把模板发布到社区,可以考虑按“场景模板包”的形式组织,而不仅仅是一个代码库。一个完整的场景包应该包含:
- README 说明文档
- 场景演示视频或截图
- bot_template.yaml 配置
- system_prompt.txt 和 reply_format.txt
- 测试用例或预期输入输出
- 版本变更记录
这套结构虽然稍微繁琐,但会给使用者带来极大的便利。真正有价值的模板分享,是别人拿到手之后能快速跑通,而不是收到一个没有说明、没有样例的空壳。
8. 延伸思考:从 Grok Bot 模板到自动化工作流
如果你已经能熟练搭建单个 Bot 模板,下一步可以去思考如何把多个 Bot 模板串成一条自动化工作流。比如一个客服 Bot 处理初步问题,如果识别到售后诉求,就把会话转给另外一个售后 Bot;售后 Bot 需要查询订单时,再通过工具调用内部服务。这种“Bot 编排”本质上解决的是复杂业务中多个 AI 节点的协作问题。
模板分享的下一步,自然也会从“分享一个 Bot”走向“分享一条工作流”。到那时,YAML 中不仅会有提示词和模型参数,还会有节点跳转条件、超时策略、回调地址、消息路由等编排配置。
回到本文开头提到的热点,SpaceX 砸下 2.2 亿处理管辖权问题,本质上也是在为技术资产配置一套规则边界;马斯克对 AI 风险的警告同样指向“边界”与“失控”。作为开发者,我们在构建 AI Bot 时最需要落实的,恰恰也是规则边界:什么能说、什么能做、什么情况下必须求助人类。Grok Bot 模板化恰好提供了一套把规则写进配置的机制。
如果你正在做自己的 Bot 模板,不要只追求“回答看起来很聪明”,更要关注它的可控性和可维护性。一个能稳定运行、方便排查、快速复用的模板,远比一个偶尔惊艳但行为不可预期的模板更有工程价值。