1. 项目概述:一个永不缺席的“守秘人”是如何炼成的
作为一名资深的TRPG(桌上角色扮演游戏)爱好者和技术从业者,我长期被一个“老大难”问题困扰:组织一场克苏鲁主题的跑团(CoC TRPG)太难了。核心痛点在于“守秘人”(游戏主持人,KP)——他需要熟读海量模组、扮演所有NPC、掌控剧情节奏、即时裁定规则,还得应对玩家天马行空的行动。一旦这位核心人物临时有事,精心筹备数周的团局就可能“鸽”掉,所有人的期待瞬间落空。
于是,一个想法在我脑中成型:能不能用AI技术,打造一个永不掉线、知识渊博、反应迅速且能同时服务多个跑团车队的“AI守秘人”?这个想法并非要取代充满魅力的人类KP,而是作为一个强大的辅助工具,或者在某些场景下(如新手入门、短平快的小模组、异步跑团)作为可靠的替代方案。
经过一番技术选型和折腾,我最终确定了以Dify和Cloudflare EdgeOne为核心的技术栈,成功搭建了一套可稳定运行、支持多人并发的“AI守秘人”系统。简单来说,Dify作为低代码的AI应用开发平台,负责封装大模型的能力,构建“守秘人”的逻辑大脑;而EdgeOne作为全球边缘网络与安全平台,则负责为这个大脑提供一个高速、稳定、安全的“躯干”,确保全球玩家都能低延迟访问,并且能扛住突然涌入的流量。
这个项目的本质,是将前沿的AI Agent开发技术与经典的桌面游戏场景相结合。它解决的不仅仅是“鸽”的问题,更是降低了跑团的门槛,让更多对克苏鲁神话感兴趣但苦于找不到KP的玩家,能够随时随地体验那种未知的恐惧与探索的乐趣。接下来,我将从零开始,拆解整个搭建过程的核心思路、技术细节与避坑经验。
2. 核心架构与工具选型解析
在动手之前,明确需求和选择合适的技术栈至关重要。一个合格的“AI守秘人”系统需要具备以下几个核心能力:
- 强大的自然语言理解与生成能力:能理解玩家复杂的自然语言指令(如“我用显微镜仔细观察雕像底座的花纹”),并生成符合克苏鲁世界观和角色设定的文本描述。
- 长期记忆与上下文管理:必须记住当前跑团模组的剧情、所有PC(玩家角色)和NPC的信息、已探索的地点、获得的线索等,上下文长度要足够支撑数小时的游戏会话。
- 规则知识库与逻辑判定:内置或能快速查询《克苏鲁的呼唤》规则书,能进行技能检定(如侦查、图书馆利用)、战斗轮判定、理智(SAN)值扣除计算等。
- 高并发与低延迟响应:支持多个独立的跑团房间同时进行,每个房间的AI响应速度要快,避免玩家等待出戏。
- 低成本与易维护:个人项目,需要在可控的成本下实现,并且部署和维护不能太复杂。
基于这些需求,我进行了如下选型:
2.1 为什么是 Dify?
在众多AI应用开发框架中,我选择Dify,主要基于以下几点考量:
- 低代码与可视化工作流:Dify的核心优势在于其可视化的工作流编排界面。构建“守秘人”的逻辑,本质上是一个复杂的决策流程:接收玩家输入 -> 理解意图 -> 检索相关规则和剧情记忆 -> 调用大模型生成叙述 -> 可能需要进行一次暗骰(隐藏的骰子检定) -> 输出结果。用代码实现这个流程非常繁琐,而Dify的拖拽式工作流可以直观地构建这个逻辑链,大幅降低了开发门槛。
- 开箱即用的关键组件:
- 知识库:我可以将克苏鲁规则书(PDF)、经典模组文本、克苏鲁神话百科等资料上传,构建专属知识库。当玩家询问规则或进行检定时,AI可以优先从知识库中获取准确信息,避免大模型“胡编乱造”。
- 上下文管理:Dify内置了对话历史管理功能,可以方便地设置上下文轮次,这对于维持长剧情对话至关重要。
- 多模型支持:可以灵活对接 OpenAI GPT、 Anthropic Claude、国内主流大模型等多种后端,便于根据成本、效果和网络情况进行切换。
- API与集成友好:Dify应用可以轻松地通过API接口被调用,这为后续与前端游戏界面或其他平台集成提供了便利。
注意:Dify虽然降低了开发难度,但它对部署服务器的资源有一定要求,尤其是运行工作流和知识库检索时,内存消耗较大。个人部署建议选择至少2核4G以上的云服务器。
2.2 为什么是 EdgeOne?
Dify解决了“大脑”的问题,但要让全球玩家都能顺畅地与这个大脑交互,还需要一个强大的“网络神经系统”。这就是我选择Cloudflare EdgeOne的原因:
- 全球边缘加速:EdgeOne拥有遍布全球的边缘节点。将Dify应用的API接口通过EdgeOne加速,无论玩家身在何处,请求都能路由到最近的节点,再通过优化过的回源链路到达我的源站服务器,从而显著降低访问延迟。对于需要实时交互的跑团游戏,几十毫秒的延迟优化体验提升都是巨大的。
- DDoS防护与安全:公开的API接口最怕恶意攻击和爬虫。EdgeOne提供企业级的DDoS缓解和Web应用防火墙(WAF),可以轻松应对各种网络攻击,保障服务稳定。个人项目最怕的就是被无意间“打挂”,EdgeOne给了我很强的安全感。
- 智能缓存与节省成本:对于一些相对静态的配置信息或常用的规则查询结果,可以设置缓存规则,直接从边缘节点返回,减少对源站服务器和Dify后端的请求压力,既能提升响应速度,也能节省服务器资源和AI API的调用费用。
- 易于配置:与Cloudflare传统CDN类似,EdgeOne的配置大部分可以通过控制台完成,无需深入复杂的网络编程。
架构总览:最终架构非常简单清晰。玩家通过一个自定义的前端界面(可以是简单的网页或Discord机器人等)发起请求,请求首先到达Cloudflare EdgeOne全球网络,经过安全清洗和加速后,到达我部署了Dify的源站服务器。Dify处理请求,调用大模型和知识库,生成“守秘人”的回应,再沿原路返回给玩家。EdgeOne在这里扮演了“高速收费站+安保”的角色。
3. “AI守秘人”大脑的构建:Dify工作流设计详解
这是整个项目的核心灵魂。我的目标不是创造一个通用聊天AI,而是一个高度特化、深谙克苏鲁跑团规则的“守秘人”智能体。在Dify中,这主要通过“工作流”来实现。
3.1 工作流核心逻辑拆解
我设计的核心工作流如下图所示(用文字描述其逻辑链):
玩家输入 -> 意图分类 -> 上下文记忆检索 -> 知识库检索 -> 规则/检定处理 -> 大模型合成 -> 输出意图分类节点:首先,需要判断玩家的输入属于哪种类型。我预设了几类关键意图:
- 普通叙事:描述角色行动、对话、观察等(如“我推开吱呀作响的木门”)。
- 技能检定:明确要求进行某项技能检定(如“我要对这本古籍进行‘图书馆利用’检定”)。
- 规则询问:询问游戏规则(如“手枪的伤害是多少?”)。
- OOC(超游)指令:玩家以现实身份进行的操作,如“/save”(保存进度)、“/roll 1d100”(直接投骰)。 这个分类可以通过一个提示词工程优化的小模型(如GPT-3.5-Turbo)或Dify的“条件判断”节点结合关键词来实现。
记忆与知识检索节点:
- 对话历史:Dify会自动维护最近N轮对话作为上下文。但我还需要一个“长期记忆体”。我采用的方法是,在每次AI输出后,自动将本轮的关键信息(如“玩家在‘黑水图书馆’发现了‘拉莱耶文本’”)以结构化的方式(如JSON)追加存储到一个外部数据库(如Supabase)或简单的文本文件中。当新对话开始时,先根据当前场景(如地点“黑水图书馆”)从长期记忆体中检索相关记录,作为附加上下文注入。
- 知识库检索:对于“规则询问”类意图,或当对话中涉及特定名词(如“深潜者”、“旧印”)时,触发Dify的“知识库检索”节点。该节点会在我上传的克苏鲁规则书和神话资料中搜索相关内容,并将最相关的片段作为参考信息提供给大模型。
规则与检定处理节点:这是体现“守秘人”专业性的关键。
- 对于明确技能检定:工作流会提取技能名和可能的目标值。然后,在后台(可以在Dify的“代码执行”节点中)模拟一次投骰。例如,玩家“图书馆利用”技能为70%,系统投一个1d100,若结果≤70则成功,>70则失败。根据大失败(96-100)、失败、成功、大成功(1-5)的不同,生成不同的结果描述框架。
- 对于暗骰:当玩家进行一些角色不自知的行动时(如侦查隐藏的陷阱),AI需要主动进行暗骰。这可以在工作流中设置一个概率触发,或在特定叙事节点后自动执行。骰子结果只影响AI后续的叙事生成,不会直接告诉玩家。
实操心得:骰子的随机性是跑团的灵魂。务必确保随机数生成是真正随机的(使用安全的随机源),并且将投骰逻辑和结果清晰地记录在日志中,方便后续复盘或争议时查验。
大模型合成与输出节点:这是最后一步,也是提示词工程发挥作用的舞台。我们将之前所有步骤的产出——玩家输入、分类意图、记忆上下文、知识库片段、骰子结果(如果有)——组合成一个精心设计的“系统提示词”,发送给大模型(如GPT-4),让它生成最终那充满克苏鲁风味的叙述。
- 系统提示词示例:
你是一位专业的《克苏鲁的呼唤》守秘人(KP),风格偏向H.P.洛夫克拉夫特,叙述强调未知的恐惧、宇宙的冷漠和精神的脆弱。 当前游戏信息: - 模组名称:【***】 - 当前场景:【黑水图书馆,深夜,雨】 - 玩家角色(PC):【侦探路易斯(侦查65)、记者艾拉(图书馆利用70)】 - 已发现线索:【***】 - 上回合回顾:【***】 (此处插入从知识库检索到的相关规则片段) (此处插入本次对话的长期记忆检索结果) (此处插入本次技能检定的过程和结果,例如:“艾拉进行了‘图书馆利用(70%)’检定,投出1d100=35,成功。”) 玩家本次行动:【艾拉说:“我要仔细查阅这本关于太平洋群岛的航海日志。”】 请根据以上信息,以守秘人的身份进行回应。首先描述环境与感官细节,然后根据检定结果(如有)推进剧情或揭示信息。保持叙述的沉浸感和压迫感。直接开始你的叙述,不要以“守秘人说”开头。
- 系统提示词示例:
3.2 多房间并发与状态隔离
一个Dify应用实例可以同时处理多个独立的会话。关键在于确保每个跑团“房间”的上下文和记忆完全隔离。Dify的API调用支持传入一个唯一的conversation_id参数。我为每个新创建的跑团房间生成一个唯一的UUID作为conversation_id。这样,Dify内部就会为每个ID维护独立的对话历史。而我的“长期记忆体”(外部数据库)在存储和检索时,也会以这个conversation_id作为主键进行区分,从而实现完美的状态隔离。
4. 为“大脑”配备高速躯干:EdgeOne配置与优化
有了聪明的“大脑”,我们需要让它反应敏捷、身强体壮。将Dify API部署在自有服务器上,直接暴露公网IP给玩家访问,不仅速度受地域影响大,而且安全风险极高。EdgeOne的引入完美解决了这些问题。
4.1 基础配置步骤
- 添加站点:在EdgeOne控制台,添加你的Dify服务器域名(例如
api.your-dify.com)。 - 修改DNS:将你域名的DNS服务器指向EdgeOne提供的地址,完成域名绑定。
- 源站配置:设置你的Dify服务器IP地址和端口为源站。
- SSL/TLS加密:EdgeOne提供免费的SSL证书,并可以设置为“完全”模式,即从客户端到EdgeOne、从EdgeOne到你的源站,全程加密,确保通信安全。
4.2 性能与安全优化策略
缓存规则设置:并非所有API请求都需要实时到达Dify。例如,获取应用配置、一些静态提示信息的接口,可以设置缓存。
- 在EdgeOne的“规则引擎”中,创建一条规则,匹配路径如
/api/console/apps/*/parameters。 - 设置缓存行为:
Cache TTL设为例如1小时。这样,玩家客户端在短时间内重复获取应用参数时,会直接从附近的EdgeOne节点获取,响应速度极快,且大大减轻源站负担。
重要提示:对于核心的对话接口(如
/api/chat-messages),绝对不要设置缓存,否则所有玩家都会收到相同的AI回复,造成混乱。- 在EdgeOne的“规则引擎”中,创建一条规则,匹配路径如
WAF(Web应用防火墙)配置:
- 启用托管规则:开启OWASP核心规则集,防御常见的SQL注入、XSS等攻击。
- 设置速率限制:创建一条速率限制规则,针对
/api/路径。例如,限制单个IP地址每秒最多请求10次,突发请求不超过30次。这能有效防止恶意刷接口或简单的CC攻击,保证服务器资源不被耗尽。 - 自定义规则:可以观察正常请求的Pattern,针对一些异常模式(如大量请求不存在的路径、User-Agent异常等)设置自定义拦截规则。
网络优化:
- 启用HTTP/2 和 HTTP/3:减少连接延迟,提升多请求并发性能。
- 启用0-RTT:对于支持的服务,可以进一步加快重复访问者的连接速度。
- 调整TCP优化参数:根据你的源站地理位置和网络状况,可以尝试调整EdgeOne的TCP缓冲区和超时设置,以优化长连接性能(对于流式输出响应尤其有用)。
经过EdgeOne的加持后,实测来自不同地区的玩家,其API请求的延迟(Ping值)和稳定性都得到了显著提升,且再未遇到过因小规模网络波动或扫描导致的服务器异常。
5. 前端交互与集成实践
“AI守秘人”的智能体最终需要一个界面与玩家交互。这里的选择非常灵活,我提供了几种实践方案:
5.1 方案一:嵌入式Web应用(最通用)
Dify本身在创建应用后,会提供一个可嵌入的Web聊天窗口。你可以直接把这个iframe嵌入到你自己的跑团活动页面或介绍网站中。优点是开发量几乎为零,风格与Dify一致。缺点是自定义程度低,UI可能和你的跑团主题网站不太搭。
5.2 方案二:自定义前端 + API调用(推荐)
这是我采用的方案,自由度最高。我使用Vue.js + Element UI构建了一个简单的单页应用。
- 界面设计:模仿经典TRPG聊天工具,左侧是玩家列表和角色卡摘要,中间是主要的聊天记录区域(区分玩家发言和守秘人叙述),右侧可以放置当前场景地图、线索卡片或规则速查。
- 核心交互:
- 玩家在输入框输入行动。
- 前端将输入内容、当前
conversation_id、玩家角色信息等,通过HTTPS POST请求发送至经过EdgeOne加速的Dify API端点(https://your-domain.com/api/chat-messages)。 - 为了体验更好,我请求Dify使用流式输出(
stream=true),这样AI的回复会像真人打字一样逐字显示在聊天区域,沉浸感更强。 - 前端接收流式响应并实时渲染。
- 状态管理:前端需要管理当前房间的
conversation_id,并在页面刷新或重新进入时能够恢复会话(可以从URL参数读取或使用本地存储)。
5.3 方案三:集成到现有平台(如Discord)
对于社群运营,Discord是跑团玩家聚集地。可以开发一个Discord Bot。
- Bot监听特定频道或私聊。
- 当收到指令(如
!kp 我要调查书架)时,Bot将指令转发给你的后端服务(即调用Dify API)。 - 后端服务处理完后,将“守秘人”的回复通过Bot发送回Discord频道。
- 这种方案的优点是玩家无需离开熟悉的Discord环境,便于组织和管理。难点在于需要处理Discord API的认证和消息格式。
6. 踩坑实录与进阶优化建议
在实际搭建和测试过程中,遇到了不少问题,这里分享一些核心的避坑经验和优化思路。
6.1 常见问题与排查
| 问题现象 | 可能原因 | 排查与解决思路 |
|---|---|---|
| AI回复偏离克苏鲁风格或规则错误 | 1. 系统提示词不够强或被淹没。 2. 知识库检索未触发或相关性低。 3. 使用的大模型本身不擅长叙事或遵循指令。 | 1.强化系统提示词:在提示词开头用强硬语气(如“你必须始终扮演...”、“严禁...”),并将关键规则(如SAN值规则)直接写入提示词。 2.优化知识库:将规则书按章节、条目拆分得更细,提高检索命中率。调整检索相似度阈值。 3.切换或微调模型:尝试GPT-4、Claude-3等更强模型,或在Dify中使用“提示词编排”功能对回复进行二次修正。 |
| 对话进行几轮后,AI忘记之前剧情 | 1. 对话上下文长度设置太短。 2. 长期记忆检索机制失效或未启用。 | 1.增加上下文轮次:在Dify应用设置中调大“上下文对话轮数”。注意,这会增加API token消耗。 2.检查记忆存储与检索:确保每轮对话后,关键信息被正确结构化存储。在下一轮请求前,确保检索逻辑被执行,且检索到的记忆被正确插入到提示词中。 |
| API响应速度慢,玩家等待时间长 | 1. 大模型API本身慢(如GPT-4)。 2. 网络延迟高。 3. 知识库检索或工作流节点处理耗时。 | 1.模型降级与缓存:非关键叙事使用GPT-3.5-Turbo。对规则查询结果进行缓存(可在Dify工作流外加一层Redis缓存)。 2.确认EdgeOne加速生效:使用 ping或curl测试不同地域到加速域名的延迟。3.优化工作流:简化不必要的节点,对知识库进行索引优化。 |
| 遭遇恶意请求或流量攻击 | API接口暴露,缺乏防护。 | 1.立即启用EdgeOne WAF:开启速率限制和托管规则。 2.配置IP黑白名单:如果只是小范围使用,可以在EdgeOne或源站服务器防火墙设置只允许特定IP段访问。 |
| 多人同时开团时,服务器负载高 | Dify工作流和模型推理消耗资源大。 | 1.升级服务器配置:增加CPU核心和内存。 2.考虑Docker部署与水平扩展:使用Docker-Compose部署Dify,未来可通过负载均衡部署多个实例。但需要注意会话状态( conversation_id)需要中心化存储(如Redis)来支持多实例。 |
6.2 进阶优化建议
- 角色卡集成:让AI真正“认识”每个玩家角色。可以将角色卡的JSON数据(属性、技能、装备、背景故事)在每轮对话时,作为“角色上下文”注入系统提示词,让AI在叙述中能调用这些信息(如“以你65的侦查技能,你注意到...”)。
- 多模态扩展:克苏鲁跑团中,地图、怪物画像、线索照片至关重要。可以尝试:
- 在知识库中存入图片,利用多模态大模型(如GPT-4V)让AI能够“看到”并描述图片内容。
- 让AI调用文生图模型(如Stable Diffusion),根据剧情实时生成场景或怪物描述图,极大提升沉浸感。这可以通过在Dify工作流中调用相应的图像生成API实现。
- 骰子机器人强化:将骰子逻辑做得更完善。不仅支持基础的
/roll 1d100,还可以支持复杂的骰子表达式(如/roll 2d6+1d4+2),并记录公开骰和暗骰日志,供所有玩家查看(公开骰)或仅KP查看(暗骰)。 - 成本控制:这是个人项目长期运行的关键。
- 精细化token管理:在Dify中设置消息的最大token数,定期清理过长的对话历史,将重要剧情摘要后存入长期记忆。
- 模型分级使用:规则查询、意图分类等对创造力要求不高的任务,使用便宜的小模型(如GPT-3.5-Turbo);核心剧情叙述和复杂判定,使用能力强的大模型(如GPT-4)。
- 监控与告警:设置API调用费用和服务器资源的监控,接近预算阈值时发送告警。
搭建并运行这个“AI守秘人”系统,让我深刻体会到,当前的开源工具和云服务已经让曾经看似科幻的想法触手可及。Dify让复杂AI工作流的构建变得直观,而EdgeOne则让全球可用的高性能服务部署变得简单。这个项目不仅解决了我个人跑团组局的痛点,更打开了一扇门:未来,每一个小众的、依赖特定知识和叙事规则的社区,或许都能用类似的方法,创造出属于自己的、永不疲倦的AI守护者或对手。