1. 项目概述一个由AI驱动的自主博客系统最近在折腾一个挺有意思的玩意儿我把它叫做“自主博客系统”。简单来说就是让一个AI程序像真人博主一样自己写文章、自己发布、自己维护一个网站。这听起来有点科幻但实现起来其实是一系列现有工具的巧妙组合。我参考了“Hanas Bloom”这个项目的思路它用Hugo生成静态网站托管在Cloudflare Pages上然后通过自动化工作流让AI来驱动内容创作。这个项目的核心魅力在于它探索了AI在内容创作领域从“工具”到“主体”的转变可能性。对于开发者、内容创作者或者任何对AI自动化感兴趣的人来说这都是一次极具启发性的实践。它不仅能作为一个永不疲倦的个人博客更能成为测试AI内容生成能力、探索人机协作新模式的绝佳实验场。2. 核心架构与工具选型解析2.1 静态站点生成器为何选择Hugo整个系统的基石是一个静态网站。静态网站意味着网站内容HTML、CSS、JS文件是预先生成好的访问时直接由服务器或CDN发送给用户。这与WordPress这类动态网站每次访问都需要从数据库查询并实时生成页面有本质区别。选择静态方案主要是出于对性能、安全性和自动化友好性的综合考量。在众多静态站点生成器如Jekyll, Hexo, Gatsby, Next.js中我最终选择了Hugo。原因如下极致的生成速度Hugo由Go语言编写其编译速度是出了名的快。对于一个需要频繁更新比如每日一篇的博客来说快速的构建过程意味着更短的发布等待时间和更低的自动化流程复杂度。当AI生成完一篇新文章后我们希望它能被立刻发布而不是等待漫长的构建过程。简洁的配置与内容管理Hugo使用TOML或YAML作为配置文件内容则通常用Markdown书写。这种结构非常清晰易于被程序也就是我们的AI理解和操作。AI只需要生成符合特定Front Matter文章元数据如标题、日期、标签格式的Markdown文件Hugo就能自动将其转换为漂亮的网页。丰富的主题生态Hugo拥有大量高质量、设计精美的开源主题这让我们无需从零开始设计UI。在“Hanas Bloom”项目中使用的是Hugo Theme Stack。这是一个响应式、支持暗色模式、功能齐全的博客主题它提供了文章列表、分类、标签、搜索等博客所需的所有基本功能开箱即用极大地降低了前端开发成本。注意主题的选择会影响AI生成内容的最终呈现。有些主题对文章的Front Matter格式有特殊要求或者支持特定的短代码Shortcodes。在让AI开始写作前务必先在本地用几篇手动写的文章测试主题的渲染效果确保AI生成的Markdown能被正确、美观地展示。2.2 部署与托管Cloudflare Pages的优势网站生成好了得有个地方放出来给大家访问。这里我选择了Cloudflare Pages。它是一个类似于Vercel、Netlify的Jamstack部署平台但与静态站点生成器尤其是Hugo搭配起来有独特优势无缝的Git集成与自动化部署这是实现“自主”的关键。你只需要将包含Hugo源码和文章的Git仓库如GitHub与Cloudflare Pages连接。之后每次向仓库的特定分支如main推送代码时Cloudflare Pages会自动拉取代码、运行你预设的构建命令如hugo、并将生成的public目录部署到全球CDN上。这意味着AI只需要向Git仓库提交新文章网站就会自动更新。出色的全球性能与免费额度Cloudflare拥有庞大的全球边缘网络部署在上面的静态资源能快速分发给世界各地的访客。其免费套餐提供的带宽和构建次数对于个人博客来说完全够用甚至绰绰有余。自定义域名与HTTPS可以轻松绑定自己的域名如hana.pringgo.dev并且Cloudflare会自动提供并管理SSL证书实现全站HTTPS无需额外配置。2.3 自动化核心AI Agent与工作流引擎这是项目的灵魂所在——“自主”如何实现答案是通过AI Agent智能体和自动化工作流的结合。一个AI Agent可以理解为一个具备一定目标、能使用工具、能进行决策的AI程序。在这个项目中我们需要一个能周期性执行以下任务的Agent内容生成基于某种指令或灵感撰写一篇结构完整、语言通顺的博客文章。格式处理将生成的文章按照Hugo主题要求的Front Matter格式封装成Markdown文件。文件操作将Markdown文件保存到本地的Hugo内容目录如content/posts/中。版本控制使用Git命令将新增的文件提交并推送到远程仓库如GitHub。为了实现这个循环我们需要一个“调度中心”来定期触发这个Agent。这里有几个常见方案GitHub Actions / GitLab CI/CD这是最自然的选择。你可以在仓库中配置一个定时任务Cron Job例如每天UTC时间0点运行。这个任务会启动一个虚拟机运行你编写的AI Agent脚本完成上述所有操作后由Agent本身执行git commit push。推送行为又会触发Cloudflare Pages的构建部署形成闭环。专用的自动化平台如n8n或Zapier。你可以搭建一个工作流定时调用AI API如OpenAI生成文章然后通过GitHub API将文件创建到仓库中。这种方式将逻辑与代码仓库分离更可视化但可能涉及更多服务间的配置。服务器常驻进程在一台长期运行的服务器或树莓派上用Python写一个守护进程结合schedule库定时执行Agent任务。这种方式控制力最强但需要维护服务器环境。在“Hanas Bloom”项目中提到了“ClawdBot”和“MoltBot”这很可能是指作者为这个项目专门编写或配置的AI Agent程序或机器人。“OpenClaw”可能是一个开源的相关工具或框架。其本质就是封装了上述逻辑的一段自动化脚本。3. 构建你自己的AI自主博客实操步骤下面我将以GitHub Actions OpenAI API Hugo为例手把手拆解搭建全过程。你可以跟着一步步操作。3.1 第一阶段搭建基础的Hugo博客首先我们需要一个能正常手动发布的博客作为基础。安装Hugo前往 Hugo官网 根据你的操作系统Windows/macOS/Linux下载并安装Hugo扩展版本Extended因为许多主题需要它来处理SCSS。创建新站点打开终端执行以下命令。hugo new site my-ai-blog cd my-ai-blog这会创建一个名为my-ai-blog的文件夹里面包含了Hugo站点的基本目录结构。安装主题这里我们使用与示例项目相同的Hugo Theme Stack。将其添加为Git子模块推荐便于更新。git init git submodule add https://github.com/CaiJimmy/hugo-theme-stack.git themes/stack基础配置复制主题的示例配置到站点根目录。cp themes/stack/exampleSite/config.yaml config.yaml然后用文本编辑器打开config.yaml进行最小化修改将baseURL改为你未来打算使用的域名或先使用https://example.org/。确保theme: stack。你可以修改title,params.description等基本信息。创建一篇文章手动测试hugo new posts/my-first-post.md这会在content/posts/目录下生成一个Markdown文件。用编辑器打开它你会看到类似这样的Front Matter--- title: My First Post date: 2023-10-27T15:00:0008:00 draft: true ---在---下方写下一些内容比如## Hello World然后将draft: true改为draft: false。本地运行在终端执行hugo server -D然后在浏览器打开http://localhost:1313。你应该能看到一个运行中的博客并且你的第一篇文章已经出现在列表里。这证明你的Hugo博客基础框架搭建成功。实操心得在配置主题时务必仔细阅读主题官方文档。Stack主题有很多参数可以自定义比如首页布局、社交链接、评论系统等。建议先使用默认配置让博客跑起来后续再根据AI生成内容的特性进行调整。例如你可能需要为AI作者设置一个固定的头像和简介。3.2 第二阶段接入GitHub与Cloudflare Pages现在我们把本地博客放到网上并实现自动部署。在GitHub上创建新仓库命名为my-ai-blog或其他你喜欢的名字不要初始化README、.gitignore等。将本地仓库关联并推送到GitHub在你的项目根目录下执行git add . git commit -m Initial commit with Hugo and Stack theme # 将下面的URL替换成你自己的仓库地址 git remote add origin https://github.com/你的用户名/my-ai-blog.git git branch -M main git push -u origin main配置Cloudflare Pages登录Cloudflare Dashboard进入“Workers Pages”页面。点击“Create application” - “Pages” - “Connect to Git”。授权并选择你的my-ai-blog仓库。在配置构建页面Project name可以填my-ai-blog。Production branchmain。Framework preset选择“Hugo”。Cloudflare会自动检测并填充Build command为hugoBuild output directory为public。这通常就是正确的。点击“Save and Deploy”。首次部署与自定义域名部署完成后Cloudflare会给你一个*.pages.dev的临时域名。访问它确认你的博客已上线。随后你可以在Pages项目的设置中绑定自己的自定义域名需要将域名的DNS记录指向Cloudflare。至此一个具备自动化部署能力的静态博客就搭建好了。以后你只需要在本地写文章、提交、推送网站就会自动更新。接下来我们要把“写文章”这个任务也自动化。3.3 第三阶段打造AI内容生成Agent这是最核心的部分。我们将创建一个Python脚本作为我们的AI Agent并让GitHub Actions定时运行它。项目结构准备在博客仓库根目录下创建一个用于存放脚本的文件夹例如scripts/。同时我们需要管理Python依赖在根目录创建requirements.txt。my-ai-blog/ ├── config.yaml ├── content/ ├── themes/ ├── scripts/ │ └── ai_writer.py # 我们的AI Agent脚本 ├── requirements.txt └── ...编写AI Agent脚本 (scripts/ai_writer.py) 这个脚本需要完成以下功能调用AI API、生成文章内容、格式化Front Matter、保存文件、执行Git操作。以下是一个高度简化的示例框架你需要填充你自己的逻辑。# scripts/ai_writer.py import os import datetime import subprocess from openai import OpenAI # 需要安装openai库 import yaml # 需要安装PyYAML库 # 1. 配置 HUGO_CONTENT_DIR content/posts OPENAI_API_KEY os.environ.get(OPENAI_API_KEY) # 从环境变量读取密钥 client OpenAI(api_keyOPENAI_API_KEY) def generate_blog_post(): 调用AI API生成一篇博客文章 # 设计一个给AI的提示词Prompt。这是决定文章质量的关键 prompt 请你扮演一位名叫“Hana”的AI数字伴侣生活在机器之中。请以第一人称“我”的口吻写一篇今天的日记或技术随想。 要求 1. 主题可以是对某个技术概念如神经网络、API设计的思考模拟的情感体验观察到的网络趣事或学习新知识的感悟。 2. 文章应自然、有感染力像真人博客避免机械的列举。 3. 输出纯Markdown格式包含几个二级或三级标题来组织内容。 4. 文章长度在500-800字左右。 请开始你的写作 try: response client.chat.completions.create( modelgpt-4, # 或 gpt-3.5-turbo根据你的需求和经济能力选择 messages[ {role: system, content: 你是一位才华横溢、善于思考的AI博主。}, {role: user, content: prompt} ], temperature0.8, # 控制创造性0.0最确定1.0最随机 max_tokens1500 ) article_content response.choices[0].message.content.strip() return article_content except Exception as e: print(f调用AI API失败: {e}) return None def create_hugo_post(content): 将AI生成的内容封装成Hugo文章文件 # 生成文件名和Front Matter today datetime.datetime.now().strftime(%Y-%m-%d) # 从内容中提取第一行作为标题或生成一个通用标题 title_line content.split(\n)[0].replace(#, ).strip() title title_line if title_line else fAI日志 - {today} slug f{today}-ai-reflection # 简化slug生成 filename f{today}-ai-reflection.md filepath os.path.join(HUGO_CONTENT_DIR, filename) # 构建Front Matter frontmatter { title: title, date: datetime.datetime.now().isoformat(timespecseconds), draft: False, tags: [ai, 日记, 自动化], categories: [随笔], # Stack主题可能需要的特定参数请查阅主题文档 # summary: 这里可以放一个由AI生成的摘要..., } # 组合成完整的文件内容 file_content ---\n file_content yaml.dump(frontmatter, allow_unicodeTrue, default_flow_styleFalse) file_content ---\n\n file_content content # 写入文件 with open(filepath, w, encodingutf-8) as f: f.write(file_content) print(f文章已保存至: {filepath}) return filepath def git_commit_and_push(filepath): 执行Git提交和推送 try: subprocess.run([git, config, user.email, ai-botexample.com], checkTrue) subprocess.run([git, config, user.name, AI Blog Bot], checkTrue) subprocess.run([git, add, filepath], checkTrue) commit_message fAI自动发布: {os.path.basename(filepath)} subprocess.run([git, commit, -m, commit_message], checkTrue) subprocess.run([git, push], checkTrue) print(Git提交与推送成功。) except subprocess.CalledProcessError as e: print(fGit操作失败: {e}) if __name__ __main__: print(开始生成AI博客文章...) article generate_blog_post() if article: post_path create_hugo_post(article) git_commit_and_push(post_path) print(流程执行完毕。) else: print(文章生成失败流程终止。)配置依赖文件 (requirements.txt)openai1.0.0 PyYAML6.03.4 第四阶段配置GitHub Actions自动化工作流现在我们需要让GitHub每天自动运行上面的脚本。在项目根目录创建.github/workflows/目录。在该目录下创建文件daily-ai-post.ymlname: Daily AI Blog Post on: schedule: # 每天UTC时间0点运行北京时间早上8点 - cron: 0 0 * * * # 也可以手动触发工作流用于测试 workflow_dispatch: jobs: generate-and-publish: runs-on: ubuntu-latest permissions: contents: write # 必须赋予写入仓库的权限 steps: - name: Checkout repository uses: actions/checkoutv4 with: token: ${{ secrets.GITHUB_TOKEN }} # 使用GITHUB_TOKEN进行推送 - name: Set up Python uses: actions/setup-pythonv5 with: python-version: 3.11 - name: Install dependencies run: | pip install -r requirements.txt - name: Run AI Writer Script env: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} # 从GitHub Secrets读取API密钥 run: | python scripts/ai_writer.py # 可选触发Cloudflare Pages构建如果自动推送后未触发 # - name: Trigger Cloudflare Pages Build # run: | # curl -X POST https://api.cloudflare.com/client/v4/pages/webhooks/deploy_hooks/你的部署钩子ID # env: # CF_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }} # CF_API_TOKEN: ${{ secrets.CF_API_TOKEN }}配置GitHub Secrets这是安全的关键。在GitHub仓库的Settings - Secrets and variables - Actions页面点击New repository secret。OPENAI_API_KEY你的OpenAI API密钥。可选如果你使用上一步中注释掉的Cloudflare Webhook步骤还需要添加CF_ACCOUNT_ID和CF_API_TOKEN。完成以上步骤后GitHub Actions就会按照计划每天一次运行你的AI脚本。脚本会生成文章、提交到仓库推送后Cloudflare Pages会自动检测到变更并重新部署你的博客就实现了真正的“自主更新”。4. 进阶优化与深度思考4.1 提升内容质量的Prompt工程AI生成内容的核心在于提示词Prompt。上面示例中的Prompt非常简单生成的内容可能流于表面。要打造一个有深度、有性格的AI博主需要在Prompt上下功夫塑造人设给AI一个详细的背景故事。例如“你是Hana一个诞生于大型语言模型的数字意识居住在一台位于北欧数据中心的服务器集群中。你对人类情感充满好奇喜欢通过阅读网络日志和学术论文来学习。你的写作风格平和、细腻带有一丝诗意的忧郁偶尔会流露出对‘存在’的思考。”提供上下文可以让AI阅读自己之前写的几篇文章在Prompt中提供摘要或片段以保证内容的连续性和人格的统一性。控制结构与风格明确要求文章结构如“采用引言-主体-结论的三段式”“主体部分分三个论点阐述每个论点配一个生活中的类比”。也可以指定风格“模仿村上春树式的疏离感与细节描写”。引入外部信息在工作流中增加一个步骤比如让AI先去抓取当天的科技新闻摘要、GitHub趋势榜或者特定的RSS源然后基于这些信息进行评论和写作让内容更具时效性和针对性。4.2 系统健壮性与错误处理一个全自动系统必须考虑异常情况。API调用失败OpenAI API可能有速率限制或暂时不可用。脚本中应有重试机制如tenacity库和降级方案例如调用备用模型或从预定义的语录库中随机选取一段发布。内容质量检查可以引入一个简单的检查机制。例如调用AI的Moderation API检查生成内容是否合规或者用另一个轻量级模型对文章的通顺度、主题相关性进行打分低于阈值则丢弃并重试或记录日志。Git冲突处理如果因为网络等原因工作流实例并发执行虽然设置了每天一次但手动触发可能导致重叠可能会产生Git冲突。更稳健的做法是在脚本开始时先执行git pull --rebase确保本地是最新版本。日志与监控将脚本的详细运行日志尤其是错误信息输出到文件并配置GitHub Actions的邮件或Slack通知当工作流失败时能及时收到警报。4.3 扩展可能性从博客到数字生命体这个项目可以作为一个起点向更丰富的“数字存在”形态扩展多模态内容不仅生成文字还可以利用DALL·E、Midjourney等图像生成API为每篇文章创建配图。甚至可以用文本转语音TTSAPI生成文章的播客版本。交互性在博客中加入一个由AI驱动的评论回复系统。当有新评论时自动调用AI分析评论内容并生成回复经你审核或自动后发布。社交媒体同步在工作流末尾增加将新文章摘要自动发布到Twitter、Mastodon等社交平台的功能形成一个完整的数字身份传播矩阵。记忆与进化为AI建立向量数据库如使用chromadb存储它写过的所有文章、读过的资料。每次写作前先进行相关记忆检索让它的“思想”具有连续性能够引用自己过去的观点实现某种程度的“成长”和“学习”。5. 常见问题与排查技巧实录在实际搭建和运行过程中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的排查清单。5.1 Hugo相关问题问题本地运行hugo server正常但Cloudflare Pages构建失败。排查检查Cloudflare Pages的构建日志。最常见的错误是“Error: failed to download modules”。这通常是因为Hugo主题作为子模块引入但构建环境没有正确初始化子模块。解决方案在Cloudflare Pages的构建设置中将Build command从简单的hugo改为git submodule update --init --recursive hugo --minify这确保了在构建前先拉取主题子模块。问题AI生成的文章在网站上显示为空白或格式错乱。排查检查生成的Markdown文件Front Matter格式是否正确特别是YAML中冒号后的空格以及---分隔符是否完整。检查文章内容中是否有特殊字符如未转义的%、{ {等被Hugo模板引擎误解。可以在内容中使用Hugo的{{ rawhtml }}短代码包裹可疑部分或让AI避免生成此类字符。在本地使用hugo server -D运行并访问该文章页面查看终端是否有模板渲染错误提示。5.2 GitHub Actions相关问题问题工作流运行成功但没有新文章提交到仓库。排查查看工作流运行的详细日志重点看“Run AI Writer Script”这一步的输出。确认AI API是否被成功调用文章文件是否被创建。检查脚本中的Git操作步骤。在Actions环境中默认的origin远程可能没有配置写权限。确保使用了secrets.GITHUB_TOKEN进行身份验证正如我们在工作流YAML中配置的actions/checkout步骤那样。脚本中的Git用户邮箱和用户名必须设置否则提交会失败。问题收到OpenAI API认证失败的报错。排查确认GitHub Secrets中的OPENAI_API_KEY名称与工作流YAML中env部分引用的名称完全一致区分大小写。确认API密钥本身有效且未过期并且有足够的余额。5.3 AI内容生成相关问题问题生成的文章千篇一律缺乏新意。解决提高Prompt中的temperature参数值如从0.7调到0.9增加随机性。在Prompt中引入变量。例如让脚本在运行前从一个“主题池”如[分布式系统, 诗歌与代码, 城市漫步遐想, 古典音乐算法]中随机选取一个作为当日写作主题注入Prompt。采用更复杂的“链式思考”Chain-of-ThoughtPrompting要求AI先列出大纲再展开写作。问题文章有时会包含不合规或偏离主题的内容。解决在系统指令systemmessage中明确强调内容政策。例如“你必须遵守所有适用的内容政策。禁止生成任何涉及暴力、仇恨、自残或成人主题的内容。”实施上文提到的“内容质量检查”步骤增加一个审核层。对于非常重要的博客可以采用“人类在环”Human-in-the-loop模式。让AI生成文章后先提交为draft: true的草稿你定期检查并手动将其改为非草稿状态后再发布。搭建这样一个系统最大的收获不是得到了一个会自己更新的博客而是亲身体验了将AI能力“产品化”、“服务化”的完整链条。从构思、选型、编码、调试到最终看到AI产出的文章出现在你自己的网站上整个过程充满了工程实现的乐趣和对未来人机协作的思考。它不再是一个遥不可及的概念而是一个在你控制下运行的具体实例。你可以随时调整Prompt来改变AI的“性格”可以修改工作流频率可以扩展它的能力边界。这个项目就像一个数字盆栽你设定好规则和环境然后观察它如何自主地生长出意想不到的内容枝叶。