2026年6月14日星期日

AI客服接入真实网站教程:用Codex与Dify上线智能体

本文介绍如何用Codex辅助将Dify智能体客服安全接入真实网站。通过本地HTML注入服务与Caddy路由配置,无需重构前端或修改后端业务代码。包含完整备份与回滚方案、客服边界设计(禁止索要敏感信息)、常见坑点(token错误及CSP策略)。适合希望快速给网站增加AI客服的产品人或开发者。

Tags:

我用 Codex 把 AI 客服接进了真实网站:普通人做产品的门槛,正在被重新改写

用 Codex 把 AI 客服接进真实网站
用 Codex 把 AI 客服接进真实网站

以前我以为 Codex 只是“更强的代码助手”。
直到这次,它陪我把一个智能体客服,真的推到了线上。

先说结论:

AI 编程最震撼的地方,已经不是帮你写几行代码。

而是它开始进入真实生产环境:

  • 看服务器配置
  • 判断网站架构
  • 改反向代理
  • 处理浏览器安全策略
  • 排查线上报错
  • 准备回滚方案
  • 最后把功能上线

这次我做的事情很简单,也很典型:

给一个真实网站,上线一个基于 Dify 的智能体客服。

不是 Demo。

不是截图。

不是“你可以这样做”的建议。

而是从 Dify 智能体设计、网站接入、服务器备份、Caddy 路由、CSP 报错,到最终验证线上页面,一路做到了可用。

更重要的是:

整个过程没有重构前端,没有大改后端,也没有让业务接口承担额外风险。

如果你也有一个网站、SaaS、小工具、知识付费产品、API 服务,想接一个智能客服,这篇文章可以当成一份真实上线手记。

我会把里面最关键的东西讲清楚:

  • 为什么这不是简单复制一段客服代码
  • Dify Chatflow 怎么设计才更像“客服”,而不是普通聊天框
  • 怎么把客服安全接进已有网站
  • Caddy 和 CSP 为什么会成为上线关键点
  • 哪些坑最容易让你半路卡住
  • 怎么避免把 token、密码、服务器信息写进文章和日志

先看结果:网站多了一个客服,但业务没有被打扰

最终网站右下角出现了一个 Dify 客服气泡。

用户可以直接问:

  • 怎么注册登录?
  • 怎么创建 API Key?
  • 充值没到账怎么办?
  • API 调用失败怎么排查?
  • 余额和账单在哪里看?
  • 服务状态是不是异常?
  • 哪些问题要转人工?

客服背后是 Dify Chatflow。

网站本身没有重新打包前端,也没有改后端业务代码。

我们用了一个更轻的方案:

在 Caddy 和原后端之间,加了一个只处理 HTML 的本地注入服务。

用户访问网页时,HTML 会被自动插入 Dify 客服脚本。

但 API、静态资源、模型调用、流式接口仍然走原来的后端。

这就很关键:

客服上线了,但业务请求不被打扰。


真正的关键:不是加聊天框,而是不破坏原系统

Caddy 与本地注入服务架构
Caddy 与本地注入服务架构

原来的架构大概是:

用户浏览器 -> Caddy -> 后端容器

上线客服后变成:

用户浏览器 -> Caddy
              ├─ HTML 页面 -> 本地注入服务 -> 后端容器
              └─ API/静态资源 -> 后端容器

本地注入服务只做一件事:

拿到 HTML 后,在 </body> 前插入 Dify 的 embed 脚本。

这类方案特别适合几种情况:

  • 网站是 Docker 容器部署的
  • 前端不方便重新构建
  • 你没有完整源码链路
  • 只是想快速加一个全站客服入口
  • 需要随时可回滚

如果是静态站,当然可以直接把 Dify 代码放进 HTML。

但真实世界里,很多网站不是这样。

所以这次的关键,不是“怎么复制一段客服代码”,而是:

怎么在不破坏现有系统的情况下,把 AI 客服安全插进去。


第一步:别急着写代码,先让 Codex 看懂现场

很多人接需求时会直接问:

“客服代码放哪里?”

但上线前真正要先问的是:

这个网站到底是怎么跑起来的?

这次 Codex 先查了 Caddy 配置。

结果发现它不是普通静态目录:

reverse_proxy localhost:8080

也就是说:

  • Caddy 只是入口
  • 网站实际服务在本地端口
  • 后端跑在 Docker 容器里
  • HTML 是后端动态返回的
  • 没有一个现成的 index.html 可以直接改

