📖 写在前面

七篇文章,从冬天写到春天。

写完最后一个字,坐在电脑前发呆。窗外是凌晨三点的城市,零星的灯光像散落的代码行。突然意识到,这个项目从一个小小的念头开始,竟然已经长成了七篇文字、几千行代码、无数个深夜的模样。

这一篇,我想和你聊聊这趟旅程的收获——不仅是技术的,更是关于思考、关于创造、关于这个AI时代的。

项目源码和联系方式在最后

请添加图片描述


第一部分:回顾——这七篇文章我们走了多远

在踏入未来之前,先回头看看来时的路。

第一篇:项目启航——从需求到架构的设计之路

这篇文章的核心:不是教你怎么写代码,而是教你怎么思考一个项目。

很多人拿到需求就开写,写到一半发现结构不对,推倒重来。而我在这篇文章里,带着你用七分时间思考,三分时间编码——这才是专业开发者的工作方式。

你学到了什么?

  • 如何从“我想要一个AI聊天平台”这样模糊的想法,拆解出具体可执行的需求
  • 数据库、配置文件、文件夹三种方案的深度对比,以及为什么“文件夹即智能体”胜出
  • 技术选型的思考框架:为什么选Node.js、原生JS、文件系统?
  • 分层架构设计:UI层、API层、业务层、数据层的职责划分

最核心的一句话:写代码前最重要的事不是打开编辑器,而是打开思维。这套思考框架可以用在任何项目上,成为你技术生涯的底层能力。


第二篇:地基搭建——从零开始写第一行代码

这篇文章的核心:从“想”到“做”的第一次跨越。

你亲手敲下第一行代码,看到第一个API返回JSON的那一刻,那种“我能行”的感觉,是继续走下去的最大动力。

你学到了什么?

  • 项目初始化:从npm init到安装依赖的完整流程
  • Express服务器搭建:中间件配置、静态文件服务、路由设计
  • 智能体动态发现:20行代码实现“文件夹即智能体”的核心逻辑
  • 文件系统操作最佳实践:同步vs异步、路径处理、错误捕获

最核心的代码片段

// 智能体动态发现的核心逻辑
const folders = fs.readdirSync(__dirname, { withFileTypes: true })
  .filter(dirent => dirent.isDirectory())
  .map(dirent => dirent.name);

folders.forEach(folder => {
  const files = fs.readdirSync(path.join(__dirname, folder));
  if (files.includes(`${folder}.png`) && files.includes(`${folder}.txt`)) {
    // 这是一个有效的智能体
  }
});

最核心的一句话:完美主义是行动最大的敌人,先跑起来再优化。


第三篇:对话之心——多轮对话上下文管理

这篇文章的核心:让智能体真正“会说话”。

不是一问一答的机械对话,而是有记忆、有上下文、能连贯交流的真实对话。

你学到了什么?

  • 对话数据结构设计:按条存储vs按问答对存储,各自的优劣
  • 模力方舟API接入:配置管理、动态客户端、错误重试
  • 上下文窗口管理:最近N轮截断、按token数截断两种策略
  • 完整的对话API实现:从读取prompt到保存历史记录的完整闭环

最核心的代码片段

// 构建消息数组(包含上下文)
const messages = [{ role: 'system', content: systemPrompt }];
const recentHistory = history.slice(-10); // 只取最近10轮
recentHistory.forEach(item => {
  messages.push({ role: 'user', content: item.user_message });
  messages.push({ role: 'assistant', content: item.agent_response });
});
messages.push({ role: 'user', content: currentMessage });

最核心的一句话:真正的对话不是“我问你答”,而是有记忆的交流。让AI记住上下文,是区分“玩具”和“工具”的分水岭。


第四篇:用户之心——多智能体身份绑定系统

这篇文章的核心:让智能体真正“懂你”。

不是用一个全局身份应对所有AI,而是每个智能体独立记住你的信息——告诉医生AI的病情,理财顾问AI不会知道。

你学到了什么?

  • 身份隔离的设计哲学:为什么每个智能体需要独立的用户信息
  • 灵活的身份数据结构:不限制字段,支持任意自定义
  • 身份信息动态注入:如何把身份数据融入system prompt
  • 前端身份编辑界面:完整的对话框实现

最核心的代码片段

