Dewei Zhai

2026-05-10 · 更新于 2026-09-04

小成本,认真做:这个网站和 Agent 是怎么搭出来的

一套小型 Cloudflare + DeepSeek 架构,以及确定性上下文、可编辑行为、线上评估和站内人工转接。

职责 选择 为什么选它
网站页面 Astro 7 可以多写内容、少写 JavaScript 的框架,特别适合文章和个人主页这样的内容站。
后台 API Cloudflare Workers Cloudflare 提供的近乎免费 Serverless 托管,类似运行在全球边缘网络上的 AWS Lambda。
Agent 模型 deepseek-v4-flash Agent 的大脑。三个月实际费用约 1.5 美元,便宜得像没用过,回答质量却并不廉价。
运行数据 Cloudflare D1 Cloudflare 提供的托管 SQLite。不用自己部署数据库,数据不多时几乎免费,正适合保存聊天记录、留言和 Agent 设置。
浏览器端连续性 localStorage 浏览器自带的小抽屉。把当前对话保存在访客自己的设备里,刷新页面后也不至于失忆。
防滥用 Turnstile + D1 限流 一个判断访客像不像机器人,另一个防止同一个人把 Agent 问到破产。
留言通知 Resend 不用配置 SMTP、可以直接通过 API 使用的邮件服务。
发布路径 GitHub → Cloudflare Worker 这个没啥可说的,默认路径了。

这个“RAG”故意很朴素

目前没有使用 Vectorize 或向量数据库。每次请求都会把稳定知识组装进系统 Prompt:公开履历、精选案例摘要、文章的日期、标签、标题和摘要、标准产品、实时设置,以及一套由我维护的常见问答。文章全文不会注入。

实测静态 Prompt 约 27,000 个字符、4,068 个英文词,约 6,000–8,000 tokens。聊天接口最多保留 20 条消息,每条最多 4,000 个字符。即使故意推到上限,总输入通常也只有约 25,000–30,000 tokens,而 DeepSeek 公布的上下文窗口是 1M tokens

确定性组装上下文是权衡后的选择。价格、就业条件等关键事实必定出现,不会因为检索漏召回而缺失;也没有 embedding、索引同步、切块和 reranking 的维护周期,行为更容易复现和评估。

静态知识超过约 50,000 tokens、总输入经常超过 100,000 tokens、延迟或成本明显上升,或者评估显示无关知识开始干扰答案时,我会重新考虑。下一步大概率是 hybrid:身份、安全、产品和实时设置继续固定注入;长文章和案例再走检索。

这个判断不是只看 Prompt 有多长。我还做了一套 Prompt 质量评价系统,用它持续回答两个问题:现在的 AI 助手表现怎样,以及问题究竟来自行为规则、知识缺失,还是上下文已经大到需要检索。

它分成两层。第一层跟在每次真实回答后面运行。访客先收到正常回复;回复保存后,Cloudflare Worker 在后台创建一条 shadow evaluation,把最近八条对话、当前会话状态、预期语言和本次回答交给一个不参与对话的评估模型。它从 0 到 100 打分,检查 Agent 是否理解了显性或潜在需求、选择了自然的下一步、只使用有依据的事实、避免过早下结论或像表单一样追问、保留用户的信任和耐心、跟随用户语言,并在合适时提供可编辑的站内留言。分数至少 80,且没有路由错误、编造、语言错误或施压等关键问题,才算通过。分数、结论和原因都会写进 D1,和具体回答绑定:

真实回答 → 后台影子评价 → 0–100 分 + 是否通过 + 原因 → 保存到 D1

第二层用于修改 Prompt。测试程序会让 Codex 扮演咨询客户、项目客户、招聘者和普通访客,并维护两个隐藏状态:信任度和耐心度。DeepSeek 回答后,固定规则先检查错误语言、错误产品路由、虚构事实、泄漏 Prompt 和过早索取联系方式等硬失败;独立 AI Judge 再评价路由、需求发现、信任维护和沟通效率。候选 Prompt 最后还要面对真实网站上的固定两轮对话。完整测试通过后才能启用;失败的版本可以直接回滚。

