1. 从一条会议任务说起:八个词到底在哪儿登场
刚接触 Agent 开发的工程师,几乎都会经历同一个阶段:Prompt 还没写利索,Context、RAG、Memory 就冒出来了;等你想让模型真正干点活,Tool、MCP、Skills、Agent、Harness 又排着队出现。每个词单独查都能看懂,凑在一起就分不清谁管谁。
我习惯用一条真实任务把它们串起来:“整理本周会议,生成待办,经我确认后发给相关同事。”这句话只交代了目标,但要真正做完,系统得先找到本周会议记录(RAG),读懂项目背景和你的偏好(Memory),认出谁负责、哪天截止(Prompt 里的规则),再调用任务系统和消息系统(Tool),中间还得处理缺失信息、等待你点头(Harness 的审批与权限)。
所以这八个词不是八个并列的技术,而是同一套 AI 系统里的不同分工。本文用一份可复制的config.toml/settings.json骨架当线索,把每个概念在配置里的落点讲清楚,最后用 TaoToken 统一 Key 把整条链路跑通。适合刚入门 Agent、想建立完整认知地图的工程师,读完你能拿到一份能直接改的配置骨架,以及逐项验证的动作。
2. 概念落点:八个词在配置骨架里各占哪一行
在动手写配置前,先把职责分四组,心里有个底。准备信息的:Prompt、Context、RAG、Memory;接工具和做法的:Tool、MCP、Skills;推进任务的:Workflow、Agent;控制运行的:Harness。真实产品里这些活经常交叉,一个组件身兼数职也正常。
先掰开三个最容易混的说法。模型只负责接收输入、生成文本或候选动作;AI 系统把模型、上下文、数据、工具、状态和控制机制组合起来;AI 产品在系统之上再加界面、账号、协作和计费。同一个模型装进不同系统,表现能差出一大截,换一套资料、换一批工具、换一种重试方式,它能做的事和容易犯的错都会变。
落到配置上,每个概念都有明确的归属:
| 概念 | 配置落点 | 一句话职责 |
|---|---|---|
| Prompt | [prompt]段 | 这一轮的任务说明 |
| Context | 运行时拼装 | 模型这次能看到的全部信息 |
| RAG | [rag]段 | 这次去哪检索资料 |
| Memory | [memory]段 | 跨会话记住什么 |
| Tool | [tools]数组 | 能调用的具体动作 |
| MCP | [mcp.servers] | 统一的连接方式 |
| Skills | [skills]段 | 可复用的做事方法 |
| Agent / Harness | [agent]/[harness] | 推进任务与运行控制 |
注意:Context 不是一个配置段,它是运行时把 Prompt、RAG 结果、Memory 召回、工具说明拼装出来的产物。你在配置里写的是“原料”,Context 是“上桌的那盘菜”。
3. TaoToken 前置:统一 Key 与接入地址
八个概念要跑起来,绕不开模型调用这一层。与其给每个组件单独配一套 Key,不如用 TaoToken 做统一入口,一个 Key 覆盖对话、编码、Agent 场景,配置里只维护一处凭证,换模型时改一行就行。
先拿到凭证。打开控制台创建 API Key:
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
接入地址统一用https://taotoken.net/api(这个地址不加 UTM 参数,直接写进配置)。如果你要对照参数含义,接入文档在这里:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite
长期做编码或跑 Agent 循环的话,Coding Plan 更划算,额度模型和按量调用不一样,可以先看:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite
拿 Key 的步骤不复杂:登录控制台 → 进入 API Keys → 新建 → 复制保存。这个 Key 只显示一次,务必先存到本地环境变量或密钥管理里,别直接写进会提交到 Git 的配置文件。下面骨架里我用${TAOTOKEN_API_KEY}占位,运行时从环境变量注入。
4. 可复制配置:config.toml 与 settings.json 骨架
下面这份config.toml把八个概念的落点全部标出来了。你可以直接复制,按注释替换成自己的值。我刻意把每个段落和概念一一对应,方便你对照理解。
# ============ 模型与统一接入 ============ [provider] name = "taotoken" base_url = "https://taotoken.net/api" api_key = "${TAOTOKEN_API_KEY}" # 从环境变量注入,勿硬编码 default_model = "claude-sonnet" # 按需替换为控制台可用模型 # ============ Prompt:这一轮的任务说明 ============ [prompt] system = """ 你是会议助理。整理本周会议,提取待办、负责人、截止时间。 先生成草稿,用户确认后再创建任务并发送消息。 """ output_format = "markdown" # ============ RAG:这次去哪检索资料 ============ [rag] enabled = true retriever = "hybrid" # 关键词 + 向量混合检索 top_k = 8 rerank = true sources = ["meeting_notes", "project_docs"] # ============ Memory:跨会话记住什么 ============ [memory] short_term = "session" # 当前会话与任务状态 long_term = "persistent" # 跨会话偏好与项目事实 recall_top_k = 5 # ============ Tool:能调用的具体动作 ============ [[tools]] name = "create_task" description = "在任务系统中创建待办" requires_approval = false [[tools]] name = "send_message" description = "向相关同事发送消息" requires_approval = true # 外发动作需人工确认 # ============ MCP:统一的连接方式 ============ [mcp.servers.calendar] transport = "stdio" command = "mcp-calendar" [mcp.servers.taskboard] transport = "http" url = "https://internal.example.com/mcp" # ============ Skills:可复用的做事方法 ============ [skills] dir = "./skills" auto_load = ["meeting-to-todo"] # 只加载名称与描述,按需展开 # ============ Agent:推进任务 ============ [agent] mode = "agent" # agent | workflow max_turns = 12 stop_on_approval = true # ============ Harness:运行与控制 ============ [harness] timeout_seconds = 120 max_retries = 2 sandbox = true trace = true eval = true如果你用的是 JSON 风格的工具(比如某些编辑器或 Agent 客户端),等价骨架如下:
{ "provider": { "name": "taotoken", "baseUrl": "https://taotoken.net/api", "apiKey": "${TAOTOKEN_API_KEY}", "defaultModel": "claude-sonnet" }, "rag": { "enabled": true, "retriever": "hybrid", "topK": 8 }, "memory": { "shortTerm": "session", "longTerm": "persistent" }, "tools": [ { "name": "create_task", "requiresApproval": false }, { "name": "send_message", "requiresApproval": true } ], "mcp": { "servers": { "calendar": { "transport": "stdio", "command": "mcp-calendar" } } }, "agent": { "mode": "agent", "maxTurns": 12 }, "harness": { "timeoutSeconds": 120, "sandbox": true, "trace": true } }几个关键点值得单独说。requires_approval是 Harness 权限控制的落点,外发消息这类高影响动作必须走审批,而创建草稿任务可以放行。mcp.servers里每个 Server 由 Host 建独立 Client 连接,Server 能提供 Resources、Prompts、Tools 三类能力,配置里只声明连接方式,具体能力由 Server 自己协商。skills.auto_load只加载名称和描述,完整说明和脚本等真正用到再读,这样技能攒多了也不会把 Context 挤爆。
5. 验证请求:逐项跑通并确认结果
配置写完不算完,得逐项验证。先设好环境变量,再发一个最小请求确认 Key 和地址通了:
export TAOTOKEN_API_KEY="你的Key" curl https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-sonnet", "messages": [ {"role": "system", "content": "你是会议助理"}, {"role": "user", "content": "整理本周会议,生成待办草稿"} ] }'返回里能看到choices[0].message.content就说明统一 Key 生效了。想先在网页里直观试模型效果,可以用模型对话:https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite
接着逐项验证八个概念是否真的接上了:
验证 RAG:问一个只有会议记录里才有的问题,比如“上周三评审会定了哪个截止日期”。如果回答引用了具体来源,说明检索链路通了;如果答得含糊,检查top_k和rerank是否生效。
验证 Memory:先告诉它“待办必须有负责人和截止时间”,开新会话再问“帮我建待办”,看它是否自动带上这两个字段。没带上就检查long_term是否真的持久化。
验证 Tool:让它“创建一个测试待办”,观察是否生成结构化调用请求。注意模型自己从头到尾没碰过工具,它只提要求,真正执行的是应用。
验证 MCP:让它“查一下我明天的日程”,看是否通过calendarServer 拿到数据。连不上先查 transport 和 command 路径。
验证 Skills:触发“会议转待办”,看它是否按 SKILL.md 里定义的字段和歧义处理规则执行。
验证 Harness:让它“把待办发给张三”,确认它在发送前停下来等你确认。没停就说明requires_approval没被强制执行。
跑完这一轮,你会对每个概念的边界有实感:Context Window 管一次能装多少,RAG 管这次去哪找,Memory 管以后记住什么,Cache 管哪些算过的能复用,各管各的。
6. 常见错排查:配置跑不通时先看这几处
报 401 或鉴权失败:九成是 Key 没注入成功。先echo $TAOTOKEN_API_KEY确认环境变量非空,再检查配置里是不是误把占位符当成了真实值。别把 Key 硬编码进会提交的文件。
RAG 检索不到内容:先确认sources指向的索引是最新的。资料源和索引不更新,答案照样过时。检索回来的片段只是候选资料,不等于证据,来源靠不靠谱、能不能撑住结论,都得核对。
Memory 不生效:短期记忆和长期记忆是两回事。当前会话状态丢了,检查 session 是否被正确传递;跨会话偏好丢了,检查持久化存储是否真的写入。记住,这些内容是应用替模型写入、更新、取回、删除的,模型自己不会永久记住。
MCP 连接超时:stdio 类型检查 command 是否在 PATH 里,http 类型检查 url 可达性和鉴权。MCP 只管双方怎么连接、怎么说话,业务权限和审批沙箱得靠协议外面的系统负责。
Agent 循环停不下来:检查max_turns和停止条件。Agent 一圈一圈循环,直到任务完成、触发停止条件,或者需要人来拿主意。没有明确停止条件就会一直转。
外发动作没等确认就执行:这是最危险的。确认requires_approval在 Harness 层被强制执行,而不是只写在工具描述里。权限要由 Host、操作系统或外部服务强制执行,审批不能替代底层权限与沙箱。
Prompt Injection 风险:网页、邮件、会议文档、工具结果都可能夹带诱导指令。把外部内容当低信任数据处理,配上内容隔离、最小权限、审批和输出验证。风险最高的路径通常同时满足三个条件:能读私有数据、会接触不可信内容、还能往外发消息。三样凑齐就危险,办法是把权限拆开,外发或写入步骤加人工确认。
7. 下一步:把骨架接进你的项目
这份骨架的价值在于,它把八个抽象概念变成了八行能改的配置。你可以先只填provider和prompt跑通最小闭环,再逐段打开 RAG、Memory、Tool,最后接 MCP 和 Skills。每打开一段就做一次上面的验证动作,别一次性全开,出问题不好定位。
统一 Key 的好处在这里体现得最明显:无论你后面接的是对话、编码还是 Agent 循环,凭证和地址都只维护一处。需要对照完整参数时翻接入文档,想先试模型效果就去模型对话,长期跑编码和 Agent 任务就上 Coding Plan。把配置骨架存好,下次开新项目直接复制,改几行就能跑。