AI Agent 从零到一:一个文科生的实战学习之路
从被质疑「不懂 AI」到自己动手构建 AI Agent,用实际项目理解 Agent 能力边界
#AI Agent
#Raycast
#LLM
#MCP
#实战教程
为什么要自己造一个 AI Agent?
在一次小组周会上,作者被同事质问「你懂 AI 吗」,这成为了他开始深入学习的动力。与其停留在概念层面,他决定从零开始构建一个 AI Agent,通过实际动手来理解 Agent 的能力边界。
明确目标:Agent 要做什么?
作者为自己设定了三个核心目标:
- 能正常聊天 — 基础的对话交互能力
- 能管理待办和笔记 — 创建、整理待办事项和笔记
- 能获取实时信息 — 获取少数派的派早报、栏目摘要等
关键原则:
- 不直接使用任何 AI 框架,代码从零开始编写
- 核心脉络和迭代方向由自己掌控,不交给 AI 全权处理
技术选型与架构
作者的 AI Agent 以 Raycast 插件 的形式实现,这样做的好处是避免了处理复杂的 UI/UX 工程问题,可以专注于 Agent 的核心逻辑。
核心组件
- LLM 接口层:对接 OpenAI/Anthropic 等模型提供商
- 工具调用(Function Calling):让 Agent 能够操作待办、笔记等
- MCP(Model Context Protocol):扩展 Agent 的能力边界
- 上下文管理:维护对话历史和系统提示词
学习路径与收获
第一阶段:理解 LLM 基础
在动手编码之前,先理清了大语言模型的工作原理:
- Token 和上下文窗口的概念
- System Prompt 与 User Prompt 的区别
- Temperature、Top-P 等参数的作用
- 流式输出(Streaming)的实现原理
第二阶段:实现基础对话
// 核心对话循环的简化示意
async function chat(message: string, history: Message[]) {
const response = await llm.chat({
model: "claude-sonnet-4-6",
messages: [
{ role: "system", content: SYSTEM_PROMPT },
...history,
{ role: "user", content: message }
]
});
return response;
}
第三阶段:添加工具能力
让 Agent 能够执行实际操作,关键在于定义清晰的工具接口:
const tools = [
{
name: "create_todo",
description: "创建一个新的待办事项",
parameters: {
title: "待办标题",
priority: "high | medium | low",
dueDate: "截止日期(可选)"
}
},
{
name: "create_note",
description: "创建一条新笔记",
parameters: {
content: "笔记内容",
tags: "标签列表(可选)"
}
}
];
第四阶段:集成 MCP
通过 MCP(Model Context Protocol),Agent 可以:
- 读取外部数据源
- 调用第三方服务 API
- 扩展工具生态,无需修改 Agent 核心代码
关键经验总结
1. 不要一开始就追求完美
先用最简单的实现让 Agent 跑起来,再逐步迭代。第一个版本可能只是能回复「你好」,但这已经是一个完整的对话循环。
2. 提示词工程很重要
System Prompt 的质量直接决定了 Agent 的行为表现。好的提示词需要:
- 明确 Agent 的角色定位
- 设定清晰的行为边界
- 提供具体的输出格式要求
3. 错误处理不可忽视
LLM 的输出具有不确定性,必须做好:
- API 调用失败的降级处理
- 模型输出格式的校验
- 超时和重试机制
4. 测试驱动开发
为 Agent 的每个能力编写测试用例,确保:
- 工具调用参数正确
- 异常输入不会导致崩溃
- 对话上下文的正确维护
结语
从被质疑「不懂 AI」到成功构建自己的 AI Agent,这个过程证明了学习 AI 的最好方式就是动手实践。软件工程本质上是实践学科,没有什么比「重造一个轮子」能带来更深刻的理解。
本文基于少数派社区文章整理,原文探讨了 AI Agent 开发的学习路径和实践经验,旨在帮助更多人跨越从理论到实践的鸿沟。