这套系统不会因为某一次低分就自动宣布“该上 RAG 了”。如果相关事实已经在当前上下文中,错误主要来自语气、路由或追问方式,那就应该修行为规则。如果知识量持续增长后,评价开始反复出现相关事实找不到、无关材料干扰回答,同时 token、延迟或成本也越过阈值,才有证据把长文章和案例迁到检索层。这样,RAG 是评估结果推动的架构变化,不是为了看起来像一套 AI 系统而预先安装的组件。

不是所有知识都要重新发布网站

把全部资料放进 Prompt,还有一个实际问题:如果我的求职条件、服务范围或 Agent 的说话方式变了,难道每次都要改代码、重新部署网站吗?

不需要。

经常变化的事实,例如“是否接受 permanent 工作”,放在网站后台的 FAQ 里。我修改后,Agent 下一次对话就会使用新答案。

Agent 的说话方式也可以单独调整。例如这次它面对招聘者时,一口气追问七项信息,很像让对方填表。我可以把规则改成“先问一个开放问题,整段对话最多主动追问一次”,然后直接在真实网站上测试。测试通过后启用,效果不好也可以退回上一版。

但删除聊天、保存留言、权限检查这些事情仍然写在代码里。因为 Prompt 适合影响“怎么说”,不适合决定“数据到底有没有被删除”。

这个 Agent 是怎么一点点调出来的

网站上线前,我只给了 Agent 一个目标:帮助来访者了解 Dewei,回答他的经历、能力和合作方式。第一版知识不是我坐下来写的一份完整说明书,而是让 AI 先采访我。它不断追问我做过什么、擅长什么、不适合什么、愿意接受怎样的合作,再把这些回答蒸馏成个人资料、案例和规则,把已有文章的日期、标签、标题和摘要加入 Prompt,然后上线。

能用,但不太会聊天。

它有时不跟随用户的语言;有人问 permanent 工作,它不知道答案;招聘者只问“是否接受”,它却立刻递过去一张七项清单;面对一个看起来不错的岗位,又会太快宣布 MATCH。它甚至会把已经取消的免费通话重新推荐出来,或者在不了解项目细节时说“十周没问题”。

这些问题不是缺少更多文章,而是 Agent 不知道怎样使用已有信息。

网站运行一段时间后,我分析了真实聊天记录,把来访者归纳成咨询客户、项目客户、招聘者,以及只想了解我的普通访客。每种人的目标不同,耐心也有限。招聘者想快速判断匹配度,不想填表;普通访客只是想得到答案,不应该一进门就被推销。

于是我给模拟用户加了两个看不见的数值:信任度和耐心度。直接回答问题,信任会上升;绕圈、编造、过早索要联系方式,信任会下降。每多聊一轮、每多读一段废话,耐心都会减少。最后再看用户有没有得到答案,或者进入正确的下一步。

接下来就是一个循环:

Codex 模拟用户 → DeepSeek 回答 → AI 评分 → 每轮只改一两个问题 → 重新测试。

比如,把七项招聘清单改成一个开放问题;把“确定 MATCH”改成“值得认真考虑”;禁止项目对话误入咨询产品;也禁止为了显得可信,随便说某个客户案例“很相似”。

改完后,再让一个独立 AI Review 整套规则。本地通过还不算结束,我会挑三个最典型的两轮对话,直接测试真实网站:一次性咨询、项目交付和 permanent 招聘。最后,我自己再读一遍完整对话,问一句很朴素的话:

我愿不愿意让这个 Agent 代表我这样说?

确定的事实和边界会写进 FAQ、Prompt 或代码;说话方式则继续通过这套循环慢慢调整。它不是一次设计完成的,而是从真实聊天里一点点调出来的。

最后,AI 只负责把话说清楚

Agent 可以回答问题、判断初步匹配度,但不能替我接受工作或作出承诺。遇到需要本人决定的事情,它会在聊天里生成一份可编辑的留言摘要。访客确认后,留言才会进入我的 inbox,不需要离开对话再填一张表。

聊天记录最多保留 90 天,也可以由访客主动删除。但已经单独确认发送的留言会继续保留。这里的边界由代码控制,不由 Prompt 临场决定。


想聊聊?就这篇文章,和我的助理聊聊,或者给我留个言