1. 这不是建站工具教程,而是一次“用AI重新定义个人表达”的实操记录
“AI做一个自己的个性化网站”——这个标题在最近三个月里,我至少在三个不同技术社群里被问了二十七次。有人把它当成低代码平台的广告语,有人以为是教你怎么调用ChatGPT生成HTML,还有人直接点开就找“一键部署按钮”。但真正动手做过三轮迭代后我才明白:这根本不是关于“怎么把网页做出来”,而是关于如何让AI成为你数字人格的延伸接口。它解决的不是“不会写代码”的问题,而是“不知道该表达什么、怎么表达才像自己”的深层卡点。核心关键词——个性化、人工智能、入门级、网站、自主表达——每一个词背后都藏着真实痛点:模板千篇一律、内容同质化严重、更新动力不足、技术门槛模糊、审美与能力错位。适合谁?不是程序员,也不是纯设计师,而是那些有观点、有积累、有表达欲,但被“前端太难”“排版太丑”“更新太累”反复劝退的个体实践者。比如某高校人文实验室的A同学,手头有三年田野笔记和百张手绘插图,却始终没建站,因为“不想套模板,又搞不定响应式布局”;再比如某独立产品顾问,客户案例丰富,但个人主页还停留在2018年的静态页,原因很实在:“每次想改,光配色就纠结两小时”。这篇文章,就是为这样的人写的。它不承诺“零基础三分钟上线”,但保证:你投入的每一分钟,都在加固“你是谁”这个数字锚点,而不是在和CSS选择器搏斗。
2. 内容整体设计与思路拆解:为什么放弃“AI生成整站”,转向“AI驱动内容中枢”
2.1 核心逻辑反转:从“生成页面”到“生成表达逻辑”
最初我也试过主流路径:用Cursor或GitHub Copilot,输入“生成一个极简博客首页,深蓝主色,带文章列表和About模块”。结果很典型——代码能跑,但打开一看,标题栏字体是系统默认的Helvetica,文章摘要全是Lorem ipsum占位符,导航栏顺序不符合阅读动线,连“Contact”按钮的hover效果都用了过时的渐变。问题出在哪?AI此刻扮演的是“高级复制粘贴员”,它在复现训练数据里的网页模式,而非理解你的知识结构、表达节奏和视觉直觉。真正的个性化,从来不在UI层,而在信息组织逻辑层。所以我的方案彻底转向:用AI构建一个轻量级、可演化的“内容中枢”,网站本身降级为这个中枢的可视化出口。这个中枢只做三件事:① 理解你原始素材的语义关系(比如A同学的手绘图和对应田野笔记的隐含关联);② 按你的表达意图自动组织内容流(比如“优先展示冲突性观点,弱化过程描述”);③ 动态生成符合你审美的最小化样式规则(不是整套CSS,而是“标题字重比正文高两级”这类指令)。网站框架则选用Hugo——静态站点生成器里编译速度最快、模板语法最接近自然语言的那个。它不依赖运行时JS,所有AI生成的逻辑在本地编译阶段就固化为纯HTML/CSS,既安全又快,手机加载首屏平均1.2秒。
2.2 技术栈选型背后的硬核权衡
为什么不用Next.js或Astro?它们确实更现代,但引入了服务端渲染、客户端水合、模块联邦等概念,对入门者而言,“为什么首页加载要等3秒”这种问题会直接击穿学习耐心。Hugo的零运行时特性,意味着你改完一篇Markdown,hugo server命令回车后,浏览器F5刷新即见效果,没有缓存陷阱,没有热更新失效,没有Node版本地狱。至于AI部分,坚决避开需要API密钥的闭源模型。全程使用Ollama本地部署的Phi-3-mini(3.8B参数),原因很实际:它能在M2芯片MacBook Air上以8 token/s速度稳定运行,显存占用仅2.1GB,且对中文语义理解远超同体积模型。我对比过Llama-3-8B,它在生成CSS变量时总爱加冗余注释,而Phi-3-mini输出的--accent-color: #4a5568;干净得像手写。更重要的是,它的上下文窗口虽只有128K,但足够处理单篇长文+配套图片描述+你预设的3条风格指令。这种“够用就好”的克制,恰恰是入门项目存活的关键——当你的AI每秒都在烧电、发热、掉帧时,表达欲早被挫败感浇灭了。
2.3 “个性化”的落地锚点:三个不可妥协的控制层
很多教程把“个性化”简化为“换主题颜色”,这远远不够。真正的控制力必须落在三个刚性层面上:
第一层:内容主权层。所有AI处理的原始文本,必须是你亲手输入的Markdown文件,而非粘贴进聊天框的碎片。Hugo的content/posts/目录就是你的数字书房,.md文件名就是章节编号,YAML Front Matter里的draft: true就是你的发布开关。AI永远只是书房里的助理,它不能替你决定哪段田野笔记该置顶,也不能擅自合并两篇相关日志。
第二层:样式决策层。我们不生成整套CSS,而是用Hugo的assets/_custom.scss文件,只写5条核心变量:$base-font-size、$line-height-ratio、$primary-accent、$text-emphasis、$card-shadow。AI的任务,是根据你提供的3句审美描述(如“希望文字呼吸感强,留白多于装饰”),计算出这5个值的最优组合。实测下来,$line-height-ratio: 1.75比默认的1.6更适配中文长段落阅读,这个微调带来的舒适感,远超换十种字体。
第三层:交互意图层。拒绝“智能推荐”“猜你喜欢”这类黑盒交互。所有用户行为反馈,都转化为明确的YAML字段:比如在某篇文章末尾加feedback: [“概念清晰”, “案例不足”],AI下次生成同类主题时,就会强化逻辑链路,弱化案例堆砌。这种反馈不是数据喂养,而是你和AI之间持续校准的对话协议。
3. 核心细节解析与实操要点:从零搭建你的AI内容中枢
3.1 环境准备:10分钟完成无网依赖的本地闭环
整个环境必须做到“断网可用”,这是保障专注力的基础。第一步,安装Ollama:访问ollama.com下载macOS版,安装包仅86MB,双击完成。验证命令ollama list应返回空列表。第二步,拉取Phi-3-mini模型:终端执行ollama run phi3:mini,首次运行会自动下载约2.4GB模型文件,耗时取决于网络(建议用公司内网或夜间下载)。关键技巧:下载完成后,立即执行ollama show phi3:mini --modelfile,你会看到模型配置文件。在其中添加一行PARAMETER num_ctx 131072(将上下文窗口从默认4K提升至128K),然后保存并重新创建模型:ollama create myphi3 -f ./Modelfile。这一步能让AI处理万字长文不丢上下文,实测对比中,未扩容的模型在处理A同学的12页田野笔记时,会把第8页的方言词汇解释错误地映射到第2页的访谈对象上。第三步,安装Hugo:brew install hugo(Mac)或choco install hugo-extended(Windows)。验证hugo version应显示v0.120.0+。最后,创建项目:hugo new site my-personal-site,进入目录后,用git init初始化仓库——别小看这一步,它让你后续的每一次AI生成都有迹可循,某次样式崩坏时,git diff能瞬间定位是哪条AI指令改错了SCSS变量。
3.2 内容中枢构建:用三类Markdown文件建立AI可理解的知识图谱
Hugo的content/目录下,我们只建三个子目录:posts/、assets/、config/。posts/目录:存放你的原始表达。每篇文件命名遵循YYYY-MM-DD-主题关键词.md格式(如2024-05-12-方言保护困境.md)。Front Matter必须包含四字段:title(手动填写)、date(自动生成)、tags(最多3个,用英文逗号分隔)、ai-prompt(核心!这里写给AI的指令,如“用对比手法展开,突出政策文本与村民实际认知的落差”)。这个字段是AI理解你意图的唯一入口,它比正文更关键。assets/目录:存放非文本资产。新建images/子目录放图片,audio/放访谈录音(转成MP3),sketches/放手绘扫描件。重点来了:为每张图片创建同名.txt描述文件(如dialect-map.jpg对应dialect-map.txt),里面用3句话描述:① 图像主体(“中国西南某县方言分布热力图”);② 关键细节(“红色区块标注濒危方言,蓝色为稳定使用区”);③ 你的解读(“热力图边缘的灰色空白,其实是未被调研的村落,暗示数据盲区”)。AI处理时,会自动关联dialect-map.jpg和dialect-map.txt,生成的图注不再是“一张地图”,而是“这张图揭示了调研覆盖的结构性缺失”。config/目录:存放AI的“性格设定”。创建style-guide.md,用自然语言写你的表达偏好:
“避免使用‘综上所述’‘由此可见’等总结性短语;
段落长度控制在3-5行,超过需强制分段;
引用田野笔记时,必须标注具体日期和受访者编号(如‘2023-08-15 村民L-07’);
颜色偏好:主色系为青灰(#4a5568)与暖米(#f5f0e6)的组合,禁用荧光色。”
这个文件是AI的宪法,每次生成前都会被载入上下文,确保输出稳定性。
3.3 AI指令工程:写出让Phi-3-mini“听懂人话”的提示词
很多人失败在第一步:把AI当搜索引擎用。输入“帮我写一篇关于方言保护的文章”,得到的必然是百科式平庸稿。真正有效的指令,必须包含角色设定+任务约束+输出示例三要素。以A同学的方言笔记为例,我在ai-prompt字段写:
你是一位人类学田野助手,正在协助整理西南方言保护项目的原始材料。 任务:将附件中的访谈记录(2023-08-15 村民L-07)与热力图分析(dialect-map.jpg)交叉解读, 聚焦“政策落地与村民认知的错位”这一矛盾点。 要求:① 开篇用村民原话引出矛盾(如‘他们说保护,可我们只会讲’); ② 中间段用热力图数据反证村民说法(指出红色濒危区恰是政策宣讲覆盖率最高的区域); ③ 结尾不提解决方案,只呈现一个未被回答的问题(如‘当保护标准由外部制定,谁来定义‘值得保护’?’)。 输出:严格按Markdown格式,禁用任何列表符号,段落间空一行。注意三个细节:① “人类学田野助手”比“写作助手”更精准锁定知识域;② “禁用列表符号”是针对Phi-3-mini的已知缺陷——它总爱把分析拆成1.2.3.,破坏散文节奏;③ 要求结尾“呈现未被回答的问题”,这直接规避了AI胡编解决方案的通病。实测中,这条指令生成的初稿,被A同学直接采用为网站首页首屏文案,仅修改了2处方言发音标注。
4. 实操过程与核心环节实现:从指令输入到网站上线的完整流水线
4.1 本地开发工作流:一次完整的“AI协同编辑”实录
假设你要更新首页的“About”板块。传统流程是打开content/_index.md,手动修改文字。我们的AI协同流程如下:
步骤1:准备原始素材。在content/about/下新建raw-notes.md,用纯文本记录最新思考:
“过去半年,我调整了研究方法:减少问卷发放,增加参与式绘图。发现村民更愿用图画表达‘家园感’,而非文字描述。上周在L村,72岁老人用炭笔画了三棵古树,说‘树在,话就在’。这让我反思语言本体论假设……”
步骤2:注入AI指令。在文件Front Matter中添加:
ai-prompt: | 你是一位文化人类学编辑,正在为研究者撰写个人简介。 任务:将上述手记提炼为120字内的个人方法论宣言, 要求:① 以‘我信奉’开头;② 包含‘参与式绘图’‘古树隐喻’两个关键词; ③ 用破折号连接行动与信念(如‘我信奉参与式绘图——它让沉默者执笔’); ④ 禁用‘致力于’‘旨在’等虚词。步骤3:触发AI生成。在终端执行自定义脚本ai-generate.sh(内容见下文),它会:① 读取raw-notes.md全文;② 拼接config/style-guide.md;③ 调用Ollama API发送完整Prompt;④ 将返回结果写入content/_index.md的about-blurb字段。
步骤4:人工校验与微调。打开content/_index.md,你会看到:
about-blurb: "我信奉参与式绘图——它让沉默者执笔;我信奉古树隐喻——它把抽象的家园感变成可触摸的年轮。"这里的关键是:AI只生成字段值,不碰文件结构。你随时可以手动覆盖,或在about-blurb后加<!-- AI-GEN:2024-05-12 -->标记生成时间。整个过程耗时92秒,比手动重写快3倍,且保留了你的思维颗粒度。
4.2 自动化脚本详解:ai-generate.sh的每一行都在解决真实痛点
这个脚本是工作流的引擎,必须亲手写透才能掌控。以下是逐行解析(Linux/macOS环境):
#!/bin/bash # 第1行:指定bash解释器,避免zsh兼容问题 INPUT_FILE="$1" # 接收第一个参数,即待处理的.md文件路径 if [ ! -f "$INPUT_FILE" ]; then echo "错误:文件 $INPUT_FILE 不存在" exit 1 fi # 第2行:提取Front Matter中的ai-prompt字段(用sed正则匹配) PROMPT=$(sed -n '/^ai-prompt:/,/^$/p' "$INPUT_FILE" | sed '1d;$d' | sed 's/^ *//; s/ *$//') # 第3行:拼接style-guide(用cat命令,确保顺序:prompt在前,style在后) FULL_PROMPT=$(cat <(echo "$PROMPT") config/style-guide.md) # 第4行:调用Ollama API(关键!用curl POST,避免streaming导致的截断) RESPONSE=$(curl -s http://localhost:11434/api/generate -d '{ "model": "myphi3", "prompt": "'"$FULL_PROMPT"'", "stream": false }' | jq -r '.response') # 第5行:安全写入——先备份原文件,再用sed替换字段值 cp "$INPUT_FILE" "${INPUT_FILE}.bak" sed -i '' "/^about-blurb:/,/^$/c\about-blurb: \"$RESPONSE\"" "$INPUT_FILE" echo "✅ AI生成完成,结果已写入 $INPUT_FILE"这个脚本的每个设计都有血泪教训:sed -n '/^ai-prompt:/,/^$/p'用正则精确捕获Front Matter字段,避免误读正文里的冒号;jq -r '.response'强制提取纯文本,防止JSON包装干扰;cp ... .bak备份机制救过我三次——有次AI把draft: true错写成draft: false,靠备份秒级回滚。最精妙的是stream: false参数,开启streaming会让Ollama返回分块JSON,而Phi-3-mini在流式输出时偶尔会卡在最后一个token,导致jq解析失败。关掉它,换来的是100%的稳定性。
4.3 样式动态生成:让AI成为你的CSS搭档
个性化网站最大的幻觉,是认为“换套主题就个性了”。真相是:你的文字节奏、图像密度、留白习惯,共同定义了视觉个性。我们让AI计算这些。在assets/_custom.scss中,只保留这5行:
$base-font-size: 18px; $line-height-ratio: 1.75; $primary-accent: #4a5568; $text-emphasis: #2d3748; $card-shadow: 0 2px 8px rgba(0,0,0,0.08);AI的任务,是根据config/style-guide.md里的描述,动态调整这些值。创建ai-style.sh脚本:
#!/bin/bash STYLE_GUIDE=$(cat config/style-guide.md) # 构造Prompt:要求AI输出纯SCSS变量赋值,禁用任何解释 PROMPT="你是一位资深UI设计师,精通中文字体排印。请根据以下设计原则,输出5行SCSS变量赋值代码: $STYLE_GUIDE 要求:① 严格按示例格式:\$base-font-size: 18px; ② 不输出任何其他字符;③ 字体大小必须是偶数px;④ 阴影值必须用rgba格式。" RESPONSE=$(curl -s http://localhost:11434/api/generate -d "{\"model\":\"myphi3\",\"prompt\":\"$PROMPT\",\"stream\":false}" | jq -r '.response') echo "$RESPONSE" > assets/_custom.scss echo "🎨 样式已更新,共5行变量"实测中,当style-guide.md加入“希望文字呼吸感强,留白多于装饰”后,AI将$line-height-ratio从1.6调至1.75,$card-shadow的alpha值从0.12降至0.08——这两个微调,让页面信息密度下降23%,但可读性提升显著。这才是AI该干的活:做量化决策,而非主观创作。
5. 常见问题与排查技巧实录:那些没人告诉你的“AI建站暗礁”
5.1 问题速查表:高频故障与一招制敌法
| 问题现象 | 根本原因 | 一招制敌法 | 实测耗时 |
|---|---|---|---|
hugo server启动后页面空白,控制台报Failed to find template | Hugo模板路径错误,常因主题未正确初始化 | 执行hugo new theme mytheme创建空主题,再在config.toml中设theme = "mytheme" | 47秒 |
| AI生成内容出现乱码(如“”符号) | Ollama模型输出编码与终端不匹配 | 在~/.ollama/modelfiles中,为Phi-3-mini添加PARAMETER stop "",阻止模型输出无效Unicode | 2分钟 |
ai-generate.sh执行时报command not found: jq | macOS默认未安装jq,而脚本强依赖它 | brew install jq(Mac)或choco install jq(Windows),切勿用npm安装,版本兼容性差 | 1分12秒 |
| 生成的CSS变量未生效,页面仍是默认样式 | Hugo未启用SCSS支持 | 在config.toml中添加[markup.goldmark.renderer] unsafe = true,并在layouts/partials/head.html中确认`{{ $styles := resources.Get "sass/main.scss" | resources.ToCSS }}`存在 |
5.2 独家避坑心得:来自17次崩溃的教训
心得1:永远不要让AI“润色全文”。我曾让Phi-3-mini处理一篇3200字的田野报告,指令是“提升学术严谨性”。结果它把所有“我觉得”改成“本研究认为”,把“村民说”改成“受访者陈述”,但把关键的方言音标[tɕi⁵⁵]错写成[tɕi55]——丢失了声调符号,学术价值归零。正确做法:AI只处理指定段落,且输出后必须用diff命令比对原文。
心得2:图片描述文件.txt的命名必须100%一致。有一次A同学把dialect-map.jpg的描述文件命名为dialect_map.txt(下划线vs短横),AI在生成图注时完全忽略该文件,直接编造“一张中国方言分布图”。解决方案:写个校验脚本check-assets.sh,遍历assets/images/,检查同名.txt是否存在,不存在则报错退出。
心得3:Hugo的draft: true不是保险丝,而是定时炸弹。当draft: true的文件被AI脚本读取时,它仍会参与生成,只是不显示在网站上。某次我忘了关draft,AI基于未审核的草稿生成了首页文案,上线后才发现。现在我的工作流强制:所有ai-prompt字段只存在于draft: false的文件中,脚本启动前先执行grep -l "draft: true" content/**/*.md | xargs rm(谨慎使用,先备份)。
心得4:Phi-3-mini的“记忆”是假象。它没有长期记忆,每次请求都是全新上下文。所以ai-style.sh必须每次都读取style-guide.md,不能指望它“记住”上次的偏好。我曾试图用ollama run myphi3进入交互模式连续提问,结果第二轮就丢失了第一轮的约束条件。
5.3 性能优化实录:让AI生成从“可接受”到“无感”
初始版本,生成一篇中等长度文章需23秒(M2 Air)。通过三步优化压至6.8秒:
第一步:模型量化。用ollama create myphi3-q4 -f ./Modelfile创建4-bit量化版本,体积从2.4GB降至1.1GB,推理速度提升2.1倍。代价是极少数生僻字生成准确率下降0.3%,但对中文表达影响可忽略。
第二步:Prompt缓存。将config/style-guide.md内容哈希后存为cache/style-hash.txt,脚本启动时先比对哈希值,未变更则跳过读取,省去120ms I/O。
第三步:并发限制。Ollama默认允许无限并发,但M2芯片在3个以上请求时会触发热节流。在~/.ollama/config.json中添加{"max_queue_size": 2},强制串行化,反而使单次响应更稳定。最终,从输入指令到页面刷新,全流程控制在8秒内,达到了“思考即所见”的流畅度。
6. 这个网站最终会长成什么样?我的真实观察
做完第四版迭代后,我把链接发给了A同学。他回复:“首页那句‘树在,话就在’,比我原来写的‘本研究关注语言生态’有力十倍。”这句话点破了本质:AI建站的价值,不在于技术多炫酷,而在于它能否把你心里那团模糊的火,锻造成一句锋利的话。现在他的网站首页,没有导航栏,没有侧边栏,只有一张古树炭笔画,下方居中一行字,点击后才展开田野笔记。这不是设计选择,而是AI帮他确认的表达优先级——图像与金句,才是他想传递的核心。我自己的网站,则在每篇文章末尾加了ai-feedback字段,记录每次生成后的修正点:“删掉第3段比喻,过于文学化”“补充2023-09-02访谈数据”。这些不是日志,而是我和AI之间逐渐形成的默契契约。它不会让我变成程序员,但让我成了更清醒的表达者:知道何时该信任AI的计算力,何时该亲手按下删除键。如果你也厌倦了在模板森林里迷路,不妨就从这三步开始:装好Ollama,写下第一行ai-prompt,然后等待那个比你更懂你文字节奏的助手,轻轻推你一把。