这一步非常重要。

如果没搞清架构就硬改,可能会出现:

  • 改了容器内部文件,重启后丢失
  • 改错前端资源,页面白屏
  • CSP 没放行,客服加载失败
  • API 请求被误代理,接口异常

所以我现在越来越觉得:

Codex 最有价值的地方,不是上来写代码,而是先帮你看清系统。


第二步:客服不是聊天框,而是一套边界

很多人理解的“AI 客服”是:

放一个聊天框,让大模型自由回答。

这其实很危险。

真正可用的客服,至少要有边界。

这次我们把客服能力拆成了几类:

用户问题
客服应该怎么处理
注册登录
给步骤
API Key
给创建和安全提醒
充值不到账
给排查路径,必要时转人工
API 报错
按错误码排查
服务状态
引导查看状态页
退款/封号/风控
不承诺,收集信息后转人工
敏感信息
明确禁止索要

尤其是支付、退款、风控、封号这些问题,不能让 AI 随便答。

客服 Prompt 里必须写清楚:

不能承诺退款。
不能判断账号状态。
不能索要密码、API Key、Cookie、完整支付凭证、身份证件。
涉及交易争议、风控、投诉,必须转人工。

这就是智能体客服和普通聊天机器人的区别。

不是更能聊,而是更知道边界。


第三步:Dify 先做最小可用,不要一上来追求完美

Dify Chatflow 最小可用流程
Dify Chatflow 最小可用流程

理想状态下,一个完整客服 Chatflow 可以这样设计:

开始
  -> 问题分类器
  -> 知识检索
  -> LLM 生成回复
  -> 直接回复
  -> 必要时转人工

问题分类器可以分这些类:

  • 产品咨询
  • 账号登录
  • 充值账单
  • API 调用排障
  • 服务状态
  • 转人工
  • 其他兜底

但第一版上线,不一定要一口吃成胖子。

这次先用了最小流程:

开始 -> 知识检索 -> LLM -> 直接回复

为什么?

因为先上线一个能回答基础问题的客服,比在画布里纠结一堆分支更重要。

后面再迭代:

  • 加问题分类器
  • 加会话变量
  • 加转人工
  • 加工单 Webhook
  • 加用户身份变量

这个节奏更稳。

我现在越来越认可一个原则:

智能体不要追求一次性完美,要先上线一个可控版本。


第四步:知识库决定下限,Prompt 只是最后一层

客服要回答得准,不能只靠模型“聪明”。

我们准备了一份知识库,里面包括:

  • 平台介绍
  • 文档入口
  • 服务状态页
  • API Base URL
  • 备用节点
  • API Key 创建方法
  • 常见错误码
  • 充值不到账排查
  • 退款和争议处理规则
  • 人工客服入口
  • 敏感信息禁止规则

其中最重要的是这句:

用户排障时可以贴报错,但必须打码 API Key、Authorization、Cookie 和个人信息。

因为客服场景里,经常会有人直接把密钥复制进聊天框。

你不提前约束,AI 很可能就顺着聊下去了。

所以知识库里必须有“安全红线”。


第五步:真正卡人的,往往是一个 token

Dify 发布后,会给一段嵌入代码,大概长这样:

<script>
 window.difyChatbotConfig = {
  token'YOUR_WEBAPP_TOKEN',
  inputs: {},
  systemVariables: {},
  userVariables: {},
 }
</script>
<script
 src="https://udify.app/embed.min.js"
 id="YOUR_WEBAPP_TOKEN"
 defer>

</script>

这里踩了一个真实的坑。

一开始我拿错了 token。

页面报错:

App with code <wrong-app-code> not found

这个错误的意思是:

当前 Dify 环境里找不到这个应用。

常见原因有三个:

  1. 复制的是 API Key,不是嵌入 WebApp token
  2. token 属于自部署 Dify,但脚本指向了 udify.app
  3. App 没有发布,或者复制错了应用

解决办法很简单:

一定要复制 Dify 发布面板里的完整“嵌入网站”代码。

不要自己从 URL 里猜。

不要拿应用 ID 当 token。

不要拿 API Secret 当 WebApp token。

这个坑很常见,值得单独记下来。


第六步:上线前先备份,这是成年人做线上系统的体面

这次改的是线上入口层。

只要 Caddy 配错,首页就可能 502。

所以 Codex 在动手前先做了备份。