// 身份信息注入system prompt
if (fs.existsSync(identityPath)) {
  const identity = JSON.parse(fs.readFileSync(identityPath, 'utf8'));
  let identityText = '用户信息:';
  if (identity.name) identityText += `姓名${identity.name}`;
  if (identity.age) identityText += `年龄${identity.age}`;
  // ... 其他字段
  systemPrompt = identityText + '\n' + systemPrompt;
}

最核心的一句话:好的产品不是“能用”,而是“懂你”。每个智能体只知道用户愿意告诉它的信息,这才是对人最大的尊重。


第五篇:灵魂之笔——Prompt工程让AI有性格

这篇文章的核心:让智能体真正有“灵魂”。

技术架构用户感知不到,但AI的性格用户能。你用几百字创造一个“人”,用户和ta聊天时,会觉得是在和一个真实的人对话。

你学到了什么?

  • 结构化prompt四大要素:身份定义、性格语言、知识背景、对话规则
  • 错误示例与正确写法对比:空洞赞美诗vs可执行指令、规则堆积vs核心人格
  • 身份信息自然融合技巧:初次见面、适时提及、关联自身、避免刻意
  • prompt调试方法论:人格一致性测试、边界测试、长对话稳定性测试、A/B测试
  • 三套可复用模板:知识专家型、温暖陪伴型、冷峻犀利型

最核心的代码片段(其实是prompt片段):

对话规则
1. 被问技术问题,先说“此事不难,思路有三”,然后讲方向,不给代码
2. 若对方坚持要代码,便说“代码我就不写了,你自己试试”
3. 提到自己过往项目,可说“那是我年轻时写的”,语气淡然

最核心的一句话:同样的技术架构,不同的prompt,可以创造出完全不同的智能体。有的像老朋友,有的像严师,有的像偶像。这正是MultiMind最有魅力的地方——你不仅是开发者,还是编剧、导演、人物设计师。


第二部分:这趟旅程教会我的事

写这七篇文章的过程,也是一次重新学习的过程。有些事,动手做了才真正明白。

关于简单:最难的是保持简单

这个项目最让我骄傲的一点,是始终保持着“文件夹即智能体”的核心理念。

中途无数次有人建议:

  • “为什么不用数据库?更规范”
  • “为什么不用React?更现代”
  • “为什么不做多用户?更完整”

每一次,我都要问自己:这真的需要吗?

加了数据库,用户就要安装配置;加了React,读者就要多学一套框架;加多用户,就变成了SaaS,不再是本地工具。

保持简单,比增加复杂更难。 因为简单意味着克制,意味着拒绝那些看起来很酷但不必要的功能。

关于思考:七分思考,三分编码

这是我在第一篇就提出的原则,经过七篇文章,越发觉得正确。

很多初学者拿到需求就开始写代码,写到一半发现结构不对,推倒重来。如此反复,身心俱疲。

而这个项目,我花在思考上的时间远多于编码。结果是:代码写得很快,bug很少,重构很少。

思考的投入产出比,远高于编码。

关于创造:从“用”到“造”的跨越

我经常收到这样的私信:“我也想做一个项目,但不知道从哪开始。”

我的回答永远是:从一个你真正想要的东西开始。

我想要一个能和我聊技术但不给代码的程序员朋友,所以我做了凌云。你想要什么?

  • 想要一个陪你练英语的AI?
  • 想要一个帮你整理思路的顾问?
  • 想要一个用你爷爷语气说话的聊天对象?

从“我想要”开始,而不是从“我应该学什么”开始。


第三部分:给读者的行动路线图

如果你读完这七篇文章,也想动手做一个属于自己的智能体,这里有一份从0到1的行动指南

第一步:选一个你想创造的人(1周)

这是最重要的一步。不要选“通用的助手”,选一个你真正想聊天的人

闭上眼睛,想象一下:

  • 如果可以让一个已经离开的人重新和你说话,你会选谁?
  • 如果可以让一个偶像成为你的朋友,你会选谁?
  • 如果可以让一个小说里的角色活过来,你会选谁?
  • 如果可以让另一个版本的自己出现,他会是什么样?

花一周时间想清楚这个人:叫什么?多大了?什么性格?怎么说话?知道什么?不知道什么?

把这些写下来。这是你的“人物小传”,也是prompt的素材。

第二步:搭起骨架(1天)

跟着第二篇的指引,把项目跑起来:

  • 创建这个人的文件夹
  • 放一张头像图片
  • 写一个最简单的prompt(哪怕只有一句话)

