☰
零基础入门:Agent系统全景架构深度解析(收藏版)——从LLM到MCP的编排层与记忆层配置实战
2026/9/28 18:28:48 网站建设 项目流程

1. 先搞清楚:Agent 系统到底由哪些层组成

很多人第一次接触 Agent,脑子里只有“大模型 + 工具调用”这一个模糊印象,结果一上手就卡在“为什么我的 Agent 记不住上一轮说了什么”“为什么工具调完就断了”。问题不在模型,而在于你缺了编排层和记忆层这两块拼图。

一个能跑起来的 Agent 系统,本质上是五层协作:推理核心(LLM)负责想,工具层负责做,记忆层负责记,技能层负责复用经验,编排层负责把前面几层串成一条能循环执行的链路。MCP 是工具层的扩展接口,Hook 是工具执行前后的拦截器。少了编排层,Agent 只能做单轮问答;少了记忆层,Agent 每轮都从零开始。

这篇面向零基础开发者,用一个最小可运行的 Agent 骨架,把 config.toml 和 settings.json 两份配置写清楚,再通过 TaoToken 统一 Key 通道接入 LLM,让你在本地跑通第一个“输入→推理→调工具→写记忆→输出”的完整闭环。不需要你之前搭过任何 Agent 框架,跟着配就行。

2. TaoToken 前置:统一 Key 与 API 通道准备

在写 Agent 骨架之前,先把模型调用通道打通。Agent 的推理核心需要一个稳定的 LLM 接口,TaoToken 在这里的角色是统一 Key 和 API 入口,让你不用在多个模型供应商之间来回切换配置。

你需要做三件事:注册账号、创建 API Key、确认接入地址。API 地址是https://taotoken.net/api,这个地址在后面的 config.toml 里会直接用到。Key 的创建入口在控制台的 API Keys 页面,生成后只显示一次,复制到本地环境变量里。

注意:Key 不要硬编码进 config.toml 提交到 Git,用环境变量注入。下面配置里用${TAOTOKEN_API_KEY}占位。

如果你后面要长期跑编码类 Agent 或做多轮 Agent 编排,可以顺带看一下 Coding Plan 的额度说明;只是验证模型通不通,用模型对话页面手动发一条请求就能确认 Key 是否生效。

3. 可复制配置:config.toml 与 settings.json

下面这份配置是一个最小 Agent 骨架的完整参数。编排层用简单的 while 循环实现,记忆层用本地 JSON 文件做跨会话存储,工具层先挂一个文件读写工具和一个 HTTP 请求工具,MCP 服务层留一个占位配置方便你后续扩展。

3.1 config.toml:模型与编排参数

[llm] provider = "taotoken" api_base = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" model = "claude-sonnet-4-20250514" max_tokens = 4096 temperature = 0.3 [orchestration] max_turns = 8 enable_plan_mode = true parallel_tools = false loop_detect_threshold = 3 [memory] short_term_window = 10 long_term_file = "./memory/MEMORY.md" vector_store = "local" vector_path = "./memory/vectors" [tools] enabled = ["file_read", "file_write", "http_request"] hook_pre_tool = "./hooks/pre_tool.py" hook_post_tool = "./hooks/post_tool.py" [mcp] enabled = false servers = []

max_turns控制单次任务最多循环几轮,防止 Agent 陷入死循环。loop_detect_threshold是连续相同工具调用超过 3 次就中断,这是编排层的基本保护。short_term_window决定短期记忆保留最近几轮对话,超出的会压缩后写入长期记忆文件。

3.2 settings.json:记忆层与工具层细项

{ "memory": { "short_term": { "type": "buffer", "max_messages": 10, "compress_on_overflow": true }, "long_term": { "type": "markdown", "path": "./memory/MEMORY.md", "append_mode": true }, "semantic": { "enabled": true, "embedding_model": "text-embedding-3-small", "top_k": 5 } }, "tools": { "file_read": { "allowed_paths": ["./workspace"], "max_size_kb": 512 }, "file_write": { "allowed_paths": ["./workspace"], "backup_before_write": true }, "http_request": { "timeout_seconds": 15, "allowed_domains": ["api.taotoken.net"] } }, "hooks": { "pre_tool": { "enabled": true, "checks": ["path_traversal", "domain_whitelist"] }, "post_tool": { "enabled": true, "log_path": "./logs/tool_calls.log" } } }