备份内容包括:

mkdir -p /srv/backups/customer-service/$(date +%Y%m%d-%H%M%S)
cp -a /etc/caddy/Caddyfile.example /srv/backups/customer-service/.../Caddyfile.example.bak
cp -a /srv/backend-app/deploy/docker-compose.yml.example /srv/backups/customer-service/.../docker-compose.yml.example.bak
cp -a /srv/backend-app/deploy/data/app-config.yaml /srv/backups/customer-service/.../app-config.yaml.bak

同时打包数据目录,但排除日志:

tar --exclude='data/logs' -czf backend-data-no-logs.tgz -C /srv/backend-app/deploy data

这个动作一点也不酷。

但它非常重要。

因为真实上线最怕的不是失败。

最怕的是失败后不知道怎么回去。


第七步:用一个本地注入服务,把改动控制到最小

这一步是整件事的核心。

我们没有改原应用源码,而是写了一个小服务:

127.0.0.1:18080

它做的事很简单:

  1. 接收 HTML 页面请求
  2. 请求原来的后端服务
  3. 判断响应是不是 text/html
  4. 如果是,就插入 Dify embed 脚本
  5. 顺便补充 CSP
  6. 返回给浏览器

配置文件里只放公开 WebApp token,不放后台密钥。

然后用 systemd 托管:

systemctl enable --now customer-service-injector.service
systemctl restart customer-service-injector.service

验证:

systemctl is-active customer-service-injector.service
curl -sS http://127.0.0.1:18080/ | grep embed.min.js

这一步的价值是:

不用重构,不用重新构建,不用改容器镜像,也能给网站加能力。


第八步:改 Caddy,但让影响范围尽量小

一开始网站所有请求都走:

reverse_proxy localhost:8080

上线客服后,Caddy 变成:

