多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

基于Dify与EdgeOne构建高并发AI守秘人:克苏鲁跑团的技术实践

基于Dify与EdgeOne构建高并发AI守秘人:克苏鲁跑团的技术实践 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 为什么是 EdgeOneDify解决了“大脑”的问题但要让全球玩家都能顺畅地与这个大脑交互还需要一个强大的“网络神经系统”。这就是我选择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%)’检定投出1d10035成功。” 玩家本次行动【艾拉说“我要仔细查阅这本关于太平洋群岛的航海日志。”】 请根据以上信息以守秘人的身份进行回应。首先描述环境与感官细节然后根据检定结果如有推进剧情或揭示信息。保持叙述的沉浸感和压迫感。直接开始你的叙述不要以“守秘人说”开头。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回复造成混乱。WAFWeb应用防火墙配置启用托管规则开启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使用流式输出streamtrue这样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 2d61d42并记录公开骰和暗骰日志供所有玩家查看公开骰或仅KP查看暗骰。成本控制这是个人项目长期运行的关键。精细化token管理在Dify中设置消息的最大token数定期清理过长的对话历史将重要剧情摘要后存入长期记忆。模型分级使用规则查询、意图分类等对创造力要求不高的任务使用便宜的小模型如GPT-3.5-Turbo核心剧情叙述和复杂判定使用能力强的大模型如GPT-4。监控与告警设置API调用费用和服务器资源的监控接近预算阈值时发送告警。搭建并运行这个“AI守秘人”系统让我深刻体会到当前的开源工具和云服务已经让曾经看似科幻的想法触手可及。Dify让复杂AI工作流的构建变得直观而EdgeOne则让全球可用的高性能服务部署变得简单。这个项目不仅解决了我个人跑团组局的痛点更打开了一扇门未来每一个小众的、依赖特定知识和叙事规则的社区或许都能用类似的方法创造出属于自己的、永不疲倦的AI守护者或对手。
返回列表