记忆层这里分了三种:短期用 buffer 存最近 10 条消息,溢出时压缩;长期用 Markdown 文件追加,跨会话可读;语义记忆用向量库做检索,top_k控制每次召回几条。工具层的allowed_paths和allowed_domains是安全边界,Hook 里的path_traversal检查防止 Agent 读写工作区以外的文件。

4. 验证请求:跑通第一个 Agent 闭环

配置写完后,用一段最小 Python 代码验证整条链路。这段代码不依赖任何 Agent 框架,直接读 config.toml 和 settings.json,手动实现编排循环。

import os import json import tomllib import requests with open("config.toml", "rb") as f: config = tomllib.load(f) with open("settings.json", "r") as f: settings = json.load(f) API_KEY = os.environ["TAOTOKEN_API_KEY"] API_BASE = config["llm"]["api_base"] def call_llm(messages): resp = requests.post( f"{API_BASE}/v1/messages", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={ "model": config["llm"]["model"], "max_tokens": config["llm"]["max_tokens"], "messages": messages }, timeout=30 ) resp.raise_for_status() return resp.json()["content"][0]["text"] def load_memory(): path = settings["memory"]["long_term"]["path"] if os.path.exists(path): with open(path, "r") as f: return f.read() return "" def save_memory(text): path = settings["memory"]["long_term"]["path"] os.makedirs(os.path.dirname(path), exist_ok=True) with open(path, "a") as f: f.write(f"\n{text}\n") memory = load_memory() messages = [ {"role": "system", "content": f"你是一个最小 Agent。历史记忆:{memory}"}, {"role": "user", "content": "读取 workspace/hello.txt 的内容并总结"} ] for turn in range(config["orchestration"]["max_turns"]): reply = call_llm(messages) print(f"[turn {turn}] {reply}") messages.append({"role": "assistant", "content": reply}) if "TASK_DONE" in reply: save_memory(f"完成任务:{reply[:200]}") break

运行前先建好workspace/hello.txt,内容随便写几行。执行python agent.py,你会看到模型返回工具调用意图,编排循环把结果追加回 messages,直到模型输出TASK_DONE或达到max_turns。成功后memory/MEMORY.md里会多一条记录,下次运行同一脚本时 system prompt 里就带上了这条历史记忆。

验证 Key 是否生效,也可以直接在模型对话页面发一条“你好”,确认返回正常再跑脚本,能省去排查网络问题的时间。

5. 本篇常见错排查

报错 401 Unauthorized:九成是环境变量没注入。检查echo $TAOTOKEN_API_KEY是否有输出,config.toml 里写的是${TAOTOKEN_API_KEY}占位,代码里用os.environ读取,不要直接把 Key 字符串写进 toml。

Agent 循环超过 max_turns 还没结束:先看loop_detect_threshold是否触发。如果模型反复调用同一个工具,把 temperature 降到 0.1,或者在 system prompt 里加一句“如果工具返回结果已满足需求,直接输出 TASK_DONE”。

记忆文件写入但下次没读到:检查long_term_file路径和代码里load_memory读的路径是否一致。settings.json 里写的是./memory/MEMORY.md,代码里从 settings 读,不要两处硬编码不同路径。

MCP 服务连不上:本篇mcp.enabled默认 false,先跑通基础闭环再开。开启后 servers 数组里每个服务需要单独配 command 和 args,MCP 服务层是工具层的扩展,不是必选层,零基础阶段可以先跳过。

Hook 报 path_traversal:Agent 试图读写allowed_paths以外的文件。把工作目录限制在./workspace下,或者调整 settings.json 里的allowed_paths,但不要直接关掉 Hook 检查。

6. 下一步:按需叠加编排与记忆

跑通上面这个闭环后,你已经有了一个最小可行 Agent。接下来按场景叠加:需要多步骤复杂任务,把enable_plan_mode打开,编排层会先出计划再执行;需要跨会话记住用户偏好,把append_mode保持 true,长期记忆会持续累积;需要接外部服务,再开 MCP 服务层,把 GitHub、数据库这些挂上去。

接入文档里有完整的 API 参数说明和 MCP 配置示例,遇到接入层报错先查那里。长期做编码类 Agent 的话,Coding Plan 的额度模型比按次调用更适合高频循环场景。先把今天这份 config.toml 和 settings.json 跑通,再逐步加层,比一上来堆全套架构稳得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询