@customer_service_html {
    method GET HEAD
    not path /assets/* /api/* /v1/* /health /logo.png /favicon.ico
}

handle @customer_service_html {
    reverse_proxy localhost:18080
}

handle {
    reverse_proxy localhost:8080
}

这段配置的重点是:

只让页面请求走注入服务。

静态资源和 API 继续走原服务。

为什么要这么小心?

因为 AI 客服只是页面增强,不应该影响:

  • API 调用
  • 静态资源
  • 健康检查
  • 流式响应
  • 用户后台接口

如果把所有流量都转给注入服务,那就不是“上线客服”,而是在给自己埋雷。


第九步:验证要有证据,不要靠“我看着能打开”

AI 客服上线验收清单
AI 客服上线验收清单

上线后必须验证几件事:

systemctl is-active caddy
systemctl is-active customer-service-injector.service
caddy validate --config /etc/caddy/Caddyfile.example
curl -k -sS https://your-domain.com/ | grep embed.min.js
curl -k -sS -o /dev/null -w "%{http_code}" https://your-domain.com/assets/index-xxx.js

最终要看到:

caddy_active=active
injector_active=active
public_status=200
public_has_embed=1
asset_status=200

这才说明:

  • Caddy 没挂
  • 注入服务没挂
  • 首页能打开
  • Dify 脚本已经注入
  • 静态资源没被误伤

我特别喜欢这一步。

因为它让上线从“凭感觉”变成了“有证据”。


这次最值得记住的 5 个坑

1. Dify token 拿错

错误:

App with code <wrong-app-code> not found

原因:

拿错了 WebApp token。

解决:

从 Dify 发布面板复制完整嵌入代码。

2. CSP 报错不一定是主因

页面里出现过类似:

Connecting to unpkg.com/... violates Content Security Policy

这个看起来很吓人。

但它不是核心错误。

真正导致客服不可用的是 App code 找不到。

排障时要分清楚:

哪个错误是噪音,哪个错误是根因。

3. Python 版本不一致

服务器上 Python 版本较旧,不支持某些新写法。

例如:

list[str]

在旧环境里会报:

TypeError: 'type' object is not subscriptable

解决方式也很朴素:

去掉这个新语法,换成兼容写法。

线上环境永远值得敬畏。

4. Caddy 路由没命中

中间出现过一个问题:

本地注入服务是好的,但线上页面没有客服脚本。

最后发现是 Caddy 路由没有真正命中注入服务。

解决方式:

重新检查 Caddyfile,确认页面请求确实走 localhost:18080

不要只看服务是否 active。

服务活着,不代表请求走到了它。

5. 敏感信息不能进日志

这次也再次提醒我:

AI 操作服务器时,最需要注意的是敏感信息。

不要在日志、文章、截图里暴露:

  • 服务器 IP
  • root 密码
  • SSH 私钥
  • Dify token
  • 数据库凭据
  • 应用签名密钥
  • API Key

尤其是让 Codex 排障时,一定要提前说:

不要打印密钥,不要输出配置原文,必要时只输出脱敏摘要。


最后一定要留回滚方案

上线任何东西,都要先想好怎么撤。

如果要回滚 Caddy:

cp -a /srv/backups/customer-service/xxxx/Caddyfile.example.bak /etc/caddy/Caddyfile.example
systemctl disable --now customer-service-injector.service
caddy validate --config /etc/caddy/Caddyfile.example
systemctl reload caddy

如果只是换 Dify WebApp token:

sed -i 's/^WEBAPP_TOKEN=.*/WEBAPP_TOKEN=新的token/' /srv/customer-service/config.example
systemctl restart customer-service-injector.service

这也是我现在用 Codex 的一个固定习惯:

每次改线上,都让它同时给我回滚命令。


表面是客服上线,背后是工作流变了

表面看,这只是上线了一个智能客服。

但我觉得更大的变化是:

产品人的工作流变了。

以前你想给网站加客服,大概要经历:

  1. 找 Dify 文档
  2. 配 Chatflow
  3. 找前端入口
  4. 查服务器
  5. 改 Caddy
  6. 排 CSP
  7. 看日志
  8. 修服务
  9. 验证线上
  10. 写回滚方案

每一步都不难。

但每一步都可能卡你半小时。

现在呢?

你可以让 Codex 参与整个过程:

  • 它先读系统
  • 再提方案
  • 再做备份
  • 再改配置
  • 再验证
  • 出错继续排
  • 最后整理成文档

这已经不是“AI 写代码”了。

这是:

AI 参与产品上线。


我对 Codex 的理解,也被这次刷新了

以前我会把 Codex 当成一个更强的代码补全。

但这次之后,我更愿意把它看成:

一个能陪你从想法走到上线的工程搭子。

它不是只会说“你可以这样做”。

它可以真的去做:

  • 查目录
  • 看配置
  • 备份文件
  • 写服务
  • 改路由
  • 重启进程
  • 验证结果
  • 写复盘

当然,它也会犯错。

比如 token 判断错、脚本写法不兼容、路由没命中。

但关键是:

它能继续修。

这就和普通聊天机器人完全不一样了。


如果你也想复刻,按这份清单来

如果你也想给自己的网站上线一个 Dify 智能客服,可以按这个顺序来:

Dify 侧

  • 建 Chatflow
  • 准备知识库
  • 写清楚客服边界
  • 发布 WebApp
  • 复制完整嵌入代码
  • 确认 token 和 baseUrl 属于同一个环境

网站侧

  • 判断是静态站还是反向代理
  • 静态站直接加 embed 代码
  • 容器/反代站优先考虑 HTML 注入代理
  • 只处理页面请求,不处理 API
  • CSP 放行 Dify 域名

服务器侧

  • 先备份
  • 再改配置
  • caddy validate
  • systemctl reload
  • 验证首页
  • 验证静态资源
  • 准备回滚命令

安全侧

  • 不打印密钥
  • 不在文章里暴露真实 IP/token/密码
  • 不让客服索要用户敏感信息
  • 操作后轮换高危凭据
  • 后续改成 SSH key + 普通部署用户

最后

这次上线智能客服,我最大的感受是:

未来普通人做产品,不一定要先拥有一个完整团队。

你可以先有一个想法。

再用 Dify 搭智能体。

再用 Codex 帮你接进真实网站。

再一点点把它推到线上。

以前“上线”是一个门槛。

现在它正在变成一个可以对话、可以协作、可以迭代的过程。

这可能才是 AI 编程真正有意思的地方。

不是替你写几行代码。

而是陪你把一个东西,真的做出来。


没有评论:

发表评论

Codex插件精选清单:必装这8个工具加Skills提升效率

本文为Codex用户整理一份实用插件与工具清单,涵盖电脑操作、办公三件套、本地文件转链接、设计视频生成、小白开发部署等场景。推荐Cloudinary、Figma、Vercel等免费或常用插件,并介绍飞书企业微信CLI及APIZ中转平台。建议按日常高频操作选择安装,不追求全装,追求...