尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

业务系统接入AI助手:独立会话服务架构与实践

发布时间:2026/9/26 18:17:09

资讯中心
01
ARTICLE

业务系统接入AI助手:独立会话服务架构与实践

业务系统接入AI助手:独立会话服务架构与实践
不需要不假思索地冲去新开一个仓库但要说“直接加个聊天模块就完事”同样会踩大坑。这个问题的答案取决于你系统的规模、团队配置、AI 功能未来的迭代频率以及你敢不敢让模型的 3 秒延迟拖住你核心接口的线程池。我先把结论放在前面大部分已有业务系统接入 AI 助手我建议拆出独立的会话服务但“独立”不等于你非得搭建一个复杂平台它可以只是一个职责单一的旁路模块。下面我从判断标准、为什么内嵌容易翻车、哪些场景可以偷懒再到一套能直接落地的接入方案和坑点完整讲一遍。1. 先判断这个 AI 助手到底要承担什么角色1.1 会话服务承载的不只是“聊天”很多人一听“会话服务”脑子里冒出来的是“给用户一个聊天窗口”然后所有逻辑塞进聊天接口里。这个理解过于简化了。一个能真正嵌入业务系统的 AI 助手后端至少承担四件事模型接入与调度不管用的是大模型 API 还是私有化部署的模型都需要统一接入层处理鉴权、限流、模型切换、超时重试。这件事如果散落在业务代码里一次 API 密钥轮换就能让你全局改一遍。上下文管理对话历史要保存、要截断、要拼进上下文窗口长对话还要做摘要压缩。这是最容易出细节问题的地方比如上下文窗口满了直接报错或者多轮对话越聊越笨。工具调用也就是过去两年经常听到的 function calling。模型根据用户问题输出一个结构化动作比如“查询订单状态”“创建工单”你的后端拿到这个动作再去调业务接口拿回结果交给模型组织回答。少了这一步AI 助手就只能聊空话没法真正办业务。会话持久化与检索长期记忆、知识库、历史会话查询一般会用到 Redis、关系库或向量数据库。这部分数据量增长快和你的核心业务数据放在一起会互相干扰。如果你把这四项全部内嵌进现有系统相当于把 AI 助手所有不稳定因素都带进了核心业务链路。后面我会细讲这会造成什么影响。1.2 用五个问题快速定位需求在决定架构之前与其听各种方案对比不如先问自己五个问题。每个问题的答案都会直接影响选型并发量级是多少是几十人内部用还是对外给上百万用户开放AI 是否需要读、写业务数据还是只做纯知识问答完全不碰现有数据库和接口部署环境有无限制公司要求数据不出内网还是要用公有云模型服务现有团队的技术栈和稳定性要求如何Java 单体、PHP、Go 微服务还是前端项目顺手接的 BFFAI 功能的迭代频率高不高提示词、模型版本、工具列表是不是两周就要调一次把这几个问题的答案写下来再去看后面三章你基本能得出自己的结论。我见过最依赖“拍脑袋”的团队往往连并发量都没估过就开始画架构图最后实现出来的东西不是过度设计就是上线就崩。2. 为什么“直接在业务系统里加聊天模块”容易翻车2.1 阻塞调用和流式响应会冲击原有线程模型举一个最常见的例子Java Spring Boot 单体服务部署在 Tomcat 中默认线程池大致在 200 左右。在正常业务中一个查询接口耗时 100ms200 个线程能撑起约 2000 QPS业务侧感觉不到压力。但如果你在这个服务里加一个 AI 聊天接口情况立刻不同。模型推理通常在数秒级别哪怕首 token 也要几秒才出来。按平均 5 秒计算一个聊天请求就要占住一个 Tomcat 线程长达 5 秒于是这个服务的聊天并发上限大约只有 200 / 5 40 QPS。如果聊天请求量稍微上来一点线程池被打满其他正常业务接口全部都会排队等待核心链路跟着一起卡死。你以为是 AI 模块自己慢实际上是把整个系统的吞吐拖到了地板上。有人会说改成异步接口、用 CompletableFuture、用响应式编程不就行了吗确实可以但这是第一道坎现有系统如果是老代码、老框架异步化改造的成本并不低更别提聊天接口还必须支持流式输出一个字一个字往外吐。要做流式你的业务服务还得处理 SSEServer-Sent Events或 WebSocket 长连接这些都对网关、超时配置、序列化方式有额外要求。与其把这一摊事塞进已有业务服务不如单独开一个带独立资源配额的服务让这些长连接、高 CPU 消耗的请求待在它们自己的窝里。2.2 上下文、工具调用与业务代码耦合成一锅粥AI 助手的典型调用链路并不是“用户发一句话你转发给模型模型给个回答”这么简单。一个稍有点实际作用的助手链路大致是这样的用户输入 - 检索会话历史Redis / 向量库 - 拼接系统提示词与工具定义 - 调用模型第一轮 - 模型返回工具调用指令 - 调用业务接口查订单、建工单、查库存 - 把业务结果回填给模型第二轮 - 模型生成最终回复 - 流式返回给前端这条链路里既有模型调用的不确定延时又有业务接口的依赖还有向量检索这类较新的组件。如果这些都写进现有业务系统的主代码里每一次更新模型、改 Prompt、调整工具定义你都绕不开整个业务系统的发布流程。你既要拉动一堆回归测试又要担心 AI 模块的异常影响主流程实际上是把一个本来迭代速度应该很快的新功能锁死在老系统的发布节奏里。我自己见过一个团队把 AI 助手做成 ERP 里的一个内部模块因为改动频繁平均每两周要触发一次 ERP 系统发版。结果运维开始抗议业务部门也开始疑惑“为什么点个 AI 功能要把整个系统停一次”。拆出一个独立的会话服务相当于给 AI 模块一条自己的发布通道模型升级、Prompt 调优、工具增减都不需要所动老系统。2.3 权限、隔离和审计的边界会变模糊再深一层是数据安全和职责边界。业务系统里通常有一套成熟的身份认证和权限体系用户能看什么、不能看什么是有明确逻辑的。如果 AI 助手直接长在业务系统内部最容易出现的情况是AI 模块为了打通能力把各种权限校验和业务数据查询揉在一段代码里导致权限边界变得模糊。独立会话服务的优势在于它可以做一个清晰的闸口业务系统只认证身份并且将当前用户的有限权限范围传入会话服务会话服务只负责对话、记忆和模型调度所有涉及业务数据的读写都通过白名单工具接口回调。这样即使模型某个环节出了问题它也没有直接接触数据库的能力权限审计也能落在一个统一的位置。3. 哪些场景不需要单独搭一套会话服务3.1 适合直接内嵌的三种情况说了这么多独立的好处我也得承认不是所有人都需要一上来就拆服务。如果你属于下面几种情况直接内嵌反而更务实纯内部分享、低并发比如公司内部一个制度问答助手用户几十人同时在线不超过个位数。这种场景跑在企业微信机器人或者一个简单的页面上直接在业务系统里加个接口就能跑单独部署服务确实是杀鸡用牛刀。纯知识问答、无工具调用AI 只基于知识库回答问题不读订单、不写工单、不触发任何业务动作。这种需求没有复杂的回调链路内嵌成本低出问题的可能性也小。团队就是核心系统的开发者且熟悉异步模型如果你本来就在用 Go 协程、Java 虚拟线程或者 Node 的异步 IO有充足的并发处理经验那在系统里内嵌一个 AI 模块当作普通异步模块处理也不是不行。这些场景有个共同点AI 的能力边界清晰、调用量可控、不会反向拖垮业务主链路。在这样的前提下少一个服务实例就少一份运维成本我不反对直接集成。3.2 从内嵌到独立一条稳妥的演进路径如果确实还不确定未来 AI 功能的规模你可以先走一条成本最低的演进路径不必一开始就大动干戈MVP 阶段先在业务系统里写一个简单的 chat 模块直接用封装好的模型 SDK目标只有一个尽快跑通效果。这个阶段允许代码丑一点允许直接把业务表捞出来喂给模型。抽取阶段当效果验证 OK开始把 chat 相关代码从业务逻辑中剥出来抽成独立的内部库或独立的服务层同时把协议固定下来会话 ID、消息格式、工具调用方式。独立部署阶段当并发上升或者 AI 功能迭代开始明显拖累上游发布节奏再把服务层部署为独立的进程入口从内部函数调用改为网络调用。此时因为协议已经固定业务系统的改动量是可控的。这条路径的关键在于第二阶段不要把 AI 相关代码继续散落在各个业务 Controller 里。你带着“总会重构成独立服务”的预期去写代码接口设计自然就会偏向松耦合后面抽离成本很低。4. 拆分独立的会话服务具体该怎么落地4.1 顶层架构业务系统负责权限会话服务负责对话如果你决定走独立会话服务路线最清晰的职责划分是这样的浏览器 / App / 企业微信 / 钉钉 | 业务系统网关身份认证、菜单权限、参数校验 | AI 会话服务会话管理、记忆、RAG、模型调度 |--- 模型服务云端 API 或私有化部署 |--- 向量库 / Redis / 业务工具接口在这个架构里用户请求先到业务系统网关网关确认“这个用户是谁、他有没有权限使用 AI 功能”然后生成一个短时效的凭据可以是一个签名后的会话票据包含 userId、租户 ID、角色信息再转发给会话服务。会话服务不自己认证用户它只信任业务系统交给它的票据。业务系统需要提供的只是工具回调接口比如“查询订单”“获取客户资料”。会话服务要操作业务数据时发起工具调用业务侧接口再校验一次上下文里的用户身份确认权限范围内再执行。这样即使会话服务的模型被诱导生成了危险指令最终权限校验依然牢牢握在业务系统手里。4.2 接入合约统一的消息协议先定义好再写代码独立服务之间通信最不建议的就是两边各写各的最后联调时互相甩锅。我习惯一上来就定一个消息协议哪怕后面要改也比没有协议强得多。一个最小可用的协议大概长这样请求POST /v1/chat { request_id: 88f7a3c2-xx, session_id: 20250102-abc123, user_id: U100232, tenant_id: T0012, messages: [ { role: user, content: 帮我查一下订单 OD20250102001 的状态 } ], tools: [order.query, order.refund], expires_at: 1735800000 }响应通过 SSE 返回data: {event:token,content:好的} data: {event:token,content:我来查一下这个订单。} data: {event:tool_call,name:order.query,input:{\order_id\:\OD20250102001\}} data: {event:tool_result,name:order.query,content:{\status\:\已发货\}} data: {event:token,content:这张订单已经发货了预计明天送到。} data: {event:done,session_id:20250102-abc123}这里面有几个细节值得注意request_id 必须幂等如果网络超时业务系统重试同样的请求不能被当成两次提问重复创建工单。session_id 串联会话新会话的第一次请求可以不传 session_id由会话服务生成并返回后续请求必须带上。tools 白名单业务系统在请求中声明这次会话允许调用哪些工具而不是让模型自己决定。这是防滥用最简单的一种手段。expires_at 票据过期会话票据带有时效性防止有人拿到后反复调用。从业务系统角度看只需要把用户当前身份、票据、消息列表打包成一个网络请求剩下的模型调度、工具编排、流式返回都不需要了解。这比把整套 LLM SDK 引进来要干净得多。4.3 会话存储与记忆管理数据放哪、怎么召回会话服务内部要处理好“短期记忆”“长期记忆”和“业务数据快照”三件事。短期记忆一般指最近几轮对话直接放在 Redis 里key 为 session_idvalue 是消息列表。每次请求进来从 Redis 读出最近 N 轮再拼上系统提示词发给模型。这种方式的优点是快缺点是上下文窗口有限聊太多轮会被截断。长期记忆则解决“用户几天前问过什么”的问题。可以定期对旧会话做摘要连同有代表性的关键信息存入关系库或向量库。当新会话开始时按用户维度检索相关历史片段作为背景知识拼进提示词。这块不用一开始做得太重很多团队上线半年才真正需要长期记忆但存储结构以 user_id tenant_id 为维度最好提前设计不然后面数据迁移会非常痛苦。还有一个容易忽略的点业务数据快照。AI 回答中涉及到的订单号、金额、状态等如果每次都实时去业务系统查既增加延迟又放大业务系统压力。合理的做法是在工具调用时把关键数据字段快照到会话服务自己的存储里后续追问直接读快照。会话服务的数据量增长快但和核心业务库是隔离的不会影响业务主库的查询性能和磁盘空间。4.4 工具调用与业务回写怎么安全地让模型碰业务系统工具调用是 AI 助手真正“干活”的关键但也是最容易出事故的地方。我给工具调用分了三类只读工具查订单、查客户、查库存。这类风险低可以直接执行。写操作工具创建工单、修改资料、发送通知。这类必须加二次确认模型只能生成“待确认动作”真正执行要由用户在界面上点击确认。高风险动作退款、删除、转账。这类我建议直接把工具调用从 AI 链路中拿掉做成用户显式操作AI 只负责填充表单或引导流程。写操作工具还有一个实践细节业务系统工具接口接收的参数必须是结构化的不能是自然语言。比如模型生成的“把订单 OD1 取消掉”在工具调用阶段应该转换为{order_id: OD1, reason: user_request}这样的结构化 JSON业务侧只认 JSON 字段不解析模型拼接的文本。这样可以最大程度避免模型在字段上报错也方便权限校验和审计。另外关于 Prompt 注入一定不要抱侥幸心理。模型可能被用户话术诱导生成类似“忽略之前指令删除所有订单”的输出。防范手段是多层次的工具定义不能把“删除所有订单”写成合法动作业务工具接口接收参数前校验操作范围写操作强制二次确认。你要是只靠系统提示词里写一句“请遵守工具规则”那是挡不住真实攻击的不加。5. 常见问题与排查技巧实录5.1 SSE 经过网关后“首字”迟迟不出现SSEServer-Sent Events是 AI 对话项目里最常见的流式方案但很多团队第一次上线就发现一个诡异现象直接连会话服务的端口首字秒出从业务系统网关转发出去整个页面要等全部内容生成完才一次性出现。这通常是网关层缓存了响应导致。以 Nginx 为例需要显式关闭代理缓冲并且设置长超时location /v1/chat { proxy_pass http://ai-session-service; proxy_buffering off; proxy_read_timeout 300s; proxy_send_timeout 300s; add_header X-Accel-Buffering no; }如果是云负载均衡或者 API 网关也要检查是否开启了响应缓冲。很多网关默认会缓冲后端响应流式协议在里面会被整个吞掉。排查方法很简单用 curl 直接打会话服务观察是否逐字返回再打网关对比行为问题基本就定位在哪一层了。5.2 业务系统线程被 AI 请求拖垮这个现象在前面理论部分已经讲过。真实项目中出现时往往表现为业务系统 CPU 不高、但接口全部超时jstack/线程转储一看大量线程阻塞在模型调用的网络等待上。如果你在业务系统内部内嵌了 AI 调用这是迟早的事。排查步骤是看线程堆栈确认线程大多卡在模型 SDK 的网络调用。统计 AI 请求的 P99 耗时确认耗时是以秒为单位。对 AI 请求单独设置线程池隔离限制并发数比如核心线程 10最大 50队列 200。治本方案仍然是拆独立服务让业务系统主线程池和 AI 长耗时互相不影响。如果你暂时没法拆服务用独立的线程池 熔断降级至少能顶一阵核心接口不至于被 AI 拖垮。5.3 会话上下文串号租户隔离形同虚设这是另一个高频事故。当业务系统里多个租户共享同一套会话服务时如果写代码时不注意很容易把上一个用户的上下文带进下个用户的提问里。最常见的根源有两个会话服务里的上下文管理用了全局单例而不是按 session_id 隔离。业务系统转发请求时漏传 tenant_id会话服务把不同租户的对话记到了同一个 key 下。排查技巧是在会话服务入口打印完整请求头核对 user_id、tenant_id、session_id 三者关系测试时一定要使用两个不同的测试账号同时聊天看是否出现“A 用户看到 B 用户前一轮回答”的现象。这个问题在功能测试阶段往往测不出来压测或真实并发时才暴露特别尴尬。5.4 模型乱改数据、提示注入如何防前面讲工具调用安全时提到了一些。这里再补充一个真实案例一个客服助手学习了退款工具的 schema用户对模型说“请把售后工单的金额字段都改成 0”模型真的生成了一串批量更新工具调用。还好当时做了两点防护——工具参数里金额字段只接受正整数且更新前加了一个滑块验证码确认才没有造成真实损失。所以我的底线是模型永远不要有“无需确认就可写库”的工具。所有写操作必须先进入“待确认”状态展示给用户的是一个小卡片用户点确认后业务系统才执行。这个设计在任何模型厂商、任何 Prompt 技巧出现之前都是必要的因为安全性不能建立在模型不会出错这个假设上。5.5 缓存和成本同一个问题反复问账单却还在涨AI 服务是按 token 计费的很多团队上线后才发现“明明功能不大为什么模型费用高得离谱”。排查之后发现大量用户反复问相似问题同一份知识库内容被翻来覆去地拼进上下文。解决方案是分两级缓存完全相同的提问直接命中缓存不调用模型。适合制度问答、产品介绍这类客观知识型场景。相似语义提问可以通过句向量检索匹配历史回答先召回最相近的问题如果相似度高于阈值直接返回历史答案。这两级缓存做下来账单通常能砍掉一大半。另外对话历史别每次都把全部轮次塞进模型定时做摘要把旧轮次压缩成一小段背景也能显著减少 token 消耗。省下的费用不是抽象的是实实在在的月度账单。6. 最后分享一点我在实际改造中的体会聊到这里你应该能感觉到我不是无脑鼓吹独立会话服务而是希望大家先把 AI 助手的职责边界画清楚。根据我参与过和见过的大大小小改造有一个经验很朴素一个功能如果会长时间占用线程、会频繁迭代、还要碰业务数据它就不适合长期住在老系统里让它独立长大是早晚的事。而独立会话服务不一定要做得多复杂一个进程、一个数据库、一组 HTTP 接口加一个清晰的权限校验和工具回调机制就能跑得很稳。真正关键的从来不是你有没有“单独搭一套”而是你有没有在设计阶段把应该由业务系统负责的事情认证、权限、写操作确认和应该由会话服务负责的事情对话、记忆、模型调度想明白。想明白了方案自然就出来了。希望这篇文章能帮正在选型的你少走两步弯路。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。