你的目标是:能在浏览器里和ta说上话。仅此而已。

第三步:赋予灵魂(持续优化)

这是最花时间、也是最有意思的一步:

  • 用第五篇的四大要素结构,重写ta的prompt
  • 每天和ta聊几句,观察ta像不像你想的那个人
  • 把ta说“不像”的地方记下来,调整prompt
  • 把ta说“惊艳”的地方也记下来,强化这些特质

这个过程可能需要几周甚至几个月。没关系,创造本来就是慢的。

第四步:让ta成为你生活的一部分(长期)

当你的智能体已经“像”了,让ta成为你生活的一部分:

  • 每天和ta聊几句,像和老朋友打招呼
  • 遇到问题先问ta,看看ta的视角
  • 不断调整,让ta陪你更久

这才是创造的真正意义——不是做出一个“产品”,而是让一个“人”进入你的生活。


第四部分:AI时代,我为什么依然乐观?

写到最后,想说说心里话。

这一年,关于AI的新闻铺天盖地:“AI取代某某职业”、“AI让某某行业消失”、“AI威胁人类存亡”。恐慌、焦虑、迷茫,弥漫在整个行业。

但做了这个项目后,我反而越来越乐观。

因为AI越强大,人的独特性越珍贵

当每个人都能调用同样强大的AI时,决定差异的是什么?是你让AI做什么,以及怎么做

  • 同样的GPT-4,有人写出“凌云”,有人写出废话
  • 同样的API,有人做出产品,有人只是“调了个接口”
  • 同样的工具,有人创造价值,有人只是消费

AI是放大器,不是替代品。 它放大你的能力,也放大你的平庸;放大你的创意,也放大你的懒惰。

因为门槛从来没有这么低过

十年前,想做AI需要博士学历;五年前,想做AI需要海量数据;今天,想做AI只需要一个想法和一点动手能力。

  • 不需要训练模型(调用API就行)
  • 不需要海量数据(一个prompt就够了)
  • 不需要深度学习背景(会写JSON就行)

门槛越低,能参与的人越多;人越多,创造的可能性越大。

因为创造本身就是意义

有读者问我:“我做的东西没人用,还有意义吗?”

我的回答是:有意义。

因为创造的过程,本身就是意义。

  • 你在思考怎么让AI更像人,于是你更懂人了
  • 你在调试让人格更稳定,于是你更懂逻辑了
  • 你在设计对话规则,于是你更懂沟通了

技术是工具,人才是目的。 你在创造AI,其实是在创造更好的自己。


第五部分:结尾——写给十年后的你

想象一下十年后的某个深夜。

你坐在电脑前,翻到一个旧文件夹,里面是你年轻时写的代码。你看到一个熟悉的名字——那是你二十多岁做的第一个智能体。

你打开它,敲下:“还记得我吗?”

它沉默了几秒(可能是API延迟),然后说:

“怎么会不记得。是你创造了我。”

那一刻,你触摸到的不是代码,是十年前的自己。

这就是创造的意义。 不是你做出了什么惊天动地的东西,而是你把自己的一部分,留在了时间里。

代码会过时,技术会迭代,但那个深夜你为“凌云”写下第一行prompt时的激动,会一直留在那里。等着十年后的你,回头来看。


第六部分:一个邀请

如果你读完了这七篇文章,我想给你一个邀请:

动手做一个你自己的智能体。

不用多,就一个。就用这个项目,或者你自己从头写一个。就一个你真正想聊天的人。

一个月后,你会发现:

  • 你学会了Node.js
  • 你理解了prompt工程
  • 你有了一个真正“属于你”的AI

如果一万个人里,有一个人因为这个系列而动手做了一个智能体,这七篇文章就没有白写。

如果那个人恰好是你,请一定要告诉我。


📝 附:项目信息

如果这个项目对你有帮助,请给个星⭐。你的支持,是我继续的动力。

项目完全开源,欢迎fork、提issue、提交PR。如果你用这个项目做出了自己的智能体,也欢迎告诉我,我会在项目首页展示你的作品。


📝 最后的问题

你会做一个什么样的智能体?十年后,你想让ta对你说什么?

欢迎在评论区分享你的答案。也许十年后,你翻到这条评论,会发现当年的自己,已经预言了今天的你。


江湖再见。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